auth.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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 { API } from "../consts";
  7. export interface Auth {
  8. domain?: string;
  9. email: string;
  10. isAdmin: boolean;
  11. isAuthenticated: Computed<Auth, boolean>;
  12. add: Action<Auth, TokenPayload>;
  13. logout: Action<Auth>;
  14. login: Thunk<Auth, { email: string; password: string }>;
  15. }
  16. export const auth: Auth = {
  17. domain: null,
  18. email: null,
  19. isAdmin: false,
  20. isAuthenticated: computed(s => !!s.email),
  21. add: action((state, payload) => {
  22. state.domain = payload.domain;
  23. state.email = payload.sub;
  24. state.isAdmin = payload.admin;
  25. }),
  26. logout: action(state => {
  27. cookie.remove("token");
  28. state.domain = null;
  29. state.email = null;
  30. state.isAdmin = false;
  31. }),
  32. login: thunk(async (actions, payload) => {
  33. const res = await axios.post(API.LOGIN, payload);
  34. const { token } = res.data;
  35. cookie.set("token", token, { expires: 7 });
  36. const tokenPayload: TokenPayload = decode(token);
  37. actions.add(tokenPayload);
  38. })
  39. };