124 lines
3.5 KiB
TypeScript
124 lines
3.5 KiB
TypeScript
import { Navigate, Route, Routes } from 'react-router-dom'
|
|
import { Center, Spinner } from '@chakra-ui/react'
|
|
import { Landing } from './pages/Landing'
|
|
import { Pricing } from './pages/Pricing'
|
|
import { RequestDemo } from './pages/RequestDemo'
|
|
import { Login } from './pages/Login'
|
|
import { Register } from './pages/Register'
|
|
import { Leads } from './pages/backoffice/Leads'
|
|
import { Demos } from './pages/backoffice/Demos'
|
|
import { PremiumDemos } from './pages/backoffice/PremiumDemos'
|
|
import { Codes } from './pages/backoffice/Codes'
|
|
import { Subscription } from './pages/backoffice/Subscription'
|
|
import { Profile } from './pages/backoffice/Profile'
|
|
import { PublicLayout } from './components/PublicLayout'
|
|
import { BackofficeLayout } from './components/BackofficeLayout'
|
|
import { useAuth } from './lib/auth'
|
|
import type { JSX } from 'react'
|
|
|
|
function RequireAuth({ children }: { children: JSX.Element }) {
|
|
const { isAuthenticated, initializing } = useAuth()
|
|
if (initializing) {
|
|
return (
|
|
<Center h="100vh">
|
|
<Spinner />
|
|
</Center>
|
|
)
|
|
}
|
|
return isAuthenticated ? children : <Navigate to="/login" replace />
|
|
}
|
|
|
|
// Réservé à l'admin : provisioning des démos.
|
|
function RequireAdmin({ children }: { children: JSX.Element }) {
|
|
const { isAdmin } = useAuth()
|
|
return isAdmin ? children : <Navigate to="/app/leads" replace />
|
|
}
|
|
|
|
// Accès aux leads : autorisé pour l'admin, ou pour les comptes non premium.
|
|
function RequireLeadsAccess({ children }: { children: JSX.Element }) {
|
|
const { isAdmin, isPremium } = useAuth()
|
|
const canAccess = isAdmin || !isPremium
|
|
return canAccess ? children : <Navigate to="/app/subscription" replace />
|
|
}
|
|
|
|
// Redirection d'accueil du back-office selon le rôle.
|
|
function BackofficeHome() {
|
|
const { role } = useAuth()
|
|
switch (role) {
|
|
case 'admin':
|
|
return <Navigate to="/app/demos" replace />
|
|
case 'client':
|
|
return <Navigate to="/app/subscription" replace />
|
|
|
|
default:
|
|
return <Navigate to="/app/leads" replace />
|
|
}
|
|
}
|
|
|
|
export function App() {
|
|
return (
|
|
<Routes>
|
|
{/* Vitrine publique (header + footer, sans authentification) */}
|
|
<Route element={<PublicLayout />}>
|
|
<Route path="/" element={<Landing />} />
|
|
<Route path="/tarifs" element={<Pricing />} />
|
|
<Route path="/demo" element={<RequestDemo />} />
|
|
</Route>
|
|
<Route path="/login" element={<Login />} />
|
|
<Route path="/register" element={<Register />} />
|
|
|
|
{/* Back-office protégé */}
|
|
<Route
|
|
path="/app"
|
|
element={
|
|
<RequireAuth>
|
|
<BackofficeLayout />
|
|
</RequireAuth>
|
|
}
|
|
>
|
|
<Route index element={<BackofficeHome />} />
|
|
|
|
<Route
|
|
path="leads"
|
|
element={
|
|
<RequireLeadsAccess>
|
|
<Leads />
|
|
</RequireLeadsAccess>
|
|
}
|
|
/>
|
|
|
|
<Route
|
|
path="demos"
|
|
element={
|
|
<RequireAdmin>
|
|
<Demos />
|
|
</RequireAdmin>
|
|
}
|
|
/>
|
|
|
|
<Route
|
|
path="codes"
|
|
element={
|
|
<RequireAdmin>
|
|
<Codes />
|
|
</RequireAdmin>
|
|
}
|
|
/>
|
|
|
|
<Route
|
|
path="premium"
|
|
element={
|
|
<RequireAdmin>
|
|
<PremiumDemos />
|
|
</RequireAdmin>
|
|
}
|
|
/>
|
|
<Route path="subscription" element={<Subscription />} />
|
|
<Route path="profile" element={<Profile />} />
|
|
</Route>
|
|
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
)
|
|
}
|