laravel-nuxt/nuxt/app/stores/auth.ts

54 lines
1.3 KiB
TypeScript

import { defineStore } from 'pinia'
import type { IAccountLogoutResponse } from '~/types/account'
export type User = {
ulid: string
name: string
email: string
avatar: string
must_verify_email: boolean
has_password: boolean
roles: string[]
providers: string[]
}
export const useAuthStore = defineStore('auth', () => {
const config = useRuntimeConfig()
const nuxtApp = useNuxtApp()
const user = ref(<User>{})
const token = useCookie('token', {
path: '/',
sameSite: 'strict',
secure: config.public.apiBase.startsWith('https://'),
maxAge: 60 * 60 * 24 * 365,
})
const isLoggedIn = computed(() => !!token.value)
const { refresh: logout } = useFetch<IAccountLogoutResponse>('logout', {
method: 'POST',
immediate: false,
onResponse({ response }) {
if (response.status === 200) {
token.value = ''
user.value = <User>{}
return nuxtApp.runWithContext(() => {
return navigateTo('/')
})
}
},
})
const { refresh: fetchUser } = useFetch<{ user: User }>('user', {
immediate: false,
onResponse({ response }) {
if (response.status === 200) {
user.value = response._data.user
}
},
})
return { user, isLoggedIn, logout, fetchUser, token }
})