import { useMemo } from 'react'; import { useCanvasStore } from '@/lib/store'; import type { PPTLineElement } from '@/lib/types/slides'; import { OperateLineHandlers } from '@/lib/types/edit'; import { ResizeHandler } from './ResizeHandler'; interface LineElementOperateProps { readonly elementInfo: PPTLineElement; readonly handlerVisible: boolean; readonly dragLineElement: ( e: React.MouseEvent, element: PPTLineElement, command: OperateLineHandlers, ) => void; } export function LineElementOperate({ elementInfo, handlerVisible, dragLineElement, }: LineElementOperateProps) { const canvasScale = useCanvasStore.use.canvasScale(); const svgWidth = useMemo( () => Math.max(elementInfo.start[0], elementInfo.end[0]), [elementInfo.start, elementInfo.end], ); const svgHeight = useMemo( () => Math.max(elementInfo.start[1], elementInfo.end[1]), [elementInfo.start, elementInfo.end], ); const resizeHandlers = useMemo(() => { const handlers = [ { handler: OperateLineHandlers.START, style: { left: elementInfo.start[0] * canvasScale + 'px', top: elementInfo.start[1] * canvasScale + 'px', }, }, { handler: OperateLineHandlers.END, style: { left: elementInfo.end[0] * canvasScale + 'px', top: elementInfo.end[1] * canvasScale + 'px', }, }, ]; if (elementInfo.curve || elementInfo.broken || elementInfo.broken2) { const ctrlHandler = (elementInfo.curve || elementInfo.broken || elementInfo.broken2) as [ number, number, ]; handlers.push({ handler: OperateLineHandlers.C, style: { left: ctrlHandler[0] * canvasScale + 'px', top: ctrlHandler[1] * canvasScale + 'px', }, }); } else if (elementInfo.cubic) { const [ctrlHandler1, ctrlHandler2] = elementInfo.cubic; handlers.push({ handler: OperateLineHandlers.C1, style: { left: ctrlHandler1[0] * canvasScale + 'px', top: ctrlHandler1[1] * canvasScale + 'px', }, }); handlers.push({ handler: OperateLineHandlers.C2, style: { left: ctrlHandler2[0] * canvasScale + 'px', top: ctrlHandler2[1] * canvasScale + 'px', }, }); } return handlers; }, [elementInfo, canvasScale]); return (