refactor: streamline token refresh logic by retrying queued requests with new tokens and update public API endpoint list.

This commit is contained in:
pradeepkumar
2026-01-31 21:46:49 +05:30
parent b41bd8a3eb
commit 81d182c526

View File

@@ -27,10 +27,17 @@ let failedQueue: Array<{
config: InternalAxiosRequestConfig; config: InternalAxiosRequestConfig;
}> = []; }> = [];
const processQueue = (error: AxiosError | null) => { const processQueue = (error: AxiosError | null, newToken?: string) => {
failedQueue.forEach((prom) => { failedQueue.forEach((prom) => {
if (error) { if (error) {
prom.reject(error); prom.reject(error);
} else {
// Update the queued request with new token and retry
if (newToken && prom.config.headers) {
prom.config.headers.Authorization = `Bearer ${newToken}`;
}
// Resolve to trigger the .then() which will retry the request
api(prom.config).then(prom.resolve).catch(prom.reject);
} }
}); });
failedQueue = []; failedQueue = [];
@@ -62,11 +69,15 @@ api.interceptors.request.use(
} }
); );
// Public API endpoints that don't require authentication // Public API endpoints that don't require authentication (everything else requires auth)
const publicEndpoints = [ const publicEndpoints = [
'/agents', '/auth/login',
'/auth/register',
'/auth/refresh',
'/auth/forgot-password',
'/auth/reset-password',
'/auth/verify-email',
'/agent-types', '/agent-types',
'/profiles',
]; ];
// Check if URL is a public endpoint // Check if URL is a public endpoint
@@ -110,16 +121,9 @@ api.interceptors.response.use(
} }
if (isRefreshing) { if (isRefreshing) {
// If already refreshing, queue this request // If already refreshing, queue this request to be retried after refresh completes
return new Promise((resolve, reject) => { return new Promise<AxiosResponse>((resolve, reject) => {
failedQueue.push({ resolve, reject, config: originalRequest }); failedQueue.push({ resolve, reject, config: originalRequest });
}).then(() => {
// Retry with new token
const newToken = localStorage.getItem('accessToken');
if (newToken && originalRequest.headers) {
originalRequest.headers.Authorization = `Bearer ${newToken}`;
}
return api(originalRequest);
}); });
} }
@@ -160,8 +164,8 @@ api.interceptors.response.use(
originalRequest.headers.Authorization = `Bearer ${newAccessToken}`; originalRequest.headers.Authorization = `Bearer ${newAccessToken}`;
} }
// Process queued requests // Process queued requests with new token
processQueue(null); processQueue(null, newAccessToken);
isRefreshing = false; isRefreshing = false;
// Retry original request // Retry original request