Skip to main content

Honeymoon Direct

if (step === 2) { return <Recommendations profileId={profile.id} />; } } export default function RomanticAddons({ bookingId, onTotalChange }) { const addons = [ { id: "spa", name: "Couples Massage", price: 180 }, { id: "dinner", name: "Private Beach Dinner", price: 250 }, { id: "photoshoot", name: "Sunset Photoshoot", price: 120 } ]; const [selected, setSelected] = useState([]);

const handleSubmit = async () => { await fetch("/api/honeymoon/profile", { method: "POST", body: JSON.stringify({ userId, ...profile }), headers: { "Content-Type": "application/json" } }); setStep(step + 1); };

useEffect(() => { const interval = setInterval(() => { const diff = new Date(weddingDate) - new Date(); setDaysLeft(Math.ceil(diff / (1000 * 60 * 60 * 24))); }, 1000); return () => clearInterval(interval); }, [weddingDate]); honeymoon

{ "profileId": "prof_abc", "packageId": "pkg_123", "checkIn": "2025-06-20", "checkOut": "2025-06-27", "addOnIds": ["addon_spa", "addon_dinner"] } Booking confirmation + total price. GET /api/honeymoon/booking/:bookingId Fetch booking details with itinerary and romantic tips. 4. Frontend UI Components (React + TailwindCSS) HoneymoonWizard.jsx – Step-by-step setup import { useState } from "react"; export default function HoneymoonWizard({ userId }) { const [step, setStep] = useState(1); const [profile, setProfile] = useState({ weddingDate: "", totalBudget: "", vibe: "relaxing" });

-- User's booked honeymoon CREATE TABLE honeymoon_bookings ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), profile_id UUID REFERENCES honeymoon_profiles(id), package_id UUID REFERENCES honeymoon_packages(id), booking_date TIMESTAMP DEFAULT NOW(), check_in DATE, check_out DATE, total_price DECIMAL(10,2), status VARCHAR(20) DEFAULT 'confirmed' ); Frontend UI Components (React + TailwindCSS) HoneymoonWizard

{ "userId": "uuid", "weddingDate": "2025-06-15", "preferredTravelStart": "2025-06-20", "preferredTravelEnd": "2025-06-30", "totalBudget": 5000, "vibe": "relaxing", "dietaryRestrictions": "vegetarian" } 201 Created with profile object. GET /api/honeymoon/recommendations Get AI-curated honeymoon packages based on profile.

const toggleAddon = (addon) => { const exists = selected.find(a => a.id === addon.id); const updated = exists ? selected.filter(a => a.id !== addon.id) : [...selected, addon]; setSelected(updated); onTotalChange(updated.reduce((sum, a) => sum + a.price, 0)); }; selected

if (step === 1) { return ( <div className="p-6 max-w-md mx-auto bg-white rounded-xl shadow-md"> <h2 className="text-2xl font-bold text-rose-600">💍 Plan Your Honeymoon</h2> <label>Wedding Date</label> <input type="date" className="border p-2 w-full my-2" onChange={e => setProfile({...profile, weddingDate: e.target.value})} /> <label>Total Budget ($)</label> <input type="number" className="border p-2 w-full my-2" onChange={e => setProfile({...profile, totalBudget: e.target.value})} /> <label>Preferred Vibe</label> <select className="border p-2 w-full my-2" onChange={e => setProfile({...profile, vibe: e.target.value})}> <option value="relaxing">🧖‍♀️ Relaxing & Spa</option> <option value="adventure">⛰️ Adventure</option> <option value="luxury">🍾 Luxury</option> <option value="beach">🏖️ Beach</option> </select> <button onClick={handleSubmit} className="bg-rose-500 text-white p-2 rounded w-full">Next →</button> </div> ); }