import { lazy, Suspense, useEffect } from 'react' import { createRouter, createRootRoute, createRoute, redirect, Outlet, useNavigate, useRouterState } from '@tanstack/react-router' import { WorkspacePageWithBoundary } from '@/features/workspace/WorkspacePage' import { ImportPage } from '@/features/import/ImportPage' import { LibraryPage } from '@/features/library/LibraryPage' import { SettingsPage } from '@/features/settings/SettingsPage' import { ResourceCatalogPage } from '@/features/resources/ResourceCatalogPage' import { LoginPage } from '@/features/login/LoginPage' import { ResetPasswordPage } from '@/features/auth/ResetPasswordPage' import { ConfirmInvitePage } from '@/features/auth/ConfirmInvitePage' import { AdminLayout } from '@/features/admin/AdminLayout' import { OrganizationsPage } from '@/features/admin/OrganizationsPage' import { OrganizationDetailPage } from '@/features/admin/OrganizationDetailPage' import { UsersPage } from '@/features/admin/UsersPage' import { useAuth } from '@/auth/AuthContext' import { Loader2 } from 'lucide-react' const ReportPage = lazy(() => import('@/features/report/ReportPage').then((m) => ({ default: m.ReportPage })) ) function ReportPageWithSuspense() { return (

Cargando reporte…

}>
) } const PUBLIC_PATHS = ['/login', '/reset-password', '/auth/confirm'] function RootComponent() { const { user, loading, pendingPasswordReset } = useAuth() const navigate = useNavigate() const pathname = useRouterState({ select: (s) => s.location.pathname }) useEffect(() => { if (loading) return // Usuario con PASSWORD_RECOVERY activo → forzar /reset-password if (user && pendingPasswordReset && pathname !== '/reset-password') { void navigate({ to: '/reset-password' }) return } if (!user && !PUBLIC_PATHS.includes(pathname)) { void navigate({ to: '/login' }) } else if (user && !pendingPasswordReset && pathname === '/login') { void navigate({ to: '/' }) } }, [user, loading, pathname, navigate, pendingPasswordReset]) if (loading) { return (
) } if (!user && !PUBLIC_PATHS.includes(pathname)) return (
) return } // Redirect /admin → /admin/organizations function AdminIndexRedirect() { const navigate = useNavigate() useEffect(() => { void navigate({ to: '/admin/organizations' }) }, [navigate]) return null } const rootRoute = createRootRoute({ component: RootComponent }) const loginRoute = createRoute({ getParentRoute: () => rootRoute, path: '/login', component: LoginPage, }) const resetPasswordRoute = createRoute({ getParentRoute: () => rootRoute, path: '/reset-password', component: ResetPasswordPage, }) const confirmInviteRoute = createRoute({ getParentRoute: () => rootRoute, path: '/auth/confirm', component: ConfirmInvitePage, }) const indexRoute = createRoute({ getParentRoute: () => rootRoute, path: '/', component: LibraryPage, }) const libraryRoute = createRoute({ getParentRoute: () => rootRoute, path: '/library', component: LibraryPage, }) const importRoute = createRoute({ getParentRoute: () => rootRoute, path: '/import', component: ImportPage, }) const workspaceRoute = createRoute({ getParentRoute: () => rootRoute, path: '/workspace/$processId', component: WorkspacePageWithBoundary, }) const reportRoute = createRoute({ getParentRoute: () => rootRoute, path: '/report/$processId', component: ReportPageWithSuspense, }) const settingsRoute = createRoute({ getParentRoute: () => rootRoute, path: '/settings', component: SettingsPage, beforeLoad: ({ context }) => { const role = (context as { auth?: { user?: { platformRole?: string } } }).auth?.user?.platformRole if (role === 'client_editor' || role === 'client_viewer') { throw redirect({ to: '/library' }) } }, }) const resourcesRoute = createRoute({ getParentRoute: () => rootRoute, path: '/recursos', component: ResourceCatalogPage, }) // ─── Admin routes (guard de platform_admin en AdminLayout) ──────────────────── const adminLayoutRoute = createRoute({ getParentRoute: () => rootRoute, path: '/admin', component: AdminLayout, }) const adminIndexRoute = createRoute({ getParentRoute: () => adminLayoutRoute, path: '/', component: AdminIndexRedirect, }) const adminOrgsRoute = createRoute({ getParentRoute: () => adminLayoutRoute, path: '/organizations', component: OrganizationsPage, }) const adminOrgDetailRoute = createRoute({ getParentRoute: () => adminLayoutRoute, path: '/organizations/$orgId', component: OrganizationDetailPage, }) const adminUsersRoute = createRoute({ getParentRoute: () => adminLayoutRoute, path: '/users', component: UsersPage, }) const routeTree = rootRoute.addChildren([ loginRoute, resetPasswordRoute, confirmInviteRoute, indexRoute, libraryRoute, importRoute, workspaceRoute, reportRoute, settingsRoute, resourcesRoute, adminLayoutRoute.addChildren([ adminIndexRoute, adminOrgsRoute, adminOrgDetailRoute, adminUsersRoute, ]), ]) export const router = createRouter({ routeTree }) declare module '@tanstack/react-router' { interface Register { router: typeof router } }