/** * 编辑描述显示组件 * 显示已提交的编辑描述内容,带有优雅的连接线 */ import React, { useMemo } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { EditPoint as EditPointType, EditPointStatus } from './types'; interface EditDescriptionProps { /** 编辑点数据 */ editPoint: EditPointType; /** 容器尺寸 */ containerSize: { width: number; height: number }; /** 描述框位置 */ position: { x: number; y: number }; /** 连接线终点 */ connectionEnd: { x: number; y: number }; /** 点击事件处理 */ onClick?: (editPoint: EditPointType) => void; /** 编辑事件处理 */ onEdit?: (id: string) => void; /** 删除事件处理 */ onDelete?: (id: string) => void; } /** * 编辑描述组件 */ export const EditDescription: React.FC = ({ editPoint, containerSize, position, connectionEnd, onClick, onEdit, onDelete }) => { // 计算编辑点的屏幕坐标 const editPointPosition = useMemo(() => ({ x: (editPoint.position.x / 100) * containerSize.width, y: (editPoint.position.y / 100) * containerSize.height }), [editPoint.position, containerSize]); // 计算连接线路径 const connectionPath = useMemo(() => { const startX = editPointPosition.x; const startY = editPointPosition.y; const endX = connectionEnd.x; const endY = connectionEnd.y; // 计算控制点,创建优雅的弧线 const deltaX = endX - startX; const deltaY = endY - startY; const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); // 控制点偏移量,创建自然的弧线 const controlOffset = Math.min(distance * 0.3, 60); const controlX = startX + deltaX * 0.5 + (deltaY > 0 ? -controlOffset : controlOffset); const controlY = startY + deltaY * 0.5 - Math.abs(deltaX) * 0.2; return `M ${startX} ${startY} Q ${controlX} ${controlY} ${endX} ${endY}`; }, [editPointPosition, connectionEnd]); // 获取状态颜色 const getStatusColor = () => { switch (editPoint.status) { case EditPointStatus.EDITED: return '#10b981'; // 绿色 case EditPointStatus.PROCESSING: return '#3b82f6'; // 蓝色 case EditPointStatus.COMPLETED: return '#059669'; // 深绿色 case EditPointStatus.FAILED: return '#ef4444'; // 红色 default: return '#6b7280'; // 灰色 } }; // 获取状态文本 const getStatusText = () => { switch (editPoint.status) { case EditPointStatus.EDITED: return '已编辑'; case EditPointStatus.PROCESSING: return '处理中'; case EditPointStatus.COMPLETED: return '已完成'; case EditPointStatus.FAILED: return '失败'; default: return ''; } }; const statusColor = getStatusColor(); const statusText = getStatusText(); return ( {editPoint.description && editPoint.status !== EditPointStatus.PENDING && ( <> {/* White dashed connection line to match reference image */} {/* Arrow head */} {/* Consistent white text display matching EditInput component */} onClick?.(editPoint)} > {/* White text display with exact same styling as EditInput */}
{editPoint.description}
{/* Interactive edit/delete buttons on hover */}
{onEdit && ( { e.stopPropagation(); onEdit(editPoint.id); }} className="w-6 h-6 rounded-full bg-white/20 hover:bg-white/30 backdrop-blur-sm flex items-center justify-center text-white text-xs transition-colors" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }} title="Edit description" > ✏️ )} {onDelete && ( { e.stopPropagation(); onDelete(editPoint.id); }} className="w-6 h-6 rounded-full bg-red-500/20 hover:bg-red-500/30 backdrop-blur-sm flex items-center justify-center text-white text-xs transition-colors" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }} title="Delete edit point" > 🗑️ )}
{/* Status indicator for processing states */} {editPoint.status === EditPointStatus.PROCESSING && (
Processing...
)} {editPoint.status === EditPointStatus.FAILED && (
Failed - Click to retry
)}
)}
); };