Compare commits

...
Author SHA1 Message Date
Elephant Lumps e160a0dada make variable public 2025-05-22 10:30:40 -07:00
Elephant Lumps 60b45b6870 merge conflicts 2025-05-22 10:24:19 -07:00
Elephant Lumps 9f8b34bbe7 Merge branch 'main' into migrate-didShowAnnouncement-protobus 2025-05-21 13:23:04 -07:00
Elephant Lumps 57ab6729e7 remove comment 2025-05-21 12:39:12 -07:00
Elephant Lumps c51543b792 changeset 2025-05-21 12:35:50 -07:00
Elephant Lumps 65302975b4 migrate didShowAnnouncement 2025-05-21 12:35:24 -07:00
8 changed files with 55 additions and 10 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"claude-dev": minor
---
Migrate didShowAnnouncement message to protobus
+3 -1
View File
@@ -10,5 +10,7 @@ import "common.proto";
service UiService {
// Scrolls to a specific settings section in the settings view
rpc scrollToSettings(StringRequest) returns (Empty);
// Marks the current announcement as shown and returns whether an announcement should still be shown
rpc onDidShowAnnouncement(EmptyRequest) returns (Boolean);
}
+1 -5
View File
@@ -65,7 +65,7 @@ export class Controller {
workspaceTracker: WorkspaceTracker
mcpHub: McpHub
accountService: ClineAccountService
private latestAnnouncementId = "may-16-2025_16:11:00" // update to some unique identifier when we add a new announcement
latestAnnouncementId = "may-16-2025_16:11:00" // update to some unique identifier when we add a new announcement
constructor(
readonly context: vscode.ExtensionContext,
@@ -298,10 +298,6 @@ export class Controller {
text: message.text,
})
break
case "didShowAnnouncement":
await updateGlobalState(this.context, "lastShownAnnouncementId", this.latestAnnouncementId)
await this.postStateToWebview()
break
case "openInBrowser":
if (message.url) {
vscode.env.openExternal(vscode.Uri.parse(message.url))
+2
View File
@@ -3,10 +3,12 @@
// Import all method implementations
import { registerMethod } from "./index"
import { onDidShowAnnouncement } from "./onDidShowAnnouncement"
import { scrollToSettings } from "./scrollToSettings"
// Register all ui service methods
export function registerAllMethods(): void {
// Register each method with the registry
registerMethod("onDidShowAnnouncement", onDidShowAnnouncement)
registerMethod("scrollToSettings", scrollToSettings)
}
@@ -0,0 +1,29 @@
import type { EmptyRequest, Boolean } from "../../../shared/proto/common"
import type { Controller } from "../index"
import { getGlobalState, updateGlobalState } from "../../storage/state"
/**
* Marks the current announcement as shown and returns the updated shouldShowAnnouncement value
*
* @param controller The controller instance
* @param _request The empty request (not used)
* @returns Boolean indicating whether an announcement should be shown
*/
export async function onDidShowAnnouncement(controller: Controller, _request: EmptyRequest): Promise<Boolean> {
try {
// Update the lastShownAnnouncementId to the current latestAnnouncementId
await updateGlobalState(controller.context, "lastShownAnnouncementId", controller.latestAnnouncementId)
// Get the updated lastShownAnnouncementId value after the update
const lastShownAnnouncementId = await getGlobalState(controller.context, "lastShownAnnouncementId")
// Calculate the new shouldShowAnnouncement value
// This replicates the same logic used in getStateToPostToWebview()
const shouldShowAnnouncement = lastShownAnnouncementId !== controller.latestAnnouncementId
return { value: shouldShowAnnouncement }
} catch (error) {
console.error("Failed to acknowledge announcement:", error)
return { value: false }
}
}
-1
View File
@@ -13,7 +13,6 @@ export interface WebviewMessage {
| "newTask"
| "condense"
| "reportBug"
| "didShowAnnouncement"
| "openInBrowser"
| "showChatView"
| "openMcpSettings"
+12 -2
View File
@@ -5,9 +5,10 @@ import SettingsView from "./components/settings/SettingsView"
import WelcomeView from "./components/welcome/WelcomeView"
import AccountView from "./components/account/AccountView"
import { useExtensionState } from "./context/ExtensionStateContext"
import { vscode } from "./utils/vscode"
import { UiServiceClient } from "./services/grpc-client"
import McpView from "./components/mcp/configuration/McpConfigurationView"
import { Providers } from "./Providers"
import { Boolean, EmptyRequest } from "@shared/proto/common"
const AppContent = () => {
const {
@@ -21,6 +22,7 @@ const AppContent = () => {
showAccount,
showAnnouncement,
setShowAnnouncement,
setShouldShowAnnouncement,
closeMcpView,
navigateToHistory,
hideSettings,
@@ -32,7 +34,15 @@ const AppContent = () => {
useEffect(() => {
if (shouldShowAnnouncement) {
setShowAnnouncement(true)
vscode.postMessage({ type: "didShowAnnouncement" })
// Use the gRPC client instead of direct WebviewMessage
UiServiceClient.onDidShowAnnouncement({} as EmptyRequest)
.then((response: Boolean) => {
setShouldShowAnnouncement(response.value)
})
.catch((error) => {
console.error("Failed to acknowledge announcement:", error)
})
}
}, [shouldShowAnnouncement])
@@ -45,6 +45,7 @@ interface ExtensionStateContextType extends ExtensionState {
setCustomInstructions: (value?: string) => void
setTelemetrySetting: (value: TelemetrySetting) => void
setShowAnnouncement: (value: boolean) => void
setShouldShowAnnouncement: (value: boolean) => void
setPlanActSeparateModelsSetting: (value: boolean) => void
setEnableCheckpointsSetting: (value: boolean) => void
setMcpMarketplaceEnabled: (value: boolean) => void
@@ -492,7 +493,8 @@ export const ExtensionStateContextProvider: React.FC<{
...prevState,
mcpMarketplaceEnabled: value,
})),
setShowAnnouncement: (value) =>
setShowAnnouncement,
setShouldShowAnnouncement: (value) =>
setState((prevState) => ({
...prevState,
shouldShowAnnouncement: value,