summaryrefslogtreecommitdiff
path: root/hooks/use-active-menus.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-06-30 08:28:13 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-06-30 08:28:13 +0000
commit5b6313f16f508882a0ea67716b7dbaa1c6967f04 (patch)
tree3d1d8dafea2f31274ace3fbda08333e889e06d1c /hooks/use-active-menus.ts
parent3f0fad18483a5c800c79c5e33946d9bb384c10e2 (diff)
(대표님) 20250630 16시 - 유저 도메인별 라우터 분리와 보안성검토 대응
Diffstat (limited to 'hooks/use-active-menus.ts')
-rw-r--r--hooks/use-active-menus.ts68
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