import React, { useState } from 'react'; import { Modal, Button, Input, Descriptions, Space, message, Alert } from 'antd'; import { TaskDTO, TaskResolutionPayload } from '@/types/api'; import { tasksApi } from '@/api/tasks'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import TaskStatusTag from '@/components/common/TaskStatusTag'; interface Props { task: TaskDTO | null; visible: boolean; onClose: () => void; } const TaskResolutionModal: React.FC = ({ task, visible, onClose }) => { const [comment, setComment] = useState(''); const queryClient = useQueryClient(); // Мутация для решения задачи const resolveMutation = useMutation({ mutationFn: (payload: TaskResolutionPayload) => tasksApi.resolveTask(task!.id, payload), onSuccess: () => { message.success('Задача обработана'); queryClient.invalidateQueries({ queryKey: ['tasks'] }); onClose(); setComment(''); }, onError: () => message.error('Ошибка при обработке задачи'), }); // Мутация для создания сущности в SD const createSdMutation = useMutation({ mutationFn: () => tasksApi.createEntityInSd(task!.id, task!.entity_type), onSuccess: () => { message.success('Запрос на создание в SD отправлен'); queryClient.invalidateQueries({ queryKey: ['tasks'] }); onClose(); }, }); if (!task) return null; const handleResolve = () => { // В реальном приложении здесь может быть сложная форма выбора действия (Action) // Для примера берем action='create' или 'approve' по умолчанию resolveMutation.mutate({ status: 'resolved', comment, resolution_payload: { action: 'create' } }); }; const handleReject = () => { resolveMutation.mutate({ status: 'rejected', comment, resolution_payload: { action: 'reject' } // Зависит от бэкенда }); }; const renderDetails = () => { // Рендерим детали динамически, так как структура зависит от типа задачи return ( {Object.entries(task.details).map(([key, value]) => { // Если значение - объект, рендерим его как JSON string (упрощенно) const displayValue = typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value); return (
                {displayValue}
              
); })}
); }; return (
{new Date(task.created_at).toLocaleString()}
{task.status === 'new' && ( )} {renderDetails()}
setComment(e.target.value)} style={{ marginBottom: 16 }} disabled={task.status !== 'new'} /> {task.status === 'new' && ( {/* Спец кнопка для Add Equipment, если еще не отправлено в SD */} {task.task_type === 'add_equipment' && ( )} )}
); }; export default TaskResolutionModal;