2025-12-04 10:04:21 +08:00

103 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// app/composables/useAuth.js
import { useApi, useAuthToken } from './useApi'
export function useAuth() {
const api = useApi()
const { token, setToken } = useAuthToken()
const user = useState('auth:user', () => null)
const loading = useState('auth:loading', () => false)
const pickToken = (res) => res?.user?.token || res?.token || null
const setUserFromResponse = (res) => {
const u = res?.user || {}
user.value = {
id: u.id ?? u._id ?? u.user_id ?? null,
username: u.username ?? null,
email: u.email ?? null,
bio: u.bio ?? null,
image: u.image ?? null,
phone: u.phone ?? null,
userType: u.userType ?? u.user_type ?? null,
companyName: u.companyName ?? u.company_name ?? null,
emailVerified: !!u.email_verified,
roles: Array.isArray(u.roles) ? [...u.roles] : [],
}
}
async function login(payload) {
loading.value = true
console.log('[useAuth] login payload:', { ...payload, password: '***' })
try {
const res = await api.post('/auth/login', {
user: { email: payload.email, password: payload.password },
})
console.log('[useAuth] login response:', res)
// 冗余写入useApi 已做了,但这里再做一遍以防万一)
const newToken = pickToken(res)
if (newToken) setToken(newToken)
setUserFromResponse(res)
console.log('[useAuth] user after login:', user.value)
return res.user
} finally {
loading.value = false
}
}
async function register(payload) {
if (payload.password !== payload.confirmPassword) {
throw createError({ statusCode: 400, statusMessage: '两次输入的密码不一致' })
}
loading.value = true
console.log('[useAuth] register payload:', { ...payload, password: '***', confirmPassword: '***' })
try {
const res = await api.post('/auth', {
user: {
email: payload.email,
password: payload.password,
confirm_password: payload.confirmPassword,
code: payload.code,
},
})
console.log('[useAuth] register response:', res)
const newToken = pickToken(res)
if (newToken) setToken(newToken)
setUserFromResponse(res)
console.log('[useAuth] user after register:', user.value)
return res.user
} finally {
loading.value = false
}
}
async function fetchMe() {
if (!token.value) {
console.log('[useAuth] fetchMe skipped: no token')
return null
}
const res = await api.get('/user')
console.log('[useAuth] fetchMe response:', res)
setUserFromResponse(res)
return res.user
}
async function logout() {
console.log('[useAuth] logout begin, token =', token.value)
try {
await $fetch('/api/auth/logout', { method: 'POST', credentials: 'include' })
console.log('[useAuth] server logout OK')
} catch (e) {
console.warn('[useAuth] server logout error:', e)
}
setToken(null)
user.value = null
console.log('[useAuth] logout done, token =', token.value, 'user =', user.value)
}
return { token, user, loading, login, register, fetchMe, logout }
}