/** * 编辑描述显示组件 * 显示已提交的编辑描述内容,带有优雅的连接线 */ 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 && ( <> {/* 连接线 */} {/* 描述内容框 */} onClick?.(editPoint)} whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} > {/* 玻璃态背景 */}
{/* 状态指示条 */}
{/* 内容区域 */}
{/* 状态标签 */} {statusText && (
{statusText}
)} {/* 描述文本 */}
{editPoint.description}
{/* 时间戳 */}
{Math.floor(editPoint.timestamp)}s {new Date(editPoint.updatedAt).toLocaleTimeString()}
{/* 悬停时显示的操作按钮 */} {onEdit && ( )} {onDelete && ( )} {/* 装饰性光效 */}
{/* 连接点指示器 */}
)} ); };