import React, { useState } from 'react'; import { Modal, Button, Card, Statistic, Row, Col, message } from 'antd'; import { CheckOutlined, CloseOutlined, SwapOutlined } from '@ant-design/icons'; import ReactDiffViewer from 'react-diff-viewer-continued'; interface ChapterContentComparisonProps { visible: boolean; onClose: () => void; chapterId: string; chapterTitle: string; originalContent: string; newContent: string; wordCount: number; onApply: () => void; onDiscard: () => void; } const ChapterContentComparison: React.FC = ({ visible, onClose, chapterId, chapterTitle, originalContent, newContent, wordCount, onApply, onDiscard }) => { const [applying, setApplying] = useState(false); const [viewMode, setViewMode] = useState<'split' | 'unified'>('split'); const originalWordCount = originalContent.length; const wordCountDiff = wordCount - originalWordCount; const wordCountDiffPercent = ((wordCountDiff / originalWordCount) * 100).toFixed(1); const handleApply = async () => { setApplying(true); try { const response = await fetch(`/api/chapters/${chapterId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ content: newContent }) }); if (!response.ok) { throw new Error('应用新内容失败'); } message.success('新内容已应用!'); // 先调用 onApply 通知父组件刷新 onApply(); // 延迟触发章节分析,给父组件时间刷新 setTimeout(async () => { try { const analysisResponse = await fetch(`/api/chapters/${chapterId}/analyze`, { method: 'POST', headers: { 'Content-Type': 'application/json', } }); if (analysisResponse.ok) { message.success('章节分析已开始,请稍后查看结果'); } else { message.warning('章节分析触发失败,您可以手动触发分析'); } } catch (analysisError) { console.error('触发分析失败:', analysisError); message.warning('章节分析触发失败,您可以手动触发分析'); } }, 500); onClose(); } catch (error: any) { message.error(error.message || '应用失败'); } finally { setApplying(false); } }; const handleDiscard = () => { Modal.confirm({ title: '确认放弃', content: '确定要放弃新生成的内容吗?此操作不可恢复。', okText: '确定放弃', cancelText: '取消', okButtonProps: { danger: true }, onOk: () => { onDiscard(); onClose(); message.info('已放弃新内容'); } }); }; return ( } onClick={handleDiscard} > 放弃新内容 , , ]} > {/* 统计信息 */} 0 ? '#3f8600' : '#cf1322' }} prefix={wordCountDiff > 0 ? '+' : ''} /> 0 ? '+' : ''} /> {/* 内容对比 */}
); }; export default ChapterContentComparison;