Spaces:
Sleeping
Sleeping
| // frontend/src/App.jsx | |
| import React, { useEffect } from "react"; | |
| import { Routes, Route, useNavigate, useSearchParams } from "react-router-dom"; | |
| import { AuthProvider, useAuth } from "./contexts/AuthContext"; | |
| import Layout from "./Layout"; | |
| import Dashboard from "./pages/Dashboard"; | |
| import History from "./pages/History"; | |
| import APIKeys from "./pages/APIKeys"; | |
| import ShareHandler from "./pages/ShareHandler"; | |
| import LoginForm from "./components/auth/LoginForm"; | |
| // Auth callback handler component | |
| function AuthCallback() { | |
| const [searchParams] = useSearchParams(); | |
| const { handleAuthCallback } = useAuth(); | |
| const navigate = useNavigate(); | |
| useEffect(() => { | |
| const token = searchParams.get("token"); | |
| if (token) { | |
| handleAuthCallback(token); | |
| navigate("/"); | |
| } else { | |
| navigate("/"); | |
| } | |
| }, [searchParams, handleAuthCallback, navigate]); | |
| return ( | |
| <div className="min-h-screen flex items-center justify-center"> | |
| <div className="text-center"> | |
| <p className="text-slate-600">Completing authentication...</p> | |
| </div> | |
| </div> | |
| ); | |
| } | |
| // Protected route wrapper | |
| function ProtectedRoute({ children }) { | |
| const { isAuthenticated, loading } = useAuth(); | |
| if (loading) { | |
| return ( | |
| <div className="min-h-screen flex items-center justify-center"> | |
| <div className="text-center"> | |
| <div className="h-16 w-16 mx-auto rounded-2xl bg-indigo-100 flex items-center justify-center mb-4 animate-pulse"> | |
| <div className="h-8 w-8 rounded-lg bg-indigo-600"></div> | |
| </div> | |
| <p className="text-slate-600">Loading...</p> | |
| </div> | |
| </div> | |
| ); | |
| } | |
| if (!isAuthenticated) { | |
| return <LoginForm />; | |
| } | |
| return children; | |
| } | |
| function AppRoutes() { | |
| return ( | |
| <Routes> | |
| <Route | |
| path="/auth/callback" | |
| element={<AuthCallback />} | |
| /> | |
| <Route | |
| path="/share/:token" | |
| element={ | |
| <ProtectedRoute> | |
| <ShareHandler /> | |
| </ProtectedRoute> | |
| } | |
| /> | |
| <Route | |
| path="/" | |
| element={ | |
| <ProtectedRoute> | |
| <Layout currentPageName="Dashboard"> | |
| <Dashboard /> | |
| </Layout> | |
| </ProtectedRoute> | |
| } | |
| /> | |
| <Route | |
| path="/history" | |
| element={ | |
| <ProtectedRoute> | |
| <Layout currentPageName="History"> | |
| <History /> | |
| </Layout> | |
| </ProtectedRoute> | |
| } | |
| /> | |
| <Route | |
| path="/api-keys" | |
| element={ | |
| <ProtectedRoute> | |
| <Layout currentPageName="API Keys"> | |
| <APIKeys /> | |
| </Layout> | |
| </ProtectedRoute> | |
| } | |
| /> | |
| </Routes> | |
| ); | |
| } | |
| export default function App() { | |
| return ( | |
| <AuthProvider> | |
| <AppRoutes /> | |
| </AuthProvider> | |
| ); | |
| } | |