source: frontend/src/api/axiosInstance.ts@ 0c86e77

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

add axios, auth context, simple working register form on frontend

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