'use client'; import Link from "next/link"; import { useEffect, useRef, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import MainLogoSvg from "./svgs/mainlogosvg"; import ChevronDownSvg from "./svgs/chevrondownsvg"; import apiService from "./lib/apiService"; const NAV_ITEMS = [ { label: "교육 과정 목록", href: "/course-list" }, { label: "학습 자료실", href: "/resources" }, { label: "공지사항", href: "/notices" }, ]; const INSTRUCTOR_NAV_ITEMS = [ { label: "강좌 현황", href: "/instructor/courses" }, { label: "학습 자료실", href: "/admin/resources" }, { label: "공지사항", href: "/admin/notices" }, ]; export default function NavBar() { const pathname = usePathname(); const router = useRouter(); const [isUserMenuOpen, setIsUserMenuOpen] = useState(false); const [userName, setUserName] = useState(''); const [userRole, setUserRole] = useState(''); const userMenuRef = useRef(null); const userButtonRef = useRef(null); const hideCenterNav = /^\/[^/]+\/review$/.test(pathname); const isAdminPage = pathname.startsWith('/admin'); const isInstructorPage = pathname.startsWith('/instructor'); // 사용자 정보 가져오기 및 비활성화 계정 체크 useEffect(() => { let isMounted = true; async function fetchUserInfo() { try { // localStorage와 쿠키 모두에서 토큰 확인 const localStorageToken = localStorage.getItem('token'); const cookieToken = document.cookie .split('; ') .find(row => row.startsWith('token=')) ?.split('=')[1]; const token = localStorageToken || cookieToken; if (!token) { return; } // localStorage에 토큰이 없고 쿠키에만 있으면 localStorage에도 저장 (동기화) if (!localStorageToken && cookieToken) { localStorage.setItem('token', cookieToken); } const response = await apiService.getCurrentUser(); if (response.status === 401) { // 토큰이 만료되었거나 유효하지 않은 경우 localStorage.removeItem('token'); document.cookie = 'token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; // 로그인 페이지가 아닐 때만 리다이렉트 if (isMounted && pathname !== '/login') { router.push('/login'); } return; } const data = response.data; // 계정 상태 확인 const userStatus = data.status || data.userStatus; if (userStatus === 'INACTIVE' || userStatus === 'inactive') { // 비활성화된 계정인 경우 로그아웃 처리 localStorage.removeItem('token'); document.cookie = 'token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; // 로그인 페이지가 아닐 때만 리다이렉트 if (isMounted && pathname !== '/login') { router.push('/login'); } return; } if (isMounted) { const role = data.role || data.userRole || ''; setUserRole(role); if (data.name) { setUserName(data.name); } } } catch (error) { console.error('사용자 정보 조회 오류:', error); } } fetchUserInfo(); return () => { isMounted = false; }; }, [router, pathname]); useEffect(() => { if (!isUserMenuOpen) return; const onDown = (e: MouseEvent) => { const t = e.target as Node; if ( userMenuRef.current && !userMenuRef.current.contains(t) && userButtonRef.current && !userButtonRef.current.contains(t) ) { setIsUserMenuOpen(false); } }; const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") setIsUserMenuOpen(false); }; document.addEventListener("mousedown", onDown); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDown); document.removeEventListener("keydown", onKey); }; }, [isUserMenuOpen]); return (
XR LMS {!hideCenterNav && !isAdminPage && isInstructorPage && ( )} {!hideCenterNav && !isAdminPage && !isInstructorPage && ( )}
{(isAdminPage || isInstructorPage) ? ( <> {isUserMenuOpen && (
)} ) : ( <> 내 강좌실 {isUserMenuOpen && (
setIsUserMenuOpen(false)} > 내 정보 수정
)} )}
); }