web/contexts/AuthContext.tsx (view raw)
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 60 61 62 63 64 |
import React, { createContext, useState, useEffect, useCallback } from "react"; interface User { id: string; name: string; displayName: string; } interface AuthContextType { isAuthenticated: boolean; user: User | null; loading: boolean; refreshAuth: () => void; } export const AuthContext = createContext<AuthContextType>({ isAuthenticated: false, user: null, loading: true, refreshAuth: () => {}, }); export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children, }) => { const [isAuthenticated, setIsAuthenticated] = useState(false); const [user, setUser] = useState<User | null>(null); const [loading, setLoading] = useState(true); const checkAuth = useCallback(async () => { setLoading(true); try { const resp = await fetch("http://localhost:8080/me", { credentials: "include", }); if (resp.ok) { const userData = await resp.json(); setIsAuthenticated(true); setUser(userData); } else { setIsAuthenticated(false); setUser(null); } } catch (err) { console.error(err); setIsAuthenticated(false); setUser(null); } finally { setLoading(false); } }, []); useEffect(() => { checkAuth(); }, [checkAuth]); return ( <AuthContext.Provider value={{ isAuthenticated, user, loading, refreshAuth: checkAuth }} > {children} </AuthContext.Provider> ); }; |