import { create } from "zustand"; import { api, getToken, setToken } from "@/lib/api"; import type { User } from "@/lib/types"; interface AuthState { user: User | null; ready: boolean; login: (username: string, password: string) => Promise; register: (username: string, password: string) => Promise; logout: () => Promise; loadUser: () => Promise; } export const useAuth = create((set) => ({ user: null, ready: false, login: async (username, password) => { const data = await api<{ token: string }>("/api/auth/token/", { method: "POST", json: { username, password }, }); setToken(data.token); const user = await api("/api/auth/me/"); set({ user, ready: true }); }, register: async (username, password) => { const data = await api<{ token: string; user: User }>("/api/auth/register/", { method: "POST", json: { username, password }, }); setToken(data.token); set({ user: data.user, ready: true }); }, logout: async () => { try { await api("/api/auth/logout/", { method: "POST" }); } catch { // The token may already be invalid; clearing it locally is enough. } setToken(null); set({ user: null, ready: true }); }, loadUser: async () => { if (!getToken()) { set({ user: null, ready: true }); return; } try { const user = await api("/api/auth/me/"); set({ user, ready: true }); } catch { setToken(null); set({ user: null, ready: true }); } }, }));