import { useState, useMemo, useCallback } from 'react'; import { Steps, Card, message, Row, Col } from 'antd'; import Step1Phone from '../components/form/Step1Phone'; import Step1Policy from '../components/form/Step1Policy'; import Step2EventType from '../components/form/Step2EventType'; import StepDocumentUpload from '../components/form/StepDocumentUpload'; import Step3Payment from '../components/form/Step3Payment'; import DebugPanel from '../components/DebugPanel'; import { getDocumentsForEventType } from '../constants/documentConfigs'; import './ClaimForm.css'; const { Step } = Steps; interface FormData { // Шаг 1: Phone phone?: string; contact_id?: string; is_new_contact?: boolean; // Шаг 2: Policy voucher: string; claim_id?: string; session_id?: string; // Шаг 3: Event Type eventType?: string; // Шаги 4+: Documents documents?: Record; // Последний шаг: Payment fullName?: string; email?: string; paymentMethod?: string; bankName?: string; cardNumber?: string; accountNumber?: string; } export default function ClaimForm() { // ✅ claim_id будет создан n8n в Step1Phone после SMS верификации // Не генерируем его локально! // Генерируем session_id и сохраняем в sessionStorage const [sessionId] = useState(() => { let sid = sessionStorage.getItem('session_id'); if (!sid) { sid = `sess-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; sessionStorage.setItem('session_id', sid); } return sid; }); const [currentStep, setCurrentStep] = useState(0); const [formData, setFormData] = useState({ voucher: '', claim_id: undefined, // ✅ Будет заполнен n8n в Step1Phone session_id: sessionId, paymentMethod: 'sbp', }); const [isPhoneVerified, setIsPhoneVerified] = useState(false); const [debugEvents, setDebugEvents] = useState([]); // 🔥 VERSION CHECK: Если видишь это в консоли - фронт обновился! console.log('🔥 ClaimForm v2.0 - claim_id НЕ генерируется на фронте!'); // Динамически определяем список шагов на основе выбранного eventType const documentConfigs = formData.eventType ? getDocumentsForEventType(formData.eventType) : []; const totalDocumentSteps = documentConfigs.length; const addDebugEvent = (type: string, status: string, message: string, data?: any) => { const event = { timestamp: new Date().toLocaleTimeString('ru-RU'), type, status, message, data: { ...data, claim_id: formData.claim_id // ✅ Используем claim_id из formData (от n8n) } }; setDebugEvents(prev => [event, ...prev]); }; // ✅ claim_id будет залогирован в Step1Phone после получения от n8n const updateFormData = useCallback((data: Partial) => { setFormData((prev) => ({ ...prev, ...data })); }, []); const nextStep = useCallback(() => { console.log('⏩ nextStep called'); setCurrentStep((prev) => { console.log('📍 Current step:', prev, '→ Next:', prev + 1); return prev + 1; }); }, []); const prevStep = useCallback(() => { console.log('⏪ prevStep called'); setCurrentStep((prev) => { console.log('📍 Current step:', prev, '→ Prev:', prev - 1); return prev - 1; }); }, []); const handleSubmit = useCallback(async () => { try { addDebugEvent('form', 'info', '📤 Отправка заявки на сервер'); const response = await fetch('http://147.45.146.17:8100/api/v1/claims/create', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ claim_id: formData.claim_id, // ✅ Используем claim_id от n8n voucher: formData.voucher, email: formData.email, phone: formData.phone, event_type: formData.eventType, payment_method: formData.paymentMethod, bank_name: formData.bankName, card_number: formData.cardNumber, account_number: formData.accountNumber, documents: formData.documents || {}, }), }); const result = await response.json(); if (result.success) { message.success(`Заявка ${result.claim_number} успешно создана!`); addDebugEvent('form', 'success', `✅ Заявка ${result.claim_number} создана`); // Сброс формы (создаём новую заявку, claim_id будет сгенерирован при следующем SMS) setFormData({ voucher: '', claim_id: undefined, // ✅ Очищаем для новой заявки session_id: sessionId, paymentMethod: 'sbp', }); setCurrentStep(0); setIsPhoneVerified(false); } else { message.error('Ошибка при создании заявки'); addDebugEvent('form', 'error', '❌ Ошибка создания заявки'); } } catch (error) { message.error('Ошибка соединения с сервером'); addDebugEvent('form', 'error', '❌ Ошибка соединения'); console.error(error); } }, [formData, sessionId, addDebugEvent]); // Динамически генерируем шаги на основе выбранного eventType const steps = useMemo(() => { const stepsArray: any[] = []; // Шаг 1: Phone (телефон + SMS верификация) stepsArray.push({ title: 'Телефон', description: 'Подтверждение по SMS', content: ( ), }); // Шаг 2: Policy (всегда) stepsArray.push({ title: 'Проверка полиса', description: 'Полис ERV', content: ( ), }); // Шаг 3: Event Type Selection (всегда) stepsArray.push({ title: 'Тип события', description: 'Выбор случая', content: ( ), }); // Шаги 3+: Document Upload (динамически, если выбран eventType) if (formData.eventType && documentConfigs.length > 0) { documentConfigs.forEach((docConfig, index) => { stepsArray.push({ title: `Документ ${index + 1}`, description: docConfig.name, content: ( ), }); }); } // Последний шаг: Payment (всегда) stepsArray.push({ title: 'Оплата', description: 'Контакты и выплата', content: ( ), }); return stepsArray; }, [formData, documentConfigs, isPhoneVerified, sessionId, nextStep, prevStep, updateFormData, handleSubmit, setIsPhoneVerified, addDebugEvent]); const handleReset = () => { setFormData({ voucher: '', claim_id: undefined, // ✅ Очищаем для новой заявки session_id: sessionId, paymentMethod: 'sbp', }); setCurrentStep(0); setIsPhoneVerified(false); message.info('Форма сброшена'); addDebugEvent('system', 'info', '🔄 Форма сброшена'); }; return (
{/* Левая часть - Форма */} 0 && ( ) } > {steps.map((item, index) => ( ))}
{steps[currentStep].content}
{/* Правая часть - Debug консоль */}
); }