DEV Community

Akash Yadav
Akash Yadav

Posted on

Axios Request Package

import AsyncStorage from '@react-native-async-storage/async-storage'; import NetInfo from "@react-native-community/netinfo"; import axios from "axios"; import { DeviceEventEmitter } from 'react-native'; const BASE_URL = { DEV: 'https://api.worldref.dev/dealx/rest/api/v1/', PROD: 'https://wr19dlx8r7nkmq1p6x.worldref.dev/dealx/rest/api/v1/' } const instance = axios.create({ baseURL: BASE_URL.DEV, timeout: 60 * 1000, }); instance.interceptors.response.use(async (response) => { return response; }, async (error) => { if (error.status === 401 || error.response && error.response.status === 401) { DeviceEventEmitter.emit('logout'); return; } return Promise.reject(error.response ? error.response.data : error); }); const SetHeader = (key, value) => { instance.defaults.headers.common[key] = value; } const RemoveHeader = (key) => { delete instance.defaults.headers.common[key]; } const StoreCache = async (key, value) => { try { await AsyncStorage.setItem(key, JSON.stringify(value)); } catch (error) { return error; } }; const GetCache = async key => { try { const value = await AsyncStorage.getItem(key); const item = JSON.parse(value); if (!item) return null; return item; } catch (error) { return error; } }; const ResponseEncodings = { JSON: 'json', Stream: 'blob', } const RequestContentType = { JSON: 'application/json', FormData: 'multipart/form-data', } const Request = async (method, url, body, nocache = false, responseType = ResponseEncodings.JSON, requestContentType = RequestContentType.JSON) => { const requestOptions = { method: method, url: url, data: body, responseType: responseType, headers: { 'Content-Type': requestContentType } }; try { const connected = await NetInfo.fetch(); if (!connected.isConnected) { if (method === 'GET' && !nocache) { const cached = await GetCache(url); if (cached) return cached; } throw new Error("Please check your internet connection"); } const response = await instance.request(requestOptions); if (method === 'GET' && !nocache) StoreCache(url, response); return response; } catch (error) { throw error; } } export { Request, ResponseEncodings, RequestContentType, SetHeader, RemoveHeader }; 
Enter fullscreen mode Exit fullscreen mode
import AsyncStorage from '@react-native-async-storage/async-storage'; import NetInfo from "@react-native-community/netinfo"; import axios from "axios"; import { DeviceEventEmitter } from 'react-native'; import { RefreshToken } from './models/auth'; const BASE_URL = { DEV: 'https://api.worldref.dev/dealx/rest/api/v1/', PROD: 'https://wr19dlx8r7nkmq1p6x.worldref.dev/dealx/rest/api/v1/' } const instance = axios.create({ baseURL: BASE_URL.DEV, timeout: 60 * 1000, }); const shouldRefreshToken = (error) => { return (error.status === 401 || error.response.status === 401) && !error.config.url.includes('login'); } const getErrorTextFromErrorObject = (error) => { if (error.response) { if (typeof error.response.data === 'string') return error.response.data; if (typeof error.response.data.error === 'string') return error.response.data.error; } if (error.data) { if (typeof error.data === 'string') return error.data; if (typeof error.data.error === 'string') return error.data.error; } if (typeof error === 'string') return error; return 'Something went wrong'; } instance.interceptors.response.use(async (response) => { return response; }, async (error) => { if (shouldRefreshToken(error)) { try { if (error.config.url.includes('refreshtoken')) throw error; await RefreshToken(); return instance.request(error.config); } catch (error) { DeviceEventEmitter.emit('logout'); return; } } return Promise.reject(getErrorTextFromErrorObject(error)); }); const SetHeader = (key, value) => { instance.defaults.headers.common[key] = value; } const RemoveHeader = (key) => { delete instance.defaults.headers.common[key]; } const StoreCache = async (key, value) => { try { await AsyncStorage.setItem(key, JSON.stringify(value)); } catch (error) { return error; } }; const GetCache = async (key) => { try { const value = await AsyncStorage.getItem(key); const item = JSON.parse(value); if (!item) return null; return item; } catch (error) { return error; } }; const ResponseEncodings = { JSON: 'json', Stream: 'blob', } const RequestContentType = { JSON: 'application/json', FormData: 'multipart/form-data', } const Request = async (method, url, body, nocache = false, responseType = ResponseEncodings.JSON, requestContentType = RequestContentType.JSON) => { const requestOptions = { method: method, url: url, data: body, responseType: responseType, headers: { 'Content-Type': requestContentType } }; try { const connected = await NetInfo.fetch(); if (!connected.isConnected) { if (method === 'GET' && !nocache) { const cached = await GetCache(url); if (cached) return cached; } throw new Error("Please check your internet connection"); } const response = await instance.request(requestOptions); if (method === 'GET' && !nocache) StoreCache(url, response); return response; } catch (error) { throw error; } } export { Request, ResponseEncodings, RequestContentType, SetHeader, RemoveHeader }; 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)