auth.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { action, Action, thunk, Thunk, computed, Computed } from "easy-peasy";
  2. import decode from "jwt-decode";
  3. import cookie from "js-cookie";
  4. import axios from "axios";
  5. import { TokenPayload } from "../types";
  6. import { APIv2 } from "../consts";
  7. import { getAxiosConfig } from "../utils";
  8. export interface Auth {
  9. domain?: string;
  10. email: string;
  11. isAdmin: boolean;
  12. isAuthenticated: Computed<Auth, boolean>;
  13. add: Action<Auth, TokenPayload>;
  14. logout: Action<Auth>;
  15. login: Thunk<Auth, { email: string; password: string }>;
  16. renew: Thunk<Auth>;
  17. }
  18. export const auth: Auth = {
  19. domain: null,
  20. email: null,
  21. isAdmin: false,
  22. isAuthenticated: computed(s => !!s.email),
  23. add: action((state, payload) => {
  24. state.domain = payload.domain;
  25. state.email = payload.sub;
  26. state.isAdmin = payload.admin;
  27. }),
  28. logout: action(state => {
  29. cookie.remove("token");
  30. state.domain = null;
  31. state.email = null;
  32. state.isAdmin = false;
  33. }),
  34. login: thunk(async (actions, payload) => {
  35. const res = await axios.post(APIv2.AuthLogin, payload);
  36. const { token } = res.data;
  37. cookie.set("token", token, { expires: 7 });
  38. const tokenPayload: TokenPayload = decode(token);
  39. actions.add(tokenPayload);
  40. }),
  41. renew: thunk(async actions => {
  42. const res = await axios.post(APIv2.AuthRenew, null, getAxiosConfig());
  43. const { token } = res.data;
  44. cookie.set("token", token, { expires: 7 });
  45. const tokenPayload: TokenPayload = decode(token);
  46. actions.add(tokenPayload);
  47. })
  48. };