Files
interview-demo-code/frontend/admin/src/utils/http.js

143 lines
3.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import axios from 'axios';
/**
* Получает user_token из глобального объекта TeleCart
*/
function getUserToken() {
if (typeof window !== 'undefined' && window.TeleCart?.user_token) {
return window.TeleCart.user_token;
}
// Fallback: пытаемся получить из URL как запасной вариант
if (typeof window !== 'undefined') {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get('user_token') || '';
}
return '';
}
/**
* Базовый URL для API запросов
*/
function getBaseUrl() {
return '/admin/index.php';
}
/**
* Создает URL для API запроса
* @param {string} apiAction - действие API (например, 'configureBotToken')
* @returns {string} полный URL
*/
function buildApiUrl(apiAction) {
const baseUrl = getBaseUrl();
const userToken = getUserToken();
return `${baseUrl}?route=extension/module/tgshop/handle&api_action=${apiAction}&user_token=${userToken}`;
}
/**
* HTTP клиент для работы с API
*/
const httpClient = axios.create({
headers: {
'Content-Type': 'application/json',
},
});
/**
* Выполняет POST запрос к API
* @param {string} apiAction - действие API
* @param {object} data - данные для отправки
* @returns {Promise} результат запроса
*/
export async function apiPost(apiAction, data = {}) {
const url = buildApiUrl(apiAction);
try {
const response = await httpClient.post(url, data);
return {
success: true,
data: response.data,
status: response.status,
};
} catch (error) {
// Обработка ошибок axios
if (error.response) {
// Сервер вернул ошибку
const status = error.response.status;
const errorData = error.response.data;
return {
success: false,
error: errorData?.error || error.response.statusText,
status,
data: errorData,
};
} else if (error.request) {
// Запрос был отправлен, но ответа не получено
return {
success: false,
error: 'Не удалось получить ответ от сервера',
status: 0,
};
} else {
// Ошибка при настройке запроса
return {
success: false,
error: error.message || 'Произошла неизвестная ошибка',
status: 0,
};
}
}
}
/**
* Выполняет GET запрос к API
* @param {string} apiAction - действие API
* @param {object} params - query параметры
* @returns {Promise} результат запроса
*/
export async function apiGet(apiAction, params = {}) {
const url = buildApiUrl(apiAction);
try {
const response = await httpClient.get(url, { params: params });
return {
success: true,
data: response.data.data,
status: response.status,
};
} catch (error) {
if (error.response) {
const status = error.response.status;
const errorData = error.response.data;
return {
success: false,
error: errorData?.error || error.response.statusText,
status,
data: errorData,
};
} else if (error.request) {
return {
success: false,
error: 'Не удалось получить ответ от сервера',
status: 0,
};
} else {
return {
success: false,
error: error.message || 'Произошла неизвестная ошибка',
status: 0,
};
}
}
}
export default {
apiPost,
apiGet,
getUserToken,
};