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",