import { notifications } from '@mantine/notifications'
import { IconX } from '@tabler/icons-react'
import axios, { AxiosError, AxiosInstance } from 'axios'
import _ from 'lodash'
import { ms } from '~/core/utils/formatter'
import { env } from './env'
const timeout = ms(env.AXIOS_TIMEOUT)
function createAxios(baseURL: string, keyLocalStorage?: string) {
const instanceAxios = axios.create({ baseURL, timeout })
// interceptor request
if (!_.isEmpty(keyLocalStorage)) {
instanceAxios.interceptors.request.use((config) => {
const curConfig = { ...config }
const SESSION_TOKEN = localStorage.getItem(String(keyLocalStorage))
// ALWAYS READ UPDATED TOKEN
try {
curConfig.headers.Authorization = `Bearer ${SESSION_TOKEN}`
} catch (e) {
console.log(e)
}
return curConfig
})
}
// interceptor response
instanceAxios.interceptors.response.use(
(response) => response,
async (error: AxiosError) => {
const statusCode = _.get(error, 'response.status', null)
const message = _.get(error, 'response.data.message', null)
const errorClientCode = [
400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413,
414, 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431,
451,
]
const errorServerCode = [
500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511,
]
// Client Error
if (errorClientCode.includes(Number(statusCode))) {
notifications.show({
title: `Client Error : ${statusCode}`,
message,
color: 'red',
withCloseButton: false,
icon: ,
})
}
// Server Error
if (errorServerCode.includes(Number(statusCode))) {
const errMessage: any = error.response?.data ?? error.message
notifications.show({
title: `Server Error : ${statusCode}`,
message: errMessage,
color: 'red',
withCloseButton: false,
icon: ,
})
}
return Promise.reject(error)
}
)
return instanceAxios
}
export default class FetchApi {
private axiosInstance: AxiosInstance | null
private readonly baseURL: string
private readonly keyLocalStorage?: string
constructor(baseURL: string, keyLocalStorage?: string) {
this.axiosInstance = null
this.baseURL = baseURL
this.keyLocalStorage = keyLocalStorage
}
public get default(): AxiosInstance {
if (!this.axiosInstance) {
this.axiosInstance = createAxios(this.baseURL, this.keyLocalStorage)
return this.axiosInstance
}
return this.axiosInstance
}
}