'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"; const NAV_ITEMS = [ { label: "교육 과정 목록", href: "/course-list" }, { label: "학습 자료실", href: "/resources" }, { label: "공지사항", href: "/notices" }, ]; export default function NavBar() { const pathname = usePathname(); const router = useRouter(); const [isUserMenuOpen, setIsUserMenuOpen] = useState(false); const [userName, setUserName] = useState(''); const userMenuRef = useRef(null); const userButtonRef = useRef(null); const hideCenterNav = /^\/[^/]+\/review$/.test(pathname); const isAdminPage = pathname.startsWith('/admin'); // 사용자 정보 가져오기 및 비활성화 계정 체크 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 apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL ? `${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/me` : 'https://hrdi.coconutmeet.net/auth/me'; const response = await fetch(apiUrl, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, }); if (!response.ok) { 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 = await response.json(); // 계정 상태 확인 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 && 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 && ( )}
{isAdminPage ? ( <> 내 정보 ) : ( <> 내 강좌실 {isUserMenuOpen && (
setIsUserMenuOpen(false)} > 내 정보 수정
)} )}
); }