import React, { useState, useEffect } from 'react'; import { Heart, MapPin, Calendar, Camera, Music, MessageCircle, Navigation, Clock, Upload, Star, Download, Plus, X, Home, Image } from 'lucide-react'; export default function DisneyWeddingWebsite() { const [currentPage, setCurrentPage] = useState('home'); const [timeLeft, setTimeLeft] = useState({}); const [expandedSuggestion, setExpandedSuggestion] = useState(null); const [uploadedPhotos, setUploadedPhotos] = useState([]); const [recommendations, setRecommendations] = useState({ preTravel: ['ESTA is mandatory for UK travellers - apply via official U.S. government website ASAP', 'Download My Disney Experience app before you fly', 'Book park tickets and reservations in advance', 'Pack comfortable shoes, sunscreen, and portable charger', 'Double-check passports, travel insurance, and flight details'], transport: ['Uber/Lyft from Orlando Airport to Disney resorts (easiest option)', 'Free Disney buses, boats, monorails & Skyliner connect all resorts and parks', 'No car needed when staying on Disney property!', 'Minnie Vans (via Lyft) for quick direct trips'], mustRides: ['Rise of the Resistance (Hollywood Studios) - arrive early!', 'Flight of Passage (Animal Kingdom) - stunning experience', 'Seven Dwarfs Mine Train (Magic Kingdom)', 'Tower of Terror (Hollywood Studios)', 'Expedition Everest (Animal Kingdom)', 'Pirates of the Caribbean (Magic Kingdom) - classic!'], dining: ['Pecos Bill (Magic Kingdom) - great Tex-Mex portions', 'Ohana (Polynesian Resort) - fun family-style dining', 'Disney Springs - Earl of Sandwich, Chicken Guy!, Blaze Pizza', 'California Grill (Contemporary) - upscale with amazing views', 'Resort food courts - affordable breakfast, pizza, burgers'], proTips: ['Mobile order food via app to skip queues', 'Arrive early for fireworks near the castle - ask Cast Members for quiet spots', 'Start parks early, take midday break, return for evenings', 'Stock snacks in your room to save money', 'Fireworks happen nightly - absolutely worth seeing at least once!'] }); const [showAddRecommendation, setShowAddRecommendation] = useState(null); const [newRecommendation, setNewRecommendation] = useState(''); const weddingDate = new Date('2027-04-08T17:00:00'); const whatsappNumber = '+4475865252910'; const DROPBOX_ACCESS_TOKEN = 'sl.u.AGSca4gixZSrHGsUwnajpXPTIpLN4JxyUCEowQa4FXFizv4O6vB1GwDJXpS3uTklZnE-1GGJY3zvTZ-WLp6q-vppBNdQXz5sjv2MNtxgO2ywvFAygggj_0qML63fumlpCiFPe1jJaHu5c-2emw7UbP8q56T98kQPhYlrR7_WqDvwMcQ21cGbbJ1x5d6cyGmR45YBoddQDxuzaTUCBt0WSFKLdOFxcWxRKsJ4TtJRK9QSbLd4cJh9BDTcmAvDZQ328C-sctZy5ip0PuCInWsFy42nafMsOrWh37hKDgFRb9UPKWKBJJthfJjNi3g3oKbRsiC2qGVyyoxeZ-KzHoTds_MXZicz0gY7HZMMP0MZrADNZlIJPx0EZyQATIfe_e1400MQ-oxEJ0UnHWPowRvtJ78fEVpEwRUFnz4r9O-g0V2EiX5xV1DQVIHiTpsv59cGkUyegRMou6O-VlYi8nNBH_URPmEiF6eKGs9rn8tgrw-kw-fTZ-QK_MNQMM782wQd3MvQ2g7SIWl2-sc2Wy9SkuNL-Rc4JI8KbXDmMptN_cvb_yJbAEsnsB2fRGiUa8XPe27kMMJOMA2o_CDeprtam1YklwiZFcATSvTPDRJ7wj8W5zkOWzOj9xlr3hrq6EXkgLGY9kxLl-wZcIs54MpNxRYlhwySObgZOhXxC5LzYo7mlhIcumoCMAtSa5hCra3O4clp7rK1sF50_WAfZYQllOG5tpmJdWbx_TSqBwBVHiaS6RPgbjDJwbfbgGtu59eHXDM7_QUcg_p7SKyScSayPcN9bKSzeD2zKp_Nedn6EWieFAW1N2Hr2ljgK7BpXf7RWcKI7LUmIdJzQeNpigMcb41A39V7FMGluUuKUa7G-SYiEtp0l0aPevCOWXRFPVtxr1PIQ2TymaJTIajh4faQ62Jc-SznsIqsjmTtQxMJ3IXsEDldjaruoQx3vMh4ZyFQGGEfxWvgIli_aJJauKV90b5IuWY3yWggikgr8R-_vaGfF_MB9K3nsUCyWna9Bf_xRCXjhd09BLvy5iMjHFNSva1iH0D34V_IrYOUMFp8b21yZ11w7Z5VYPJTKQVKeIsBcrG6TlE2hLCOYQc5aMUneoZ-tQ9m8Txf1DC95Ni6orRYjJpaHkE2h0Ykqu0JUYpkY8YibBLIAOebqRWdln1PIRT8hnyDqQZII4ALWQU3MwmSWE1sf2YwB-w5a9JunizvCMucU0ewJFbmMsUBFi_4uj682qcWs33mpoJaXyyAI77lttIikHfoyeCGztK-OoL32FraWctUTZB4KIrUUCNOEiqs'; // Countdown timer useEffect(() => { const timer = setInterval(() => { const now = new Date(); const difference = weddingDate - now; setTimeLeft({ days: Math.floor(difference / (1000 * 60 * 60 * 24)), hours: Math.floor((difference / (1000 * 60 * 60)) % 24), minutes: Math.floor((difference / 1000 / 60) % 60), seconds: Math.floor((difference / 1000) % 60) }); }, 1000); return () => clearInterval(timer); }, []); const schedule = [ { time: '4:30 PM', event: 'Guest Arrival', location: 'Wedding Pavilion', note: 'Please arrive early to find your seats' }, { time: '5:00 PM', event: 'Ceremony Begins', location: 'Disney\'s Wedding Pavilion', note: 'Please be seated by 4:55 PM' }, { time: '6:00 PM', event: 'Reception & Dinner', location: '✨ Surprise Location ✨', note: 'Get ready for something magical!' }, { time: '8:30 PM', event: 'Surprise #1', location: 'To Be Revealed', note: 'You won\'t want to miss this!' }, { time: '9:30 PM', event: 'Surprise #2', location: 'To Be Revealed', note: 'The magic continues!' } ]; const locations = [ { name: 'Wedding Pavilion', note: 'Ceremony location - arrive early!', address: 'Disney\'s Grand Floridian Resort & Spa', coords: '28.4177,-81.5848' }, { name: 'Parking', note: 'Complimentary valet available', address: 'Grand Floridian Main Entrance', coords: '28.4177,-81.5848' }, { name: 'Magic Kingdom', note: 'Optional pre-wedding visit', address: 'Magic Kingdom Park', coords: '28.4177,-81.5812' } ]; const suggestions = [ { id: 'preTravel', title: 'Before You Fly (Essential!)', icon: '✈️', key: 'preTravel' }, { id: 'transport', title: 'Getting Around', icon: '🚌', key: 'transport' }, { id: 'mustRides', title: 'Rides Not to Miss', icon: '🎢', key: 'mustRides' }, { id: 'dining', title: 'Where to Eat', icon: '🍽️', key: 'dining' }, { id: 'proTips', title: 'Pro Tips & Tricks', icon: '💡', key: 'proTips' } ]; const handlePhotoUpload = async (e) => { const files = Array.from(e.target.files); for (const file of files) { try { // Read file as base64 const reader = new FileReader(); reader.onload = async (event) => { const base64Data = event.target.result; // Add to local display const newPhoto = { id: Date.now() + Math.random(), name: file.name, data: base64Data, timestamp: new Date().toISOString(), uploading: true }; setUploadedPhotos(prev => [...prev, newPhoto]); // Upload to Dropbox try { const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const fileName = `/wedding-photos/${timestamp}_${file.name}`; // Convert base64 to blob const blob = await fetch(base64Data).then(r => r.blob()); const response = await fetch('https://content.dropboxapi.com/2/files/upload', { method: 'POST', headers: { 'Authorization': `Bearer ${DROPBOX_ACCESS_TOKEN}`, 'Content-Type': 'application/octet-stream', 'Dropbox-API-Arg': JSON.stringify({ path: fileName, mode: 'add', autorename: true, mute: false }) }, body: blob }); if (response.ok) { // Mark as successfully uploaded setUploadedPhotos(prev => prev.map(p => p.id === newPhoto.id ? { ...p, uploading: false, uploaded: true } : p ) ); } else { throw new Error('Upload failed'); } } catch (uploadError) { console.error('Dropbox upload error:', uploadError); // Mark as failed setUploadedPhotos(prev => prev.map(p => p.id === newPhoto.id ? { ...p, uploading: false, uploadError: true } : p ) ); alert('Photo saved locally but failed to upload to Dropbox. Please try again.'); } }; reader.readAsDataURL(file); } catch (error) { console.error('Error processing file:', error); } } }; const downloadPhoto = (photo) => { const link = document.createElement('a'); link.href = photo.data; link.download = photo.name; link.click(); }; const downloadAllPhotos = () => { uploadedPhotos.forEach((photo, idx) => { setTimeout(() => downloadPhoto(photo), idx * 100); }); }; const addRecommendation = (category) => { if (newRecommendation.trim()) { setRecommendations(prev => ({ ...prev, [category]: [...prev[category], newRecommendation.trim()] })); setNewRecommendation(''); setShowAddRecommendation(null); } }; const removeRecommendation = (category, index) => { setRecommendations(prev => ({ ...prev, [category]: prev[category].filter((_, i) => i !== index) })); }; const openMap = (coords) => { window.open(`https://maps.google.com/?q=${coords}`, '_blank'); }; const openWhatsApp = () => { window.open(`https://wa.me/${whatsappNumber}`, '_blank'); }; return (
at the Most Magical Place on Earth
Disney World, Florida 🏰
{loc.note}
{loc.address}
We've been before - here's everything you need to know for an amazing 14-day trip! ✨
{item.note}
Capture and share magical moments from our special day!
Uploading...