current-user.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { createSlice, PayloadAction } from "@reduxjs/toolkit";
  2. import type { RootState } from "../store";
  3. export const ROLE_ROOT = "root";
  4. export const ROLE_ADMINISTRATOR = "administrator";
  5. export const TO_SIGN_IN = "/anonymous/users/sign-in";
  6. export const TO_PROFILE = "/dashboard/users/logs";
  7. export const TO_HOME = "/";
  8. const KEY = "token";
  9. export const DURATION = 60 * 60 * 24;
  10. export const get = (): string | null => {
  11. let token = sessionStorage.getItem(KEY);
  12. if (token) {
  13. return token;
  14. }
  15. token = localStorage.getItem(KEY);
  16. if (token) {
  17. return token;
  18. }
  19. return null;
  20. };
  21. const set = (token: string) => {
  22. sessionStorage.setItem(KEY, token);
  23. localStorage.setItem(KEY, token);
  24. };
  25. const remove = () => {
  26. sessionStorage.removeItem(KEY);
  27. localStorage.removeItem(KEY);
  28. };
  29. export interface IUser {
  30. id: string;
  31. nickName: string;
  32. realName: string;
  33. avatar: string;
  34. roles: string[] | null;
  35. }
  36. interface IState {
  37. payload?: IUser;
  38. guest?: boolean;
  39. }
  40. const initialState: IState = {};
  41. export const slice = createSlice({
  42. name: "current-user",
  43. initialState,
  44. reducers: {
  45. signIn: (state, action: PayloadAction<[IUser, string]>) => {
  46. state.payload = action.payload[0];
  47. set(action.payload[1]);
  48. state.guest = false;
  49. },
  50. signOut: (state) => {
  51. state.payload = undefined;
  52. state.guest = undefined;
  53. remove();
  54. },
  55. guest: (state, action: PayloadAction<boolean>) => {
  56. state.guest = action.payload;
  57. },
  58. },
  59. });
  60. export const { signIn, signOut, guest } = slice.actions;
  61. export const isRoot = (state: RootState): boolean =>
  62. state.currentUser.payload?.roles?.includes(ROLE_ROOT) || false;
  63. export const isAdministrator = (state: RootState): boolean =>
  64. state.currentUser.payload?.roles?.includes(ROLE_ADMINISTRATOR) || false;
  65. export const currentUser = (state: RootState): IUser | undefined =>
  66. state.currentUser.payload;
  67. export const isGuest = (state: RootState): boolean | undefined =>
  68. state.currentUser.guest;
  69. export default slice.reducer;