forked from odsc2015/agentic-hackathon-template
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathApp.tsx
More file actions
130 lines (112 loc) · 4.05 KB
/
App.tsx
File metadata and controls
130 lines (112 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import { Toaster } from "@/components/ui/toaster";
import { Toaster as Sonner } from "@/components/ui/sonner";
import { TooltipProvider } from "@/components/ui/tooltip";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
import { ThemeProvider } from "next-themes";
import { LanguageProvider } from "@/contexts/LanguageContext";
import { AuthProvider, useAuth } from "@/contexts/AuthContext";
import { UserProvider, useUser } from "@/contexts/UserContext";
import { TaskProvider } from "@/contexts/TaskContext";
import { AppLayout } from "@/components/layout/AppLayout";
import { Auth } from "@/pages/Auth";
import { Onboarding } from "@/pages/Onboarding";
import { Dashboard } from "@/pages/Dashboard";
import { StudyPlan } from "@/pages/StudyPlan";
import { ConceptExplainer } from "@/pages/ConceptExplainer";
import { FocusZone } from "@/pages/FocusZone";
import { AICounselor } from "@/pages/AICounselor";
import { StudyTogether } from "@/pages/StudyTogether";
import Profile from "@/pages/Profile";
import Videos from "@/pages/Videos";
import NotFound from "./pages/NotFound";
import { Loader2 } from "lucide-react";
const queryClient = new QueryClient();
// Auth-required wrapper
const RequireAuth = ({ children }: { children: React.ReactNode }) => {
const { user, isLoading } = useAuth();
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center bg-background">
<Loader2 className="w-8 h-8 animate-spin text-primary" />
</div>
);
}
if (!user) {
return <Navigate to="/auth" replace />;
}
return <>{children}</>;
};
// Redirect if already authenticated
const AuthRoute = () => {
const { user, isLoading } = useAuth();
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center bg-background">
<Loader2 className="w-8 h-8 animate-spin text-primary" />
</div>
);
}
if (user) {
return <Navigate to="/" replace />;
}
return <Auth />;
};
// Wrapper component to handle home route logic inside Router context
const HomeRoute = () => {
const { user } = useUser();
if (user?.onboardingComplete) {
return <Navigate to="/dashboard" replace />;
}
return <Onboarding />;
};
// Wrapper component for protected routes
const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
const { user } = useUser();
if (!user?.onboardingComplete) {
return <Navigate to="/" replace />;
}
return <>{children}</>;
};
const AppRoutes = () => {
return (
<Routes>
<Route path="/auth" element={<AuthRoute />} />
<Route path="/" element={<RequireAuth><HomeRoute /></RequireAuth>} />
<Route element={<RequireAuth><ProtectedRoute><AppLayout /></ProtectedRoute></RequireAuth>}>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/study-plan" element={<StudyPlan />} />
<Route path="/learn" element={<ConceptExplainer />} />
<Route path="/focus" element={<FocusZone />} />
<Route path="/progress" element={<Dashboard />} />
<Route path="/counselor" element={<AICounselor />} />
<Route path="/study-together" element={<StudyTogether />} />
<Route path="/videos" element={<Videos />} />
<Route path="/profile" element={<Profile />} />
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
);
};
const App = () => (
<BrowserRouter>
<QueryClientProvider client={queryClient}>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<LanguageProvider>
<AuthProvider>
<UserProvider>
<TaskProvider>
<TooltipProvider>
<Toaster />
<Sonner />
<AppRoutes />
</TooltipProvider>
</TaskProvider>
</UserProvider>
</AuthProvider>
</LanguageProvider>
</ThemeProvider>
</QueryClientProvider>
</BrowserRouter>
);
export default App;