import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router' import { QueryClientProvider } from '@tanstack/react-query' import { queryClient } from '@/lib/queryClient' import { useAuthStore } from '@/store/authStore' import type { UserRole } from '@/store/authStore' import LoginPage from '@/pages/auth/LoginPage' import AppDashboardPage from '@/pages/app/DashboardPage' import ClientsPage from '@/pages/app/ClientsPage' import CatalogPage from '@/pages/app/CatalogPage' import WorkOrdersPage from '@/pages/app/WorkOrdersPage' import WorkOrderDetailPage from '@/pages/app/WorkOrderDetailPage' import StaffPage from '@/pages/app/StaffPage' import ExpensesPage from '@/pages/app/ExpensesPage' import SettingsPage from '@/pages/app/SettingsPage' import InvoicesPage from '@/pages/app/InvoicesPage' import ReportsPage from '@/pages/app/ReportsPage' import VehicleReportsPage from '@/pages/app/VehicleReportsPage' import ExpenseReportsPage from '@/pages/app/ExpenseReportsPage' import TechnicianReportsPage from '@/pages/app/TechnicianReportsPage' import HelpPage from '@/pages/app/HelpPage' import AdminDashboardPage from '@/pages/admin/DashboardPage' import TenantsPage from '@/pages/admin/TenantsPage' import AdminSettingsPage from '@/pages/admin/SettingsPage' import InviteRedeemPage from '@/pages/public/InviteRedeemPage' import AppLayout from '@/components/layout/AppLayout' import AdminLayout from '@/components/layout/AdminLayout' function RequireAuth({ children, allowedRoles, }: { children: React.ReactNode allowedRoles: UserRole[] }) { const { isAuthenticated, user } = useAuthStore() const location = useLocation() if (!isAuthenticated) return // Allow super_admin carrying an impersonation payload through to /app — // AppLayout applies the role switch on mount via useLayoutEffect. const hasImpersonation = !!location.state?.impersonation if (user && !allowedRoles.includes(user.role) && !hasImpersonation) { return } return <>{children} } export default function App() { return ( } /> } /> } > } /> } /> } /> } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ) }