export interface User { id: number name: string email: string email_verified_at: string | null password?: string remember_token?: string | null created_at: string | null updated_at: string | null } export interface LoginCredentials { email: string password: string remember?: boolean } export interface RegisterCredentials { name: string email: string password: string password_confirmation: string } export interface ResetPasswordCredentials { email: string password: string password_confirmation: string token: string } // Value is initialized in: ~/plugins/auth.ts export function useUser() { return useState('user', () => undefined) } export function useAuth() { const router = useRouter() const user = useUser() const isLoggedIn = computed(() => !!user.value) async function refresh() { try { user.value = await fetchCurrentUser() } catch { user.value = null } } async function login(credentials: LoginCredentials) { if (isLoggedIn.value) { return } await $larafetch('/login', { method: 'post', body: credentials }) await refresh() } async function register(credentials: RegisterCredentials) { await $larafetch('/register', { method: 'post', body: credentials }) await refresh() } async function resendEmailVerification() { return await $larafetch<{ status: string }>( '/email/verification-notification', { method: 'post', }, ) } async function logout() { if (!isLoggedIn.value) { return } await $larafetch('/logout', { method: 'post' }) user.value = null const csrf_cookie = useCookie('XSRF-TOKEN') csrf_cookie.value = null await router.push('/login') } async function forgotPassword(email: string) { return await $larafetch<{ status: string }>('/forgot-password', { method: 'post', body: { email }, }) } async function resetPassword(credentials: ResetPasswordCredentials) { return await $larafetch<{ status: string }>('/reset-password', { method: 'post', body: credentials, }) } return { user, isLoggedIn, login, register, resendEmailVerification, logout, forgotPassword, resetPassword, refresh, } } export async function fetchCurrentUser() { try { return await $larafetch('/api/user') } catch (error: any) { if ([401, 419].includes(error?.response?.status)) { return null } if (error?.response?.status === undefined) { return null } throw error } }