import { create } from "zustand"; import { loginRequest, meRequest, refreshRequest } from "../api/auth"; import type { AuthUser } from "../chat/types"; interface AuthState { accessToken: string | null; refreshToken: string | null; me: AuthUser | null; loading: boolean; setTokens: (accessToken: string, refreshToken: string) => void; login: (email: string, password: string) => Promise; loadMe: () => Promise; refresh: () => Promise; logout: () => void; } const ACCESS_KEY = "bm_access_token"; const REFRESH_KEY = "bm_refresh_token"; export const useAuthStore = create((set, get) => ({ accessToken: localStorage.getItem(ACCESS_KEY), refreshToken: localStorage.getItem(REFRESH_KEY), me: null, loading: false, setTokens: (accessToken, refreshToken) => { localStorage.setItem(ACCESS_KEY, accessToken); localStorage.setItem(REFRESH_KEY, refreshToken); set({ accessToken, refreshToken }); }, login: async (email, password) => { set({ loading: true }); try { const data = await loginRequest(email, password); get().setTokens(data.access_token, data.refresh_token); await get().loadMe(); } finally { set({ loading: false }); } }, loadMe: async () => { const me = await meRequest(); set({ me }); }, refresh: async () => { const token = get().refreshToken; if (!token) { get().logout(); return; } const data = await refreshRequest(token); get().setTokens(data.access_token, data.refresh_token); }, logout: () => { localStorage.removeItem(ACCESS_KEY); localStorage.removeItem(REFRESH_KEY); set({ accessToken: null, refreshToken: null, me: null }); } }));