mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
/**
|
|
* useResponsiveSidebar Hook
|
|
* Manages responsive sidebar behavior and mobile detection
|
|
*/
|
|
|
|
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
|
|
export interface UseResponsiveSidebarReturn {
|
|
isMobile: boolean;
|
|
isCollapsed: boolean;
|
|
setIsCollapsed: (collapsed: boolean) => void;
|
|
toggleCollapsed: () => void;
|
|
}
|
|
|
|
/**
|
|
* Custom hook for responsive sidebar logic
|
|
* Detects mobile screen size and auto-closes sidebar on resize transition to mobile
|
|
*/
|
|
export const useResponsiveSidebar = (
|
|
sidebarOpen: boolean,
|
|
onSidebarChange: (open: boolean) => void
|
|
): UseResponsiveSidebarReturn => {
|
|
const [isMobile, setIsMobile] = useState(false);
|
|
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
const wasMobileRef = useRef(false);
|
|
const onSidebarChangeRef = useRef(onSidebarChange);
|
|
onSidebarChangeRef.current = onSidebarChange;
|
|
|
|
const toggleCollapsed = useCallback(() => {
|
|
setIsCollapsed((prev) => !prev);
|
|
}, []);
|
|
|
|
// Handle window resize — only auto-close when transitioning to mobile
|
|
useEffect(() => {
|
|
const handleResize = () => {
|
|
const mobile = window.innerWidth < 768;
|
|
const wasDesktop = !wasMobileRef.current;
|
|
wasMobileRef.current = mobile;
|
|
setIsMobile(mobile);
|
|
|
|
// Auto-close sidebar only when crossing the desktop → mobile boundary
|
|
if (mobile && wasDesktop) {
|
|
onSidebarChangeRef.current(false);
|
|
}
|
|
};
|
|
|
|
window.addEventListener('resize', handleResize);
|
|
handleResize(); // Call on mount
|
|
|
|
return () => window.removeEventListener('resize', handleResize);
|
|
}, []);
|
|
|
|
return {
|
|
isMobile,
|
|
isCollapsed,
|
|
setIsCollapsed,
|
|
toggleCollapsed
|
|
};
|
|
};
|