import { useState, useRef, useCallback, useEffect } from 'react'; interface UseResizableOptions { initialWidth?: number; minWidth?: number; maxWidth?: number; } export const useResizable = (options: UseResizableOptions = {}) => { const { initialWidth = 300, minWidth = 200, maxWidth = 400 } = options; const [width, setWidth] = useState(initialWidth); const [isDragging, setIsDragging] = useState(false); const startX = useRef(0); const startWidth = useRef(0); const handleMouseDown = useCallback( (e: React.MouseEvent) => { setIsDragging(true); startX.current = e.clientX; startWidth.current = width; e.preventDefault(); }, [width] ); const handleMouseMove = useCallback( (e: MouseEvent) => { if (!isDragging) return; const diff = e.clientX - startX.current; const newWidth = Math.min(Math.max(startWidth.current + diff, minWidth), maxWidth); setWidth(newWidth); }, [isDragging, minWidth, maxWidth] ); const handleMouseUp = useCallback(() => { setIsDragging(false); }, []); useEffect(() => { if (isDragging) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); } return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging, handleMouseMove, handleMouseUp]); return { width, isDragging, handleMouseDown }; }; export default useResizable;