import React, { useState } from 'react'; import { X, Upload, File, AlertCircle, CheckCircle } from 'lucide-react'; import { invoke } from '@tauri-apps/api/core'; import { ImportTemplateRequest } from '../../types/template'; import { CustomSelect } from '../CustomSelect'; import { useProjectStore } from '../../store/projectStore'; interface ImportTemplateModalProps { onClose: () => void; onImport: (request: ImportTemplateRequest) => Promise; isLoading: boolean; } export const ImportTemplateModal: React.FC = ({ onClose, onImport, isLoading, }) => { const [formData, setFormData] = useState>({ file_path: '', template_name: '', project_id: '', auto_upload: true, }); const [dragOver, setDragOver] = useState(false); const [selectedFile, setSelectedFile] = useState(''); const [errors, setErrors] = useState>({}); const { projects } = useProjectStore(); // 处理文件选择 const handleFileSelect = async () => { try { // 使用 Tauri 命令选择文件 const selected = await invoke('select_file', { filters: [['剪映草稿文件', ['json']]] }); if (selected) { setSelectedFile(selected); setFormData(prev => ({ ...prev, file_path: selected, template_name: prev.template_name || extractTemplateNameFromPath(selected), })); setErrors(prev => ({ ...prev, file_path: '' })); } } catch (error) { console.error('文件选择失败:', error); } }; // 从文件路径提取模板名称 const extractTemplateNameFromPath = (filePath: string) => { const parts = filePath.split(/[/\\]/); const fileName = parts[parts.length - 1]; return fileName.replace('.json', '').replace('draft_content', '模板'); }; // 处理拖拽 const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); setDragOver(true); }; const handleDragLeave = (e: React.DragEvent) => { e.preventDefault(); setDragOver(false); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setDragOver(false); const files = Array.from(e.dataTransfer.files); const jsonFile = files.find(file => file.name.endsWith('.json')); if (jsonFile) { // 注意:在 Tauri 中,我们需要使用文件路径而不是 File 对象 // 这里需要根据实际的 Tauri API 来处理文件路径获取 console.log('拖拽文件:', jsonFile.name); // 实际实现中需要获取文件的完整路径 } }; // 表单验证 const validateForm = () => { const newErrors: Record = {}; if (!formData.file_path) { newErrors.file_path = '请选择剪映草稿文件'; } if (!formData.template_name?.trim()) { newErrors.template_name = '请输入模板名称'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; // 处理提交 const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } try { await onImport(formData as ImportTemplateRequest); } catch (error) { console.error('导入失败:', error); } }; const projectOptions = [ { value: '', label: '不关联项目' }, ...projects.map(project => ({ value: project.id, label: project.name, })), ]; return (
{/* 模态框头部 */}

导入模板

{/* 模态框内容 */}
{/* 文件选择区域 */}
{selectedFile ? (
{selectedFile.split(/[/\\]/).pop()}
{selectedFile}
) : ( <>
拖拽 draft_content.json 文件到此处
或者点击下方按钮选择文件
)}
{errors.file_path && (
{errors.file_path}
)}
{/* 模板名称 */}
setFormData(prev => ({ ...prev, template_name: e.target.value }))} className={`w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent ${ errors.template_name ? 'border-red-300' : 'border-gray-300' }`} placeholder="输入模板名称" /> {errors.template_name && (
{errors.template_name}
)}
{/* 关联项目 */}
setFormData(prev => ({ ...prev, project_id: value }))} options={projectOptions} placeholder="选择项目(可选)" className="w-full" />
{/* 自动上传选项 */}

启用后将自动上传模板中的素材文件到云端,便于跨设备访问

{/* 操作按钮 */}
); };