/* global React, Icon, Button, Eyebrow, TBMark, useLanguage */ const { useState, useMemo, useRef } = React; const BOOKING_ENDPOINT = 'https://formsubmit.co/ajax/tainaborgesphoto@outlook.com'; function BookingModal({ open, onClose }) { const { isPortuguese } = useLanguage(); const [step, setStep] = useState(0); const [date, setDate] = useState(null); const [time, setTime] = useState(null); const [info, setInfo] = useState({ name: '', email: '', note: '' }); const [confirmed, setConfirmed] = useState(false); const [status, setStatus] = useState('idle'); const [error, setError] = useState(''); const [honey, setHoney] = useState(''); const openedAt = useRef(Date.now()); const days = useMemo(() => { const out = []; const start = new Date(); start.setHours(12, 0, 0, 0); start.setDate(start.getDate() + 1); for (let i = 0; i < 21; i++) { const d = new Date(start); d.setDate(start.getDate() + i); const dow = (isPortuguese ? ['dom','seg','ter','qua','qui','sex','sáb'] : ['sun','mon','tue','wed','thu','fri','sat'])[d.getDay()]; const disabled = d.getDay() === 0 || d.getDay() === 6; out.push({ d, dow, day: d.getDate(), month: d.toLocaleString(isPortuguese ? 'pt-BR' : 'en-US', { month: 'short' }).toLowerCase().replace('.', ''), disabled }); } return out; }, [isPortuguese]); const times = ['09:30', '10:00', '11:00', '13:30', '14:00', '15:30', '16:00', '17:00']; if (!open) return null; const reset = () => { setStep(0); setDate(null); setTime(null); setConfirmed(false); setStatus('idle'); setError(''); setHoney(''); setInfo({ name: '', email: '', note: '' }); openedAt.current = Date.now(); onClose(); }; const submitBooking = async () => { setError(''); const selectedDay = days[date]; if (!selectedDay || !time || !info.name.trim() || !/^\S+@\S+\.\S+$/.test(info.email.trim())) { setError('Please add your name and a valid email address.'); return; } if (honey || Date.now() - openedAt.current < 2500) { setError('Please wait a moment and try again.'); return; } try { const lastSent = Number(localStorage.getItem('tb-booking-sent') || 0); if (Date.now() - lastSent < 60000) throw new Error('Please wait one minute before sending another request.'); setStatus('sending'); const requestedDate = selectedDay.d.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' }); const response = await fetch(BOOKING_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ name: info.name.trim().slice(0, 100), email: info.email.trim().slice(0, 160), request_type: '20-minute introductory Zoom call', requested_date: requestedDate, requested_time: `${time} Eastern Time`, message: info.note.trim().slice(0, 2000), _subject: `New call request from ${info.name.trim().replace(/[\r\n]+/g, ' ').slice(0, 80)}`, _template: 'table', _honey: honey, }), }); const result = await response.json().catch(() => ({})); if (!response.ok || result.success === false) throw new Error(result.message || 'The booking request could not be sent.'); localStorage.setItem('tb-booking-sent', String(Date.now())); setStatus('sent'); setConfirmed(true); } catch (err) { setStatus('error'); setError(err.message || 'Something went wrong. Please email me directly.'); } }; return (
e.stopPropagation()} style={{ width: 'min(940px, 100%)', maxHeight: '92vh', overflow: 'auto', background: 'var(--limestone)', borderRadius: 4, boxShadow: '0 24px 60px -12px rgba(22,21,19,0.5)', animation: 'tbModalIn 320ms var(--ease-cinematic)', }}>
{isPortuguese ? 'agendar conversa · vídeo' : 'book a call · video'}
{isPortuguese ? 'conversa de 20 minutos · tainá borges' : '20-minute intro · tainá borges'}
{confirmed ? (
{isPortuguese ? 'confirmado' : 'confirmed'}

{isPortuguese ? 'pedido enviado' : 'you’re on the list'}.

your request was sent. i\u2019ll confirm availability and send details to {info.email || 'your email'}. requested: {days[date]?.dow}, {days[date]?.month} {days[date]?.day} at {time} eastern.

) : ( <> {step === 0 && (
{isPortuguese ? 'passo 1 / 3 · escolha o dia' : 'step 1 / 3 · pick a day'}

{isPortuguese ? 'qual dia funciona melhor?' : 'which day works?'}

{days.map((d, i) => { const active = date === i; return ( ); })}

{isPortuguese ? 'todos os horários são de nova york' : 'all times are eastern (new york)'}

)} {step === 1 && date != null && (
{isPortuguese ? 'passo 2 / 3 · escolha o horário' : 'step 2 / 3 · pick a time'}

{days[date].dow}, {days[date].month} {days[date].day}

{times.map(t => ( ))}
)} {step === 2 && date != null && time && (
{isPortuguese ? 'passo 3 / 3 · confirmar' : 'step 3 / 3 · confirm'}

{days[date].dow}, {days[date].month} {days[date].day} · {time}

setInfo({ ...info, name: e.target.value })} placeholder={isPortuguese ? 'seu nome' : 'your name'} style={inpStyle}/> setInfo({ ...info, email: e.target.value })} placeholder="email" style={inpStyle}/>