admin / Apex
publicBid Management and Orchestration Tool with AI Capability
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> ); } |