import React, { useState, useRef, useEffect } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { FileCode, Upload, Loader2, FileJson, CheckCircle2 } from 'lucide-react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { toast } from 'sonner'; import { apiRequest } from '@/lib/api'; import { ENDPOINTS } from '@/constants/api'; interface SwaggerImportModalProps { isOpen: boolean; onClose: () => void; onImport: (data: any, filename?: string) => void; } export const SwaggerImportModal: React.FC = ({ isOpen, onClose, onImport, }) => { const [selectedFile, setSelectedFile] = useState(null); const [spec, setSpec] = useState(''); const [isImporting, setIsImporting] = useState(false); const fileInputRef = useRef(null); // Reset state when modal is closed useEffect(() => { if (!isOpen) { setSelectedFile(null); setSpec(''); setIsImporting(false); if (fileInputRef.current) { fileInputRef.current.value = ''; } } }, [isOpen]); const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { if (file.type !== 'application/json' && !file.name.endsWith('.json') && !file.name.endsWith('.yaml') && !file.name.endsWith('.yml')) { toast.error('Пожалуйста, выберите JSON или YAML файл'); return; } setSelectedFile(file); } }; const handleImportFile = async () => { if (!selectedFile) { toast.error('Пожалуйста, выберите файл'); return; } setIsImporting(true); try { const formData = new FormData(); // Отправляем файл напрямую как multipart/form-data formData.append('file', selectedFile); const result = await apiRequest(ENDPOINTS.ACTIONS.INGEST, { method: 'POST', body: formData, }); toast.success(`Файл ${selectedFile.name} успешно импортирован на сервер`); onImport(result, selectedFile.name); onClose(); } catch (error: any) { toast.error(error.message || 'Ошибка при отправке файла на сервер'); console.error(error); } finally { setIsImporting(false); } }; const handleImportByContent = async () => { if (!spec) { toast.error('Пожалуйста, вставьте содержимое спецификации'); return; } setIsImporting(true); try { const formData = new FormData(); // Создаем блоб из текста и отправляем как файл const specBlob = new Blob([spec], { type: 'application/json' }); formData.append('file', specBlob, 'manual_import.json'); const result = await apiRequest(ENDPOINTS.ACTIONS.INGEST, { method: 'POST', body: formData, }); toast.success('Методы успешно импортированы на сервер'); onImport(result, 'manual_import.json'); onClose(); } catch (error: any) { toast.error(error.message || 'Ошибка при отправке спецификации на сервер'); console.error(error); } finally { setIsImporting(false); } }; return ( Import Swagger / OpenAPI Выберите способ импорта вашей API спецификации для создания новых Actions. Upload JSON Paste JSON/YAML
fileInputRef.current?.click()} > {selectedFile ? ( <>

{selectedFile.name}

{(selectedFile.size / 1024).toFixed(2)} KB • Нажмите, чтобы изменить

) : ( <>

Выберите JSON файл

Перетащите файл сюда или нажмите для поиска

)}
Поддерживаются форматы JSON и YAML (OpenAPI 3.0/ Swagger 2.0). Файл будет обработан локально в вашем браузере.