const BASE_URL = "https://survey.slavagm.ru/api"; interface RequestConfig { method: string; headers: Record; body?: BodyInit | null; } /** * Создаёт конфигурацию для fetch-запроса * @param method HTTP-метод (GET, POST, PUT, DELETE) * @param isFormData Флаг, указывающий, что отправляется FormData * @returns Конфигурация для fetch-запроса */ const createRequestConfig = (method: string, isFormData: boolean = false): RequestConfig => { const token = localStorage.getItem("token"); const config: RequestConfig = { method, headers: {}, }; // Добавляем заголовок авторизации, если есть токен if (token) { config.headers.Authorization = `Bearer ${token}`; } // Добавляем Content-Type, если это не FormData if (!isFormData) { config.headers["Content-Type"] = "application/json"; } return config; }; /** * Обрабатывает ответ от сервера * @param response Ответ от fetch * @returns Распарсенные данные или ошибку */ const handleResponse = async (response: Response) => { // Проверяем, есть ли контент в ответе const responseText = await response.text(); if (!responseText) { if (response.ok) { return null; // Если ответ пустой, но статус 200, возвращаем null } throw new Error(`HTTP ${response.status}: ${response.statusText}`); } try { const data = JSON.parse(responseText); if (!response.ok) { throw new Error(data.message || `HTTP ${response.status}`); } return data; } catch (e) { throw new Error(`Не удалось разобрать ответ сервера: ${e}`); } }; export { BASE_URL, createRequestConfig, handleResponse };