import { defineStore } from "pinia"; import { computed, ref } from "vue"; import { apiGet, apiPost } from "@/api/client"; export interface AuthUser { id: number; email: string; displayName: string; isAdmin: boolean; } interface MePayload { user: AuthUser; } export const useAuthStore = defineStore("auth", () => { const user = ref(null); const checked = ref(false); const error = ref(null); const signupCompleted = ref(false); const isAuthenticated = computed(() => user.value !== null); const isAdmin = computed(() => user.value?.isAdmin === true); async function fetchMe(): Promise { const result = await apiGet("/me"); checked.value = true; if (result.ok && result.data) { user.value = result.data.user; return true; } user.value = null; return false; } async function signup(email: string, displayName: string): Promise { error.value = null; const result = await apiPost("/signup", { email, displayName, }); if (!result.ok) { error.value = result.error; return false; } signupCompleted.value = true; return true; } async function confirmEmail(token: string, password: string): Promise { error.value = null; const result = await apiPost("/confirm-email", { token, password, }); if (!result.ok) { error.value = result.error; return false; } return true; } async function login(email: string, password: string): Promise { error.value = null; const result = await apiPost("/login", { email, password, }); if (!result.ok) { error.value = result.error; return false; } if (result.data) { user.value = result.data.user; checked.value = true; } return true; } async function logout(): Promise { await apiPost("/logout", {}); user.value = null; signupCompleted.value = false; } function clearError(): void { error.value = null; } return { user, checked, error, signupCompleted, isAuthenticated, isAdmin, fetchMe, signup, confirmEmail, login, logout, clearError, }; });