import { create } from 'zustand'; import { devtools, persist } from 'zustand/middleware'; import { immer } from 'zustand/middleware/immer'; import type { UserUpdateParams } from '@/types/user'; import type { UserType } from '@fastgpt/global/support/user/type.d'; import { formatPrice } from '@fastgpt/global/support/wallet/bill/tools'; import { getTokenLogin, putUserInfo } from '@/web/support/user/api'; type State = { userInfo: UserType | null; initUserInfo: () => Promise; setUserInfo: (user: UserType | null) => void; updateUserInfo: (user: UserUpdateParams) => Promise; }; export const useUserStore = create()( devtools( persist( immer((set, get) => ({ userInfo: null, async initUserInfo() { const res = await getTokenLogin(); get().setUserInfo(res); return res; }, setUserInfo(user: UserType | null) { set((state) => { state.userInfo = user ? { ...user, balance: formatPrice(user.balance) } : null; }); }, async updateUserInfo(user: UserUpdateParams) { const oldInfo = (get().userInfo ? { ...get().userInfo } : null) as UserType | null; set((state) => { if (!state.userInfo) return; state.userInfo = { ...state.userInfo, ...user }; }); try { await putUserInfo(user); } catch (error) { set((state) => { state.userInfo = oldInfo; }); return Promise.reject(error); } } })), { name: 'userStore', partialize: (state) => ({}) } ) ) );