import { create } from 'zustand'; import { api } from '../api/client'; import { User } from '../types'; interface AuthStore { token: string | null; user: User | null; loading: boolean; error: string | null; initialized: boolean; init: () => Promise; login: (email: string, password: string) => Promise; register: (email: string, username: string, password: string) => Promise; logout: () => Promise; forgotPassword: (email: string) => Promise; resetPassword: (token: string, password: string) => Promise; handleGoogleCallback: (token: string) => Promise; clearError: () => void; } export const useAuthStore = create((set, get) => ({ token: localStorage.getItem('token'), user: null, loading: false, error: null, initialized: false, init: async () => { const token = localStorage.getItem('token'); if (!token) { set({ initialized: true }); return; } api.setToken(token); try { const { user } = await api.getMe(); set({ user, token, initialized: true }); } catch { localStorage.removeItem('token'); api.setToken(null); set({ token: null, user: null, initialized: true }); } }, login: async (email: string, password: string) => { set({ loading: true, error: null }); try { const { token, user } = await api.login(email, password); localStorage.setItem('token', token); api.setToken(token); set({ token, user, loading: false }); } catch (err: any) { set({ error: err.message, loading: false }); throw err; } }, register: async (email: string, username: string, password: string) => { set({ loading: true, error: null }); try { const { token, user } = await api.register(email, username, password); localStorage.setItem('token', token); api.setToken(token); set({ token, user, loading: false }); } catch (err: any) { set({ error: err.message, loading: false }); throw err; } }, logout: async () => { try { await api.logout(); } catch {} localStorage.removeItem('token'); api.setToken(null); set({ token: null, user: null }); }, forgotPassword: async (email: string) => { set({ loading: true, error: null }); try { await api.forgotPassword(email); set({ loading: false }); } catch (err: any) { set({ error: err.message, loading: false }); throw err; } }, resetPassword: async (token: string, password: string) => { set({ loading: true, error: null }); try { await api.resetPassword(token, password); set({ loading: false }); } catch (err: any) { set({ error: err.message, loading: false }); throw err; } }, handleGoogleCallback: async (token: string) => { set({ loading: true, error: null }); try { localStorage.setItem('token', token); api.setToken(token); const { user } = await api.getMe(); set({ token, user, loading: false }); } catch (err: any) { localStorage.removeItem('token'); api.setToken(null); set({ error: err.message, loading: false, token: null, user: null }); throw err; } }, clearError: () => set({ error: null }), }));