import React, { useRef, useCallback } from 'react'; import { Box, Center } from '@chakra-ui/react'; import { Stage, Layer, Rect } from 'react-konva'; import { useDispatch, useSelector } from 'react-redux'; import { RootState } from '@/store'; import { selectComponent, clearSelection } from '@/store/slices/selectionSlice'; import ComponentRenderer from './ComponentRenderer'; import useCanvasSize from '@/hooks/useCanvasSize'; import useCanvasZoom from '@/hooks/useCanvasZoom'; const Canvas: React.FC = () => { const dispatch = useDispatch(); const stageRef = useRef(null); const { mockup } = useSelector((state: RootState) => state); const { components, canvas } = mockup; // Custom hooks for canvas operations const { containerSize, canvasContainerRef } = useCanvasSize(); const { scale, position, handleWheel, handleDragMove } = useCanvasZoom(); // Handle background click (deselect all) const handleStageClick = useCallback((e: any) => { // If clicked on the stage background if (e.target === e.currentTarget) { dispatch(clearSelection()); } }, [dispatch]); // Handle component selection const handleComponentClick = useCallback((id: string, e: any) => { e.cancelBubble = true; // Stop propagation to parent dispatch(selectComponent(id)); }, [dispatch]); return (
{/* Canvas background */} {/* Render components */} {components.map((component) => ( handleComponentClick(component.id, e)} /> ))}
); }; export default Canvas;