Source: axios/axiosRequest/index.js

import axios from 'axios';

/**
 * Запрос
 * @param {string} url - URL запроса.
 * @param {string} method - HTTP-метод запроса.
 * @param {Object} postData - Передаваемые данные.
 * @param {boolean} isCheckUser - Проверять ли достоверность ВК или ОК пользователя.
 * @param {Object} params - Парметры запроса axios.
 * @param {Object} headers - Заголовки запроса axios.
 * @return {Promise} - Вернется либо фейл в формате
 * { result: 'fail', error: 'error', errorDesc: 'description' }, либо успех в формате
 * { result: success, data: {Array | Object} }
 */
const axiosRequest = (url, method, postData, isCheckUser = true, params = {}, headers = {}) => {
    const checkFunc = (response) => {
        if (response.data.result === 'success') {
            return response;
        }
        return Promise.reject(response.data.result !== undefined ? response.data : 'unknown');
    };

    const successFunc = (response) => response.data;

    const failFunc = (err) => {
        if (err === 'unknown') {
            // eslint-disable-next-line prefer-promise-reject-errors
            return Promise.reject({
                result: 'fail',
                error: 'unknown',
                errorDesc: err,
            });
        }

        return Promise.reject(err);
    };

    const preparedPostData = new FormData();
    Object.keys(postData).forEach((key) => {
        preparedPostData.append(key, postData[key]);
    });

    if (isCheckUser) {
        preparedPostData.append('url', window.location.href);
    }

    return axios({
        method,
        url,
        data: preparedPostData,
        headers,
        ...params,
    })
        .then((result) => checkFunc(result))
        .then((result) => successFunc(result))
        .catch((error) => failFunc(error));
};

export default axiosRequest;