import { computed, ref } from 'vue' import { defineStore } from 'pinia' import { z } from 'zod' import { API_BASE } from '@/utils/apiBase' export const authUserSchema = z.object({ id: z.number().int().positive(), email: z.string().email(), }) const meResponseSchema = z.object({ user: authUserSchema, }) export type AuthUser = z.infer export const useAuthStore = defineStore('auth', () => { const user = ref(null) const loading = ref(false) const error = ref(null) const isAuthenticated = computed(() => user.value !== null) async function fetchMe(): Promise { loading.value = true error.value = null try { const response = await fetch(`${API_BASE}/api/me`, { method: 'GET', credentials: 'include', headers: { Accept: 'application/json', }, }) if (response.status === 200) { const responseBody: unknown = await response.json() user.value = meResponseSchema.parse(responseBody).user return true } user.value = null if (response.status !== 401) { error.value = 'Unable to restore session' } return false } catch { user.value = null error.value = 'Unable to restore session' return false } finally { loading.value = false } } return { user, loading, error, isAuthenticated, fetchMe, } })