'use client'; import { useState, useEffect } from 'react'; import { useParams, useRouter } from 'next/navigation'; import Link from 'next/link'; import PaperClipSvg from '../../svgs/paperclipsvg'; import BackCircleSvg from '../../svgs/backcirclesvg'; import DownloadIcon from '../../svgs/downloadicon'; import apiService from '../../lib/apiService'; import type { Resource } from '../../admin/resources/mockData'; type Attachment = { name: string; size: string; url?: string; fileKey?: string; }; export default function ResourceDetailPage() { 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); 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]); 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) { return (

학습 자료 상세

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

); } const item = resource; return (
{/* 상단 타이틀 */}

학습 자료 상세

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

{item.title}

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

{p}

)) ) : (

내용이 없습니다.

)}
{/* 첨부 파일 */} {attachments.length > 0 && (
첨부 파일
{attachments.map((f, idx) => (
{f.name} {f.size && ( {f.size} )}
))}
)}
); }