import React, { createContext, useContext, useState, useEffect, type ReactNode } from 'react'; interface User { email: string; name?: string; } interface AuthContextType { user: User | null; loading: boolean; login: (email: string, password: string) => Promise; logout: () => void; token: string | null; } const AuthContext = createContext({ user: null, loading: true, login: async () => false, logout: () => {}, token: null, }); export function useAuth() { return useContext(AuthContext); } export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [token, setToken] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const saved = localStorage.getItem('admin_token'); if (saved) { setToken(saved); fetch('/api/admin/auth/session', { headers: { Authorization: `Bearer ${saved}` } }) .then(r => r.ok ? r.json() : null) .then(data => { if (data?.authenticated) setUser(data.user); else localStorage.removeItem('admin_token'); }) .catch(() => localStorage.removeItem('admin_token')) .finally(() => setLoading(false)); } else { setLoading(false); } }, []); const login = async (email: string, password: string) => { const res = await fetch('/api/admin/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }); if (!res.ok) return false; const data = await res.json(); setToken(data.token); setUser(data.user); localStorage.setItem('admin_token', data.token); return true; }; const logout = () => { setUser(null); setToken(null); localStorage.removeItem('admin_token'); document.cookie = 'admin_token=; Path=/; Max-Age=0'; }; return ( {children} ); } export function AuthGuard({ children }: { children: ReactNode }) { const { user, loading } = useAuth(); if (loading) return (
); if (!user) { window.location.href = '/admin/login'; return null; } return <>{children}; }