Files
huihuiSquare/digital-avatar-app/src/store/user.ts
T

107 lines
2.4 KiB
TypeScript

import { defineStore } from 'pinia'
import { ref } from 'vue'
import {
setAuthToken,
sendSmsCode,
loginBySms,
loginByPassword,
loginByHuihuiToken,
logoutUser,
type SmsLoginResult,
type UserProfile
} from '@/api'
const TOKEN_KEY = 'hh_app_token'
const USER_KEY = 'hh_app_user'
// 会会短信登录的本地会话(打通 会会 userId ↔ 本系统用户)
export const useUserStore = defineStore('smsuser', () => {
const token = ref<string>('')
const user = ref<(UserProfile & { huihuiUserId?: string; phone?: string }) | null>(null)
const isLogin = ref(false)
// 启动时从本地恢复会话
const loadFromStorage = () => {
const t = localStorage.getItem(TOKEN_KEY)
const u = localStorage.getItem(USER_KEY)
if (t && u) {
try {
token.value = t
user.value = JSON.parse(u)
isLogin.value = true
setAuthToken(t)
} catch {
clearLocal()
}
}
}
const persist = () => {
localStorage.setItem(TOKEN_KEY, token.value)
localStorage.setItem(USER_KEY, JSON.stringify(user.value))
}
const clearLocal = () => {
localStorage.removeItem(TOKEN_KEY)
localStorage.removeItem(USER_KEY)
}
const clearSession = () => {
token.value = ''
user.value = null
isLogin.value = false
setAuthToken(null)
clearLocal()
}
const acceptLogin = (res: SmsLoginResult) => {
token.value = res.token
user.value = { ...(res.user || {}), ...(res.huihui || {}) }
isLogin.value = true
setAuthToken(res.token)
persist()
return res
}
// 发送验证码(返回结果,演示模式含 devCode)
const sendCode = async (phone: string) => {
return await sendSmsCode(phone)
}
// 短信登录
const login = async (phone: string, code: string) => {
return acceptLogin(await loginBySms(phone, code))
}
// 账号密码登录
const loginByPwd = async (account: string, password: string) => {
return acceptLogin(await loginByPassword(account, password))
}
const loginByToken = async (huihuiToken: string) =>
acceptLogin(await loginByHuihuiToken(huihuiToken))
// 退出
const logout = async () => {
try {
await logoutUser()
} catch {
/* 忽略网络错误,本地清除即可 */
}
clearSession()
}
return {
token,
user,
isLogin,
loadFromStorage,
clearSession,
sendCode,
login,
loginByPwd,
loginByToken,
logout
}
})