'use client'; import { useCallback, useEffect, useRef, useState } from 'react'; import { useRouter } from 'next/navigation'; import { MoreHorizontal } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useFavoritesStore } from '@/stores/favoritesStore'; import { iconMap } from '@/lib/utils/menuTransform'; import type { FavoriteItem } from '@/stores/favoritesStore'; type DisplayMode = 'full' | 'icon-only' | 'overflow'; interface HeaderFavoritesBarProps { isMobile: boolean; } export default function HeaderFavoritesBar({ isMobile }: HeaderFavoritesBarProps) { const router = useRouter(); const { favorites } = useFavoritesStore(); const containerRef = useRef(null); const [displayMode, setDisplayMode] = useState('full'); // 반응형: ResizeObserver로 컨테이너 너비 감지 useEffect(() => { if (isMobile) { setDisplayMode('overflow'); return; } const container = containerRef.current; if (!container) return; const observer = new ResizeObserver((entries) => { for (const entry of entries) { const width = entry.contentRect.width; if (width < 300 || favorites.length > 4) { setDisplayMode('overflow'); } else if (width < 600) { setDisplayMode('icon-only'); } else { setDisplayMode('full'); } } }); observer.observe(container); return () => observer.disconnect(); }, [isMobile, favorites.length]); const handleClick = useCallback( (item: FavoriteItem) => { router.push(item.path); }, [router] ); if (favorites.length === 0) return null; const getIcon = (iconName: string) => { const Icon = iconMap[iconName]; return Icon || null; }; // 모바일: 최대 2개 아이콘 + 나머지 드롭다운 if (isMobile) { const visible = favorites.slice(0, 2); const overflow = favorites.slice(2); return (
{visible.map((item) => { const Icon = getIcon(item.iconName); if (!Icon) return null; return ( ); })} {overflow.length > 0 && ( {overflow.map((item) => { const Icon = getIcon(item.iconName); return ( handleClick(item)} className="flex items-center gap-2 cursor-pointer" > {Icon && } {item.label} ); })} )}
); } // 데스크톱 const visibleCount = displayMode === 'overflow' ? 3 : favorites.length; const visibleItems = favorites.slice(0, visibleCount); const overflowItems = favorites.slice(visibleCount); return (
{visibleItems.map((item) => { const Icon = getIcon(item.iconName); if (!Icon) return null; if (displayMode === 'full') { return ( ); } // icon-only 또는 overflow의 visible 부분 return (

{item.label}

); })} {overflowItems.length > 0 && ( {overflowItems.map((item) => { const Icon = getIcon(item.iconName); return ( handleClick(item)} className="flex items-center gap-2 cursor-pointer" > {Icon && } {item.label} ); })} )}
); }