import { create } from 'zustand'; import type { User, Quota, TeamInfo } from '../types'; import { authApi } from '../lib/api'; interface AuthState { user: User | null; accessToken: string | null; refreshToken: string | null; isAuthenticated: boolean; isLoading: boolean; quota: Quota | null; team: TeamInfo | null; teamDisabled: boolean; login: (username: string, password: string) => Promise; logout: () => void; refreshAccessToken: () => Promise; fetchUserInfo: () => Promise; initialize: () => Promise; } export const useAuthStore = create((set, get) => ({ user: null, accessToken: localStorage.getItem('access_token'), refreshToken: localStorage.getItem('refresh_token'), isAuthenticated: !!localStorage.getItem('access_token'), isLoading: true, quota: null, team: null, teamDisabled: false, login: async (username, password) => { const { data } = await authApi.login(username, password); localStorage.setItem('access_token', data.tokens.access); localStorage.setItem('refresh_token', data.tokens.refresh); set({ user: data.user, accessToken: data.tokens.access, refreshToken: data.tokens.refresh, isAuthenticated: true, }); // Fetch quota after login await get().fetchUserInfo(); }, logout: () => { localStorage.removeItem('access_token'); localStorage.removeItem('refresh_token'); set({ user: null, accessToken: null, refreshToken: null, isAuthenticated: false, quota: null, team: null, teamDisabled: false, }); }, refreshAccessToken: async () => { const refresh = get().refreshToken; if (!refresh) throw new Error('No refresh token'); const { data } = await authApi.refreshToken(refresh); localStorage.setItem('access_token', data.access); set({ accessToken: data.access }); }, fetchUserInfo: async () => { try { const { data } = await authApi.getMe(); const { quota, team, team_disabled, ...user } = data; set({ user, quota, team: team || null, teamDisabled: team_disabled || false, isAuthenticated: true, }); } catch { // Token invalid get().logout(); } }, initialize: async () => { const token = localStorage.getItem('access_token'); if (token) { try { await get().fetchUserInfo(); } catch { get().logout(); } } set({ isLoading: false }); }, }));