import DragableBox from "./DragableBox"; import { ChangeEvent, Suspense, useEffect, useRef, useState } from "react"; import { PhAngle } from "./PhAngle"; import { parse } from "postcss"; type Coordinates = { x: number; y: number; } export default function CropSelector() { const [selectorHeight, setSelectorHeight] = useState(0); const [selectorWidth, setSelectorWidth] = useState(0); const [selectorTop, setSelectorTop] = useState(0); const [selectorLeft, setSelectorLeft] = useState(0); const [firstDragable, setFirstDragable] = useState({ x: 0, y: 0 }) const [secondDragable, setSecondDragable] = useState({ x: 0, y: 0 }) const [containerSize, setContainerSize] = useState({ width: 0, height: 0 }); const [scaleRatio, setScaleRatio] = useState({ width: 1, height: 1 }); const containerRef = useRef(null) const prevSize = useRef({ width: 0, height: 0 }); // Helper function to round pixel values const roundPixel = (value: number) => Math.round(value); useEffect(() => { const updateContainerSize = () => { if (!containerRef.current) return; const newWidth = roundPixel(containerRef.current.offsetWidth); const newHeight = roundPixel(containerRef.current.offsetHeight); // Only calculate ratios if we have previous sizes if (prevSize.current.width && prevSize.current.height) { const widthRatio = newWidth / prevSize.current.width; const heightRatio = newHeight / prevSize.current.height; setScaleRatio({ width: widthRatio, height: heightRatio }); // Update dragable positions with new ratios and round the results setFirstDragable(prev => ({ x: roundPixel(prev.x * widthRatio), y: roundPixel(prev.y * heightRatio) })); setSecondDragable(prev => ({ x: roundPixel(prev.x * widthRatio), y: roundPixel(prev.y * heightRatio) })); } // Update container size and store as previous for next resize setContainerSize({ width: newWidth, height: newHeight }); prevSize.current = { width: newWidth, height: newHeight }; }; // Initial size setup updateContainerSize(); // Add resize listener with debounce to prevent too frequent updates let resizeTimeout: any; const handleResize = () => { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(updateContainerSize, 16); // roughly 60fps }; window.addEventListener('resize', handleResize); // Cleanup return () => { window.removeEventListener('resize', handleResize); clearTimeout(resizeTimeout); }; }, []); // Empty dependency array since we're using refs const handleChange = (event: ChangeEvent) => { event.preventDefault() const { value, name, id } = event.target let valueInt = parseInt(value) if (name === 'x' && containerSize.width !== null && valueInt > containerSize.width) { valueInt = containerSize.width } if (name === 'y' && containerSize.height !== null && valueInt > containerSize.height) { valueInt = containerSize.height } if (id === 'first') { setFirstDragable(prev => ({ ...prev, [name]: valueInt, })) } if (id === 'second') { setSecondDragable(prev => ({ ...prev, [name]: valueInt, })) } } useEffect(() => { const width = Math.abs(secondDragable.x - firstDragable.x); setSelectorWidth(width); const height = Math.abs(secondDragable.y - firstDragable.y); setSelectorHeight(height); setSelectorTop(Math.min(firstDragable.y, secondDragable.y)); setSelectorLeft(Math.min(firstDragable.x, secondDragable.x)); }, [firstDragable, secondDragable]); return (
Loading...

}>

{containerSize.width} - {containerSize.height}

firstDragable: x: {firstDragable.x} y: {firstDragable.y}

secondDragable: x: {secondDragable.x} y: {secondDragable.y}

Scale height: {scaleRatio.height}

Scale width: {scaleRatio.width}

); }