'use client'; import { useState, useEffect } from 'react'; interface QuestionnaireResponse { id: string; questionnaire_type: string; client_name: string; client_email: string; client_phone: string | null; responses: Record; status: string; admin_notes: string | null; created_at: string; reviewed_at: string | null; } const STATUS_CONFIG: Record = { submitted: { label: '접수', color: 'bg-blue-900/40 text-blue-400 border-blue-500/30' }, reviewed: { label: '검토완료', color: 'bg-green-900/40 text-green-400 border-green-500/30' }, archived: { label: '보관', color: 'bg-slate-700/60 text-slate-400 border-slate-500/30' }, }; const QUESTION_LABELS: Record = { q1: '주 사용 부품 사이트 URL', q2: '주요 취급 부품 카테고리', q3: '샘플 품번 목록', q4: '현재 eBay 리스팅 URL', q5: 'eBay 셀러 계정 등급', q6: '주 판매 카테고리', q7: '예상 월간 리스팅 건수', q8: 'Fitment 정확도 기대치', q8_detail: 'Fitment 추가 의견', q9_selected: '타겟 마켓', q9_detail: '타겟 마켓 기타', q10: '리스팅 1건 소요 시간', q11: '기존 리스팅 관리 방식', q11_detail: '서드파티 툴 이름', q12: '관세/통관 계산 방식', q13: 'eBay Developer API 키 보유', q14: '선호 AI 모델', q15: '현재 자동화 도구', q16: 'AI API 키 보유 여부', q17: '포트폴리오 활용 동의', additional: '추가 요청사항', }; export default function AdminQuestionnairePage() { const [responses, setResponses] = useState([]); const [loading, setLoading] = useState(true); const [selected, setSelected] = useState(null); const [adminNotes, setAdminNotes] = useState(''); const [saving, setSaving] = useState(false); useEffect(() => { fetchResponses(); }, []); async function fetchResponses() { try { const res = await fetch('/api/admin/questionnaire'); if (!res.ok) throw new Error(); const json = await res.json(); setResponses(json.data || []); } catch { setResponses([]); } finally { setLoading(false); } } function openDetail(item: QuestionnaireResponse) { setSelected(item); setAdminNotes(item.admin_notes || ''); } async function updateStatus(id: string, status: string) { setSaving(true); try { await fetch(`/api/admin/questionnaire/${id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status, admin_notes: adminNotes }), }); await fetchResponses(); if (selected?.id === id) { setSelected(prev => prev ? { ...prev, status, admin_notes: adminNotes } : null); } } finally { setSaving(false); } } function formatDate(dateStr: string) { return new Date(dateStr).toLocaleDateString('ko-KR', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }); } return (

질문지 응답

고객이 제출한 요구사항 질문지 응답을 관리합니다

{loading ? (
불러오는 중...
) : responses.length === 0 ? (

아직 제출된 질문지가 없습니다

) : (
{/* 목록 */}
{responses.map((item) => { const st = STATUS_CONFIG[item.status] || STATUS_CONFIG.submitted; return ( openDetail(item)} > ); })}
고객명 이메일 유형 상태 접수일
{item.client_name} {item.client_email} {item.questionnaire_type} {st.label} {formatDate(item.created_at)}
{/* 상세 패널 */} {selected && (

{selected.client_name} — 응답 상세

{selected.client_email} {selected.client_phone && ` · ${selected.client_phone}`} {' · '}접수: {formatDate(selected.created_at)}

{Object.entries(selected.responses).map(([key, value]) => (
{QUESTION_LABELS[key] || key}
{Array.isArray(value) ? (value as string[]).join(', ') : String(value)}
))} {Object.keys(selected.responses).length === 0 && (

응답 내용이 없습니다

)}
{/* 관리자 메모 + 상태 변경 */}