From f3f55a68578fcacb21e30db68a2cceeb637e2ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Ben=C3=ADtez?= Date: Tue, 7 Jul 2026 14:24:26 -0300 Subject: [PATCH] =?UTF-8?q?Resumen=20de=20los=20cambios=20del=20fix=20de?= =?UTF-8?q?=20navegaci=C3=B3n:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LibraryPage.tsx:778 — reemplazó useSearch({ from: '/' }) por useRouterState + URLSearchParams. Ahora funciona tanto desde / como desde /library. WorkspacePage.tsx:206-209 — handleBack() navega a /library (con o sin ?org=uuid) en lugar de /. workspace-back-button.test.ts — backTo actualizado a /library y /library?org=... en los 6 tests. library-ui.test.tsx — mock de useSearch → useRouterState (devuelve { location: { search: '' } }). --- src/features/library/LibraryPage.tsx | 5 +++-- src/features/workspace/WorkspacePage.tsx | 4 ++-- src/router.tsx | 7 ++++++ tests/features/library/library-ui.test.tsx | 2 +- .../workspace/workspace-back-button.test.ts | 22 +++++++++---------- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/features/library/LibraryPage.tsx b/src/features/library/LibraryPage.tsx index 8c764fd..d913736 100644 --- a/src/features/library/LibraryPage.tsx +++ b/src/features/library/LibraryPage.tsx @@ -1,5 +1,5 @@ import { useEffect, useState, useRef, useCallback } from 'react' -import { useNavigate, useSearch } from '@tanstack/react-router' +import { useNavigate, useRouterState } from '@tanstack/react-router' import { Upload, Search, Plus, Building2, FolderX, GitBranch, Clock, TrendingUp, BarChart2, FileX2, X, Settings, @@ -775,7 +775,8 @@ export function LibraryPage() { const navigate = useNavigate() const { load, processes, groups, settings, isLoading } = useLibraryStore() const { user, isProfileLoaded } = useAuth() - const { org: orgParam } = useSearch({ from: '/' }) as { org?: string } + const searchStr = useRouterState({ select: (s) => s.location.search }) + const orgParam = new URLSearchParams(searchStr).get('org') const [view, setView] = useState<'home' | 'group'>('home') const [activeGroupId, setActiveGroupId] = useState(null) const [transitioning, setTransitioning] = useState(false) diff --git a/src/features/workspace/WorkspacePage.tsx b/src/features/workspace/WorkspacePage.tsx index a4f3b4d..20aebff 100644 --- a/src/features/workspace/WorkspacePage.tsx +++ b/src/features/workspace/WorkspacePage.tsx @@ -203,9 +203,9 @@ export function WorkspacePage() { function handleBack() { const orgId = currentProcess?.orgId if (orgId && !isClientRole) { - void navigate({ to: '/', search: { org: orgId } }) + void navigate({ to: '/library', search: { org: orgId } as never }) } else { - void navigate({ to: '/' }) + void navigate({ to: '/library' }) } } diff --git a/src/router.tsx b/src/router.tsx index 92910c7..fe34923 100644 --- a/src/router.tsx +++ b/src/router.tsx @@ -103,6 +103,12 @@ const indexRoute = createRoute({ component: LibraryPage, }) +const libraryRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/library', + component: LibraryPage, +}) + const importRoute = createRoute({ getParentRoute: () => rootRoute, path: '/import', @@ -170,6 +176,7 @@ const routeTree = rootRoute.addChildren([ resetPasswordRoute, confirmInviteRoute, indexRoute, + libraryRoute, importRoute, workspaceRoute, reportRoute, diff --git a/tests/features/library/library-ui.test.tsx b/tests/features/library/library-ui.test.tsx index 5ee9626..992302f 100644 --- a/tests/features/library/library-ui.test.tsx +++ b/tests/features/library/library-ui.test.tsx @@ -73,7 +73,7 @@ vi.mock('@/components/AppHeader', () => ({ AppHeader: () => null })) vi.mock('@tanstack/react-router', () => ({ useNavigate: () => vi.fn(), - useSearch: () => ({}), + useRouterState: () => ({ location: { search: '' } }), Link: ({ children }: { children: React.ReactNode }) => <>{children}, })) diff --git a/tests/features/workspace/workspace-back-button.test.ts b/tests/features/workspace/workspace-back-button.test.ts index 4be2586..bc19589 100644 --- a/tests/features/workspace/workspace-back-button.test.ts +++ b/tests/features/workspace/workspace-back-button.test.ts @@ -17,44 +17,44 @@ function resolveBackButton( : orgId ? (orgName ?? 'Volver') : 'Biblioteca' - const backTo = orgId && !isClientRole ? `/?org=${orgId}` : '/' + const backTo = orgId && !isClientRole ? `/library?org=${orgId}` : '/library' return { backLabel, backTo } } describe('workspace back button — lógica de backLabel y backTo', () => { - it('1. admin con proceso de cliente → muestra nombre de org y navega a /?org=uuid', () => { + it('1. admin con proceso de cliente → muestra nombre de org y navega a /library?org=uuid', () => { const { backLabel, backTo } = resolveBackButton('platform_admin', 'org-uuid-123', 'Solar Banco') expect(backLabel).toBe('Solar Banco') - expect(backTo).toBe('/?org=org-uuid-123') + expect(backTo).toBe('/library?org=org-uuid-123') }) it('2. admin con proceso de cliente mientras orgName carga → muestra "Volver" como fallback', () => { const { backLabel, backTo } = resolveBackButton('platform_admin', 'org-uuid-123', null) expect(backLabel).toBe('Volver') - expect(backTo).toBe('/?org=org-uuid-123') + expect(backTo).toBe('/library?org=org-uuid-123') }) - it('3. admin sin org asignada → muestra "Biblioteca" y navega a /', () => { + it('3. admin sin org asignada → muestra "Biblioteca" y navega a /library', () => { const { backLabel, backTo } = resolveBackButton('platform_admin', null, null) expect(backLabel).toBe('Biblioteca') - expect(backTo).toBe('/') + expect(backTo).toBe('/library') }) it('4. member sin org → igual que platform_admin', () => { const { backLabel, backTo } = resolveBackButton('member', null, null) expect(backLabel).toBe('Biblioteca') - expect(backTo).toBe('/') + expect(backTo).toBe('/library') }) - it('5. client_editor con proceso de cliente → muestra "Procesos" y navega a /', () => { + it('5. client_editor con proceso de cliente → muestra "Procesos" y navega a /library', () => { const { backLabel, backTo } = resolveBackButton('client_editor', 'org-uuid-123', 'Solar Banco') expect(backLabel).toBe('Procesos') - expect(backTo).toBe('/') + expect(backTo).toBe('/library') }) - it('6. client_viewer con proceso de cliente → muestra "Procesos" y navega a /', () => { + it('6. client_viewer con proceso de cliente → muestra "Procesos" y navega a /library', () => { const { backLabel, backTo } = resolveBackButton('client_viewer', 'org-uuid-123', 'Solar Banco') expect(backLabel).toBe('Procesos') - expect(backTo).toBe('/') + expect(backTo).toBe('/library') }) })