72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
// lib/api.ts
|
||
// Общая логика отправки данных калькулятора на backend
|
||
|
||
import { API_BASE_URL } from './config';
|
||
|
||
export interface SubmitResponse {
|
||
success: boolean;
|
||
error?: string;
|
||
}
|
||
|
||
/**
|
||
* Отправляет данные калькулятора на backend
|
||
* @param calculatorType - Тип калькулятора (например, 'soap')
|
||
* @param chatId - ID чата Telegram
|
||
* @param formData - Данные формы
|
||
* @param photoFile - Файл фото (опционально)
|
||
* @returns Promise с результатом отправки
|
||
*/
|
||
export async function submitCalculator(
|
||
calculatorType: string,
|
||
chatId: string,
|
||
formData: Record<string, string | number>,
|
||
photoFile: File | null = null
|
||
): Promise<SubmitResponse> {
|
||
const data = new FormData();
|
||
|
||
data.append('chat_id', chatId);
|
||
|
||
// Добавляем все поля формы
|
||
for (const [key, value] of Object.entries(formData)) {
|
||
data.append(key, value.toString());
|
||
}
|
||
|
||
// Добавляем фото, если есть
|
||
if (photoFile) {
|
||
data.append('photo', photoFile);
|
||
}
|
||
|
||
try {
|
||
const res = await fetch(`${API_BASE_URL}/api/submit/${calculatorType}`, {
|
||
method: 'POST',
|
||
body: data,
|
||
});
|
||
|
||
if (res.ok) {
|
||
return { success: true };
|
||
} else {
|
||
let errorMessage = `Ошибка ${res.status}: ${res.statusText}`;
|
||
try {
|
||
const errorData = await res.json();
|
||
errorMessage = errorData.error || errorMessage;
|
||
} catch {
|
||
try {
|
||
errorMessage = await res.text();
|
||
} catch {
|
||
// Оставляем дефолтное сообщение
|
||
}
|
||
}
|
||
return {
|
||
success: false,
|
||
error: errorMessage,
|
||
};
|
||
}
|
||
} catch (err) {
|
||
return {
|
||
success: false,
|
||
error: err instanceof Error ? err.message : 'Ошибка сети при отправке расчёта',
|
||
};
|
||
}
|
||
}
|
||
|