admin / Bid-Sentinel
publicBid Scrape and Tracking Application with AI Capability
Bid-Sentinel / bid-sentinel-v2 / frontend / src / context / AuthContext.jsx
1326 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 { fetchMe, login as apiLogin, setupAdmin as apiSetupAdmin, tokenStore, } from "../api/client"; const AuthContext = createContext(null); export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); // On mount, restore the session from a stored token (persistent login). useEffect(() => { async function restore() { if (!tokenStore.get()) { setLoading(false); return; } try { setUser(await fetchMe()); } catch { tokenStore.clear(); } finally { setLoading(false); } } restore(); }, []); async function login(email, password) { await apiLogin(email, password); setUser(await fetchMe()); } async function setup(payload) { await apiSetupAdmin(payload); setUser(await fetchMe()); } function logout() { tokenStore.clear(); setUser(null); } return ( <AuthContext.Provider value={{ user, loading, login, setup, logout }}> {children} </AuthContext.Provider> ); } export function useAuth() { const ctx = useContext(AuthContext); if (!ctx) throw new Error("useAuth must be used within AuthProvider"); return ctx; } |