import { createContext, useContext, useEffect, useState, type ReactNode } from 'react'; import { api, ApiClientError } from './api-client'; interface User { email: string; role: string; } interface AuthContextType { user: User | null; loading: boolean; login: (email: string, password: string) => Promise<{ ok: true } | { ok: false; error: string }>; logout: () => Promise; } const AuthContext = createContext({ user: null, loading: true, login: async () => ({ ok: false, error: 'not initialised' }), logout: async () => {}, }); export function useAuth() { return useContext(AuthContext); } export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; api .get<{ user: User }>('/auth/session') .then((data) => { if (!cancelled) setUser(data.user); }) .catch(() => { if (!cancelled) setUser(null); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, []); const login = async (email: string, password: string) => { try { const data = await api.post<{ user: User }>('/auth/login', { email, password }); setUser(data.user); return { ok: true as const }; } catch (err) { const msg = err instanceof ApiClientError ? err.message : 'Login mislukt'; return { ok: false as const, error: msg }; } }; const logout = async () => { try { await api.post('/auth/logout'); } catch { // ignore } setUser(null); window.location.href = '/cms/login'; }; return {children}; }