History

Remove dead code and fix sidebar split/tab navigation conflict

- Remove unused `nowTick` state variable from ChatView - Remove unused `terminalFocusRequestId` state variable from ChatView - Delete unused `WorkspaceRouteSync` component - Remove redundant router.navigate() calls from sidebar split/tab context menu handlers that conflicted with route-level openThreadSurface("focus-or-tab")

Cursor Agent committed 7 months ago

Commit dc4ee0b1 parent d3d096c3 files · +0 −145Browse files

Unified · Split

3 files
  1. apps/web/src/components/ChatView.tsx +0 −2
  2. apps/web/src/components/Sidebar.tsx +0 −13
  3. apps/web/src/components/workspace/WorkspaceRouteSync.tsx +0 −130
apps/web/src/components/ChatView.tsx+0−2
@@ -498,8 +498,6 @@ export default function ChatView(props: ChatViewProps) { · 497 unmodified lines
498 // When set, the thread-change reset effect will open the sidebar instead of closing it.498 // When set, the thread-change reset effect will open the sidebar instead of closing it.
499 // Used by "Implement in a new thread" to carry the sidebar-open intent across navigation.499 // Used by "Implement in a new thread" to carry the sidebar-open intent across navigation.
500 const planSidebarOpenOnNextThreadRef = useRef(false);500 const planSidebarOpenOnNextThreadRef = useRef(false);
501 const [terminalFocusRequestId, setTerminalFocusRequestId] = useState(0);
502 const [nowTick, setNowTick] = useState(() => Date.now());
503 const [pullRequestDialogState, setPullRequestDialogState] =501 const [pullRequestDialogState, setPullRequestDialogState] =
504 useState<PullRequestDialogState | null>(null);502 useState<PullRequestDialogState | null>(null);
505 const [attachmentPreviewHandoffByMessageId, setAttachmentPreviewHandoffByMessageId] = useState<503 const [attachmentPreviewHandoffByMessageId, setAttachmentPreviewHandoffByMessageId] = useState<
apps/web/src/components/Sidebar.tsx+0−13
@@ -1654,28 +1654,16 @@ const SidebarProjectItem = memo(function SidebarProjectItem(props: SidebarProjec · 1653 unmodified lines
1654 1654
1655 if (clicked === "open-new-tab") {1655 if (clicked === "open-new-tab") {
1656 openThreadInNewTab(serverThreadSurfaceInput(threadRef));1656 openThreadInNewTab(serverThreadSurfaceInput(threadRef));
1657 void router.navigate({
1658 to: "/$environmentId/$threadId",
1659 params: buildThreadRouteParams(threadRef),
1660 });
1661 return;1657 return;
1662 }1658 }
1663 1659
1664 if (clicked === "open-split-right") {1660 if (clicked === "open-split-right") {
1665 openThreadInSplit(serverThreadSurfaceInput(threadRef), "x");1661 openThreadInSplit(serverThreadSurfaceInput(threadRef), "x");
1666 void router.navigate({
1667 to: "/$environmentId/$threadId",
1668 params: buildThreadRouteParams(threadRef),
1669 });
1670 return;1662 return;
1671 }1663 }
1672 1664
1673 if (clicked === "open-split-down") {1665 if (clicked === "open-split-down") {
1674 openThreadInSplit(serverThreadSurfaceInput(threadRef), "y");1666 openThreadInSplit(serverThreadSurfaceInput(threadRef), "y");
1675 void router.navigate({
1676 to: "/$environmentId/$threadId",
1677 params: buildThreadRouteParams(threadRef),
1678 });
1679 return;1667 return;
1680 }1668 }
1681 1669
@@ -1729,7 +1717,6 @@ const SidebarProjectItem = memo(function SidebarProjectItem(props: SidebarProjec · 47 unmodified lines
1729 openThreadInNewTab,1717 openThreadInNewTab,
1730 openThreadInSplit,1718 openThreadInSplit,
1731 project.cwd,1719 project.cwd,
1732 router,
1733 ],1720 ],
1734 );1721 );
1735 1722
apps/web/src/components/workspace/WorkspaceRouteSync.tsx+0−130
@@ -1,130 +0,0 @@
1import { useLocation, useNavigate, useParams } from "@tanstack/react-router";
2import { useEffect, useMemo, useRef } from "react";
3
4import { useComposerDraftStore } from "../../composerDraftStore";
5import { resolveThreadRouteTarget } from "../../threadRoutes";
6import { useFocusedWorkspaceRouteTarget, useWorkspaceStore } from "../../workspace/store";
7import type { ThreadSurfaceInput } from "../../workspace/types";
8
9function sameRouteTarget(
10 left: ReturnType<typeof resolveThreadRouteTarget>,
11 right: ReturnType<typeof resolveThreadRouteTarget>,
12): boolean {
13 if (!left && !right) {
14 return true;
15 }
16 if (!left || !right || left.kind !== right.kind) {
17 return false;
18 }
19 if (left.kind === "server" && right.kind === "server") {
20 return (
21 left.threadRef.environmentId === right.threadRef.environmentId &&
22 left.threadRef.threadId === right.threadRef.threadId
23 );
24 }
25 if (left.kind === "draft" && right.kind === "draft") {
26 return left.draftId === right.draftId;
27 }
28 return false;
29}
30
31export function WorkspaceRouteSync() {
32 const navigate = useNavigate();
33 const openThreadSurface = useWorkspaceStore((state) => state.openThreadSurface);
34 const currentRouteTarget = useParams({
35 strict: false,
36 select: (params) => resolveThreadRouteTarget(params),
37 });
38 const focusedRouteTarget = useFocusedWorkspaceRouteTarget();
39 const pathname = useLocation({
40 select: (location) => location.pathname,
41 });
42 const previousPathnameRef = useRef(pathname);
43 const draftSession = useComposerDraftStore((store) =>
44 currentRouteTarget?.kind === "draft" ? store.getDraftSession(currentRouteTarget.draftId) : null,
45 );
46 const currentRouteSurfaceInput = useMemo<ThreadSurfaceInput | null>(() => {
47 if (!currentRouteTarget) {
48 return null;
49 }
50 if (currentRouteTarget.kind === "server") {
51 return {
52 scope: "server",
53 threadRef: currentRouteTarget.threadRef,
54 };
55 }
56 if (!draftSession) {
57 return null;
58 }
59 return {
60 scope: "draft",
61 draftId: currentRouteTarget.draftId,
62 environmentId: draftSession.environmentId,
63 threadId: draftSession.threadId,
64 };
65 }, [currentRouteTarget, draftSession]);
66
67 useEffect(() => {
68 const pathnameChanged = previousPathnameRef.current !== pathname;
69 previousPathnameRef.current = pathname;
70
71 if (currentRouteTarget) {
72 if (!currentRouteSurfaceInput) {
73 return;
74 }
75
76 if (!focusedRouteTarget || pathnameChanged) {
77 openThreadSurface(currentRouteSurfaceInput, "focus-or-tab");
78 return;
79 }
80
81 if (sameRouteTarget(currentRouteTarget, focusedRouteTarget)) {
82 return;
83 }
84
85 void navigateToRouteTarget(navigate, focusedRouteTarget);
86 return;
87 }
88
89 if (!focusedRouteTarget) {
90 return;
91 }
92
93 void navigateToRouteTarget(navigate, focusedRouteTarget);
94 }, [
95 currentRouteSurfaceInput,
96 currentRouteTarget,
97 focusedRouteTarget,
98 navigate,
99 openThreadSurface,
100 pathname,
101 ]);
102
103 return null;
104}
105
106function navigateToRouteTarget(
107 navigate: ReturnType<typeof useNavigate>,
108 target: NonNullable<ReturnType<typeof resolveThreadRouteTarget>>,
109) {
110 if (target.kind === "server") {
111 return navigate({
112 to: "/$environmentId/$threadId",
113 params: {
114 environmentId: target.threadRef.environmentId,
115 threadId: target.threadRef.threadId,
116 },
117 replace: true,
118 search: {},
119 });
120 }
121
122 return navigate({
123 to: "/draft/$draftId",
124 params: {
125 draftId: target.draftId,
126 },
127 replace: true,
128 search: {},
129 });
130}