'use client'; import { createContext, useContext, useState, useEffect, useCallback, type ReactNode } from 'react'; interface User { id: string; email: string; role: string; displayName: string; } interface AuthState { user: User | null; token: string | null; loading: boolean; login: (email: string, password: string) => Promise; logout: () => void; } const AuthContext = createContext({ user: null, token: null, loading: true, login: async () => {}, logout: () => {}, }); 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 stored = localStorage.getItem('tracker_token'); if (stored) { setToken(stored); fetch('/api/auth/me', { headers: { Authorization: `Bearer ${stored}` }, }) .then(res => (res.ok ? res.json() : Promise.reject())) .then(data => setUser(data)) .catch(() => { localStorage.removeItem('tracker_token'); setToken(null); }) .finally(() => setLoading(false)); } else { setLoading(false); } }, []); const login = useCallback(async (email: string, password: string) => { const res = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }); if (!res.ok) { const body = await res.json().catch(() => ({})); throw new Error(body.error || 'Login failed'); } const data = await res.json(); localStorage.setItem('tracker_token', data.accessToken); setToken(data.accessToken); setUser(data.user); }, []); const logout = useCallback(() => { localStorage.removeItem('tracker_token'); setToken(null); setUser(null); }, []); return ( {children} ); }