103 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

2025-12-04 10:04:21 +08:00
// 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 }
}