diff --git a/apps/review-desktop/code-oss/src/vs/review/browser/reviewNotification.ts b/apps/review-desktop/code-oss/src/vs/review/browser/reviewNotification.ts index dbc138e6c..450c8f5c7 100644 --- a/apps/review-desktop/code-oss/src/vs/review/browser/reviewNotification.ts +++ b/apps/review-desktop/code-oss/src/vs/review/browser/reviewNotification.ts @@ -5,7 +5,7 @@ import type { ReviewDisposable, ReviewNotification } from "../common/reviewProto export function showReviewNotification( notifications: Pick, - { kind, text, actions, onClose }: ReviewNotification, + { kind, text, actions, closeAfterMs, onClose }: ReviewNotification, ): ReviewDisposable { const handle = notifications.notify({ severity: kind === "error" ? Severity.Error : Severity.Info, @@ -14,6 +14,10 @@ export function showReviewNotification( ? { primary: actions.map((action, index) => toAction({ id: `review.notification.${index}`, label: action.label, run: () => action.run() })) } : undefined, }); + if (closeAfterMs !== undefined) { + const timer = setTimeout(() => handle.close(), closeAfterMs); + Event.once(handle.onDidClose)(() => clearTimeout(timer)); + } if (onClose) Event.once(handle.onDidClose)(onClose); return { dispose: () => handle.close() }; } diff --git a/packages/review-protocol/src/contracts.ts b/packages/review-protocol/src/contracts.ts index 3d6d0e21d..313ee01f4 100644 --- a/packages/review-protocol/src/contracts.ts +++ b/packages/review-protocol/src/contracts.ts @@ -370,6 +370,7 @@ export interface ReviewNotification { kind: "success" | "error"; text: string; actions?: readonly { label: string; run(): void }[]; + closeAfterMs?: number; onClose?(): void; } diff --git a/packages/review/app/src/agent-selection.test.tsx b/packages/review/app/src/agent-selection.test.tsx index 739ea2418..dcf55047f 100644 --- a/packages/review/app/src/agent-selection.test.tsx +++ b/packages/review/app/src/agent-selection.test.tsx @@ -137,6 +137,7 @@ it("copies only on click or Shift+Cmd+C, reports failures, and clears on revisio expect(notify).toHaveBeenLastCalledWith({ kind: "success", text: expect.stringContaining("copied to clipboard"), + closeAfterMs: 5_000, }); expect(container.querySelector('[role="status"]')).toBeNull(); await act(async () => { diff --git a/packages/review/app/src/agent-selection.tsx b/packages/review/app/src/agent-selection.tsx index b0bcb5406..d5e1380a3 100644 --- a/packages/review/app/src/agent-selection.tsx +++ b/packages/review/app/src/agent-selection.tsx @@ -235,6 +235,7 @@ export function AgentSelectionProvider({ notify({ kind: "success", text: "Selection copied to clipboard. Paste into your agent to chat about it.", + closeAfterMs: 5_000, }); } catch { setCopiedSelection(null); diff --git a/packages/review/app/src/ask-setup.tsx b/packages/review/app/src/ask-setup.tsx index ffcf29d98..1c2627079 100644 --- a/packages/review/app/src/ask-setup.tsx +++ b/packages/review/app/src/ask-setup.tsx @@ -34,6 +34,7 @@ export function AskSetup({ notify({ kind: "success", text: "Selection copied to clipboard. Paste into your agent to chat about it.", + closeAfterMs: 5_000, }); } catch { notify({ diff --git a/packages/review/app/src/bug-report-dialog.browser.test.tsx b/packages/review/app/src/bug-report-dialog.browser.test.tsx index 9ccd5addc..6b2b0cf7f 100644 --- a/packages/review/app/src/bug-report-dialog.browser.test.tsx +++ b/packages/review/app/src/bug-report-dialog.browser.test.tsx @@ -70,6 +70,7 @@ describe("BugReportControl", () => { expect(notify).toHaveBeenCalledWith({ kind: "success", text: "Bug report was sent.", + closeAfterMs: 5_000, }); expect(container.querySelector("dialog")).toBeNull(); }); diff --git a/packages/review/app/src/bug-report-dialog.tsx b/packages/review/app/src/bug-report-dialog.tsx index 5949d7b28..b9dd8bf76 100644 --- a/packages/review/app/src/bug-report-dialog.tsx +++ b/packages/review/app/src/bug-report-dialog.tsx @@ -132,6 +132,7 @@ export function BugReportControl({ notify({ kind: "success", text: "Bug report was sent.", + closeAfterMs: 5_000, }); reset(); setOpen(false); diff --git a/packages/review/app/src/onboarding/draw-flow.tsx b/packages/review/app/src/onboarding/draw-flow.tsx index e60b27458..b6c37d3e8 100644 --- a/packages/review/app/src/onboarding/draw-flow.tsx +++ b/packages/review/app/src/onboarding/draw-flow.tsx @@ -71,6 +71,7 @@ export function DrawFlow({ ? { kind: "success", text: "Prompt copied. Paste it into your agent.", + closeAfterMs: 5_000, } : { kind: "error", diff --git a/packages/review/app/src/review-home-view.tsx b/packages/review/app/src/review-home-view.tsx index b2a95a76e..4d94d196e 100644 --- a/packages/review/app/src/review-home-view.tsx +++ b/packages/review/app/src/review-home-view.tsx @@ -955,6 +955,7 @@ function ReviewHomeBody({ ? { kind: "success", text: "Copied 'founders@dev.fast' to clipboard", + closeAfterMs: 5_000, } : { kind: "error", text: "Couldn't copy email. Please try again." }, );