current-user.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { createSlice, type PayloadAction } from "@reduxjs/toolkit";
  2. import type { RootState } from "../store";
  3. import type { IStudio } from "../api/Auth";
  4. export const ROLE_ROOT = "root";
  5. export const ROLE_ADMINISTRATOR = "administrator";
  6. export const TO_SIGN_IN = "/anonymous/sign-in";
  7. export const TO_PROFILE = "/dashboard/users/logs";
  8. export const TO_HOME = "/";
  9. export const TO_WORKSPACE = "/workspace";
  10. const KEY = "token";
  11. const STUDIO_KEY = "studio";
  12. export const DURATION = 60 * 60 * 24;
  13. export const get = (): string | null => {
  14. let token = sessionStorage.getItem(KEY);
  15. if (token) {
  16. return token;
  17. }
  18. token = localStorage.getItem(KEY);
  19. console.debug("token", KEY, token);
  20. if (token) {
  21. return token;
  22. }
  23. return null;
  24. };
  25. const set = (token: string) => {
  26. sessionStorage.setItem(KEY, token);
  27. localStorage.setItem(KEY, token);
  28. };
  29. const remove = () => {
  30. sessionStorage.removeItem(KEY);
  31. localStorage.removeItem(KEY);
  32. };
  33. const removeStudio = () => {
  34. localStorage.removeItem(STUDIO_KEY);
  35. };
  36. const setStudio = (id: string) => {
  37. localStorage.setItem(STUDIO_KEY, id);
  38. };
  39. export interface IUser {
  40. id: string;
  41. nickName: string;
  42. realName: string;
  43. avatar: string;
  44. roles: string[] | null;
  45. }
  46. interface IState {
  47. payload?: IUser;
  48. studio?: IStudio[];
  49. guest?: boolean;
  50. currStudio?: IStudio;
  51. }
  52. const initialState: IState = {};
  53. export const slice = createSlice({
  54. name: "current-user",
  55. initialState,
  56. reducers: {
  57. signIn: (state, action: PayloadAction<[IUser, string]>) => {
  58. state.payload = action.payload[0];
  59. set(action.payload[1]);
  60. state.guest = false;
  61. },
  62. signOut: (state) => {
  63. state.payload = undefined;
  64. state.guest = undefined;
  65. remove();
  66. },
  67. guest: (state, action: PayloadAction<boolean>) => {
  68. state.guest = action.payload;
  69. },
  70. studioSignIn: (state, action: PayloadAction<IStudio[]>) => {
  71. state.studio = action.payload;
  72. },
  73. setCurrStudio: (state, action: PayloadAction<IStudio>) => {
  74. state.currStudio = action.payload;
  75. setStudio(action.payload.id);
  76. },
  77. studioSignOut: (state) => {
  78. state.currStudio = undefined;
  79. removeStudio();
  80. },
  81. recallCurrStudio: (state) => {
  82. const id = localStorage.getItem(STUDIO_KEY);
  83. if (id && state.studio) {
  84. state.currStudio = state.studio.find((value) => value.id);
  85. }
  86. },
  87. },
  88. });
  89. export const {
  90. signIn,
  91. signOut,
  92. guest,
  93. studioSignIn,
  94. setCurrStudio,
  95. studioSignOut,
  96. recallCurrStudio,
  97. } = slice.actions;
  98. export const isRoot = (state: RootState): boolean =>
  99. state.currentUser.payload?.roles?.includes(ROLE_ROOT) || false;
  100. export const isAdministrator = (state: RootState): boolean =>
  101. state.currentUser.payload?.roles?.includes(ROLE_ADMINISTRATOR) || false;
  102. export const currentUser = (state: RootState): IUser | undefined =>
  103. state.currentUser.payload;
  104. export const isGuest = (state: RootState): boolean | undefined =>
  105. state.currentUser.guest;
  106. export const currentStudio = (state: RootState): IStudio | undefined =>
  107. state.currentUser.currStudio;
  108. export const studioList = (state: RootState): IStudio[] | undefined =>
  109. state.currentUser.studio;
  110. export default slice.reducer;