/* Multi-step charter quote modal */ const { useState: useStateC, useEffect: useEffectC, useMemo: useMemoC } = React; const CHARTER_AIRCRAFT = [ { id: "g650", name: "Gulfstream G650", cls: "Ultra-Long-Range", thumb: "media/fleet-gulfstream-g650-exterior.webp" }, { id: "global7500", name: "Bombardier Global 7500", cls: "Ultra-Long-Range", thumb: "media/fleet-global-7500-managed.webp" }, { id: "global6000", name: "Bombardier Global 6000", cls: "Long-Range", thumb: "media/fleet-global-6000-exterior-1.webp" }, { id: "g600", name: "Gulfstream G600", cls: "Long-Range", thumb: "media/fleet-gulfstream-g600-exterior-1.webp" }, { id: "legacy650",name: "Embraer Legacy 650", cls: "Super-Midsize", thumb: "media/fleet-legacy-650-empire-livery.webp" }, { id: "bbj", name: "Boeing Business Jet", cls: "Airliner Class", thumb: "media/fleet-boeing-business-jet-bbj.webp" }, { id: "any", name: "Operator's Choice", cls: "We'll recommend", thumb: "media/managed-jet-on-ramp.webp" }, ]; const ROUTE_SUGGESTIONS = [ ["DXB → LHR", "Dubai → London"], ["DXB → MLE", "Dubai → Maldives"], ["DXB → CDG", "Dubai → Paris"], ["DXB → LCA", "Dubai → Larnaca"], ["BOM → DXB", "Mumbai → Dubai"], ["DXB → JFK", "Dubai → New York"], ]; function CharterFlow({ open, onClose }) { const [step, setStep] = useStateC(0); const [data, setData] = useStateC({ from: "DXB", to: "", tripType: "one-way", date: "", returnDate: "", pax: 6, aircraft: "", name: "", company: "", email: "", phone: "", notes: "", }); const [submitted, setSubmitted] = useStateC(false); useEffectC(() => { if (!open) { // reset when closed setStep(0); setSubmitted(false); setData(d => ({ ...d })); } }, [open]); useEffectC(() => { const onKey = (e) => { if (e.key === "Escape" && open) onClose(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [open, onClose]); if (!open) return null; const steps = ["Route", "Date", "Aircraft", "Details", "Confirm"]; const canNext = (() => { if (step === 0) return data.from.trim().length > 1 && data.to.trim().length > 1; if (step === 1) return data.date.length > 0 && (data.tripType !== "round-trip" || data.returnDate.length > 0); if (step === 2) return data.aircraft.length > 0; if (step === 3) return data.name.trim() && data.email.trim() && data.phone.trim(); return true; })(); const update = (k, v) => setData(d => ({ ...d, [k]: v })); const handleSubmit = () => { setSubmitted(true); }; const ac = CHARTER_AIRCRAFT.find(a => a.id === data.aircraft); return (
{ if (e.target.classList.contains("cq-backdrop")) onClose(); }}>
Request a Charter Quote · CRM-routed
{!submitted && (
{steps.map((label, i) => (
0{i + 1} · {label}
))}
)}
{submitted ? ( ) : ( <> {step === 0 && } {step === 1 && } {step === 2 && } {step === 3 && } {step === 4 && } )}
{!submitted && (
Step 0{step + 1} of 0{steps.length} {step < steps.length - 1 ? ( ) : ( )}
)}
); } function StepRoute({ data, update }) { return ( <> 01 · ROUTE

Where to, and from where?

Use IATA codes or city names. We'll resolve the FBO at quote.

update("from", e.target.value)} placeholder="DXB · Dubai" />
update("to", e.target.value)} placeholder="MLE · Maldives" />
{ROUTE_SUGGESTIONS.map((r, i) => { const [code, label] = r; const [f, t] = code.split(" → "); const isActive = data.from === f && data.to === t; return ( ); })}
); } function StepDate({ data, update }) { return ( <> 02 · TIMING

When are we flying?

Add the return leg if needed. All times confirmed at quote.

{["one-way", "round-trip", "multi-leg"].map(t => ( ))}
update("date", e.target.value)} />
{data.tripType === "round-trip" && (
update("returnDate", e.target.value)} />
)}
update("pax", parseInt(e.target.value, 10))} style={{ flex: 1, accentColor: "var(--gold)" }} /> {data.pax}
); } function StepAircraft({ data, update }) { return ( <> 03 · AIRCRAFT

Preferred aircraft.

If you're unsure, choose Operator's Choice — we'll recommend based on range, passengers and ground times.

{CHARTER_AIRCRAFT.map(a => ( ))}
); } function StepDetails({ data, update }) { return ( <> 04 · CONTACT

A direct line to you.

A member of the Dubai operations desk will respond personally.

update("name", e.target.value)} placeholder="" />
update("company", e.target.value)} placeholder="Optional" />
update("email", e.target.value)} />
update("phone", e.target.value)} placeholder="+971 …" />