import { useMemo } from 'react'; import { useCanvasStore } from '@/lib/store'; import type { PPTVideoElement, PPTLatexElement, PPTAudioElement, PPTChartElement, } from '@/lib/types/slides'; import type { OperateResizeHandlers } from '@/lib/types/edit'; import { useCommonOperate } from '../hooks/useCommonOperate'; import { RotateHandler } from './RotateHandler'; import { ResizeHandler } from './ResizeHandler'; import { BorderLine } from './BorderLine'; type PPTElement = PPTVideoElement | PPTLatexElement | PPTAudioElement | PPTChartElement; interface CommonElementOperateProps { readonly elementInfo: PPTElement; readonly handlerVisible: boolean; readonly rotateElement: (e: React.MouseEvent, element: PPTElement) => void; readonly scaleElement: ( e: React.MouseEvent, element: PPTElement, command: OperateResizeHandlers, ) => void; } export function CommonElementOperate({ elementInfo, handlerVisible, rotateElement, scaleElement, }: CommonElementOperateProps) { const canvasScale = useCanvasStore.use.canvasScale(); const scaleWidth = useMemo( () => elementInfo.width * canvasScale, [elementInfo.width, canvasScale], ); const scaleHeight = useMemo( () => elementInfo.height * canvasScale, [elementInfo.height, canvasScale], ); const { resizeHandlers, borderLines } = useCommonOperate(scaleWidth, scaleHeight); const cannotRotate = useMemo( () => ['chart', 'video', 'audio'].includes(elementInfo.type), [elementInfo.type], ); return (
{borderLines.map((line) => ( ))} {handlerVisible && ( <> {resizeHandlers.map((point) => ( { e.stopPropagation(); scaleElement(e, elementInfo, point.direction); }} /> ))} {!cannotRotate && ( { e.stopPropagation(); rotateElement(e, elementInfo); }} /> )} )}
); }