diff --git a/src/App.tsx b/src/App.tsx index c11602c1..6101ae9b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -66,7 +66,7 @@ function WorkspaceTabRoute() { tab: string; }>(); - if (!workspaceId) { + if (!workspaceId && !sessionId) { return ; } @@ -74,7 +74,7 @@ function WorkspaceTabRoute() { return ; } - const decodedWorkspaceId = decodeURIComponent(workspaceId); + const decodedWorkspaceId = workspaceId ? decodeURIComponent(workspaceId) : null; const decodedSessionId = sessionId ? decodeURIComponent(sessionId) : null; const decodedTab = tab ? decodeURIComponent(tab) : 'chat'; @@ -83,7 +83,10 @@ function WorkspaceTabRoute() {

{decodedTab} view

- Workspace: {decodedWorkspaceId} + Workspace:{' '} + + {decodedWorkspaceId || 'none (session-level route)'} +

Session:{' '} @@ -102,20 +105,20 @@ const router = createBrowserRouter( path: '/', element: , children: [ - { index: true, element: }, + { index: true, element: }, // TODO: Show empty state component loader here. { path: 'workspaces/:workspaceId', element: , children: [ { index: true, element: }, { path: ':tab', element: }, - { - path: 'sessions/:sessionId', - children: [ - { index: true, element: }, - { path: ':tab', element: }, - ], - }, + ], + }, + { + path: 'sessions/:sessionId', + children: [ + { index: true, element: }, + { path: ':tab', element: }, ], }, ], diff --git a/src/components/refactored/shared/layout/MainHeading.tsx b/src/components/refactored/shared/layout/MainHeading.tsx index 87b520bb..e0670931 100644 --- a/src/components/refactored/shared/layout/MainHeading.tsx +++ b/src/components/refactored/shared/layout/MainHeading.tsx @@ -111,22 +111,20 @@ export function MainHeading() { return () => observer.disconnect(); }, [isMobile, updateScrollState]); - if (!workspaceId) { + if (!workspaceId && !sessionId) { return null; } const handleTabSelect = (nextTab: AppTab) => { - // Preserve workspace/session context while switching only the active tab path segment. - const encodedWorkspaceId = encodeURIComponent(decodedWorkspaceId); + // Preserve route context while switching only the active tab path segment. const encodedTab = encodeURIComponent(nextTab); if (decodedSessionId) { - navigate( - `/workspaces/${encodedWorkspaceId}/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`, - ); + navigate(`/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`); return; } + const encodedWorkspaceId = encodeURIComponent(decodedWorkspaceId); navigate(`/workspaces/${encodedWorkspaceId}/${encodedTab}`); }; @@ -158,7 +156,7 @@ export function MainHeading() { {title}

- {decodedWorkspaceId} + {decodedWorkspaceId || t('mainContent.newSession')}
diff --git a/src/components/refactored/shared/layout/MobileNav.tsx b/src/components/refactored/shared/layout/MobileNav.tsx index c8f24ad7..381989a8 100644 --- a/src/components/refactored/shared/layout/MobileNav.tsx +++ b/src/components/refactored/shared/layout/MobileNav.tsx @@ -89,21 +89,19 @@ export function MobileNav() { }, [moreOpen]); const navigateToTab = (nextTab: AppTab) => { - if (!workspaceId) { + if (!workspaceId && !sessionId) { return; } - const encodedWorkspaceId = encodeURIComponent(decodeValue(workspaceId)); const encodedTab = encodeURIComponent(nextTab); const decodedSessionId = decodeValue(sessionId); if (decodedSessionId) { - navigate( - `/workspaces/${encodedWorkspaceId}/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`, - ); + navigate(`/sessions/${encodeURIComponent(decodedSessionId)}/${encodedTab}`); return; } + const encodedWorkspaceId = encodeURIComponent(decodeValue(workspaceId)); navigate(`/workspaces/${encodedWorkspaceId}/${encodedTab}`); }; diff --git a/src/components/refactored/sidebar/hooks/useWorkspaces.ts b/src/components/refactored/sidebar/hooks/useWorkspaces.ts index e2f71be6..72bbb540 100644 --- a/src/components/refactored/sidebar/hooks/useWorkspaces.ts +++ b/src/components/refactored/sidebar/hooks/useWorkspaces.ts @@ -23,7 +23,7 @@ import { splitWorkspacesByStarred, } from '@/components/refactored/sidebar/utils/workspaceTransforms'; -const SESSION_ROUTE_PATTERN = /^\/workspaces\/[^/]+\/sessions\/([^/]+)(?:\/[^/]+)?$/; +const SESSION_ROUTE_PATTERN = /^\/sessions\/([^/]+)(?:\/[^/]+)?$/; const extractSessionIdFromPathname = (pathname: string): string | null => { const sessionMatch = pathname.match(SESSION_ROUTE_PATTERN); @@ -120,7 +120,7 @@ export const useWorkspaces = () => { } navigate( - `/workspaces/${encodeURIComponent(matchedWorkspace.workspaceId)}/sessions/${encodeURIComponent(sessionId)}`, + `/sessions/${encodeURIComponent(sessionId)}`, ); }, [navigate, workspaces],