diff --git a/src/browser/stories/App.demo.stories.tsx b/src/browser/stories/App.demo.stories.tsx index 949eb34ceb..74de23e80f 100644 --- a/src/browser/stories/App.demo.stories.tsx +++ b/src/browser/stories/App.demo.stories.tsx @@ -17,49 +17,22 @@ import { createStatusTool, createStaticChatHandler, createStreamingChatHandler, - createGitStatusOutput, type GitStatusFixture, } from "./mockFactory"; -import { selectWorkspace, setWorkspaceInput, setWorkspaceModel } from "./storyHelpers"; +import { + createGitStatusExecutor, + createOnChatAdapter, + type ChatHandler, + selectWorkspace, + setWorkspaceInput, + setWorkspaceModel, +} from "./storyHelpers"; import { createMockORPCClient } from "../../../.storybook/mocks/orpc"; -import type { WorkspaceChatMessage } from "@/common/orpc/types"; - export default { ...appMeta, title: "App/Demo", }; -type ChatHandler = (callback: (event: WorkspaceChatMessage) => void) => () => void; - -/** Adapts callback-based chat handlers to ORPC onChat format */ -function createOnChatAdapter(chatHandlers: Map) { - return (workspaceId: string, emit: (msg: WorkspaceChatMessage) => void) => { - const handler = chatHandlers.get(workspaceId); - if (handler) { - return handler(emit); - } - queueMicrotask(() => emit({ type: "caught-up" })); - return undefined; - }; -} - -/** Creates an executeBash function that returns git status output for workspaces */ -function createGitStatusExecutor(gitStatus: Map) { - return (workspaceId: string, script: string) => { - if (script.includes("git status") || script.includes("git show-branch")) { - const status = gitStatus.get(workspaceId) ?? {}; - const output = createGitStatusOutput(status); - return Promise.resolve({ success: true as const, output, exitCode: 0, wall_duration_ms: 50 }); - } - return Promise.resolve({ - success: true as const, - output: "", - exitCode: 0, - wall_duration_ms: 0, - }); - }; -} - /** * Comprehensive story showing all sidebar indicators and chat features. * diff --git a/src/browser/stories/App.sidebar.stories.tsx b/src/browser/stories/App.sidebar.stories.tsx index d93611516d..bd793a1460 100644 --- a/src/browser/stories/App.sidebar.stories.tsx +++ b/src/browser/stories/App.sidebar.stories.tsx @@ -15,33 +15,29 @@ import { createGitStatusOutput, type GitStatusFixture, } from "./mockFactory"; -import { expandProjects } from "./storyHelpers"; +import { + clearWorkspaceSelection, + createOnChatAdapter, + type ChatHandler, + expandProjects, +} from "./storyHelpers"; import { GIT_STATUS_INDICATOR_MODE_KEY } from "@/common/constants/storage"; import { within, userEvent, waitFor } from "@storybook/test"; import { createMockORPCClient } from "../../../.storybook/mocks/orpc"; -import type { WorkspaceChatMessage } from "@/common/orpc/types"; - export default { ...appMeta, title: "App/Sidebar", + decorators: [ + (Story: () => JSX.Element) => { + // Sidebar stories are about list organization; keep the main panel unselected. + clearWorkspaceSelection(); + return ; + }, + ], }; -type ChatHandler = (callback: (event: WorkspaceChatMessage) => void) => () => void; - -/** Adapts callback-based chat handlers to ORPC onChat format */ -function createOnChatAdapter(chatHandlers: Map) { - return (workspaceId: string, emit: (msg: WorkspaceChatMessage) => void) => { - const handler = chatHandlers.get(workspaceId); - if (handler) { - return handler(emit); - } - queueMicrotask(() => emit({ type: "caught-up" })); - return undefined; - }; -} - /** * Creates an executeBash function that returns deterministic git outputs for Storybook. * diff --git a/src/browser/stories/storyHelpers.ts b/src/browser/stories/storyHelpers.ts index d965143f71..479b089fd7 100644 --- a/src/browser/stories/storyHelpers.ts +++ b/src/browser/stories/storyHelpers.ts @@ -45,6 +45,11 @@ export function selectWorkspace(workspace: FrontendWorkspaceMetadata): void { ); } +/** Clear workspace selection from localStorage (for sidebar-focused stories) */ +export function clearWorkspaceSelection(): void { + localStorage.removeItem(SELECTED_WORKSPACE_KEY); +} + /** Set input text for a workspace */ export function setWorkspaceInput(workspaceId: string, text: string): void { localStorage.setItem(getInputKey(workspaceId), text); @@ -98,7 +103,7 @@ export function createReview( // ═══════════════════════════════════════════════════════════════════════════════ /** Creates an executeBash function that returns git status output for workspaces */ -function createGitStatusExecutor(gitStatus?: Map) { +export function createGitStatusExecutor(gitStatus?: Map) { return (workspaceId: string, script: string) => { if (script.includes("git status") || script.includes("git show-branch")) { const status = gitStatus?.get(workspaceId) ?? {}; @@ -118,10 +123,10 @@ function createGitStatusExecutor(gitStatus?: Map) { // CHAT HANDLER ADAPTER // ═══════════════════════════════════════════════════════════════════════════════ -type ChatHandler = (callback: (event: WorkspaceChatMessage) => void) => () => void; +export type ChatHandler = (callback: (event: WorkspaceChatMessage) => void) => () => void; /** Adapts callback-based chat handlers to ORPC onChat format */ -function createOnChatAdapter(chatHandlers: Map) { +export function createOnChatAdapter(chatHandlers: Map) { return (workspaceId: string, emit: (msg: WorkspaceChatMessage) => void) => { const handler = chatHandlers.get(workspaceId); if (handler) {