import { Form, Input, Button, Select, DatePicker, Upload, message } from 'antd'; import { UploadOutlined } from '@ant-design/icons'; import { useState } from 'react'; import type { UploadFile } from 'antd/es/upload/interface'; import dayjs from 'dayjs'; const { Option } = Select; interface Props { formData: any; updateFormData: (data: any) => void; onNext: () => void; onPrev: () => void; addDebugEvent?: (type: string, status: string, message: string, data?: any) => void; } // Типы страховых случаев из erv_ticket const EVENT_TYPES = [ { value: 'delay_flight', label: 'Задержка авиарейса (более 3 часов)' }, { value: 'cancel_flight', label: 'Отмена авиарейса' }, { value: 'miss_connection', label: 'Пропуск (задержка прибытия) стыковочного рейса (авиа/жд/паром и тд)' }, { value: 'emergency_landing', label: 'Посадка воздушного судна на запасной аэродром' }, { value: 'delay_train', label: 'Задержка отправки поезда' }, { value: 'cancel_train', label: 'Отмена поезда' }, { value: 'delay_ferry', label: 'Задержка/отмена отправки парома/круизного судна' }, ]; export default function Step2Details({ formData, updateFormData, onNext, onPrev, addDebugEvent }: Props) { const [form] = Form.useForm(); const [fileList, setFileList] = useState([]); const [uploading, setUploading] = useState(false); const handleNext = async () => { try { const values = await form.validateFields(); // Если есть файлы - загружаем if (fileList.length > 0) { setUploading(true); addDebugEvent?.('upload', 'pending', `📤 Загружаю ${fileList.length} документ(ов) в S3...`, { count: fileList.length }); const formData = new FormData(); fileList.forEach((file: any) => { if (file.originFileObj) { formData.append('files', file.originFileObj); } }); const uploadResponse = await fetch('http://147.45.146.17:8100/api/v1/upload/files?folder=documents', { method: 'POST', body: formData, }); const uploadResult = await uploadResponse.json(); if (uploadResult.success) { addDebugEvent?.('upload', 'success', `✅ Документы загружены: ${uploadResult.uploaded_count}/${uploadResult.total_count}`, { files: uploadResult.files }); updateFormData({ ...values, uploadedFiles: uploadResult.files }); } else { message.error('Ошибка загрузки документов'); setUploading(false); return; } setUploading(false); } else { updateFormData(values); } onNext(); } catch (error) { message.error('Заполните все обязательные поля'); setUploading(false); } }; const handleUploadChange = ({ fileList: newFileList }: any) => { setFileList(newFileList); }; return (
{/* Индикатор что полис найден */} {formData.voucher && (
✅ Полис найден
)} current && current > dayjs().endOf('day')} /> { const isLt15M = file.size / 1024 / 1024 < 15; if (!isLt15M) { message.error(`${file.name}: файл больше 15MB`); return Upload.LIST_IGNORE; } if (fileList.length >= 10) { message.error('Максимум 10 файлов'); return Upload.LIST_IGNORE; } return false; }} accept="image/*,.pdf,.heic,.heif" multiple maxCount={10} showUploadList={{ showPreviewIcon: true, showRemoveIcon: true, }} >
Загружено: {fileList.length}/10 файлов
); }