import axios from 'axios'; import setupAxiosStartupCalls from './axios_startup_calls'; import csrf from './csrf'; import suppressAjaxErrorsDuringNavigation from './suppress_ajax_errors_during_navigation'; axios.defaults.headers.common[csrf.headerKey] = csrf.token; // Used by Rails to check if it is a valid XHR request axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; // Maintain a global counter for active requests // see: spec/support/wait_for_requests.rb axios.interceptors.request.use((config) => { window.pendingRequests = window.pendingRequests || 0; window.pendingRequests += 1; return config; }); setupAxiosStartupCalls(axios); // Remove the global counter axios.interceptors.response.use( (response) => { window.pendingRequests -= 1; return response; }, (err) => { window.pendingRequests -= 1; return Promise.reject(err); }, ); let isUserNavigating = false; window.addEventListener('beforeunload', () => { isUserNavigating = true; }); // Ignore AJAX errors caused by requests // being cancelled due to browser navigation axios.interceptors.response.use( (response) => response, (err) => suppressAjaxErrorsDuringNavigation(err, isUserNavigating), ); export default axios; /** * @return The adapter that axios uses for dispatching requests. This may be overwritten in tests. * * @see https://github.com/axios/axios/tree/master/lib/adapters * @see https://github.com/ctimmerm/axios-mock-adapter/blob/v1.12.0/src/index.js#L39 */ export const getDefaultAdapter = () => axios.defaults.adapter;