import { useRouter } from 'next/router'; import { useState } from 'react'; import AdminFormSection from '../../components/admin/AdminFormSection'; import AdminLayout from '../../components/admin/AdminLayout'; import DynamicList from '../../components/admin/DynamicList'; import ImageUploader from '../../components/admin/ImageUploader'; import Button from '../../components/reusable/Button'; import FormInput from '../../components/reusable/FormInput'; import { AdminApiError, fetchAdmin } from '../../lib/admin/api'; import { requireAuth } from '../../lib/admin/requireAuth'; function toFormState(about) { return { name: about?.name ?? '', tagline: about?.tagline ?? '', profileImage: about?.profileImage ?? '', bio: (about?.bio ?? []).map((paragraph, i) => ({ _key: `bio-${i}-${Math.random()}`, paragraph, })), }; } function AdminAboutEditor({ initialAbout }) { const router = useRouter(); const [form, setForm] = useState(() => toFormState(initialAbout)); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); const [message, setMessage] = useState(''); function set(name, value) { setForm((prev) => ({ ...prev, [name]: value })); } async function handleSubmit(event) { event.preventDefault(); if (submitting) return; setError(''); setMessage(''); setSubmitting(true); try { const payload = { name: form.name.trim(), tagline: form.tagline.trim() || null, profileImage: form.profileImage.trim(), bio: form.bio .map((b) => b.paragraph.trim()) .filter((p) => p.length > 0), }; const saved = await fetchAdmin('/api/admin/about', { method: 'PUT', body: payload, }); setForm(toFormState(saved)); setMessage('저장되었습니다.'); } catch (err) { if (err instanceof AdminApiError && err.status === 401) { router.replace('/admin/login'); return; } setError(err?.message ?? '저장에 실패했습니다.'); } finally { setSubmitting(false); } } return (
set('name', e.target.value)} /> set('tagline', e.target.value)} /> set('profileImage', url)} previewAlt={form.name ? `${form.name} profile` : 'Profile preview'} preset="profile" /> set('bio', next)} emptyItem={() => ({ _key: `bio-${Date.now()}`, paragraph: '' })} addLabel="단락 추가" renderItem={(item, _idx, onItemChange) => (