import { useState, useRef, useEffect } from 'react'; import { NavLink, useNavigate } from 'react-router-dom'; import { CheckSquare, Clock as ClockIcon, FileText, FolderKanban, Code, Menu, X, ChevronDown, ChevronRight, Database, Package, User, Users, CalendarDays, Mail, Shield, List, AlertTriangle, Star, } from 'lucide-react'; import { clsx } from 'clsx'; import { UserInfoDialog } from '@/components/user/UserInfoDialog'; import { UserGroupDialog } from '@/components/user/UserGroupDialog'; import { KuntaeErrorCheckDialog } from '@/components/kuntae/KuntaeErrorCheckDialog'; import { FavoriteDialog } from '@/components/favorite/FavoriteDialog'; import { AmkorLogo } from './AmkorLogo'; interface HeaderProps { isConnected?: boolean; // deprecated, no longer used } interface NavItem { path?: string; icon: React.ElementType; label: string; action?: string; } interface SubMenu { label: string; icon: React.ElementType; items: NavItem[]; } interface MenuItem { type: 'link' | 'submenu' | 'action'; path?: string; icon: React.ElementType; label: string; submenu?: SubMenu; action?: string; } interface DropdownMenuConfig { label: string; icon: React.ElementType; items: MenuItem[]; } // 좌측 메뉴 항목 const leftNavItems: NavItem[] = [ { path: '/jobreport', icon: FileText, label: '업무일지' }, { path: '/project', icon: FolderKanban, label: '프로젝트' }, ]; // 좌측 드롭다운 메뉴 (근태) const leftDropdownMenus: DropdownMenuConfig[] = [ { label: '근태', icon: ClockIcon, items: [ { type: 'link', path: '/kuntae', icon: List, label: '목록' }, { type: 'action', icon: AlertTriangle, label: '오류검사', action: 'kuntaeErrorCheck' }, ], }, ]; // 좌측 단독 액션 버튼 (즐겨찾기) const leftActionItems: NavItem[] = [ { icon: Star, label: '즐겨찾기', action: 'favorite' }, ]; // 우측 메뉴 항목 const rightNavItems: NavItem[] = [ { path: '/todo', icon: CheckSquare, label: '할일' }, ]; // 드롭다운 메뉴 (2단계 지원) const dropdownMenus: DropdownMenuConfig[] = [ { label: '공용정보', icon: Database, items: [ { type: 'link', path: '/common', icon: Code, label: '공용코드' }, { type: 'link', path: '/items', icon: Package, label: '품목정보' }, { type: 'submenu', icon: Users, label: '사용자', submenu: { label: '사용자', icon: Users, items: [ { icon: User, label: '정보', action: 'userInfo' }, { path: '/user/list', icon: Users, label: '목록' }, { path: '/user/auth', icon: Shield, label: '권한' }, { icon: Users, label: '그룹정보', action: 'userGroup' }, ], }, }, { type: 'link', path: '/monthly-work', icon: CalendarDays, label: '월별근무표' }, { type: 'link', path: '/mail-form', icon: Mail, label: '메일양식' }, ], }, { label: '문서', icon: FileText, items: [ { type: 'link', path: '/note', icon: FileText, label: '메모장' }, { type: 'link', path: '/patch-list', icon: FileText, label: '패치 내역' }, { type: 'link', path: '/mail-list', icon: Mail, label: '메일 내역' }, ], }, ]; function DropdownNavMenu({ menu, onItemClick, onAction }: { menu: DropdownMenuConfig; onItemClick?: () => void; onAction?: (action: string) => void; }) { const [isOpen, setIsOpen] = useState(false); const [activeSubmenu, setActiveSubmenu] = useState(null); const dropdownRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); setActiveSubmenu(null); } } document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const handleSubItemClick = (subItem: NavItem) => { setIsOpen(false); setActiveSubmenu(null); if (subItem.action) { onAction?.(subItem.action); } onItemClick?.(); }; return (
{isOpen && (
{menu.items.map((item) => ( item.type === 'link' ? ( { setIsOpen(false); onItemClick?.(); }} className={({ isActive }) => clsx( 'flex items-center space-x-2 px-4 py-2 text-sm transition-colors', isActive ? 'bg-white/20 text-white' : 'text-white/70 hover:bg-white/10 hover:text-white' ) } > {item.label} ) : item.type === 'action' ? ( ) : (
setActiveSubmenu(item.label)} onMouseLeave={() => setActiveSubmenu(null)} >
{item.label}
{activeSubmenu === item.label && item.submenu && (
{item.submenu.items.map((subItem) => ( subItem.path ? ( handleSubItemClick(subItem)} className={({ isActive }) => clsx( 'flex items-center space-x-2 px-4 py-2 text-sm transition-colors', isActive ? 'bg-white/20 text-white' : 'text-white/70 hover:bg-white/10 hover:text-white' ) } > {subItem.label} ) : ( ) ))}
)}
) ))}
)}
); } // 모바일용 드롭다운 (펼쳐진 형태) function MobileDropdownMenu({ menu, onItemClick, onAction }: { menu: DropdownMenuConfig; onItemClick?: () => void; onAction?: (action: string) => void; }) { const [isOpen, setIsOpen] = useState(false); const [activeSubmenu, setActiveSubmenu] = useState(null); const handleSubItemClick = (subItem: NavItem) => { if (subItem.action) { onAction?.(subItem.action); } onItemClick?.(); }; return (
{isOpen && (
{menu.items.map((item) => ( item.type === 'link' ? ( clsx( 'flex items-center space-x-3 px-4 py-2 rounded-lg transition-all duration-200', isActive ? 'bg-white/20 text-white' : 'text-white/70 hover:bg-white/10 hover:text-white' ) } > {item.label} ) : item.type === 'action' ? ( ) : (
{activeSubmenu === item.label && item.submenu && (
{item.submenu.items.map((subItem) => ( subItem.path ? ( clsx( 'flex items-center space-x-3 px-4 py-2 rounded-lg transition-all duration-200', isActive ? 'bg-white/20 text-white' : 'text-white/70 hover:bg-white/10 hover:text-white' ) } > {subItem.label} ) : ( ) ))}
)}
) ))}
)}
); } export function Header(_props: HeaderProps) { const navigate = useNavigate(); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [showUserInfoDialog, setShowUserInfoDialog] = useState(false); const [showUserGroupDialog, setShowUserGroupDialog] = useState(false); const [showKuntaeErrorCheckDialog, setShowKuntaeErrorCheckDialog] = useState(false); const [showFavoriteDialog, setShowFavoriteDialog] = useState(false); const handleAction = (action: string) => { if (action === 'userInfo') { setShowUserInfoDialog(true); } else if (action === 'userGroup') { setShowUserGroupDialog(true); } else if (action === 'kuntaeErrorCheck') { setShowKuntaeErrorCheckDialog(true); } else if (action === 'favorite') { setShowFavoriteDialog(true); } }; return ( <>
{/* Main Header Bar */}
{/* Logo & Mobile Menu Button */}
navigate('/')} >
{/* Desktop Navigation - Left */} {/* Desktop Navigation - Right */}
{/* Mobile Navigation Dropdown */} {isMobileMenuOpen && (
)}
{/* User Info Dialog */} setShowUserInfoDialog(false)} /> {/* User Group Dialog */} setShowUserGroupDialog(false)} /> {/* Kuntae Error Check Dialog */} setShowKuntaeErrorCheckDialog(false)} /> {/* Favorite Dialog */} setShowFavoriteDialog(false)} /> ); }