Files
chat/frontend/src/stores/auth.js
T
2026-07-17 17:28:25 +08:00

67 lines
1.8 KiB
JavaScript

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 }
})