request.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import axios from 'axios';
  2. import { API_URL, APP_VERSION } from '../constants';
  3. import { Platform } from 'react-native';
  4. import { showBanner } from './bannerUtils';
  5. export const request = axios.create({
  6. baseURL: API_URL,
  7. timeout: 10000
  8. });
  9. export const setupInterceptors = ({
  10. showError
  11. }: {
  12. showError: (message: string, loginNeeded: boolean) => void;
  13. }) => {
  14. request.interceptors.request.use(
  15. (config) => {
  16. config.headers['App-Version'] = APP_VERSION;
  17. config.headers['Platform'] = Platform.OS;
  18. return config;
  19. },
  20. (error) => {
  21. return Promise.reject(error);
  22. }
  23. );
  24. request.interceptors.response.use(
  25. (response) => {
  26. if (response.data.result === 'ERROR' && response.data.result_description) {
  27. const showErrorWithDelay = (message: string, requiresLogin: boolean) => {
  28. setTimeout(() => {
  29. showError(message, requiresLogin);
  30. }, 1000);
  31. };
  32. if (response.data?.login_needed && response.data.login_needed === 1) {
  33. showErrorWithDelay(response.data.result_description, true);
  34. return response;
  35. }
  36. showErrorWithDelay(response.data.result_description, false);
  37. }
  38. return response;
  39. },
  40. (error) => {
  41. if (error.code === 'ECONNABORTED') {
  42. error.isTimeout = true;
  43. showBanner('Slow internet connection!');
  44. return;
  45. } else if (error.message === 'Network Error') {
  46. return;
  47. }
  48. showError(error.message, false);
  49. return Promise.reject(error);
  50. }
  51. );
  52. };