Catalyst / admin/Apex 14.8 GB / 57.8 GB 40.0 GB free
Help Sign in

admin / Apex

public

Bid Management and Orchestration Tool with AI Capability

Code Issues Pull requests Pipelines Packages Security Insights Wiki Settings
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>
  );
}