GlobalEffect.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import React, { useContext } from 'react';
  2. import axiosInstance from '../../http/Axios';
  3. import { rootContext } from '../../context/Root';
  4. import { CODE_STATUS } from '../../consts/Http';
  5. import { MILVUS_ADDRESS } from '../../consts/Localstorage';
  6. import { authContext } from '../../context/Auth';
  7. let axiosResInterceptor: number | null = null;
  8. // let timer: Record<string, ReturnType<typeof setTimeout> | number>[] = [];
  9. // we only take side effect here, nothing else
  10. const GlobalEffect = (props: { children: React.ReactNode }) => {
  11. const { openSnackBar } = useContext(rootContext);
  12. const { setAddress } = useContext(authContext);
  13. // catch axios error here
  14. if (axiosResInterceptor === null) {
  15. axiosResInterceptor = axiosInstance.interceptors.response.use(
  16. function (res: any) {
  17. if (res.statusCode && res.statusCode !== CODE_STATUS.SUCCESS) {
  18. openSnackBar(res.data.message, 'warning');
  19. return Promise.reject(res.data);
  20. }
  21. return res;
  22. },
  23. function (error: any) {
  24. const { response = {} } = error;
  25. switch (response.status) {
  26. case CODE_STATUS.UNAUTHORIZED:
  27. setAddress('');
  28. window.localStorage.removeItem(MILVUS_ADDRESS);
  29. break;
  30. default:
  31. break;
  32. }
  33. if (response.data) {
  34. const { message: errMsg } = response.data;
  35. errMsg && openSnackBar(errMsg, 'error');
  36. return Promise.reject(error);
  37. }
  38. if (error.message) {
  39. openSnackBar(error.message, 'error');
  40. }
  41. return Promise.reject(error);
  42. }
  43. );
  44. }
  45. // get global data
  46. return <>{props.children}</>;
  47. };
  48. export default GlobalEffect;