import { defineStore } from 'pinia' import { ref, computed } from 'vue' import api from '@/api' import { getOrCreateGuestKey } from '@/utils/guestSession' export const useAuthStore = defineStore('auth', () => { const token = ref(localStorage.getItem('token') || '') const user = ref(null) const initialized = ref(false) const isLoggedIn = computed(() => !!token.value && !!user.value) const isGuest = computed(() => !!user.value?.is_guest) function setSession(data, type) { token.value = data.token user.value = data.user localStorage.setItem('token', token.value) localStorage.setItem('auth_type', type) } async function enterGuestMode() { const res = await api.post('/auth/guest', { guest_key: getOrCreateGuestKey() }) setSession(res.data.data, 'guest') return res.data } async function init() { try { if (token.value) { const res = await api.get('/auth/me') user.value = res.data.data localStorage.setItem('auth_type', user.value?.is_guest ? 'guest' : 'account') } if (!user.value) { await enterGuestMode() } } catch { logout() await enterGuestMode() } finally { initialized.value = true } } async function login(account, password) { const res = await api.post('/auth/login', { account, password }) setSession(res.data.data, 'account') return res.data } async function register(username, email, password) { const res = await api.post('/auth/register', { username, email, password }) setSession(res.data.data, 'account') return res.data } function logout() { token.value = '' user.value = null localStorage.removeItem('token') localStorage.removeItem('auth_type') } return { token, user, initialized, isLoggedIn, isGuest, init, enterGuestMode, login, register, logout } })