import { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios' import _get from 'lodash/get' import { CONFIGS, isBrowser } from '../utils' import { getCookieByName, setCustomCookie } from '../utils/cookies' import { publicRequest } from './publicRequest' publicRequest.interceptors.request.use((config: InternalAxiosRequestConfig) => { const guestToken = isBrowser ? window.localStorage.getItem('auth_guest_token') : null if (guestToken) { config.headers['Authorization-Guest'] = guestToken } const xtfCookie = getCookieByName('X-TF-ECOMMERCE') if (xtfCookie) { config.headers['X-TF-ECOMMERCE'] = xtfCookie } const additionalCookiesHeaderValue = isBrowser ? document.cookie ?? '' : '' if (additionalCookiesHeaderValue !== '') { config.headers['Additional-Cookies'] = additionalCookiesHeaderValue } if (CONFIGS.X_SOURCE_ORIGIN) { config.headers['X-Source-Origin'] = CONFIGS.X_SOURCE_ORIGIN } if (CONFIGS.BASE_URL) { config.baseURL = CONFIGS.BASE_URL + '/api' } return config }) publicRequest.interceptors.response.use( (response: AxiosResponse) => { const authGuestToken: string | null = _get( response, 'headers.authorization-guest', '' ) if (isBrowser && authGuestToken) { window.localStorage.setItem('auth_guest_token', authGuestToken) publicRequest.setGuestToken(authGuestToken) } const xtfCookie = _get(response, 'headers.x-tf-ecommerce') const url = _get(response, 'config.url') const method = _get(response, 'config.method') if (xtfCookie && !(url === '/auth' && method === 'delete')) { setCustomCookie('X-TF-ECOMMERCE', xtfCookie) } return response }, (error: AxiosError) => { if (error?.response?.status === 401) { if (isBrowser) { window.localStorage.removeItem('user_data') const errorType = _get(error, 'response.data.error') if (errorType === 'invalid_token') { window.location.href = '/' } } } const authGuestToken = _get(error, 'response.headers.authorization-guest') if (isBrowser && authGuestToken) { window.localStorage.setItem('auth_guest_token', authGuestToken) publicRequest.setGuestToken(authGuestToken) } return Promise.reject(error) } )