FastGPT/projects/app/src/web/support/user/useUserStore.ts
2023-11-09 09:46:57 +08:00

63 lines
1.8 KiB
TypeScript

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<UserType>;
setUserInfo: (user: UserType | null) => void;
updateUserInfo: (user: UserUpdateParams) => Promise<void>;
};
export const useUserStore = create<State>()(
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) => ({})
}
)
)
);