GlobalEffect.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React, { useContext } from 'react';
  2. import axiosInstance from '../../http/Axios';
  3. import { rootContext } from '../../context/Root';
  4. import { HTTP_STATUS_CODE } from '../../consts/Http';
  5. import { authContext } from '../../context/Auth';
  6. import { MILVUS_ADDRESS } from '../../consts/Localstorage';
  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 { setIsAuth, setAddress } = useContext(authContext);
  13. // catch axios error here
  14. if (axiosResInterceptor === null) {
  15. axiosResInterceptor = axiosInstance.interceptors.response.use(
  16. function (res: any) {
  17. debugger;
  18. if (res.statusCode && res.statusCode !== HTTP_STATUS_CODE.OK) {
  19. openSnackBar(res.data.message, 'warning');
  20. return Promise.reject(res.data);
  21. }
  22. return res;
  23. },
  24. function (error: any) {
  25. const { response = {} } = error;
  26. const reset = () => {
  27. setIsAuth(false);
  28. setAddress('');
  29. window.localStorage.removeItem(MILVUS_ADDRESS);
  30. };
  31. switch (response.status) {
  32. case HTTP_STATUS_CODE.UNAUTHORIZED:
  33. case HTTP_STATUS_CODE.FORBIDDEN:
  34. setTimeout(reset, 2000);
  35. break;
  36. default:
  37. break;
  38. }
  39. if (response.data) {
  40. const { message: errMsg } = response.data;
  41. // We need check status 401 in login page
  42. // So server will return 500 when change the user password.
  43. errMsg && openSnackBar(errMsg, 'error');
  44. return Promise.reject(error);
  45. }
  46. if (error.message) {
  47. openSnackBar(error.message, 'error');
  48. }
  49. return Promise.reject(error);
  50. }
  51. );
  52. }
  53. // get global data
  54. return <>{props.children}</>;
  55. };
  56. export default GlobalEffect;