api ulandi

This commit is contained in:
Samandar Turgunboyev
2025-10-25 18:42:01 +05:00
parent 1a08775451
commit 05b752daf2
84 changed files with 11179 additions and 3724 deletions

View File

@@ -1,7 +1,28 @@
import i18n from "@/shared/config/i18n";
import axios from "axios";
import {
getAuthToken,
getRefAuthToken,
removeAuthToken,
removeRefAuthToken,
setAuthToken,
} from "@/shared/lib/authCookies";
import axios, { AxiosError } from "axios";
import { BASE_URL } from "./URLs";
let isRefreshing = false;
let failedQueue: {
resolve: (token: string) => void;
reject: (error: any) => void;
}[] = [];
const processQueue = (error: any, token: string | null = null) => {
failedQueue.forEach((prom) => {
if (error) prom.reject(error);
else if (token) prom.resolve(token);
});
failedQueue = [];
};
const httpClient = axios.create({
baseURL: BASE_URL,
timeout: 10000,
@@ -9,13 +30,16 @@ const httpClient = axios.create({
httpClient.interceptors.request.use(
async (config) => {
// Language configs
const language = i18n.language;
config.headers["Accept-Language"] = language;
// const accessToken = localStorage.getItem('accessToken');
// if (accessToken) {
// config.headers['Authorization'] = `Bearer ${accessToken}`;
// }
// Faqat GET so'rovlarida Accept-Language headerini qo'shish
if (config.method?.toLowerCase() === "get") {
const language = i18n.language;
config.headers["Accept-Language"] = language;
}
const accessToken = getAuthToken();
if (accessToken) {
config.headers["Authorization"] = `Bearer ${accessToken}`;
}
return config;
},
@@ -24,7 +48,62 @@ httpClient.interceptors.request.use(
httpClient.interceptors.response.use(
(response) => response,
(error) => {
async (error: AxiosError) => {
const originalRequest = error.config as any;
if (error.response?.status === 401 && !originalRequest._retry) {
if (isRefreshing) {
return new Promise((resolve, reject) => {
failedQueue.push({ resolve, reject });
})
.then((token) => {
originalRequest.headers["Authorization"] = `Bearer ${token}`;
return httpClient(originalRequest);
})
.catch((err) => Promise.reject(err));
}
originalRequest._retry = true;
isRefreshing = true;
const refreshToken = getRefAuthToken();
if (!refreshToken) {
removeAuthToken();
removeRefAuthToken();
window.location.href = "/login";
return Promise.reject(error);
}
try {
const response = await axios.post(`${BASE_URL}auth/token/refresh/`, {
refresh: refreshToken,
});
const newAccessToken = response.data.access;
setAuthToken(newAccessToken);
httpClient.defaults.headers["Authorization"] =
`Bearer ${newAccessToken}`;
processQueue(null, newAccessToken);
originalRequest.headers["Authorization"] = `Bearer ${newAccessToken}`;
return httpClient(originalRequest);
} catch (refreshError: any) {
processQueue(refreshError, null);
removeAuthToken();
removeRefAuthToken();
const status = refreshError.response?.status;
if ([401].includes(status)) {
window.location.href = "/login";
}
return Promise.reject(refreshError);
} finally {
isRefreshing = false;
}
}
console.error("API error:", error);
return Promise.reject(error);
},