116 lines
2.7 KiB
TypeScript
116 lines
2.7 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import {
|
|
setAuthToken,
|
|
sendSmsCode,
|
|
loginBySms,
|
|
loginByPassword,
|
|
loginByHuihuiToken,
|
|
logoutUser,
|
|
type SmsLoginResult,
|
|
type UserProfile
|
|
} from '@/api'
|
|
import { clearHuihuiEmbeddedMode, markHuihuiEmbeddedMode } from '@/utils/embed-mode'
|
|
|
|
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) => {
|
|
const result = await loginBySms(phone, code)
|
|
clearHuihuiEmbeddedMode()
|
|
return acceptLogin(result)
|
|
}
|
|
|
|
// 账号密码登录
|
|
const loginByPwd = async (account: string, password: string) => {
|
|
const result = await loginByPassword(account, password)
|
|
clearHuihuiEmbeddedMode()
|
|
return acceptLogin(result)
|
|
}
|
|
|
|
const loginByToken = async (huihuiToken: string) => {
|
|
const result = await loginByHuihuiToken(huihuiToken)
|
|
markHuihuiEmbeddedMode()
|
|
return acceptLogin(result)
|
|
}
|
|
|
|
// 退出
|
|
const logout = async () => {
|
|
try {
|
|
await logoutUser()
|
|
} catch {
|
|
/* 忽略网络错误,本地清除即可 */
|
|
}
|
|
clearHuihuiEmbeddedMode()
|
|
clearSession()
|
|
}
|
|
|
|
return {
|
|
token,
|
|
user,
|
|
isLogin,
|
|
loadFromStorage,
|
|
clearSession,
|
|
sendCode,
|
|
login,
|
|
loginByPwd,
|
|
loginByToken,
|
|
logout
|
|
}
|
|
})
|