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 ABORT_REQUEST_ERR_MESSAGE = 'The user aborted a request.'; 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'), 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 | 422 | 500 | 502 | 503 | 504; const errorHandler = (error: { response: Response; message: string; }): Response => { const { response } = error; if (error.message === ABORT_REQUEST_ERR_MESSAGE) { console.log('user abort request'); } 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, }); } else if (!response) { notification.error({ description: i18n.t('message.networkAnomalyDescription'), message: i18n.t('message.networkAnomaly'), }); } } 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 (options.responseType === 'blob') { return response; } const data: ResponseType = await response.clone().json(); if (data.retcode === 401 || data.retcode === 401) { notification.error({ message: data.retmsg, description: data.retmsg, duration: 3, }); authorizationUtil.removeAll(); history.push('/login'); // Will not jump to the login page } else if (data.retcode !== 0) { if (data.retcode === 100) { message.error(data.retmsg); } else { notification.error({ message: `${i18n.t('message.hint')} : ${data.retcode}`, description: data.retmsg, duration: 3, }); } return response; } else { return response; } }); export default request;