From 57bb74dc14dfbba37f7a3dd6e999fe0faa0dc21c Mon Sep 17 00:00:00 2001 From: chpark Date: Thu, 7 May 2026 20:12:48 +0900 Subject: [PATCH] =?UTF-8?q?chore(header):=20=EB=AA=A8=EB=B0=94=EC=9D=BC=20?= =?UTF-8?q?=EC=B9=9C=ED=99=94=20=E2=80=94=20=EC=83=81=EB=8B=A8=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=ED=83=AD/Admin/=EC=95=8C=EB=9E=8C=C2=B7=EB=A7=A4?= =?UTF-8?q?=EB=89=B4=EC=96=BC=C2=B7=ED=85=8C=EB=A7=88=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 배경: 모바일에서 헤더가 너무 빽빽함. 사용되지 않는 요소 정리. 제거: - [사용자] / [관리자] 등 상단 메뉴 탭 (좌측 메뉴로 충분) - 홈 아이콘 - 알람 (결재함 배지) — MOMO에서는 결재 흐름 X - 매뉴얼 (BookOpen) 아이콘 - 테마 토글 (Sun/Moon) - Admin 패널 진입 버튼 유지: - 사용자명(클릭 시 /profile) - 로그아웃 Co-Authored-By: Claude Opus 4.7 (1M context) --- src/components/layout/header.tsx | 148 +++++-------------------------- 1 file changed, 24 insertions(+), 124 deletions(-) diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx index 11f785c..709c6e0 100644 --- a/src/components/layout/header.tsx +++ b/src/components/layout/header.tsx @@ -1,48 +1,21 @@ "use client"; -import { useEffect, useState } from "react"; -import { cn } from "@/lib/utils"; +import { useEffect } from "react"; import { useAuthStore } from "@/store/auth-store"; import { useMenuStore } from "@/store/menu-store"; -import { useThemeStore } from "@/store/theme-store"; -import { - Bell, LogOut, Sun, Moon, User, BookOpen, - Home, Shield, -} from "lucide-react"; +import { LogOut, User } from "lucide-react"; export function Header() { const { user, logout } = useAuthStore(); const { topMenus, activeTopMenu, fetchTopMenus, fetchSideMenus } = useMenuStore(); - const { theme, toggleTheme } = useThemeStore(); - const [approvalCount, setApprovalCount] = useState(0); useEffect(() => { fetchTopMenus(); }, [fetchTopMenus]); - useEffect(() => { - const fetchApprovalCount = async () => { - try { - const res = await fetch("/api/approval/count"); - if (res.ok) { - const data = await res.json(); - setApprovalCount(data.count || 0); - } - } catch { /* ignore */ } - }; - fetchApprovalCount(); - const interval = setInterval(fetchApprovalCount, 60000); - return () => clearInterval(interval); - }, []); - - // 관리자 메뉴 분리 (기존 header.jsp openAdminMngPop 대응) - const userMenus = topMenus.filter((m) => m.MENU_NAME_KOR !== "관리자"); - const adminMenu = topMenus.find((m) => m.MENU_NAME_KOR === "관리자"); - - // 초기 로드: 항상 "사용자" 메뉴의 사이드바를 불러오기 + // 초기 로드: "사용자" 메뉴의 사이드바를 불러오기 (관리자 제외) useEffect(() => { if (topMenus.length > 0 && !activeTopMenu) { - // "관리자" 제외하고 "사용자" 메뉴를 명시적으로 찾아서 로드 const userMenu = topMenus.find((m) => m.MENU_NAME_KOR !== "관리자"); if (userMenu) { fetchSideMenus(userMenu.OBJID); @@ -50,103 +23,30 @@ export function Header() { } }, [topMenus, activeTopMenu, fetchSideMenus]); - const handleTopMenuClick = (menuObjId: string) => { - fetchSideMenus(menuObjId); - }; - - // 기존 openAdminMngPop() 대응 - 관리자 팝업 - const openAdminPopup = () => { - if (adminMenu) { - window.open( - `/admin-panel?menuId=${adminMenu.OBJID}`, - "adminPanel", - "width=1630,height=950,menuBar=no,status=no" - ); - } - }; - return ( -
- - - {/* 상위 메뉴 - 관리자 제외 */} - - -
- - - - - - - {/* 관리자 버튼 - plm_admin만 표시 */} - {user?.isAdmin && adminMenu && ( - - )} - -
- - - {user?.userName} {user?.deptName ? `(${user.deptName})` : ""} - -
- - -
); }