From afcd824ae9ca93672fda317562e0076ce8918c89 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Mon, 2 Mar 2026 11:05:39 -0800 Subject: [PATCH] fix(web): resolve post-rebase selector/store regressions Remove duplicate selector declarations introduced during rebase and restore the streamlined AppStore shape so Zustand selector usage remains consistent. Restore Sidebar cleanup semantics and pure store test assertions so lint/typecheck stay green after rebasing. Made-with: Cursor --- apps/web/src/components/BranchToolbar.tsx | 7 ------- apps/web/src/components/ChatView.tsx | 10 ---------- apps/web/src/components/Sidebar.tsx | 7 ++++--- apps/web/src/store.test.ts | 6 +++--- apps/web/src/store.ts | 23 ----------------------- 5 files changed, 7 insertions(+), 46 deletions(-) diff --git a/apps/web/src/components/BranchToolbar.tsx b/apps/web/src/components/BranchToolbar.tsx index c3bc6c4a31fb75ac73c851161b21e6171e898311..7d1317af142920f0ceffd949ed1ca60455f84714 100644 --- a/apps/web/src/components/BranchToolbar.tsx +++ b/apps/web/src/components/BranchToolbar.tsx @@ -48,13 +48,6 @@ export default function BranchToolbar({ const setThreadBranchAction = useStore((store) => store.setThreadBranch); const setThreadErrorAction = useStore((store) => store.setError); const draftThread = useComposerDraftStore((store) => store.getDraftThread(threadId)); - const serverThread = useStore((state) => - state.threads.find((thread) => thread.id === threadId), - ); - const activeProjectId = serverThread?.projectId ?? draftThread?.projectId ?? null; - const activeProject = useStore((state) => - activeProjectId ? state.projects.find((project) => project.id === activeProjectId) : undefined, - ); const setDraftThreadContext = useComposerDraftStore((store) => store.setDraftThreadContext); const queryClient = useQueryClient(); diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index e7feeffa92e83761f616be81314088b0a37a02f5..8261aded088b7f83478387f0cbc88c458c95aa06 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -475,15 +475,6 @@ export default function ChatView({ threadId }: ChatViewProps) { const clearDraftThread = useComposerDraftStore((store) => store.clearDraftThread); const setDraftThreadContext = useComposerDraftStore((store) => store.setDraftThreadContext); const draftThread = useComposerDraftStore((store) => store.draftThreadsByThreadId[threadId] ?? null); - const serverThread = useStore((state) => - state.threads.find((thread) => thread.id === threadId), - ); - const fallbackDraftProjectId = draftThread?.projectId ?? null; - const fallbackDraftProject = useStore((state) => - fallbackDraftProjectId - ? state.projects.find((project) => project.id === fallbackDraftProjectId) - : undefined, - ); const promptRef = useRef(prompt); const [isDragOverComposer, setIsDragOverComposer] = useState(false); const [expandedImage, setExpandedImage] = useState(null); @@ -1714,7 +1705,6 @@ export default function ChatView({ threadId }: ChatViewProps) { splitTerminal, keybindings, onToggleDiff, - setThreadTerminalOpen, toggleTerminalVisibility, ]); diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index e6eccbd89e42686038aad5842512cb5b80c3031a..acd0c698998b97b6b1ac3e799f6c27f29c5b6cc2 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -470,10 +470,11 @@ export default function Sidebar() { await handleNewThread(projectId).catch(() => undefined); } } + } finally { + setIsAddingProject(false); + setNewCwd(""); + setAddingProject(false); } - setIsAddingProject(false); - setNewCwd(""); - setAddingProject(false); }, [focusMostRecentThreadForProject, handleNewThread, isAddingProject, projects], ); diff --git a/apps/web/src/store.test.ts b/apps/web/src/store.test.ts index 2514d32619acac907db49d5906aa74393825f022..2b29dd8ff8590ab7d29e9000a269bcdd938d6379 100644 --- a/apps/web/src/store.test.ts +++ b/apps/web/src/store.test.ts @@ -1,5 +1,5 @@ import { ProjectId, ThreadId, TurnId } from "@t3tools/contracts"; -import { beforeEach, describe, expect, it } from "vitest"; +import { describe, expect, it } from "vitest"; import { markThreadUnread, type AppState } from "./store"; import type { Thread } from "./types"; @@ -61,7 +61,7 @@ describe("store pure functions", () => { const next = markThreadUnread(initialState, ThreadId.makeUnsafe("thread-1")); - const updatedThread = useStore.getState().threads[0]; + const updatedThread = next.threads[0]; expect(updatedThread).toBeDefined(); expect(updatedThread?.lastVisitedAt).toBe("2026-02-25T12:29:59.999Z"); expect(Date.parse(updatedThread?.lastVisitedAt ?? "")).toBeLessThan( @@ -79,6 +79,6 @@ describe("store pure functions", () => { const next = markThreadUnread(initialState, ThreadId.makeUnsafe("thread-1")); - expect(useStore.getState().threads[0]?.lastVisitedAt).toBe("2026-02-25T12:35:00.000Z"); + expect(next).toEqual(initialState); }); }); diff --git a/apps/web/src/store.ts b/apps/web/src/store.ts index 790b5a24e64a22debaea496f86dd388f4736e562..3152db2b88c90f473da89229f8bc78b40fba2a78 100644 --- a/apps/web/src/store.ts +++ b/apps/web/src/store.ts @@ -25,29 +25,6 @@ export interface AppState { runtimeMode: RuntimeMode; } -interface AppStore extends AppState { - syncServerReadModel: (readModel: OrchestrationReadModel) => void; - markThreadVisited: (threadId: ThreadId, visitedAt?: string) => void; - markThreadUnread: (threadId: ThreadId) => void; - toggleProject: (projectId: Project["id"]) => void; - setThreadTerminalActivity: ( - threadId: ThreadId, - terminalId: string, - hasRunningSubprocess: boolean, - ) => void; - setProjectExpanded: (projectId: Project["id"], expanded: boolean) => void; - toggleThreadTerminal: (threadId: ThreadId) => void; - setThreadTerminalOpen: (threadId: ThreadId, open: boolean) => void; - setThreadTerminalHeight: (threadId: ThreadId, height: number) => void; - splitThreadTerminal: (threadId: ThreadId, terminalId: string) => void; - newThreadTerminal: (threadId: ThreadId, terminalId: string) => void; - setThreadActiveTerminal: (threadId: ThreadId, terminalId: string) => void; - closeThreadTerminal: (threadId: ThreadId, terminalId: string) => void; - setThreadError: (threadId: ThreadId, error: string | null) => void; - setThreadBranch: (threadId: ThreadId, branch: string | null, worktreePath: string | null) => void; - setRuntimeMode: (mode: RuntimeMode) => void; -} - const PERSISTED_STATE_KEY = "t3code:renderer-state:v7"; const LEGACY_PERSISTED_STATE_KEYS = [ "t3code:renderer-state:v6", -- 2.54.0