· 5 years ago · Jun 13, 2020, 11:28 PM
1import Axios from "axios";
2import { toast } from "react-toastify";
3import { history } from "../..";
4import { setUserInLocalStorage } from "./localStorage";
5
6const api = Axios.create({
7 baseURL: "https://localhost:5001/api",
8 withCredentials: true,
9});
10const refreshTokenUrl = "/identity/refresh";
11
12let authTokenRequest;
13
14// This function makes a call to get the auth token
15// or it returns the same promise as an in-progress call to get the auth token
16function getAuthToken() {
17 if (!authTokenRequest) {
18 authTokenRequest = api
19 .post(refreshTokenUrl, {})
20 .then((tokenRefreshResponse) => tokenRefreshResponse);
21 authTokenRequest.then(resetAuthTokenRequest, resetAuthTokenRequest);
22 }
23
24 return authTokenRequest;
25}
26
27function resetAuthTokenRequest() {
28 authTokenRequest = null;
29}
30
31api.interceptors.response.use(
32 (response) => response,
33 (error) => {
34 // network error
35 const errorResponse = error.response;
36 if (!errorResponse) {
37 history.push("/error/network");
38 return Promise.reject(error);
39 }
40
41 if (error.response.status === 401 && !error.config._retry) {
42 return getAuthToken().then((response) => {
43 setUserInLocalStorage(response);
44 error.response.config.__isRetryRequest = true;
45 return api(error.response.config);
46 });
47 }
48
49 if (errorResponse.status) {
50 // validation errors
51 if (errorResponse.status === 400 && errorResponse.data.errors) {
52 return handleValidationErrors(errorResponse, error);
53 } else if (errorResponse.status === 400 && errorResponse.data.error) {
54 toast.error(errorResponse.data.error);
55 return Promise.reject(error);
56 } else if (errorResponse.status === 404) {
57 toast.error(
58 "Oops, looks like the item you are searching for actually does not exist."
59 );
60 history.push("/");
61 return Promise.reject(error);
62 }
63
64 return Promise.reject(error);
65 }
66 }
67);
68
69function handleValidationErrors(errorResponse, error) {
70 Object.keys(errorResponse.data.errors).forEach(function (key) {
71 errorResponse.data.errors[key].forEach(function (value) {
72 toast.error(value, {
73 autoClose: 8000,
74 });
75 });
76 });
77 return Promise.reject(error);
78}
79
80export default api;