'use client'; import { useState, useEffect } from 'react'; interface Document { id: string; title: string; description: string; category: '제안서' | '질문지' | '계약서'; fileName: string; updatedAt: string; status: 'draft' | 'sent' | 'accepted'; } const documents: Document[] = [ { id: 'ebay-proposal', title: '이베이 부품 AI 자동화 — 제안서', description: '프로젝트 개요, 3단 패키지 견적(120/198/330만원), 기술 스택, 진행 절차', category: '제안서', fileName: 'ebay-tool-proposal.html', updatedAt: '2026-04-02', status: 'draft', }, { id: 'ebay-questionnaire', title: '이베이 부품 AI 자동화 — 요구사항 질문지', description: '고객 사전 확인 17항목 (타겟 사이트, 샘플 품번, eBay 셀러 티어 등)', category: '질문지', fileName: 'ebay-tool-questionnaire.html', updatedAt: '2026-04-02', status: 'draft', }, ]; const CATEGORY_COLORS: Record = { '제안서': 'bg-blue-900/40 text-blue-400 border-blue-500/30', '질문지': 'bg-amber-900/40 text-amber-400 border-amber-500/30', '계약서': 'bg-green-900/40 text-green-400 border-green-500/30', }; const STATUS_CONFIG: Record = { draft: { label: '초안', color: 'bg-slate-700/60 text-slate-300' }, sent: { label: '발송', color: 'bg-blue-900/40 text-blue-400' }, accepted: { label: '수락', color: 'bg-green-900/40 text-green-400' }, }; export default function AdminDocumentsPage() { const [previewDoc, setPreviewDoc] = useState(null); const [previewHtml, setPreviewHtml] = useState(''); const [previewLoading, setPreviewLoading] = useState(false); // iframe src 대신 fetch + srcdoc 방식으로 X-Frame-Options 우회 useEffect(() => { if (!previewDoc) { setPreviewHtml(''); return; } setPreviewLoading(true); fetch(`/api/admin/documents/${previewDoc.fileName}`) .then(res => res.ok ? res.text() : Promise.reject('문서를 불러올 수 없습니다')) .then(html => setPreviewHtml(html)) .catch(() => setPreviewHtml('

문서를 불러올 수 없습니다.

')) .finally(() => setPreviewLoading(false)); }, [previewDoc]); return (
{/* 헤더 */}

프로젝트 문서

고객 제안서, 견적서, 요구사항 질문지 등 프로젝트 문서를 관리합니다

{/* 문서 카드 그리드 */}
{documents.map((doc) => (
{/* 카테고리 + 상태 뱃지 */}
{doc.category} {STATUS_CONFIG[doc.status].label}
{/* 제목 + 설명 */}

{doc.title}

{doc.description}

{/* 수정일 + 버튼 */}
수정일: {doc.updatedAt}
))}
{/* 미리보기 섹션 */} {previewDoc && (
{/* 미리보기 헤더 */}
{previewDoc.title}
{/* 문서 미리보기 (fetch + srcdoc 방식) */} {previewLoading ? (
문서를 불러오는 중...
) : (