import React, { useState } from 'react'; import { X, FolderOpen, AlertCircle, CheckCircle, Settings } from 'lucide-react'; import { BatchImportRequest } from '../../types/template'; import { CustomSelect } from '../CustomSelect'; import { useProjectStore } from '../../store/projectStore'; import { invoke } from '@tauri-apps/api/core'; interface BatchImportModalProps { onClose: () => void; onImport: (request: BatchImportRequest) => Promise; isLoading: boolean; } export const BatchImportModal: React.FC = ({ onClose, onImport, isLoading, }) => { const [formData, setFormData] = useState>({ folder_path: '', project_id: '', auto_upload: true, max_concurrent: 3, }); const [selectedFolder, setSelectedFolder] = useState(''); const [errors, setErrors] = useState>({}); const [showAdvanced, setShowAdvanced] = useState(false); const { projects } = useProjectStore(); // 处理文件夹选择 const handleFolderSelect = async () => { try { // 使用 Tauri 的文件夹选择对话框 const selected = await invoke('select_directory'); if (selected) { setSelectedFolder(selected); setFormData(prev => ({ ...prev, folder_path: selected, })); setErrors(prev => ({ ...prev, folder_path: '' })); } } catch (error) { console.error('文件夹选择失败:', error); } }; // 表单验证 const validateForm = () => { const newErrors: Record = {}; if (!formData.folder_path) { newErrors.folder_path = '请选择包含剪映草稿的文件夹'; } if (formData.max_concurrent && (formData.max_concurrent < 1 || formData.max_concurrent > 10)) { newErrors.max_concurrent = '并发数量应在 1-10 之间'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; // 处理提交 const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } try { await onImport(formData as BatchImportRequest); } catch (error) { console.error('批量导入失败:', error); } }; const projectOptions = [ { value: '', label: '不关联项目' }, ...projects.map(project => ({ value: project.id, label: project.name, })), ]; const concurrentOptions = [ { value: `1`, label: '1 个(慢速)' }, { value: `2`, label: '2 个' }, { value: `3`, label: '3 个(推荐)' }, { value: `5`, label: '5 个' }, { value: `10`, label: '10 个(快速)' }, ]; return (
{/* 模态框头部 */}

批量导入模板

{/* 模态框内容 */}
{/* 文件夹选择区域 */}
{selectedFolder ? (
已选择文件夹
{selectedFolder}
) : ( <>
选择包含剪映草稿文件的文件夹
系统将自动扫描文件夹中的所有 draft_content.json 文件
)}
{errors.folder_path && (
{errors.folder_path}
)}
{/* 关联项目 */}
setFormData(prev => ({ ...prev, project_id: value }))} options={projectOptions} placeholder="选择项目(可选)" className="w-full" />
{/* 自动上传选项 */}

启用后将自动上传所有模板中的素材文件到云端

{/* 高级设置 */}
{showAdvanced && (
setFormData(prev => ({ ...prev, max_concurrent: parseInt(value) }))} options={concurrentOptions} className="w-full" />

同时处理的模板数量,数值越大速度越快但占用资源越多

{errors.max_concurrent && (
{errors.max_concurrent}
)}
)}
{/* 提示信息 */}
批量导入说明:
  • • 系统将递归扫描选定文件夹中的所有 draft_content.json 文件
  • • 每个文件将作为一个独立的模板进行导入
  • • 导入过程中可以在模板管理页面查看进度
  • • 如果某个模板导入失败,不会影响其他模板的导入
{/* 操作按钮 */}
); };