55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import type { RequestOptions } from "@@/plugin-request/request";
|
|
import type { RequestConfig } from "@umijs/max";
|
|
import { message as toast } from "antd";
|
|
|
|
// Define the structure of the expected response.
|
|
interface ResponseStructure {
|
|
code: number;
|
|
reason?: string;
|
|
message?: string;
|
|
metadata?: Map<string, number>;
|
|
}
|
|
|
|
// Request configuration with error handling and interceptors.
|
|
export const errorConfig: RequestConfig = {
|
|
errorConfig: {
|
|
errorThrower: (res) => {
|
|
const { code, reason, message } = res as unknown as ResponseStructure;
|
|
if (code != 200) {
|
|
const error: any = new Error(message);
|
|
error.info = { reason, message };
|
|
throw error;
|
|
}
|
|
},
|
|
errorHandler: (error: any, opts: any) => {
|
|
if (opts?.skipErrorHandler) throw error;
|
|
if (error.response?.data) {
|
|
const errorInfo: ResponseStructure | undefined = error.response?.data;
|
|
if (errorInfo) {
|
|
const { message, reason } = errorInfo;
|
|
toast.error(reason + ": " + message);
|
|
}
|
|
} else if (error.response) {
|
|
toast.error(`Response status: ${error.response.status}`);
|
|
} else if (error.request) {
|
|
toast.error("None response! Please retry.");
|
|
} else {
|
|
toast.error("Request error, please retry.");
|
|
}
|
|
},
|
|
},
|
|
requestInterceptors: [
|
|
(config: RequestOptions) => {
|
|
return config;
|
|
},
|
|
],
|
|
responseInterceptors: [
|
|
(response) => {
|
|
if (response.status != 200) {
|
|
toast.error(`Request error: ${response.status}`);
|
|
}
|
|
return response;
|
|
},
|
|
],
|
|
};
|