import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { createVisitRequest } from '../api'; import { DateTimePicker } from '../components/DateTimePicker'; const ZONE_OPTIONS = [ '4층전산실', '5층전산실', '3층사무실', '4층사무실', '5층사무실', '종합상황실', 'BMT실', '의사결정실', '기타', ]; const PURPOSE_OPTIONS = ['유지점검', '장비반입', '업무협의', '공사', '기타']; const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; export const VisitRequestFormPage: React.FC = () => { const [form, setForm] = useState({ visitorName: '', company: '', contact: '', email: '', vehicleNo: '', zone: '', zoneEtc: '', purpose: '', purposeEtc: '', visitFrom: '', visitTo: '', }); const [consent, setConsent] = useState(false); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); const navigate = useNavigate(); const update = (k: keyof typeof form) => ( e: React.ChangeEvent, ) => setForm({ ...form, [k]: e.target.value }); /** Returns the first Korean validation error, or null if valid. */ const validate = (): string | null => { if (!form.visitorName.trim()) return '방문자 이름을 입력하세요.'; if (!form.contact.trim()) return '방문자 연락처를 입력하세요.'; if (form.email.trim() && !EMAIL_RE.test(form.email.trim())) return '이메일 형식이 올바르지 않습니다. (예: name@example.com)'; if (!form.zone) return '출입 구역을 선택하세요.'; if (form.zone === '기타' && !form.zoneEtc.trim()) return '기타 출입 구역을 입력하세요.'; if (!form.purpose) return '출입 목적을 선택하세요.'; if (form.purpose === '기타' && !form.purposeEtc.trim()) return '기타 출입 목적을 입력하세요.'; if (!form.visitFrom) return '출입 일시를 입력하세요.'; if (!form.visitTo) return '퇴실 일시를 입력하세요.'; if (new Date(form.visitTo) < new Date(form.visitFrom)) return '퇴실 일시는 출입 일시보다 빠를 수 없습니다.'; if (!consent) return '개인정보 사용 및 저장에 동의해야 신청할 수 있습니다.'; return null; }; const onSubmit = async (e: React.FormEvent) => { e.preventDefault(); const message = validate(); if (message) { setError(message); return; } setError(null); setBusy(true); try { await createVisitRequest({ visitorName: form.visitorName.trim(), company: form.company.trim() || undefined, contact: form.contact.trim(), email: form.email.trim() || undefined, vehicleNo: form.vehicleNo.trim() || undefined, zoneName: form.zone === '기타' ? form.zoneEtc.trim() : form.zone, purpose: form.purpose === '기타' ? form.purposeEtc.trim() : form.purpose, visitFrom: form.visitFrom, visitTo: form.visitTo, }); navigate('/visit-requests', { replace: true }); } catch (err) { setError(err instanceof Error ? err.message : '신청 실패'); } finally { setBusy(false); } }; return (

출입 신청

{error &&
{error}
} {/* noValidate: use our Korean messages instead of the browser's native popups */}
{form.zone === '기타' ? ( ) :
} {form.purpose === '기타' ? ( ) :
}
); };