import { create } from 'zustand'; import { persist } from 'zustand/middleware'; import axios from 'axios'; interface User { id: string; username: string; discriminator: string | null; avatar: string | null; email?: string; } interface AuthState { user: User | null; token: string | null; isAuthenticated: boolean; login: (token: string, user: User) => void; logout: () => void; checkAuth: () => Promise; } export const useAuthStore = create()( persist( (set, get) => ({ user: null, token: null, isAuthenticated: false, login: (token: string, user: User) => { localStorage.setItem('token', token); axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; set({ token, user, isAuthenticated: true }); }, logout: () => { localStorage.removeItem('token'); delete axios.defaults.headers.common['Authorization']; set({ token: null, user: null, isAuthenticated: false }); }, checkAuth: async () => { const token = localStorage.getItem('token'); if (!token) { set({ isAuthenticated: false }); return; } try { axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; const response = await axios.get(`${import.meta.env.VITE_FRONTEND_URL}/api/auth/me`); set({ token, user: response.data.user, isAuthenticated: true, }); } catch (error) { console.error('Auth check failed:', error); get().logout(); } }, }), { name: 'auth-storage', partialize: (state) => ({ token: state.token, user: state.user, isAuthenticated: state.isAuthenticated, }), }, ), );