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 / lib / auth.tsx 1302 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { createContext, useContext, useEffect, useState } from "react";
import { api, setToken } from "./api";

export interface User {
  id: number;
  email: string;
  name: string;
  roles: string[];
  mfa_enrolled: boolean;
  must_change_password: boolean;
}

interface AuthCtx {
  user: User | null;
  loading: boolean;
  refresh: () => Promise<void>;
  logout: () => void;
  has: (...roles: string[]) => boolean;
}

const Ctx = createContext<AuthCtx>(null as any);
export const useAuth = () => useContext(Ctx);

export function AuthProvider({ children }: { children: React.ReactNode }) {
  const [user, setUser] = useState<User | null>(null);
  const [loading, setLoading] = useState(true);

  async function refresh() {
    try {
      const u = await api.get("/auth/me");
      setUser(u);
    } catch {
      setUser(null);
    } finally {
      setLoading(false);
    }
  }

  useEffect(() => {
    refresh();
  }, []);

  function logout() {
    setToken(null);
    setUser(null);
  }

  function has(...roles: string[]) {
    if (!user) return false;
    if (user.roles.includes("administrator")) return true;
    return roles.some((r) => user.roles.includes(r));
  }

  return (
    <Ctx.Provider value={{ user, loading, refresh, logout, has }}>
      {children}
    </Ctx.Provider>
  );
}