import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; import Cookies from "js-cookie"; import { message } from "antd"; interface ApiResponse { code: number; msg: string; data: T; } interface ErrorResponse { code: number; msg: string; msgZh: string; } export interface ProcessedResponse { data: T; error: null | Pick; } interface CustomAxiosInstance extends Omit { get>>( url: string, config?: AxiosRequestConfig ): Promise; post>>( url: string, data?: unknown, config?: AxiosRequestConfig ): Promise; put>>( url: string, data?: unknown, config?: AxiosRequestConfig ): Promise; delete>>( url: string, config?: AxiosRequestConfig ): Promise; } const instance: CustomAxiosInstance = axios.create({ baseURL: "", timeout: 10000, headers: { "Content-Type": "application/json", }, }); const processResponse = ( response: AxiosResponse> ): ProcessedResponse => { if (response.data.code === 200) { return { data: response.data.data, error: null, }; } else { return { data: response.data.data || ({} as T), error: { msg: response.data.msg, msgZh: (response.data as unknown as ErrorResponse).msgZh, }, }; } }; instance.interceptors.request.use( (config) => { return config; }, (error) => { return Promise.reject(error); } ); instance.interceptors.response.use( ( response: AxiosResponse> ): AxiosResponse> => { return { ...response, data: processResponse(response) }; }, (error) => { message.error(error?.response?.data?.msg || "Error"); return Promise.reject(error); } ); export default instance;