this repo has no description
1import { Routes, Route, Navigate } from 'react-router-dom';
2import { ThemeProvider } from '@mui/material/styles';
3import CssBaseline from '@mui/material/CssBaseline';
4import CircularProgress from '@mui/material/CircularProgress';
5import Box from '@mui/material/Box';
6import theme from './theme';
7import { useAuth } from './hooks/useAuth';
8import { AppShell } from './components/layout/AppShell';
9import { LoginPage } from './pages/LoginPage';
10import { RegisterPage } from './pages/RegisterPage';
11import { HomePage } from './pages/HomePage';
12import { LessonPage } from './pages/LessonPage';
13import { ReviewPage } from './pages/ReviewPage';
14import { SettingsPage } from './pages/SettingsPage';
15import type { ReactNode } from 'react';
16
17function ProtectedRoute({ children }: { children: ReactNode }) {
18 const { user, loading } = useAuth();
19
20 if (loading) {
21 return (
22 <Box
23 sx={{
24 display: 'flex',
25 justifyContent: 'center',
26 alignItems: 'center',
27 minHeight: '100vh',
28 }}
29 >
30 <CircularProgress color="primary" />
31 </Box>
32 );
33 }
34
35 if (!user) {
36 return <Navigate to="/login" replace />;
37 }
38
39 return <>{children}</>;
40}
41
42function RootRedirect() {
43 const { user, loading } = useAuth();
44
45 if (loading) {
46 return (
47 <Box
48 sx={{
49 display: 'flex',
50 justifyContent: 'center',
51 alignItems: 'center',
52 minHeight: '100vh',
53 }}
54 >
55 <CircularProgress color="primary" />
56 </Box>
57 );
58 }
59
60 return <Navigate to={user ? '/home' : '/login'} replace />;
61}
62
63function App() {
64 return (
65 <ThemeProvider theme={theme}>
66 <CssBaseline />
67 <Routes>
68 <Route path="/" element={<RootRedirect />} />
69 <Route path="/login" element={<LoginPage />} />
70 <Route path="/register" element={<RegisterPage />} />
71 <Route
72 element={
73 <ProtectedRoute>
74 <AppShell />
75 </ProtectedRoute>
76 }
77 >
78 <Route path="/home" element={<HomePage />} />
79 <Route path="/review" element={<ReviewPage />} />
80 <Route path="/settings" element={<SettingsPage />} />
81 </Route>
82 <Route
83 path="/lesson/:topicId/:lessonId"
84 element={
85 <ProtectedRoute>
86 <LessonPage />
87 </ProtectedRoute>
88 }
89 />
90 </Routes>
91 </ThemeProvider>
92 );
93}
94
95export default App;