From b9dee09060a6237f192ea479feae0ddc604f20d7 Mon Sep 17 00:00:00 2001 From: Vinicius Souza Date: Mon, 11 Nov 2024 14:50:12 +0000 Subject: [PATCH] feat: request queue --- src/services/api.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/services/api.ts b/src/services/api.ts index 0f2fc47..45a027f 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,10 +1,16 @@ -import axios, { AxiosInstance } from 'axios'; +import axios, { AxiosError, AxiosInstance } from 'axios'; import { AppError } from '@utils/AppError'; import { storageAuthTokenGet } from '@storage/storageAuthToken'; type SignOut = () => void; + +type PromiseType = { + onSuccess: (token: string) => void; + onFailure: (error: AxiosError) => void; +}; + type APIInstanceProps = AxiosInstance & { registerInterceptTokenManager: (signOut: SignOut) => () => void; }; @@ -22,6 +28,9 @@ api.interceptors.request.use( }, ); +let failedQueue: Array = []; +let isRefreshing = false; + api.registerInterceptTokenManager = (signOut: SignOut) => { const interceptTokenManager = api.interceptors.response.use( (response) => response, @@ -37,6 +46,24 @@ api.registerInterceptTokenManager = (signOut: SignOut) => { signOut(); return Promise.reject(requestError); } + + const originalRequestConfig = requestError.config; + + if (isRefreshing) { + return new Promise((resolve, reject) => { + failedQueue.push({ + onSuccess: (token: string) => { + originalRequestConfig.headers.Authorization = `Bearer ${token}`; + resolve(api(originalRequestConfig)); + }, + onFailure: (error: AxiosError) => { + reject(error); + }, + }); + }); + } + + isRefreshing = true; } signOut();