1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import axios from 'axios';
- import { API_URL, APP_VERSION } from '../constants';
- import { Platform } from 'react-native';
- import { showBanner } from './bannerUtils';
- import { useErrorStore } from 'src/stores/errorStore';
- export const request = axios.create({
- baseURL: API_URL,
- timeout: 10000
- });
- export const setupInterceptors = ({
- showError
- }: {
- showError: (
- message: string,
- loginNeeded: boolean,
- authNeeded: boolean,
- premiumNeeded: boolean
- ) => void;
- }) => {
- request.interceptors.request.use(
- (config) => {
- config.headers['App-Version'] = APP_VERSION;
- config.headers['Platform'] = Platform.OS;
- if (config.data instanceof FormData) {
- config.timeout = 0;
- }
- return config;
- },
- (error) => {
- return Promise.reject(error);
- }
- );
- request.interceptors.response.use(
- (response) => {
- const { isErrorShown, setErrorShown } = useErrorStore.getState();
- if (response.data.result === 'ERROR' && response.data.result_description) {
- const showErrorWithDelay = (
- message: string,
- requiresLogin: boolean,
- requiresAuth: boolean,
- requiresPremium: boolean = false
- ) => {
- if (!isErrorShown) {
- setErrorShown(true);
- setTimeout(() => {
- showError(message, requiresLogin, requiresAuth, requiresPremium);
- }, 1000);
- }
- };
- if (response.data?.login_needed && response.data.login_needed === 1) {
- showErrorWithDelay(response.data.result_description, true, false);
- return response;
- } else if (
- response.data.result_description ===
- 'Only authenticated users are allowed to send messages.'
- ) {
- showErrorWithDelay(response.data.result_description, false, true);
- return response;
- } else if (response.data?.premium_needed && response.data.premium_needed === 1) {
- showErrorWithDelay(response.data.result_description, false, false, true);
- return response;
- }
- showErrorWithDelay(response.data.result_description, false, false);
- }
- return response;
- },
- (error) => {
- const { isErrorShown, setErrorShown } = useErrorStore.getState();
- if (error.code === 'ECONNABORTED') {
- error.isTimeout = true;
- showBanner('Slow internet connection!');
- return Promise.reject(error);
- } else if (error.message === 'Network Error') {
- return Promise.reject(error);
- }
- const shortUrl = error.config.url
- ? error.config.url?.split('/')?.filter(Boolean)?.pop()
- : 'Unknown URL';
- if (!isErrorShown) {
- setErrorShown(true);
- showError(`${error.message} (${shortUrl})`, false, false, false);
- }
- return Promise.reject(error);
- }
- );
- };
|