Skip to content

Commit 0c30612

Browse files
celestial-vaultElephant Lumps
andauthored
Migrate didShowAnnouncement protobus (RooCodeInc#3699)
* migrate didShowAnnouncement * changeset * remove comment * make variable public --------- Co-authored-by: Elephant Lumps <[email protected]>
1 parent 97139f7 commit 0c30612

File tree

8 files changed

+55
-10
lines changed

8 files changed

+55
-10
lines changed

.changeset/twelve-seals-type.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"claude-dev": minor
3+
---
4+
5+
Migrate didShowAnnouncement message to protobus

proto/ui.proto

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@ import "common.proto";
1010
service UiService {
1111
// Scrolls to a specific settings section in the settings view
1212
rpc scrollToSettings(StringRequest) returns (Empty);
13+
14+
// Marks the current announcement as shown and returns whether an announcement should still be shown
15+
rpc onDidShowAnnouncement(EmptyRequest) returns (Boolean);
1316
}
14-

src/core/controller/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class Controller {
6565
workspaceTracker: WorkspaceTracker
6666
mcpHub: McpHub
6767
accountService: ClineAccountService
68-
private latestAnnouncementId = "may-16-2025_16:11:00" // update to some unique identifier when we add a new announcement
68+
latestAnnouncementId = "may-16-2025_16:11:00" // update to some unique identifier when we add a new announcement
6969

7070
constructor(
7171
readonly context: vscode.ExtensionContext,
@@ -298,10 +298,6 @@ export class Controller {
298298
text: message.text,
299299
})
300300
break
301-
case "didShowAnnouncement":
302-
await updateGlobalState(this.context, "lastShownAnnouncementId", this.latestAnnouncementId)
303-
await this.postStateToWebview()
304-
break
305301
case "openInBrowser":
306302
if (message.url) {
307303
vscode.env.openExternal(vscode.Uri.parse(message.url))

src/core/controller/ui/methods.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33

44
// Import all method implementations
55
import { registerMethod } from "./index"
6+
import { onDidShowAnnouncement } from "./onDidShowAnnouncement"
67
import { scrollToSettings } from "./scrollToSettings"
78

89
// Register all ui service methods
910
export function registerAllMethods(): void {
1011
// Register each method with the registry
12+
registerMethod("onDidShowAnnouncement", onDidShowAnnouncement)
1113
registerMethod("scrollToSettings", scrollToSettings)
1214
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { EmptyRequest, Boolean } from "../../../shared/proto/common"
2+
import type { Controller } from "../index"
3+
import { getGlobalState, updateGlobalState } from "../../storage/state"
4+
5+
/**
6+
* Marks the current announcement as shown and returns the updated shouldShowAnnouncement value
7+
*
8+
* @param controller The controller instance
9+
* @param _request The empty request (not used)
10+
* @returns Boolean indicating whether an announcement should be shown
11+
*/
12+
export async function onDidShowAnnouncement(controller: Controller, _request: EmptyRequest): Promise<Boolean> {
13+
try {
14+
// Update the lastShownAnnouncementId to the current latestAnnouncementId
15+
await updateGlobalState(controller.context, "lastShownAnnouncementId", controller.latestAnnouncementId)
16+
17+
// Get the updated lastShownAnnouncementId value after the update
18+
const lastShownAnnouncementId = await getGlobalState(controller.context, "lastShownAnnouncementId")
19+
20+
// Calculate the new shouldShowAnnouncement value
21+
// This replicates the same logic used in getStateToPostToWebview()
22+
const shouldShowAnnouncement = lastShownAnnouncementId !== controller.latestAnnouncementId
23+
24+
return { value: shouldShowAnnouncement }
25+
} catch (error) {
26+
console.error("Failed to acknowledge announcement:", error)
27+
return { value: false }
28+
}
29+
}

src/shared/WebviewMessage.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export interface WebviewMessage {
1313
| "newTask"
1414
| "condense"
1515
| "reportBug"
16-
| "didShowAnnouncement"
1716
| "openInBrowser"
1817
| "showChatView"
1918
| "openMcpSettings"

webview-ui/src/App.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import SettingsView from "./components/settings/SettingsView"
55
import WelcomeView from "./components/welcome/WelcomeView"
66
import AccountView from "./components/account/AccountView"
77
import { useExtensionState } from "./context/ExtensionStateContext"
8-
import { vscode } from "./utils/vscode"
8+
import { UiServiceClient } from "./services/grpc-client"
99
import McpView from "./components/mcp/configuration/McpConfigurationView"
1010
import { Providers } from "./Providers"
11+
import { Boolean, EmptyRequest } from "@shared/proto/common"
1112

1213
const AppContent = () => {
1314
const {
@@ -21,6 +22,7 @@ const AppContent = () => {
2122
showAccount,
2223
showAnnouncement,
2324
setShowAnnouncement,
25+
setShouldShowAnnouncement,
2426
closeMcpView,
2527
navigateToHistory,
2628
hideSettings,
@@ -32,7 +34,15 @@ const AppContent = () => {
3234
useEffect(() => {
3335
if (shouldShowAnnouncement) {
3436
setShowAnnouncement(true)
35-
vscode.postMessage({ type: "didShowAnnouncement" })
37+
38+
// Use the gRPC client instead of direct WebviewMessage
39+
UiServiceClient.onDidShowAnnouncement({} as EmptyRequest)
40+
.then((response: Boolean) => {
41+
setShouldShowAnnouncement(response.value)
42+
})
43+
.catch((error) => {
44+
console.error("Failed to acknowledge announcement:", error)
45+
})
3646
}
3747
}, [shouldShowAnnouncement])
3848

webview-ui/src/context/ExtensionStateContext.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ interface ExtensionStateContextType extends ExtensionState {
4545
setCustomInstructions: (value?: string) => void
4646
setTelemetrySetting: (value: TelemetrySetting) => void
4747
setShowAnnouncement: (value: boolean) => void
48+
setShouldShowAnnouncement: (value: boolean) => void
4849
setPlanActSeparateModelsSetting: (value: boolean) => void
4950
setEnableCheckpointsSetting: (value: boolean) => void
5051
setMcpMarketplaceEnabled: (value: boolean) => void
@@ -492,7 +493,8 @@ export const ExtensionStateContextProvider: React.FC<{
492493
...prevState,
493494
mcpMarketplaceEnabled: value,
494495
})),
495-
setShowAnnouncement: (value) =>
496+
setShowAnnouncement,
497+
setShouldShowAnnouncement: (value) =>
496498
setState((prevState) => ({
497499
...prevState,
498500
shouldShowAnnouncement: value,

0 commit comments

Comments
 (0)