import { useState } from 'react' import { Download, FileText, Files, Type } from 'lucide-react' import { useTranslation } from 'react-i18next' import { useProjectStore } from '../../stores/project-store' import { exportNovel, type ExportFormat } from '../../services/export-service' import { ipc } from '../../services/ipc-client' import { Dialog, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, } from '../ui/Dialog' import { Button } from '../ui/Button' import { cn } from '../../lib/utils' interface Props { isOpen: boolean onClose: () => void } /** 导出对话框 — 使用 shadcn/ui */ export default function ExportDialog({ isOpen, onClose }: Props) { const { t } = useTranslation('dialogs') const currentProject = useProjectStore(s => s.currentProject) const [format, setFormat] = useState('merged-md') const [includeOutline, setIncludeOutline] = useState(true) const [exporting, setExporting] = useState(false) const [result, setResult] = useState<{ success: boolean; path?: string; error?: string } | null>(null) const handleExport = async () => { if (!currentProject) return const dir = await ipc.invoke('dialog:select-folder') if (!dir) return setExporting(true) setResult(null) const res = await exportNovel({ format, outputDir: dir, includeOutline }) setResult(res) setExporting(false) } const FORMAT_OPTIONS: Array<{ value: ExportFormat; label: string; desc: string; icon: React.ReactNode }> = [ { value: 'merged-md', label: t('export.formatMergedMd'), desc: t('export.formatMergedMdDesc'), icon: }, { value: 'split-md', label: t('export.formatSplitMd'), desc: t('export.formatSplitMdDesc'), icon: }, { value: 'txt', label: t('export.formatTxt'), desc: t('export.formatTxtDesc'), icon: }, ] return ( !v && onClose()}> {t('export.title')} {t('export.description')}
{/* 格式选择 */}
{FORMAT_OPTIONS.map((opt) => (
setFormat(opt.value)} className={cn( 'flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors border', format === opt.value ? 'bg-[var(--color-active)] border-[var(--color-accent)]' : 'bg-[var(--color-panel)] border-[var(--color-border)] hover:bg-[var(--color-hover)]' )} >
{opt.icon}
{opt.label}
{opt.desc}
))}
{/* 选项 */} {/* 结果 */} {result && (
{result.success ? t('export.exported', { path: result.path }) : t('export.exportError', { error: result.error })}
)}
) }