summaryrefslogtreecommitdiff
path: root/hooks/use-active-menus.ts
blob: 0007c728d83e1f63772776ce27e9d795ac7e2a0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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 }
}