SPB Git forge

spb/uqo-chat

Public
14commits 1branches 0releases
1.4 MBsize
maindefault branch
18 days agolast push
Python 64.6% TypeScript 33.7% CSS 0.8%
2.2 KB · 48 lines tsx
Raw Blame History
1import { useEffect, type ReactNode } from 'react';2import { Navigate, Route, Routes, useLocation } from 'react-router-dom';3import { useAuth } from '@/stores/auth';4import { useChat } from '@/stores/chat';5import { AppShell } from '@/components/layout/app-shell';6import { ChatView } from '@/components/chat/chat-view';7import { LoginPage } from '@/features/auth/login-page';8import { PrivacyPage } from '@/features/auth/privacy-page';9import { SetPasswordPage } from '@/features/auth/set-password-page';10import { ProfessorPage } from '@/features/professor/professor-page';11import { AdminCostsPage } from '@/features/professor/admin-costs-page';12import { Spinner } from '@/components/ui/spinner';1314function Guard({ children, role }: { children: ReactNode; role?: 'professor' | 'admin' }) {15  const { user, loading } = useAuth();16  const loc = useLocation();17  if (loading) return <div className="h-[100dvh] flex items-center justify-center"><Spinner size={28} /></div>;18  if (!user) return <Navigate to="/connexion" replace state={{ from: loc }} />;19  if (role === 'professor' && !(user.role === 'professor' || user.role === 'admin')) return <Navigate to="/" replace />;20  if (role === 'admin' && user.role !== 'admin') return <Navigate to="/" replace />;21  return <>{children}</>;22}2324export function AppRouter() {25  const { user, load } = useAuth();26  const loadConversations = useChat((s) => s.loadConversations);27  useEffect(() => {28    load();29  }, [load]);30  useEffect(() => {31    if (user) loadConversations().catch(() => undefined);32  }, [user, loadConversations]);33  return (34    <Routes>35      <Route path="/connexion" element={<LoginPage />} />36      <Route path="/mot-de-passe" element={<SetPasswordPage />} />37      <Route path="/confidentialite" element={<PrivacyPage />} />38      <Route path="/professeur" element={<Guard role="professor"><ProfessorPage /></Guard>} />39      <Route path="/admin" element={<Guard role="admin"><AdminCostsPage /></Guard>} />40      <Route element={<Guard><AppShell /></Guard>}>41        <Route path="/" element={<ChatView />} />42        <Route path="/c/:id" element={<ChatView />} />43      </Route>44      <Route path="*" element={<Navigate to="/" replace />} />45    </Routes>46  );47}48