93 lines
3.5 KiB
JavaScript
93 lines
3.5 KiB
JavaScript
import { lazy } from 'react'
|
|
import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'
|
|
|
|
import AuthProvider from './auth/AuthProvider'
|
|
import RequireAuth from './auth/RequireAuth'
|
|
import AppLayout from './app/AppLayout'
|
|
import LegacyHashRedirect from './app/LegacyHashRedirect'
|
|
import { ROUTES } from './app/routes'
|
|
|
|
import Login from './pages/Login'
|
|
import Signup from './pages/Signup'
|
|
import ForgotPassword from './pages/ForgotPassword'
|
|
import ConfirmEmail from './pages/ConfirmEmail'
|
|
|
|
// Route-level code splitting: putting 23 screens in one bundle would make the
|
|
// first paint pay for every screen a user never opens.
|
|
const SCREENS = {
|
|
dashboard: lazy(() => import('./screens/Dashboard')),
|
|
inbox: lazy(() => import('./screens/Inbox')),
|
|
matching: lazy(() => import('./screens/Matching')),
|
|
jobs: lazy(() => import('./screens/Jobs')),
|
|
candidates: lazy(() => import('./screens/Candidates')),
|
|
talentpool: lazy(() => import('./screens/TalentPool')),
|
|
pipeline: lazy(() => import('./screens/Pipeline')),
|
|
import: lazy(() => import('./screens/CvImport')),
|
|
jobboard: lazy(() => import('./screens/JobBoard')),
|
|
recruiterhub: lazy(() => import('./screens/RecruiterHub')),
|
|
tasks: lazy(() => import('./screens/Tasks')),
|
|
aiassistant: lazy(() => import('./screens/AiAssistant')),
|
|
interviews: lazy(() => import('./screens/Interviews')),
|
|
assessments: lazy(() => import('./screens/Assessments')),
|
|
offers: lazy(() => import('./screens/Offers')),
|
|
managers: lazy(() => import('./screens/Managers')),
|
|
calendar: lazy(() => import('./screens/Calendar')),
|
|
reports: lazy(() => import('./screens/Reports')),
|
|
analytics: lazy(() => import('./screens/Analytics')),
|
|
aistudio: lazy(() => import('./screens/AiStudio')),
|
|
notifications: lazy(() => import('./screens/Notifications')),
|
|
rbac: lazy(() => import('./screens/Rbac')),
|
|
settings: lazy(() => import('./screens/Settings')),
|
|
help: lazy(() => import('./screens/Help')),
|
|
}
|
|
|
|
export default function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<AuthProvider>
|
|
<LegacyHashRedirect />
|
|
<Routes>
|
|
{/* Public. These keep the /auth prefix as ROUTE paths so the backend's
|
|
CONFIRM_EMAIL_PATH=/auth/confirm-email links resolve unchanged. */}
|
|
<Route path="/auth" element={<Navigate to="/auth/login" replace />} />
|
|
<Route path="/auth/login" element={<Login />} />
|
|
<Route path="/auth/signup" element={<Signup />} />
|
|
<Route path="/auth/forgot-password" element={<ForgotPassword />} />
|
|
<Route path="/auth/confirm-email" element={<ConfirmEmail />} />
|
|
|
|
{/* Protected */}
|
|
<Route
|
|
element={
|
|
<RequireAuth>
|
|
<AppLayout />
|
|
</RequireAuth>
|
|
}
|
|
>
|
|
{ROUTES.map((r) => {
|
|
const Screen = SCREENS[r.path]
|
|
return (
|
|
<Route
|
|
key={r.path}
|
|
path={`/${r.path}`}
|
|
element={
|
|
r.permission ? (
|
|
<RequireAuth permission={r.permission}>
|
|
<Screen />
|
|
</RequireAuth>
|
|
) : (
|
|
<Screen />
|
|
)
|
|
}
|
|
/>
|
|
)
|
|
})}
|
|
</Route>
|
|
|
|
<Route path="/" element={<Navigate to="/dashboard" replace />} />
|
|
<Route path="*" element={<Navigate to="/dashboard" replace />} />
|
|
</Routes>
|
|
</AuthProvider>
|
|
</BrowserRouter>
|
|
)
|
|
}
|