source: frontend/src/api/axiosInstance.ts@ 484dc3f

main
Last change on this file since 484dc3f was 484dc3f, checked in by Filip Gavrilovski <filipgavrilovski28@…>, 6 months ago

add support for profile pictures

  • Property mode set to 100644
File size: 2.0 KB
Line 
1import axios from "axios";
2
3export const baseURL = import.meta.env.VITE_API_BASE_URL;
4
5export const axiosInstance = axios.create({
6 baseURL,
7 withCredentials: true,
8});
9
10// set content-type to application/json unless sending FormData
11axiosInstance.interceptors.request.use((config) => {
12 if (!(config.data instanceof FormData)) {
13 config.headers["Content-Type"] = "application/json";
14 }
15 return config;
16});
17
18let refreshPromise: Promise<void> | null = null;
19let refreshTimeout: number | null = null;
20
21export const clearRefreshTimeout = () => {
22 if (refreshTimeout) {
23 clearTimeout(refreshTimeout);
24 refreshTimeout = null;
25 }
26};
27
28export const scheduleTokenRefresh = (expiryTimeSeconds: number) => {
29 clearRefreshTimeout();
30
31 if (!expiryTimeSeconds || expiryTimeSeconds <= 0) {
32 return;
33 }
34
35 const refreshTime = (expiryTimeSeconds - 60) * 1000;
36 if (refreshTime <= 0) {
37 refreshTokenMethod();
38 } else {
39 refreshTimeout = setTimeout(refreshTokenMethod, refreshTime);
40 }
41};
42
43export const refreshTokenMethod = async (): Promise<void | null> => {
44 if (refreshPromise) {
45 return refreshPromise;
46 }
47
48 refreshPromise = (async () => {
49 try {
50 const refreshResponse = await axiosInstance.post<{
51 tokenExpiresIn: number;
52 }>("/auth/refresh");
53 scheduleTokenRefresh(refreshResponse.data.tokenExpiresIn);
54 } catch (err) {
55 clearRefreshTimeout();
56 console.error(err);
57 throw err;
58 } finally {
59 refreshPromise = null;
60 }
61 })();
62 return refreshPromise;
63};
64
65axiosInstance.interceptors.response.use(
66 (response) => response,
67 async (error) => {
68 const originalConfig = error.config;
69 if (
70 [401, 403].includes(error.response?.status) &&
71 !originalConfig._retry &&
72 originalConfig.url !== "/auth/refresh"
73 ) {
74 originalConfig._retry = true;
75
76 try {
77 await refreshTokenMethod();
78 return axiosInstance(originalConfig);
79 } catch (err) {
80 clearRefreshTimeout();
81 return Promise.reject(err);
82 }
83 }
84 return Promise.reject(error);
85 },
86);
87
88export default axiosInstance;
Note: See TracBrowser for help on using the repository browser.