import { useEffect, useState } from 'react'; import { Button, Card, List, Typography, Space, Empty, Popconfirm, message, Spin, Tag } from 'antd'; import { FileTextOutlined, DeleteOutlined, PlusOutlined, ReloadOutlined } from '@ant-design/icons'; // Форматирование даты без date-fns (если библиотека не установлена) const formatDate = (dateStr: string) => { try { const date = new Date(dateStr); const day = date.getDate(); const month = date.toLocaleDateString('ru-RU', { month: 'long' }); const year = date.getFullYear(); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); return `${day} ${month} ${year}, ${hours}:${minutes}`; } catch { return dateStr; } }; const { Title, Text, Paragraph } = Typography; interface Draft { id: string; claim_id: string; session_token: string; status_code: string; created_at: string; updated_at: string; problem_description?: string; wizard_plan: boolean; wizard_answers: boolean; has_documents: boolean; } interface Props { phone: string; session_id?: string; onSelectDraft: (claimId: string) => void; onNewClaim: () => void; } export default function StepDraftSelection({ phone, session_id, onSelectDraft, onNewClaim, }: Props) { const [drafts, setDrafts] = useState([]); const [loading, setLoading] = useState(true); const [deletingId, setDeletingId] = useState(null); const loadDrafts = async () => { try { setLoading(true); const params = new URLSearchParams(); if (session_id) { params.append('session_id', session_id); } else if (phone) { params.append('phone', phone); } const response = await fetch(`/api/v1/claims/drafts/list?${params.toString()}`); if (!response.ok) { throw new Error('Не удалось загрузить черновики'); } const data = await response.json(); setDrafts(data.drafts || []); } catch (error) { console.error('Ошибка загрузки черновиков:', error); message.error('Не удалось загрузить список черновиков'); } finally { setLoading(false); } }; useEffect(() => { loadDrafts(); }, [phone, session_id]); const handleDelete = async (claimId: string) => { try { setDeletingId(claimId); const response = await fetch(`/api/v1/claims/drafts/${claimId}`, { method: 'DELETE', }); if (!response.ok) { throw new Error('Не удалось удалить черновик'); } message.success('Черновик удален'); await loadDrafts(); } catch (error) { console.error('Ошибка удаления черновика:', error); message.error('Не удалось удалить черновик'); } finally { setDeletingId(null); } }; const getProgressInfo = (draft: Draft) => { const parts: string[] = []; if (draft.problem_description) parts.push('Описание'); if (draft.wizard_plan) parts.push('План вопросов'); if (draft.wizard_answers) parts.push('Ответы'); if (draft.has_documents) parts.push('Документы'); return parts.length > 0 ? parts.join(', ') : 'Начато'; }; return (
Продолжить заполнение или создать новую заявку? У вас есть незавершенные черновики. Вы можете продолжить заполнение или создать новую заявку.
{loading ? (
) : drafts.length === 0 ? ( ) : ( <> ( onSelectDraft(draft.claim_id!)} icon={} > Продолжить , handleDelete(draft.claim_id!)} okText="Да, удалить" cancelText="Отмена" > , ]} > } title={ Черновик {draft.claim_id} Черновик } description={ Обновлен: {formatDate(draft.updated_at)} {draft.problem_description && ( {draft.problem_description} )} {draft.wizard_plan ? '✓ План' : 'План'} {draft.wizard_answers ? '✓ Ответы' : 'Ответы'} {draft.has_documents ? '✓ Документы' : 'Документы'} Прогресс: {getProgressInfo(draft)} } /> )} />
)}
); }