auth.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { action, Action, thunk, Thunk, computed, Computed } from "easy-peasy";
  2. import Router from "next/router";
  3. import decode from "jwt-decode";
  4. import cookie from "js-cookie";
  5. import axios from "axios";
  6. import { TokenPayload } from "../types";
  7. import { API } from "../consts";
  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. }
  17. export const auth: Auth = {
  18. domain: null,
  19. email: null,
  20. isAdmin: false,
  21. isAuthenticated: computed(s => !!s.email),
  22. add: action((state, payload) => {
  23. state.domain = payload.domain;
  24. state.email = payload.sub;
  25. state.isAdmin = payload.admin;
  26. }),
  27. logout: action(state => {
  28. cookie.remove("token");
  29. state.domain = null;
  30. state.email = null;
  31. state.isAdmin = false;
  32. Router.push("/");
  33. }),
  34. login: thunk(async (actions, payload) => {
  35. const res = await axios.post(API.LOGIN, payload);
  36. const { token } = res.data;
  37. cookie.set("token", token, { expires: 7 });
  38. const tokenPayload: TokenPayload = decode(token);
  39. actions.add(tokenPayload);
  40. Router.push("/");
  41. })
  42. };