user.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import {UserLoginData} from '@models';
  2. import {QUERY_CLIENT, USER_TOKEN_STORAGE} from '@utils';
  3. import {startTransition} from 'react';
  4. import {createStore} from 'zustand/vanilla';
  5. import {menuStore} from './menu';
  6. type UserStoreState = UserLoginData;
  7. type UserStoreAction = {
  8. init(data: UserLoginData): void;
  9. logout(): void;
  10. setMenu(menus: string[]): void;
  11. };
  12. function defaultValue(): UserStoreState {
  13. return {
  14. id: 0,
  15. realName: '',
  16. token: '',
  17. userName: '',
  18. menu: null,
  19. department: '',
  20. role: '',
  21. };
  22. }
  23. export const userStore = createStore<UserStoreState & UserStoreAction>(
  24. function (set) {
  25. // 刷新时不会丢掉用户状态
  26. const sessionData = sessionStorage.getItem(USER_TOKEN_STORAGE);
  27. const initValue = sessionData
  28. ? (JSON.parse(sessionData) as UserLoginData)
  29. : defaultValue();
  30. return {
  31. ...initValue,
  32. init(data) {
  33. set(data);
  34. },
  35. logout() {
  36. // 清除用户缓存
  37. sessionStorage.removeItem(USER_TOKEN_STORAGE);
  38. set(defaultValue());
  39. startTransition(function () {
  40. // 清除请求缓存
  41. QUERY_CLIENT.clear();
  42. // 清除菜单缓存
  43. const {clear} = menuStore.getState();
  44. clear();
  45. });
  46. },
  47. setMenu(menus) {
  48. set({menu: menus.join(',') + ','});
  49. },
  50. };
  51. },
  52. );