HR-ATS-Portal/frontend/src/App.jsx

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