43 lines
1.2 KiB
JavaScript
43 lines
1.2 KiB
JavaScript
import { useState, useCallback, useEffect } from "react";
|
|
|
|
const useSidebarResize = (initialWidth = 250) => {
|
|
const [sidebarWidth, setSidebarWidth] = useState(initialWidth);
|
|
const [isResizing, setIsResizing] = useState(false);
|
|
|
|
const startResizing = useCallback((e) => {
|
|
e.preventDefault();
|
|
setIsResizing(true);
|
|
}, []);
|
|
|
|
const resize = useCallback((e) => {
|
|
if (isResizing) {
|
|
const newWidth = e.clientX;
|
|
if (newWidth > 100 && newWidth < 400) {
|
|
setSidebarWidth(newWidth);
|
|
}
|
|
}
|
|
}, [isResizing]);
|
|
|
|
const stopResizing = useCallback(() => {
|
|
setIsResizing(false);
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const handleMouseMove = (e) => resize(e);
|
|
const handleMouseUp = () => stopResizing();
|
|
|
|
if (isResizing) {
|
|
window.addEventListener("mousemove", handleMouseMove);
|
|
window.addEventListener("mouseup", handleMouseUp);
|
|
}
|
|
|
|
return () => {
|
|
window.removeEventListener("mousemove", handleMouseMove);
|
|
window.removeEventListener("mouseup", handleMouseUp);
|
|
};
|
|
}, [isResizing, resize, stopResizing]);
|
|
|
|
return { sidebarWidth, startResizing };
|
|
};
|
|
|
|
export default useSidebarResize; |