From 9361ba0cf821c121593bd8f6ce26344857a8ffd6 Mon Sep 17 00:00:00 2001 From: krow <59503057+copypasteitworks@users.noreply.github.com> Date: Thu, 12 Mar 2026 05:19:06 +0100 Subject: [PATCH] fix: close thread diff panel correctly --- apps/web/src/diffRouteSearch.ts | 4 +++ apps/web/src/routes/_chat.$threadId.tsx | 13 ++------- apps/web/src/threadRouteSearch.test.ts | 38 +++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 apps/web/src/threadRouteSearch.test.ts diff --git a/apps/web/src/diffRouteSearch.ts b/apps/web/src/diffRouteSearch.ts index f310b74b7..1901996b6 100644 --- a/apps/web/src/diffRouteSearch.ts +++ b/apps/web/src/diffRouteSearch.ts @@ -37,3 +37,7 @@ export function parseDiffRouteSearch(search: Record): DiffRoute ...(diffFilePath ? { diffFilePath } : {}), }; } + +export const threadDiffRouteSearchOptions = { + validateSearch: parseDiffRouteSearch, +} as const; diff --git a/apps/web/src/routes/_chat.$threadId.tsx b/apps/web/src/routes/_chat.$threadId.tsx index b85aeab0d..fd291ecb8 100644 --- a/apps/web/src/routes/_chat.$threadId.tsx +++ b/apps/web/src/routes/_chat.$threadId.tsx @@ -1,14 +1,10 @@ import { ThreadId } from "@t3tools/contracts"; -import { createFileRoute, retainSearchParams, useNavigate } from "@tanstack/react-router"; +import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { Suspense, lazy, type ReactNode, useCallback, useEffect } from "react"; import ChatView from "../components/ChatView"; import { useComposerDraftStore } from "../composerDraftStore"; -import { - type DiffRouteSearch, - parseDiffRouteSearch, - stripDiffSearchParams, -} from "../diffRouteSearch"; +import { stripDiffSearchParams, threadDiffRouteSearchOptions } from "../diffRouteSearch"; import { useMediaQuery } from "../hooks/useMediaQuery"; import { useStore } from "../store"; import { Sheet, SheetPopup } from "../components/ui/sheet"; @@ -227,9 +223,6 @@ function ChatThreadRouteView() { } export const Route = createFileRoute("/_chat/$threadId")({ - validateSearch: (search) => parseDiffRouteSearch(search), - search: { - middlewares: [retainSearchParams(["diff"])], - }, + ...threadDiffRouteSearchOptions, component: ChatThreadRouteView, }); diff --git a/apps/web/src/threadRouteSearch.test.ts b/apps/web/src/threadRouteSearch.test.ts new file mode 100644 index 000000000..cc24e61ca --- /dev/null +++ b/apps/web/src/threadRouteSearch.test.ts @@ -0,0 +1,38 @@ +import { + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from "@tanstack/react-router"; +import { describe, expect, it } from "vitest"; + +import { stripDiffSearchParams, threadDiffRouteSearchOptions } from "./diffRouteSearch"; + +describe("thread route diff search state", () => { + it("allows removing diff params from the active thread route", async () => { + const threadId = "thread-route-search-test"; + const rootRoute = createRootRoute(); + const threadRoute = createRoute({ + getParentRoute: () => rootRoute, + path: "$threadId", + ...threadDiffRouteSearchOptions, + component: () => null, + }); + const router = createRouter({ + routeTree: rootRoute.addChildren([threadRoute]), + history: createMemoryHistory({ + initialEntries: [`/${threadId}?diff=1&diffTurnId=turn-1&diffFilePath=src/app.ts`], + }), + }); + + await router.load(); + await router.navigate({ + to: "/$threadId", + params: { threadId }, + search: (previous) => stripDiffSearchParams(previous), + }); + + expect(router.state.location.search).toEqual({}); + expect(router.state.location.href).toBe(`/${threadId}`); + }); +});