'use client'; import { useState, useEffect } from 'react'; import { Box, Paper, Typography, Button } from '@mui/material'; import { useTranslation } from 'react-i18next'; import Image from 'next/image'; import SaveIcon from '@mui/icons-material/Save'; import AnswerInput from '../../images/components/annotation/AnswerInput'; function handleAnswer(dataset) { const { answer, answerType } = dataset; if (answerType === 'label' || answerType === 'custom_format') { try { return JSON.parse(answer); } catch (e) { return answer; } } return answer; } /** * 数据集主要内容组件 */ export default function DatasetContent({ dataset, projectId, onAnswerChange }) { const { t } = useTranslation(); const [currentAnswer, setCurrentAnswer] = useState(() => handleAnswer(dataset)); const [hasChanges, setHasChanges] = useState(false); const [saving, setSaving] = useState(false); // 当 dataset 变化时,重置状态 useEffect(() => { setCurrentAnswer(handleAnswer(dataset)); setHasChanges(false); }, [dataset.id, dataset.answer]); // 处理答案变化 const handleAnswerChange = newAnswer => { setCurrentAnswer(newAnswer); // 检测是否有变化 const originalAnswer = handleAnswer(dataset); const hasChanged = JSON.stringify(newAnswer) !== JSON.stringify(originalAnswer); setHasChanges(hasChanged); }; // 保存答案 const handleSave = async () => { setSaving(true); try { let answerToSave = currentAnswer; if (typeof answerToSave !== 'string') { answerToSave = JSON.stringify(answerToSave, null, 2); } await onAnswerChange(answerToSave); setHasChanges(false); } catch (error) { console.error('保存失败:', error); } finally { setSaving(false); } }; return ( {/* 问题和保存按钮 */} {dataset.question} {/* 保存按钮 - 只在有变化时显示 */} {hasChanges && ( )} {/* 答案编辑器 */} {/* 图片 */} {dataset.base64 ? ( {dataset.imageName} ) : ( {dataset.imageName} )} {dataset.imageName} ); }