"use client"; import * as React from "react"; import Link from "next/link"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { X, ChevronDown, ChevronRight } from "lucide-react"; import type { MenuTreeNode } from "@/lib/menu-v2/types"; interface MobileMenuV2Props { lng: string; onClose: () => void; tree: MenuTreeNode[]; getTitle: (node: MenuTreeNode) => string; getDescription: (node: MenuTreeNode) => string | null; } export function MobileMenuV2({ lng, onClose, tree, getTitle, getDescription, }: MobileMenuV2Props) { const [expandedGroups, setExpandedGroups] = React.useState>( new Set() ); const toggleGroup = (groupId: number) => { setExpandedGroups((prev) => { const next = new Set(prev); if (next.has(groupId)) { next.delete(groupId); } else { next.add(groupId); } return next; }); }; // 드롭다운 메뉴인지 판단 const isDropdownMenu = (node: MenuTreeNode) => node.nodeType === 'menu_group' && node.children && node.children.length > 0; return (
{/* 헤더 */}
메뉴
{/* 스크롤 영역 */}
{tree.map((node) => { // 드롭다운 메뉴 (menu_group with children) if (isDropdownMenu(node)) { return (
{/* 메뉴그룹 헤더 */} {/* 하위 메뉴 */} {expandedGroups.has(node.id) && (
{node.children?.map((item) => { if (item.nodeType === "group") { // 그룹인 경우 return (
{getTitle(item)}
{item.children?.map((menu) => ( ))}
); } else if (item.nodeType === "menu") { // 직접 메뉴인 경우 return ( ); } return null; })}
)}
); } // 단일 링크 메뉴 (최상위 menu) if (node.nodeType === 'menu' && node.menuPath) { return ( ); } return null; })}
); } interface MobileMenuLinkProps { href: string; title: string; onClick: () => void; } function MobileMenuLink({ href, title, onClick }: MobileMenuLinkProps) { return ( {title} ); }