import axios, { AxiosInstance, AxiosResponse, AxiosError } from 'axios'; import { toast } from 'sonner'; import { useUserStore } from '@/store/user-store'; import { env } from '@/config/env'; import { AXIOS_TIMEOUT_MS } from '@/config/constants'; import { paramsSerializer } from '@/lib/paramsSerializer'; export const httpClient: AxiosInstance = axios.create({ baseURL: env.apiBaseUrl, withCredentials: true, paramsSerializer, }); httpClient.defaults.timeout = AXIOS_TIMEOUT_MS; type ServerErrorData = { message: string }; const errorMessageByCode: Record = { 400: 'Validation error', 404: 'Not found', 500: 'Server error', }; const setupInterceptors = () => { httpClient.interceptors.request.use( (requestConfig) => { if (typeof window !== 'undefined') { const locale = document.cookie.match(/NEXT_LOCALE=([^;]+)/)?.[1] ?? 'az'; requestConfig.headers['Accept-Language'] = locale; } return requestConfig; }, (error: AxiosError) => Promise.reject(error), ); httpClient.interceptors.response.use( (response: AxiosResponse) => response, (error: AxiosError) => { if (error.response) { const errorStatus = error.response.status; const errorData = error.response.data as ServerErrorData; if (errorStatus === 401 || errorStatus === 403) { const store = useUserStore.getState(); if (store.isAuthenticated()) { store.clearUser(); window.dispatchEvent(new CustomEvent('auth:unauthorized')); } return Promise.reject(error); } if (errorStatus in errorMessageByCode) { toast.error(errorData?.message ?? errorMessageByCode[errorStatus]); } else if (errorData?.message) { toast.error(errorData.message); } else { toast.error(`Server status ${errorStatus}`); } } else if (error.request) { toast.error('Network error. Check your connection.'); } else { toast.error(`Unexpected error: ${error.message}`); } return Promise.reject(error); }, ); }; setupInterceptors();