import { lazy, Suspense } from "react"; import { Routes, Route } from "react-router-dom"; import { QueryClientProvider } from "@tanstack/react-query"; import { AuthProvider } from "./context/AuthContext"; import { AlertProvider } from "./context/AlertContext"; import { queryClient } from "./lib/queryClient"; import ErrorBoundary from "./components/ErrorBoundary"; import AppShell from "./ui/AppShell"; import AlertContainer from "./components/AlertContainer"; import MuiProvider from "./ui/MuiProvider"; import { LoadingState } from "./ui"; import Login from "./pages/Login"; import Dashboard from "./pages/Dashboard"; const Odin = lazy(() => import("./pages/Odin")); const Users = lazy(() => import("./pages/Users")); const Attendance = lazy(() => import("./pages/Attendance")); const AttendanceHistory = lazy(() => import("./pages/AttendanceHistory")); const AttendanceAdmin = lazy(() => import("./pages/AttendanceAdmin")); const AttendanceBalances = lazy(() => import("./pages/AttendanceBalances")); const AttendanceCreate = lazy(() => import("./pages/AttendanceCreate")); const LeaveRequests = lazy(() => import("./pages/LeaveRequests")); const LeaveApproval = lazy(() => import("./pages/LeaveApproval")); const AttendanceLocation = lazy(() => import("./pages/AttendanceLocation")); const PlanWork = lazy(() => import("./pages/PlanWork")); const Trips = lazy(() => import("./pages/Trips")); const TripsHistory = lazy(() => import("./pages/TripsHistory")); const TripsAdmin = lazy(() => import("./pages/TripsAdmin")); const Vehicles = lazy(() => import("./pages/Vehicles")); const Offers = lazy(() => import("./pages/Offers")); const OfferDetail = lazy(() => import("./pages/OfferDetail")); const OffersCustomers = lazy(() => import("./pages/OffersCustomers")); const OffersTemplates = lazy(() => import("./pages/OffersTemplates")); const Orders = lazy(() => import("./pages/Orders")); const OrderDetail = lazy(() => import("./pages/OrderDetail")); const IssuedOrderDetail = lazy(() => import("./pages/IssuedOrderDetail")); const Projects = lazy(() => import("./pages/Projects")); const ProjectDetail = lazy(() => import("./pages/ProjectDetail")); const Invoices = lazy(() => import("./pages/Invoices")); const InvoiceDetail = lazy(() => import("./pages/InvoiceDetail")); const Settings = lazy(() => import("./pages/Settings")); const AuditLog = lazy(() => import("./pages/AuditLog")); const NotFound = lazy(() => import("./pages/NotFound")); const Warehouse = lazy(() => import("./pages/Warehouse")); const WarehouseItems = lazy(() => import("./pages/WarehouseItems")); const WarehouseItemDetail = lazy(() => import("./pages/WarehouseItemDetail")); const WarehouseReceipts = lazy(() => import("./pages/WarehouseReceipts")); const WarehouseReceiptDetail = lazy( () => import("./pages/WarehouseReceiptDetail"), ); const WarehouseReceiptForm = lazy(() => import("./pages/WarehouseReceiptForm")); const WarehouseIssues = lazy(() => import("./pages/WarehouseIssues")); const WarehouseIssueDetail = lazy(() => import("./pages/WarehouseIssueDetail")); const WarehouseIssueForm = lazy(() => import("./pages/WarehouseIssueForm")); const WarehouseReservations = lazy( () => import("./pages/WarehouseReservations"), ); const WarehouseInventory = lazy(() => import("./pages/WarehouseInventory")); const WarehouseInventoryDetail = lazy( () => import("./pages/WarehouseInventoryDetail"), ); const WarehouseInventoryForm = lazy( () => import("./pages/WarehouseInventoryForm"), ); const WarehouseReports = lazy(() => import("./pages/WarehouseReports")); const WarehouseSuppliers = lazy(() => import("./pages/WarehouseSuppliers")); const WarehouseLocations = lazy(() => import("./pages/WarehouseLocations")); const WarehouseCategories = lazy(() => import("./pages/WarehouseCategories")); const UiKit = import.meta.env.DEV ? lazy(() => import("./pages/UiKit")) : null; export default function AdminApp() { return ( }> } /> {import.meta.env.DEV && UiKit && ( } /> )} {/* Auth gating is delegated to : every authenticated page is nested under this layout route, and AppShell redirects to /login when there is no user (per-page permission checks live in the pages themselves). NOTE: any NEW top-level route added OUTSIDE this wrapper (like `login`/`ui-kit` above) is PUBLIC by default — wrap it in AppShell or add its own guard if it needs auth. */} }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); }