| import axios from "axios"; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || ""; |
|
|
| |
| let accessToken: string | null = null; |
|
|
| export function setAccessToken(token: string | null) { |
| accessToken = token; |
| } |
|
|
| export function getAccessToken(): string | null { |
| return accessToken; |
| } |
|
|
| |
| if (typeof window !== "undefined") { |
| |
| const legacy = localStorage.getItem("access_token"); |
| if (legacy) { |
| accessToken = legacy; |
| localStorage.removeItem("access_token"); |
| } |
| } |
|
|
| export const apiClient = axios.create({ |
| baseURL: `${API_BASE_URL}/api/v1`, |
| headers: { "Content-Type": "application/json" }, |
| withCredentials: true, |
| }); |
|
|
| |
| apiClient.interceptors.request.use( |
| (config) => { |
| if (accessToken) { |
| config.headers.Authorization = `Bearer ${accessToken}`; |
| } |
| return config; |
| }, |
| (error) => Promise.reject(error) |
| ); |
|
|
| |
| apiClient.interceptors.response.use( |
| (response) => response, |
| async (error) => { |
| const originalRequest = error.config; |
|
|
| if (error.response?.status === 401 && !originalRequest._retry) { |
| originalRequest._retry = true; |
|
|
| try { |
| const refreshToken = localStorage.getItem("refresh_token"); |
| if (!refreshToken) throw new Error("No refresh token"); |
|
|
| |
| const response = await axios.post(`${API_BASE_URL}/api/v1/auth/refresh`, { |
| refresh_token: refreshToken, |
| }); |
|
|
| const { access_token, refresh_token: newRefreshToken } = response.data; |
|
|
| |
| accessToken = access_token; |
| |
| localStorage.setItem("refresh_token", newRefreshToken); |
|
|
| originalRequest.headers.Authorization = `Bearer ${access_token}`; |
| return apiClient(originalRequest); |
| } catch (refreshError) { |
| |
| accessToken = null; |
| localStorage.removeItem("refresh_token"); |
| if (typeof window !== "undefined") { |
| window.location.href = "/login"; |
| } |
| return Promise.reject(refreshError); |
| } |
| } |
|
|
| return Promise.reject(error); |
| } |
| ); |
|
|
| export default apiClient; |
|
|