admin / Apex
publicBid Management and Orchestration Tool with AI Capability
Apex / Synapse-Apexv2 / frontend / src / App.tsx
1602 B · main
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 | import { useEffect, useState } from "react"; import { Navigate, Route, Routes } from "react-router-dom"; import Layout from "./components/Layout"; import { api } from "./lib/api"; import { useAuth } from "./lib/auth"; import Login from "./pages/Login"; import MfaEnroll from "./pages/MfaEnroll"; import Dashboard from "./pages/Dashboard"; import BidWorkspace from "./pages/BidWorkspace"; import Capabilities from "./pages/Capabilities"; import AnswerLibrary from "./pages/AnswerLibrary"; import Admin from "./pages/admin/Admin"; export default function App() { const { user, loading } = useAuth(); const [mfaGate, setMfaGate] = useState<boolean | null>(null); useEffect(() => { if (user && !user.must_change_password) { api .get("/auth/mfa/status") .then((s) => setMfaGate(s.enforced && !s.enrolled)) .catch(() => setMfaGate(false)); } }, [user]); if (loading) return <div className="login-wrap">Loading…</div>; if (!user) return <Login />; if (user.must_change_password) return <Login forceChange />; if (mfaGate === null) return <div className="login-wrap">Loading…</div>; if (mfaGate) return <MfaEnroll />; return ( <Layout> <Routes> <Route path="/" element={<Dashboard />} /> <Route path="/bids/:id" element={<BidWorkspace />} /> <Route path="/capabilities" element={<Capabilities />} /> <Route path="/library" element={<AnswerLibrary />} /> <Route path="/admin/*" element={<Admin />} /> <Route path="*" element={<Navigate to="/" />} /> </Routes> </Layout> ); } |