'use client'; import { useState, useEffect } from 'react'; import { useRouter, useParams } from 'next/navigation'; import Link from 'next/link'; import AdminSidebar from '@/app/components/AdminSidebar'; import BackCircleSvg from '@/app/svgs/backcirclesvg'; import DownloadIcon from '@/app/svgs/downloadicon'; import PaperClipSvg from '@/app/svgs/paperclipsvg'; import apiService from '@/app/lib/apiService'; import type { Resource } from '@/app/admin/resources/mockData'; import NoticeDeleteModal from '@/app/admin/notices/NoticeDeleteModal'; type Attachment = { name: string; size: string; url?: string; fileKey?: string; }; export default function AdminResourceDetailPage() { const params = useParams(); const router = useRouter(); const [resource, setResource] = useState(null); const [attachments, setAttachments] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [isDeleting, setIsDeleting] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [showToast, setShowToast] = useState(false); useEffect(() => { async function fetchResource() { if (!params?.id) return; try { setLoading(true); setError(null); const response = await apiService.getLibraryItem(params.id); const data = response.data; // API 응답 데이터를 Resource 형식으로 변환 const transformedResource: Resource = { id: data.id || data.resourceId || Number(params.id), title: data.title || '', date: data.date || data.createdAt || data.createdDate || new Date().toISOString().split('T')[0], views: data.views || data.viewCount || 0, writer: data.writer || data.author || data.createdBy || '관리자', content: data.content ? (Array.isArray(data.content) ? data.content : typeof data.content === 'string' ? data.content.split('\n').filter((line: string) => line.trim()) : [String(data.content)]) : [], hasAttachment: data.hasAttachment || data.attachment || false, }; // 첨부파일 정보 처리 if (data.attachments && Array.isArray(data.attachments)) { setAttachments(data.attachments.map((att: any) => ({ name: att.name || att.fileName || att.filename || '', size: att.size || att.fileSize || '', url: att.url || att.downloadUrl, fileKey: att.fileKey || att.key || att.fileId, }))); } else if (transformedResource.hasAttachment && data.attachment) { // 단일 첨부파일인 경우 setAttachments([{ name: data.attachment.name || data.attachment.fileName || data.attachment.filename || '첨부파일', size: data.attachment.size || data.attachment.fileSize || '', url: data.attachment.url || data.attachment.downloadUrl, fileKey: data.attachment.fileKey || data.attachment.key || data.attachment.fileId, }]); } if (!transformedResource.title) { throw new Error('학습 자료를 찾을 수 없습니다.'); } setResource(transformedResource); } catch (err) { console.error('학습 자료 조회 오류:', err); setError('학습 자료를 불러오는 중 오류가 발생했습니다.'); } finally { setLoading(false); } } fetchResource(); }, [params?.id]); // 토스트 자동 닫기 useEffect(() => { if (showToast) { const timer = setTimeout(() => { setShowToast(false); }, 3000); return () => clearTimeout(timer); } }, [showToast]); const handleDownload = async (fileKey?: string, url?: string, fileName?: string) => { if (url) { // URL이 있으면 직접 다운로드 const link = document.createElement('a'); link.href = url; link.download = fileName || 'download'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } else if (fileKey) { // fileKey가 있으면 API를 통해 다운로드 try { const fileUrl = await apiService.getFile(fileKey); if (fileUrl) { const link = document.createElement('a'); link.href = fileUrl; link.download = fileName || 'download'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } } catch (err) { console.error('파일 다운로드 실패:', err); alert('파일 다운로드에 실패했습니다.'); } } }; if (loading) { return (

로딩 중...

); } if (error || !resource || !resource.content || resource.content.length === 0) { return (

학습 자료 상세

{error || '학습 자료를 찾을 수 없습니다.'}

); } return (
{/* 사이드바 */}
{/* 메인 콘텐츠 */}
{/* 상단 타이틀 */}

학습 자료 상세

{/* 카드 */}
{/* 헤더 */}

{resource.title}

작성자 {resource.writer}
게시일 {resource.date.includes('T') ? new Date(resource.date).toISOString().split('T')[0] : resource.date}
조회수 {resource.views.toLocaleString()}
{/* 구분선 */}
{/* 본문 및 첨부파일 */}
{/* 본문 */}
{resource.content.map((p, idx) => (

{p}

))}
{/* 첨부파일 섹션 */} {attachments.length > 0 && (

첨부 파일

{attachments.map((attachment, idx) => (

{attachment.name}

{attachment.size}

))}
)}
{/* 버튼 영역 */}
{/* 삭제 확인 모달 */} setIsDeleteModalOpen(false)} onConfirm={async () => { if (!params?.id) { alert('학습 자료 ID를 찾을 수 없습니다.'); setIsDeleteModalOpen(false); return; } try { setIsDeleting(true); await apiService.deleteLibraryItem(params.id); setIsDeleteModalOpen(false); setShowToast(true); // 토스트 표시 후 목록 페이지로 이동 setTimeout(() => { router.push('/admin/resources'); }, 1500); } catch (err) { console.error('학습 자료 삭제 오류:', err); const errorMessage = err instanceof Error ? err.message : '학습 자료 삭제에 실패했습니다.'; alert(errorMessage); setIsDeleteModalOpen(false); } finally { setIsDeleting(false); } }} isDeleting={isDeleting} /> {/* 삭제 완료 토스트 */} {showToast && (

학습 자료가 삭제되었습니다.

)}
); }