"use client"; import { createContext, useContext, useState, useEffect, useCallback, type ReactNode } from "react"; interface User { id: string; email: string; name: string; isPremium: boolean; isPro: boolean; flhBalance: number; dailyMsgCount: number; preferredName?: string; coachPersona?: string; madhab?: string; coachingGoals?: string; createdAt?: string; trialEndsAt?: string; } interface AuthContextType { user: User | null; token: string | null; loading: boolean; login: (email: string, password: string) => Promise; register: (email: string, name: string, password: string) => Promise; logout: () => void; refreshUser: () => Promise; } const AuthContext = createContext(undefined); 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("flh_token"); if (stored) { setToken(stored); fetchUser(stored); } else { setLoading(false); } }, []); const fetchUser = async (t: string) => { try { const res = await fetch("/api/auth/me", { headers: { Authorization: `Bearer ${t}` }, }); if (res.ok) { const data = await res.json(); setUser(data.user); } else { localStorage.removeItem("flh_token"); setToken(null); } } catch { // ignore } finally { 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 err = await res.json(); throw new Error(err.error || "Login failed"); } const data = await res.json(); localStorage.setItem("flh_token", data.token); setToken(data.token); setUser(data.user); }, []); const register = useCallback(async (email: string, name: string, password: string) => { const res = await fetch("/api/auth/register", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, name, password }), }); if (!res.ok) { const err = await res.json(); throw new Error(err.error || "Registration failed"); } const data = await res.json(); localStorage.setItem("flh_token", data.token); setToken(data.token); setUser(data.user); }, []); const logout = useCallback(() => { localStorage.removeItem("flh_token"); setToken(null); setUser(null); }, []); const refreshUser = useCallback(async () => { if (!token) return; await fetchUser(token); }, [token]); return ( {children} ); } export function useAuth() { const ctx = useContext(AuthContext); if (!ctx) throw new Error("useAuth must be used within AuthProvider"); return ctx; }