'use client'; import { useState, useEffect, useRef } from 'react'; interface ContactModalProps { isOpen: boolean; onClose: () => void; service: string; checklist: string[]; accentColor?: string; // tailwind class e.g. 'text-amber-400' accentBg?: string; // e.g. 'bg-amber-400' headerFrom?: string; // hex e.g. '#1a0a00' headerTo?: string; // hex e.g. '#3d1a00' } export default function ContactModal({ isOpen, onClose, service, checklist, accentColor = 'text-[#5ba4ff]', accentBg = 'bg-[#1a56db]', headerFrom = '#04102b', headerTo = '#0a2060', }: ContactModalProps) { const [formData, setFormData] = useState({ name: '', phone: '', email: '', service, message: '', }); const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle'); const [errorMessage, setErrorMessage] = useState(''); const [visible, setVisible] = useState(false); const firstInputRef = useRef(null); /* sync service prop into form */ useEffect(() => { setFormData((prev) => ({ ...prev, service })); }, [service]); /* animation: open/close */ useEffect(() => { if (isOpen) { setVisible(true); setTimeout(() => firstInputRef.current?.focus(), 100); document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [isOpen]); /* close on Escape */ useEffect(() => { const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handler); return () => window.removeEventListener('keydown', handler); }, [onClose]); const handleChange = (e: React.ChangeEvent) => { setFormData((prev) => ({ ...prev, [e.target.name]: e.target.value })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setStatus('loading'); setErrorMessage(''); try { const response = await fetch('/api/contact', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData), }); const data = await response.json(); if (!response.ok) throw new Error(data.error || '문의 전송에 실패했습니다.'); setStatus('success'); } catch (error) { setStatus('error'); setErrorMessage(error instanceof Error ? error.message : '문의 전송에 실패했습니다.'); } }; if (!isOpen && !visible) return null; return (
{ if (e.target === e.currentTarget) onClose(); }} onTransitionEnd={() => { if (!isOpen) setVisible(false); }} >
{/* ─── Header ─── */}

CONTACT

{service}

{/* ─── Body ─── */} {status === 'success' ? ( /* Success State */

문의가 접수되었습니다

24시간 이내로 답변 드리겠습니다.

bgg8988@gmail.com / 010-3907-1392

) : (
{/* Left: Checklist */}

신청 전 확인사항

    {checklist.map((item, i) => (
  • {item}
  • ))}
{/* quick contact */}
24h 이내 답변 보장
{/* Right: Form */}