import { create } from 'zustand'; interface User { id: string; username: string; email: string; } interface AuthState { token: string | null; user: User | null; isLoading: boolean; error: string | null; login: (email: string, password: string) => Promise; register: (username: string, email: string, password: string) => Promise; logout: () => void; loadFromStorage: () => void; clearError: () => void; } export const useAuthStore = create((set, get) => ({ token: null, user: null, isLoading: false, error: null, login: async (email: string, password: string) => { set({ isLoading: true, error: null }); try { const res = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }); if (!res.ok) { const data = await res.json().catch(() => ({ message: 'Login failed' })); throw new Error(data.message || `Login failed (${res.status})`); } const data = await res.json(); localStorage.setItem('token', data.token); localStorage.setItem('user', JSON.stringify(data.user)); set({ token: data.token, user: data.user, isLoading: false }); } catch (err: any) { set({ error: err.message, isLoading: false }); } }, register: async (username: string, email: string, password: string) => { set({ isLoading: true, error: null }); try { const res = await fetch('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, email, password }), }); if (!res.ok) { const data = await res.json().catch(() => ({ message: 'Registration failed' })); throw new Error(data.message || `Registration failed (${res.status})`); } const data = await res.json(); localStorage.setItem('token', data.token); localStorage.setItem('user', JSON.stringify(data.user)); set({ token: data.token, user: data.user, isLoading: false }); } catch (err: any) { set({ error: err.message, isLoading: false }); } }, logout: () => { localStorage.removeItem('token'); localStorage.removeItem('user'); set({ token: null, user: null }); }, loadFromStorage: () => { const token = localStorage.getItem('token'); const userStr = localStorage.getItem('user'); if (token && userStr) { try { const user = JSON.parse(userStr); set({ token, user }); } catch { localStorage.removeItem('token'); localStorage.removeItem('user'); } } }, clearError: () => set({ error: null }), }));