interceptors.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { notification } from 'antd';
  2. import { AxiosError } from 'axios';
  3. import { ApiResponse, FailedTuple, ResponseType, SuccessTuple } from '../';
  4. /**
  5. * Response processing
  6. *
  7. * @param promise request
  8. * @param ignoreCodes ignore error codes
  9. * @returns
  10. */
  11. export const apiInterceptors = <T = any, D = any>(
  12. promise: Promise<ApiResponse<T, D>>,
  13. ignoreCodes?: '*' | (number | string)[],
  14. ) => {
  15. return promise
  16. .then<SuccessTuple<T, D>>(response => {
  17. const { data } = response;
  18. if (!data) {
  19. throw new Error('Network Error!');
  20. }
  21. if (!data.success) {
  22. if (ignoreCodes === '*' || (data.err_code && ignoreCodes && ignoreCodes.includes(data.err_code))) {
  23. return [null, data.data, data, response];
  24. } else {
  25. notification.error({
  26. message: `Request error`,
  27. description: data?.err_msg ?? 'The interface is abnormal. Please try again later',
  28. });
  29. }
  30. }
  31. return [null, data.data, data, response];
  32. })
  33. .catch<FailedTuple<T, D>>((err: Error | AxiosError<T, D>) => {
  34. let errMessage = err.message;
  35. if (err instanceof AxiosError) {
  36. try {
  37. const { err_msg } = JSON.parse(err.request.response) as ResponseType<null>;
  38. err_msg && (errMessage = err_msg);
  39. } catch {
  40. /* empty */
  41. }
  42. }
  43. notification.error({
  44. message: `Request error`,
  45. description: errMessage,
  46. });
  47. return [err, null, null, null];
  48. });
  49. };