import axios from 'axios'; <% if (functionality.includes('antd')) { -%> import { message } from 'antd'; <% } -%> import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; interface ResponseType { code: string; message: string; data: T; } class Request { instance: AxiosInstance; baseConfig: AxiosRequestConfig = { baseURL: '/api', timeout: 60000 }; constructor(config: AxiosRequestConfig) { this.instance = axios.create( Object.assign({}, this.baseConfig, config) ); this.instance.interceptors.request.use( (config: AxiosRequestConfig) => { return config; }, (error) => { console.error( `something were wrong when fetch ${config?.url}`, error ); return Promise.reject(error); } ); this.instance.interceptors.response.use( (response: AxiosResponse>) => { const res = response.data; const { code, data, message: errorMessage } = response.data; if (response.config.url?.includes('api.etherscan.io')) { return res; } if (config.baseURL?.includes('cms')) { return data; } if (config.baseURL?.includes('connect')) { return res; } switch (code) { case '20000': return data; case '20001': return {}; case '50000': return null; default: <% if (functionality.includes('antd')) { -%> message.error(errorMessage); <% } else { -%> console.error(errorMessage); <% } -%> return res; } }, (error) => { let errMessage = ''; switch (error?.response?.status) { case 400: errMessage = 'Bad Request'; break; case 401: <% if (functionality.includes('antd')) { -%> message.error('The signature has expired. Please log in again.'); <% } else { -%> console.error('The signature has expired. Please log in again.'); <% } -%> setTimeout(() => { location.pathname = '/'; }, 3000); break; case 404: errMessage = 'Not Found'; break; case 500: case 501: case 502: case 503: case 504: errMessage = `${error.response.status}: something is wrong in server`; break; default: errMessage = `${error.response.status}: something is wrong, please try again later`; break; } <% if (functionality.includes('antd')) { -%> message.error(errMessage); <% } else { -%> console.error(errMessage); <% } -%> return Promise.reject(errMessage); } ); } public async request(config: AxiosRequestConfig): Promise { return this.instance.request(config); } public get(url: string, config?: AxiosRequestConfig): Promise { return this.instance.get(url, config); } public post( url: string, data?: T, config?: AxiosRequestConfig ): Promise { return this.instance.post(url, data, config); } public put, D = any>( url: string, data?: D, config?: AxiosRequestConfig ): Promise { return this.instance.put(url, data, config); } public delete(url: string, config?: AxiosRequestConfig): Promise { return this.instance.delete(url, config); } } const tokenRequest = new Request({ baseURL: '/connect', }); export default new Request({}); export { tokenRequest };