| | |
| |
|
| | 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"; |
| |
|
| | |
| | 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> |
| | ); |
| | } |
| |
|
| | |
| | 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> |
| | ); |
| | } |
| |
|