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 (
} />
} />
}
>
} />
} />
} />
}
>
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
)
}