import React, { useRef, useState } from 'react'; import { useApp } from '../../contexts/AppContext'; import Button from '../common/Button'; import Modal, { ModalFooter, ModalButton } from '../common/Modal'; import TextArea from '../common/TextArea'; import Input from '../common/Input'; interface DslFileUploaderProps { groupId: string; onUploadComplete?: () => void; } const DslFileUploader: React.FC = ({ groupId, onUploadComplete }) => { const { addDslFile } = useApp(); const fileInputRef = useRef(null); const [isUploading, setIsUploading] = useState(false); const [showModal, setShowModal] = useState(false); // 用于直接输入 YAML 内容的状态 const [fileName, setFileName] = useState(''); const [content, setContent] = useState(''); const [error, setError] = useState(''); // 处理文件选择 const handleFileChange = async (e: React.ChangeEvent) => { if (!e.target.files || e.target.files.length === 0) return; setIsUploading(true); setError(''); try { const file = e.target.files[0]; // 验证文件类型 const validTypes = ['.yml', '.yaml', '.txt', '.json', '.dsl']; const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase(); if (!validTypes.includes(fileExtension)) { throw new Error('不支持的文件类型。请上传 YAML, JSON, TXT 或 DSL 文件'); } // 读取文件内容为文本 const reader = new FileReader(); reader.onload = async (event) => { if (!event.target || typeof event.target.result !== 'string') { throw new Error('文件读取失败'); } // 获取文件的文本内容 const fileContent = event.target.result; // 修改文件名,确保扩展名为 .yml let fileName = file.name; if (!fileName.toLowerCase().endsWith('.yml')) { fileName = fileName.replace(/\.[^/.]+$/, '') + '.yml'; } await addDslFile(groupId, { name: fileName, content: fileContent }); if (onUploadComplete) { onUploadComplete(); } // 重置 input if (fileInputRef.current) { fileInputRef.current.value = ''; } }; reader.onerror = () => { throw new Error('文件读取错误'); }; reader.readAsText(file); // 直接读取为文本 } catch (error: any) { console.error('文件上传失败:', error); setError(error.message || '上传失败,请重试'); } finally { setIsUploading(false); } }; // 处理直接粘贴 YAML 内容的提交 const handleContentSubmit = async () => { if (!fileName.trim()) { setError('请输入文件名'); return; } if (!content.trim()) { setError('请输入YAML内容'); return; } setIsUploading(true); setError(''); try { // 确保文件名以 .yml 结尾 let finalFileName = fileName; if (!finalFileName.toLowerCase().endsWith('.yml')) { finalFileName = finalFileName.replace(/\.[^/.]+$/, '') + '.yml'; } await addDslFile(groupId, { name: finalFileName, content: content }); if (onUploadComplete) { onUploadComplete(); } // 重置表单并关闭模态框 setFileName(''); setContent(''); setShowModal(false); } catch (error: any) { console.error('添加YAML失败:', error); setError(error.message || '添加失败,请重试'); } finally { setIsUploading(false); } }; const triggerFileInput = () => { if (fileInputRef.current) { fileInputRef.current.click(); } }; return (
{/* 文件上传按钮 */} {/* 添加直接粘贴内容的按钮 */}
{error && (
{error}
)} {/* 粘贴 YAML 内容的模态框 */} setShowModal(false)} title="添加 YAML 内容" footer={ setShowModal(false)} > 取消 添加 } >
{error && (
{error}
)} setFileName(e.target.value)} placeholder="例如: workflow.yml" required />