import React, { createContext, useCallback, useContext, useEffect, useState } from 'react'; import { getCurrentUser } from '../api'; import { CurrentUser, Role } from '../types'; interface AuthState { user: CurrentUser | null; loading: boolean; refresh: () => Promise; clear: () => void; hasRole: (...roles: Role[]) => boolean; } const AuthContext = createContext(undefined); export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const refresh = useCallback(async () => { setLoading(true); try { setUser(await getCurrentUser()); } catch { setUser(null); } finally { setLoading(false); } }, []); const clear = useCallback(() => setUser(null), []); const hasRole = useCallback( (...roles: Role[]) => !!user && roles.some((r) => user.roles.includes(r)), [user], ); useEffect(() => { void refresh(); }, [refresh]); return ( {children} ); }; export function useAuth(): AuthState { const ctx = useContext(AuthContext); if (!ctx) { throw new Error('useAuth must be used within AuthProvider'); } return ctx; }