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 logout: () => void /** 更新门店信息(用于编辑资料后同步 store) */ setUser: (user: User) => void } const useAuthStore = create((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