// Modal components: BookingModal, SecondOpinionModal const { useState: muS, useEffect: muE, useRef: muR } = React; // ============ MODAL SHELL ============ const Modal = ({ open, onClose, children, title, subtitle, width = 560 }) => { muE(() => { if (open) { document.body.classList.add('modal-open'); const onKey = (e) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', onKey); return () => { document.body.classList.remove('modal-open'); document.removeEventListener('keydown', onKey); }; } }, [open, onClose]); if (!open) return null; return (
e.stopPropagation()}> {title && (

{title}

{subtitle &&

{subtitle}

}
)}
{children}
); }; // ============ BOOKING MODAL ============ const BookingModal = ({ open, onClose }) => { const [step, setStep] = muS(1); const [data, setData] = muS({ direction: '', doctor: '', date: '', time: '', name: '', phone: '', comment: '', }); const [submitted, setSubmitted] = muS(false); muE(() => { if (open) { setStep(1); setSubmitted(false); setData({ direction: '', doctor: '', date: '', time: '', name: '', phone: '', comment: '' }); } }, [open]); const set = (patch) => setData((d) => ({ ...d, ...patch })); const dates = muR(generateDates(10)).current; const times = ['09:00', '10:30', '12:00', '14:00', '15:30', '17:00']; const filteredDoctors = data.direction ? DATA.doctors.filter(d => d.tags.some(t => t.toLowerCase().includes(data.direction.toLowerCase().split(' ')[0]))) : DATA.doctors; const canNext1 = data.direction; const canNext2 = data.date && data.time; const canSubmit = data.name.trim() && data.phone.replace(/\D/g, '').length >= 10; const handleSubmit = (e) => { e.preventDefault(); if (!canSubmit) return; if (window.NZ_API) { NZ_API.createAppointment({ name: data.name, phone: data.phone, direction: data.direction, doctor: data.doctor, date: data.date, time: data.time, comment: data.comment, }).catch(() => {}); } setSubmitted(true); }; return ( {submitted ? (

Спасибо, {data.name.split(' ')[0]}! Мы получили заявку на {data.direction}, {data.date} в {data.time}. Администратор позвонит вам на номер {data.phone}.

) : ( <>
{[1, 2, 3].map((s) => (
= s ? 'is-done' : ''} ${step === s ? 'is-active' : ''}`}> {s} {s === 1 ? 'Направление' : s === 2 ? 'Дата и время' : 'Контакты'}
))}
{step === 1 && (
{DATA.directions.slice(0, 8).map((d) => ( ))}
{filteredDoctors.slice(0, 4).map((d) => ( ))}
)} {step === 2 && (
{dates.map((d) => ( ))}
{times.map((t) => ( ))}
)} {step === 3 && (
set({ name: e.target.value })} required />
set({ phone: formatPhone(e.target.value) })} required />