From 5b6313f16f508882a0ea67716b7dbaa1c6967f04 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 30 Jun 2025 08:28:13 +0000 Subject: (대표님) 20250630 16시 - 유저 도메인별 라우터 분리와 보안성검토 대응 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hooks/use-active-menus.ts | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 hooks/use-active-menus.ts (limited to 'hooks') 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 { + 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({}) + 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 -- cgit v1.2.3