mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
- Added @metabuilder/hooks workspace package at root
- Consolidated 30 React hooks from across codebase into single module
- Implemented conditional exports for tree-shaking support
- Added comprehensive package.json with build/lint/typecheck scripts
- Created README.md documenting hook categories and usage patterns
- Updated root package.json workspaces array to include hooks
- Supports multi-version peer dependencies (React 18/19, Redux 8/9)
Usage:
import { useDashboardLogic } from '@metabuilder/hooks'
import { useLoginLogic } from '@metabuilder/hooks/useLoginLogic'
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
55 lines
1.3 KiB
TypeScript
55 lines
1.3 KiB
TypeScript
/**
|
|
* useResponsiveSidebar Hook
|
|
* Manages responsive sidebar behavior and mobile detection
|
|
*/
|
|
|
|
import { useState, useEffect, useCallback } 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 mobile
|
|
*/
|
|
export const useResponsiveSidebar = (
|
|
sidebarOpen: boolean,
|
|
onSidebarChange: (open: boolean) => void
|
|
): UseResponsiveSidebarReturn => {
|
|
const [isMobile, setIsMobile] = useState(false);
|
|
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
|
|
const toggleCollapsed = useCallback(() => {
|
|
setIsCollapsed((prev) => !prev);
|
|
}, []);
|
|
|
|
// Handle window resize
|
|
useEffect(() => {
|
|
const handleResize = () => {
|
|
const mobile = window.innerWidth < 768;
|
|
setIsMobile(mobile);
|
|
|
|
// Auto-close sidebar on mobile if it's open
|
|
if (mobile && sidebarOpen) {
|
|
onSidebarChange(false);
|
|
}
|
|
};
|
|
|
|
window.addEventListener('resize', handleResize);
|
|
handleResize(); // Call on mount
|
|
|
|
return () => window.removeEventListener('resize', handleResize);
|
|
}, [sidebarOpen, onSidebarChange]);
|
|
|
|
return {
|
|
isMobile,
|
|
isCollapsed,
|
|
setIsCollapsed,
|
|
toggleCollapsed
|
|
};
|
|
};
|