Files
xin-procurement-weapp/src/stores/auth/useAuthStore.ts
T
2026-08-21 11:01:37 +08:00

91 lines
2.5 KiB
TypeScript
Raw 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.
import { create } from 'zustand'
import Taro from '@tarojs/taro'
import { loginApi } from '@/services/auth'
import type { LoginParams } from '@/services/auth'
import type { User } from '@/types/user'
/** 存储 key */
const STORAGE_KEYS = {
TOKEN: 'auth_token',
USER: 'auth_user',
} as const
/** 从本地存储恢复登录态 */
function loadFromStorage(): { user: User | null; token: string | null } {
try {
const storedToken = Taro.getStorageSync(STORAGE_KEYS.TOKEN)
const storedUser = Taro.getStorageSync(STORAGE_KEYS.USER)
if (storedToken && storedUser) {
return { token: storedToken, user: JSON.parse(storedUser) }
}
} catch {
// 存储数据损坏,清除并视为未登录
try { Taro.removeStorageSync(STORAGE_KEYS.TOKEN) } catch { /* noop */ }
try { Taro.removeStorageSync(STORAGE_KEYS.USER) } catch { /* noop */ }
}
return { user: null, token: null }
}
/** 登录成功后持久化 token 与门店信息 */
function persistAuth(token: string, user: User): void {
try {
Taro.setStorageSync(STORAGE_KEYS.TOKEN, token)
Taro.setStorageSync(STORAGE_KEYS.USER, JSON.stringify(user))
} catch {
// storage 写入失败不阻塞登录流程
}
}
interface AuthState {
user: User | null
token: string | null
loading: boolean
/** 账号密码登录(门店账号由商家后台分配) */
login: (params: LoginParams) => Promise<void>
logout: () => void
/** 更新门店信息(用于编辑资料后同步 store) */
setUser: (user: User) => void
}
const useAuthStore = create<AuthState>((set) => {
// 初始化时从 storage 恢复
const initial = loadFromStorage()
return {
user: initial.user,
token: initial.token,
loading: !!(initial.token && initial.user), // 已恢复则立即 ready
/** 账号密码登录:POST /mini/auth/login */
login: async (params: LoginParams) => {
const res = await loginApi(params)
const { token, user } = res.data
set({ user, token })
persistAuth(token, user)
},
/** 退出登录 */
logout: () => {
set({ user: null, token: null })
try {
Taro.removeStorageSync(STORAGE_KEYS.TOKEN)
Taro.removeStorageSync(STORAGE_KEYS.USER)
} catch {
// noop
}
},
/** 更新用户信息(编辑资料后同步 store + storage */
setUser: (user: User) => {
set({ user })
try {
Taro.setStorageSync(STORAGE_KEYS.USER, JSON.stringify(user))
} catch {
// storage 写入失败不阻塞
}
},
}
})
export default useAuthStore