diff options
Diffstat (limited to 'hooks/use-active-menus.ts')
| -rw-r--r-- | hooks/use-active-menus.ts | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/hooks/use-active-menus.ts b/hooks/use-active-menus.ts new file mode 100644 index 00000000..0007c728 --- /dev/null +++ b/hooks/use-active-menus.ts @@ -0,0 +1,68 @@ +// hooks/use-active-menus.ts + +"use client" + +import { useState, useEffect } from "react" +import type { MenuSection, MenuItem } from "@/config/menuConfig" + +interface ActiveMenusData { + [menuPath: string]: boolean +} + +// 서버에서 활성 메뉴 상태를 가져오는 함수 +async function fetchActiveMenus(): Promise<ActiveMenusData> { + try { + const response = await fetch("/api/menu-assignments/active-status") + if (!response.ok) { + throw new Error("Failed to fetch menu status") + } + return await response.json() + } catch (error) { + console.error("Error fetching active menus:", error) + return {} + } +} + +// 메뉴를 필터링하는 유틸리티 함수 +export function filterActiveMenus( + sections: MenuSection[], + activeMenus: ActiveMenusData +): MenuSection[] { + return sections.map(section => ({ + ...section, + items: section.items.filter(item => { + // activeMenus에 데이터가 없으면 기본적으로 활성으로 간주 + return activeMenus[item.href] !== false + }) + })).filter(section => section.items.length > 0) // 빈 섹션 제거 +} + +export function filterActiveAdditionalMenus( + items: MenuItem[], + activeMenus: ActiveMenusData +): MenuItem[] { + return items.filter(item => { + // activeMenus에 데이터가 없으면 기본적으로 활성으로 간주 + return activeMenus[item.href] !== false + }) +} + +// 활성 메뉴 상태를 관리하는 훅 +export function useActiveMenus() { + const [activeMenus, setActiveMenus] = useState<ActiveMenusData>({}) + const [isLoading, setIsLoading] = useState(true) + + useEffect(() => { + fetchActiveMenus() + .then(data => { + setActiveMenus(data) + setIsLoading(false) + }) + .catch(error => { + console.error("Failed to load menu status:", error) + setIsLoading(false) + }) + }, []) + + return { activeMenus, isLoading } +}
\ No newline at end of file |
