Seth
update
d7fe8fb
// 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>
);
}