/* eslint-disable @next/next/no-img-element */ 'use client'; import { useEffect, useMemo, useRef, useState } from 'react'; import { useRouter } from 'next/navigation'; import MainLogoSvg from './svgs/mainlogosvg'; import apiService from './lib/apiService'; export default function Home() { const router = useRouter(); const containerRef = useRef(null); const [currentIndex, setCurrentIndex] = useState(0); const [userName, setUserName] = useState(''); // 코스, 공지사항 더미 데이터 const courseCards = useMemo( () => [ { id: 'c1', title: '원자력 운영 기초', meta: 'VOD • 초급 • 4시간 20분', image: 'https://picsum.photos/seed/xrlms-c1/1200/800', }, { id: 'c2', title: '반도체', meta: 'VOD • 중급 • 3시간 10분', image: 'https://picsum.photos/seed/xrlms-c2/1200/800', }, { id: 'c3', title: '방사선 안전', meta: 'VOD • 중급 • 4시간 20분', image: 'https://picsum.photos/seed/xrlms-c3/1200/800', }, { id: 'c4', title: '방사선 폐기물', meta: 'VOD • 중급 • 4시간 20분', image: 'https://picsum.photos/seed/xrlms-c4/1200/800', }, { id: 'c5', title: '원자력 운전 개론', meta: 'VOD • 초급 • 3시간 00분', image: 'https://picsum.photos/seed/xrlms-c5/1200/800', }, { id: 'c6', title: '안전 표지와 표준', meta: 'VOD • 초급 • 2시간 40분', image: 'https://picsum.photos/seed/xrlms-c6/1200/800', }, { id: 'c7', title: '발전소 운영', meta: 'VOD • 중급 • 4시간 20분', image: 'https://picsum.photos/seed/xrlms-c7/1200/800', }, { id: 'c8', title: '방사선 안전 실습', meta: 'VOD • 중급 • 3시간 30분', image: 'https://picsum.photos/seed/xrlms-c8/1200/800', }, { id: 'c9', title: '실험실 안전', meta: 'VOD • 초급 • 2시간 10분', image: 'https://picsum.photos/seed/xrlms-c9/1200/800', }, { id: 'c10', title: '기초 장비 운용', meta: 'VOD • 초급 • 2시간 50분', image: 'https://picsum.photos/seed/xrlms-c10/1200/800', }, ] as Array<{ id: string; title: string; meta: string; image: string }>, [] ); const noticeRows = useMemo( () => [ { id: 5, title: '(공지)시스템 개선이 완료되었...', date: '2025-09-10', views: 1320, writer: '운영팀' }, { id: 4, title: '(공지)서버 점검 안내(9/10 새벽)', date: '2025-09-10', views: 1210, writer: '운영팀' }, { id: 3, title: '(공지)서비스 개선 안내', date: '2025-09-10', views: 1230, writer: '운영팀' }, { id: 2, title: '(공지)시장점검 공지', date: '2025-09-10', views: 1320, writer: '관리자' }, { id: 1, title: '뉴: 봉사시간 안내 및 한눈에 보는 현황 정리', date: '2025-08-28', views: 594, writer: '운영팀' }, ], [] ); // NOTE: 실제 이미지 자산 연결 시 해당 src를 교체하세요. const slides = useMemo( () => [ { id: 1, title: '시스템 점검 안내', description: '11월 10일 새벽 2시~4시 시스템 점검이 진행됩니다.', imageSrc: 'https://picsum.photos/seed/xrlms-slide1/1600/900', }, { id: 2, title: '신규 과정 오픈', description: '최신 커리큘럼으로 업스킬링하세요.', imageSrc: 'https://picsum.photos/seed/xrlms-slide2/1600/900', }, { id: 3, title: '수강 이벤트', description: '이번 달 수강 혜택을 확인해보세요.', imageSrc: 'https://picsum.photos/seed/xrlms-slide3/1600/900', }, ], [] ); // 사용자 정보 가져오기 useEffect(() => { let isMounted = true; async function fetchUserInfo() { try { const localStorageToken = localStorage.getItem('token'); const cookieToken = document.cookie .split('; ') .find(row => row.startsWith('token=')) ?.split('=')[1]; const token = localStorageToken || cookieToken; if (!token) { return; } const response = await apiService.getCurrentUser(); if (response.status !== 200) { return; } const data = response.data; if (isMounted) { // 사용자 권한 확인 const userRole = data.role || data.userRole; if (userRole === 'ADMIN' || userRole === 'admin') { // admin 권한이면 /admin/id로 리다이렉트 router.push('/admin/id'); return; } if (data.name) { setUserName(data.name); } } } catch (error) { console.error('사용자 정보 조회 오류:', error); } } fetchUserInfo(); return () => { isMounted = false; }; }, []); useEffect(() => { const containerEl = containerRef.current; if (!containerEl) return; const handleScroll = () => { const width = containerEl.clientWidth; const index = Math.round(containerEl.scrollLeft / Math.max(width, 1)); setCurrentIndex(index); }; containerEl.addEventListener('scroll', handleScroll, { passive: true }); return () => { containerEl.removeEventListener('scroll', handleScroll); }; }, []); const scrollToIndex = (index: number) => { const containerEl = containerRef.current; if (!containerEl) return; const clamped = Math.max(0, Math.min(index, slides.length - 1)); const width = containerEl.clientWidth; containerEl.scrollTo({ left: clamped * width, behavior: 'smooth' }); }; const handlePrev = () => scrollToIndex(currentIndex - 1); const handleNext = () => scrollToIndex(currentIndex + 1); return (
{/* 메인 컨테이너 */}
{/* 배너 + 사이드 */}
{/* 배너 */}
{slides.map((slide) => (
{slide.title} { const t = e.currentTarget as HTMLImageElement; if (!t.src.includes('picsum.photos')) t.src = 'https://picsum.photos/seed/xrlms-fallback-slide/1600/900'; }} />
{slide.title}
{slide.description}
))}
{/* 좌/우 내비게이션 버튼 */} {/* 인디케이터 */}
{slides.map((_, idx) => ( ))}
{/* 사이드 패널 (피그마 디자인 적용) */}
{/* 교육 과정 */}

교육 과정

28
전체보기
{courseCards.map((c) => (
{c.title} { const t = e.currentTarget as HTMLImageElement; if (!t.src.includes('picsum.photos')) t.src = 'https://picsum.photos/seed/xrlms-fallback-card/1200/800'; }} />
{c.id === 'c1' && ( 수강 중 )}
{c.title}

{c.meta}

))}
{/* 공지사항 */}

공지사항

{noticeRows.length}
전체보기
번호
제목
게시일
조회수
작성자
{noticeRows.map((r) => (
{r.id}
{r.title}
{r.date}
{r.views.toLocaleString()}
{r.writer}
))}
{/* 전역 Footer는 layout.tsx에서 렌더링됩니다. */}
); }