import { Authorization } from '@/constants/authorization'; import { ResponseType } from '@/interfaces/database/base'; import i18n from '@/locales/config'; import authorizationUtil, { getAuthorization, } from '@/utils/authorization-util'; import { message, notification } from 'antd'; import { history } from 'umi'; import { RequestMethod, extend } from 'umi-request'; import { convertTheKeysOfTheObjectToSnake } from './common-util'; const FAILED_TO_FETCH = 'Failed to fetch'; const RetcodeMessage = { 200: i18n.t('message.200'), 201: i18n.t('message.201'), 202: i18n.t('message.202'), 204: i18n.t('message.204'), 400: i18n.t('message.400'), 401: i18n.t('message.401'), 403: i18n.t('message.403'), 404: i18n.t('message.404'), 406: i18n.t('message.406'), 410: i18n.t('message.410'), 413: i18n.t('message.413'), 422: i18n.t('message.422'), 500: i18n.t('message.500'), 502: i18n.t('message.502'), 503: i18n.t('message.503'), 504: i18n.t('message.504'), }; type ResultCode = | 200 | 201 | 202 | 204 | 400 | 401 | 403 | 404 | 406 | 410 | 413 | 422 | 500 | 502 | 503 | 504; const errorHandler = (error: { response: Response; message: string; }): Response => { const { response } = error; if (error.message === FAILED_TO_FETCH) { notification.error({ description: i18n.t('message.networkAnomalyDescription'), message: i18n.t('message.networkAnomaly'), }); } else { if (response && response.status) { const errorText = RetcodeMessage[response.status as ResultCode] || response.statusText; const { status, url } = response; notification.error({ message: `${i18n.t('message.requestError')} ${status}: ${url}`, description: errorText, }); } } return response; }; const request: RequestMethod = extend({ errorHandler, timeout: 300000, getResponse: true, }); request.interceptors.request.use((url: string, options: any) => { const data = convertTheKeysOfTheObjectToSnake(options.data); const params = convertTheKeysOfTheObjectToSnake(options.params); return { url, options: { ...options, data, params, headers: { ...(options.skipToken ? undefined : { [Authorization]: getAuthorization() }), ...options.headers, }, interceptors: true, }, }; }); request.interceptors.response.use(async (response: any, options) => { if (response?.status === 413 || response?.status === 504) { message.error(RetcodeMessage[response?.status as ResultCode]); } if (options.responseType === 'blob') { return response; } const data: ResponseType = await response?.clone()?.json(); if (data?.code === 100) { message.error(data?.message); } else if (data?.code === 401) { notification.error({ message: data?.message, description: data?.message, duration: 3, }); authorizationUtil.removeAll(); history.push('/login'); // Will not jump to the login page } else if (data?.code !== 0) { notification.error({ message: `${i18n.t('message.hint')} : ${data?.code}`, description: data?.message, duration: 3, }); } return response; }); export default request; export const get = (url: string) => { return request.get(url); }; export const post = (url: string, body: any) => { return request.post(url, { data: body }); }; export const drop = () => {}; export const put = () => {};