import Link from 'next/link'; import { useRouter } from 'next/router'; import { useState } from 'react'; import { FiArrowLeft } from 'react-icons/fi'; import AdminFormSection from '../../../components/admin/AdminFormSection'; import AdminLayout from '../../../components/admin/AdminLayout'; import StatusBadge from '../../../components/admin/StatusBadge'; import { AdminApiError, fetchAdmin } from '../../../lib/admin/api'; import { requireAuth } from '../../../lib/admin/requireAuth'; const STATUS_OPTIONS = ['pending', 'read', 'replied']; function formatDate(iso) { try { return new Date(iso).toLocaleString('ko-KR'); } catch { return iso; } } function AdminContactDetail({ initial }) { const router = useRouter(); const [detail, setDetail] = useState(initial); const [updating, setUpdating] = useState(false); const [error, setError] = useState(''); async function handleStatusChange(nextStatus) { if (nextStatus === detail.status) return; setUpdating(true); setError(''); try { const updated = await fetchAdmin( `/api/admin/contact/${detail.id}/status`, { method: 'PATCH', body: { status: nextStatus } }, ); setDetail(updated); } catch (err) { if (err instanceof AdminApiError && err.status === 401) { router.replace('/admin/login'); return; } setError(err?.message ?? '상태 변경에 실패했습니다.'); } finally { setUpdating(false); } } return (
목록으로
이름
{detail.name}
이메일
{detail.email}
주제
{detail.subject}
제출 시각
{formatDate(detail.createdAt)}
상태
{error && (

{error}

)}
					{detail.message}
				
); } const API_BASE_URL = process.env.API_INTERNAL_URL || 'http://localhost:7341'; export const getServerSideProps = requireAuth(async (ctx) => { const id = ctx.params?.id; const cookieHeader = ctx.req?.headers?.cookie ?? ''; const res = await fetch(`${API_BASE_URL}/api/admin/contact/${id}`, { headers: cookieHeader ? { cookie: cookieHeader } : undefined, }); if (res.status === 404) { return { notFound: true }; } if (!res.ok) { throw new Error(`[admin contact detail] API returned ${res.status}`); } const body = await res.json(); return { props: { initial: body?.data } }; }); export default AdminContactDetail;