diff --git a/src/services/api/axiosClient.ts b/src/services/api/axiosClient.ts index aad08b5..2bc3b7f 100644 --- a/src/services/api/axiosClient.ts +++ b/src/services/api/axiosClient.ts @@ -1,5 +1,6 @@ import axios from "axios"; import { API_CONFIG } from "./config"; +import { userService } from "./userService"; // Create axios instance with default configuration const axiosClient = axios.create({ @@ -35,6 +36,42 @@ axiosClient.interceptors.response.use( return response; }, async (error) => { + const originalRequest = error.config; + + if ( + error.response && + error.response.status === 401 && + !originalRequest._retry + ) { + originalRequest._retry = true; + try { + let refreshToken = null; + if (typeof window !== "undefined") { + const authTokens = localStorage.getItem("auth_tokens"); + if (authTokens) { + const tokens = JSON.parse(authTokens); + refreshToken = tokens.refreshToken; + } + } + const data = await userService.refreshAccessToken(refreshToken); + if (typeof window !== "undefined") { + localStorage.setItem("auth_tokens", JSON.stringify(data.tokens)); + } + + originalRequest.headers[ + "Authorization" + ] = `Bearer ${data.tokens.accessToken}`; + return axiosClient(originalRequest); + } catch (refreshError) { + if (typeof window !== "undefined") { + localStorage.removeItem("auth_tokens"); + localStorage.removeItem("auth_user"); + window.location.href = "/login"; + } + + return Promise.reject(refreshError); + } + } return Promise.reject(error); } ); diff --git a/src/services/api/config.ts b/src/services/api/config.ts index 861b5b9..ec01a52 100644 --- a/src/services/api/config.ts +++ b/src/services/api/config.ts @@ -19,6 +19,7 @@ export const API_ENDPOINTS = { // Auth endpoints AUTH: { CREATE: "/auth/create-login", + REFRESH: "/auth/refresh-token", }, // User endpoints diff --git a/src/services/api/userService.ts b/src/services/api/userService.ts index 1f075b5..4bae654 100644 --- a/src/services/api/userService.ts +++ b/src/services/api/userService.ts @@ -13,6 +13,10 @@ interface UpdateUserParams { picture?: string; } +interface RefreshTokenParams { + refreshToken: string; +} + interface User { id: string; username: string; @@ -39,6 +43,13 @@ const createUser = async (params: CreateUserParams): Promise => { return response.data; }; +const refreshAccessToken = async ( + params: RefreshTokenParams +): Promise => { + const response = await axiosClient.post(API_ENDPOINTS.AUTH.REFRESH); + return response.data; +}; + const updateUser = async (params: UpdateUserParams): Promise => { const response = await axiosClient.patch(API_ENDPOINTS.USERS.UPDATE, params); return response.data; @@ -53,4 +64,5 @@ export const userService = { createUser, updateUser, getUserById, + refreshAccessToken, };