diff --git a/src/components/EnhancedTestimonials.tsx b/src/components/EnhancedTestimonials.tsx index 527837b..a49643b 100644 --- a/src/components/EnhancedTestimonials.tsx +++ b/src/components/EnhancedTestimonials.tsx @@ -20,11 +20,11 @@ interface Testimonial { company: string; signature: string; } - +const cityName = localStorage.getItem('cityName') || 'the city'; const testimonials: Testimonial[] = [ { id: 1, - quote: "CityCards transformed our Melbourne trip into an unforgettable adventure. The seamless access to attractions and insider recommendations made every moment magical.", + quote: `CityCards transformed our ${cityName} trip into an unforgettable adventure. The seamless access to attractions and insider recommendations made every moment magical.`, name: "Sarah Chen", company: "Travel Blogger", signature: "Sarah" diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 3aa0787..7b2c55a 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -45,10 +45,10 @@ export function Footer({ /> {/* Enhanced White Gradient Overlay at Top */} -
+
{/* Additional Smooth Transition Layer */} -
+
{/* Dark overlay for text readability */}
@@ -61,7 +61,7 @@ export function Footer({
{/* Content Overlay */} -
+
{/* Footer Content Grid */}
diff --git a/src/components/HeroBannerCarousel.tsx b/src/components/HeroBannerCarousel.tsx index af7fb62..ac83f13 100644 --- a/src/components/HeroBannerCarousel.tsx +++ b/src/components/HeroBannerCarousel.tsx @@ -19,13 +19,15 @@ export function HeroBannerCarousel({ const [currentSlide, setCurrentSlide] = useState(0); const [isPaused, setIsPaused] = useState(false); + const cityName = localStorage.getItem("cityName") + const slides = [ { id: 1, title: "Discover", - highlight: "Melbourne", + highlight: cityName, subtitle: "Ultimate Guide to Iconic City", - description: "From Flinders Street to St Kilda Beach: explore the best of Melbourne's landmarks, culture, food and more!", + description: cityName === "Melbourne" ? "From Flinders Street to St Kilda Beach: explore the best of Melbourne's landmarks, culture, food and more!" : "From the Sydney Opera House to Bondi Beach: explore the best of Sydney’s landmarks, culture, food and more!", image: "https://images.unsplash.com/photo-1757470238279-0e9f331d02c9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBza3lsaW5lJTIwc3Vuc2V0fGVufDF8fHx8MTc2MDUwOTIyMHww&ixlib=rb-4.1.0&q=80&w=1080", cta: "Get Started", onClick: onCheckoutClick diff --git a/src/components/HotelEsimOffers.tsx b/src/components/HotelEsimOffers.tsx index 09d2085..5b2d619 100644 --- a/src/components/HotelEsimOffers.tsx +++ b/src/components/HotelEsimOffers.tsx @@ -7,6 +7,7 @@ interface HotelEsimOffersProps { } export function HotelEsimOffers({ onEsimsClick, onHotelDiscountsClick }: HotelEsimOffersProps) { + const cityName = localStorage.getItem("cityName") return (
@@ -64,7 +65,7 @@ export function HotelEsimOffers({ onEsimsClick, onHotelDiscountsClick }: HotelEs > - Stay Connected in Melbourne + Stay Connected in {cityName}

@@ -72,7 +73,7 @@ export function HotelEsimOffers({ onEsimsClick, onHotelDiscountsClick }: HotelEs Connected

- Get instant e-SIM connectivity across Australia. Stay online from the moment you land in Melbourne. + Get instant e-SIM connectivity across Australia. Stay online from the moment you land in {cityName}.

@@ -105,10 +106,10 @@ export function HotelEsimOffers({ onEsimsClick, onHotelDiscountsClick }: HotelEs πŸ‡¦πŸ‡Ί AUSTRALIA-WIDE COVERAGE

- Exclusive e-SIM Offers for Melbourne Visitors + Exclusive e-SIM Offers for {cityName} Visitors

- No more hunting for local SIM cards at the airport. Activate your e-SIM instantly and explore Melbourne with seamless connectivity. + No more hunting for local SIM cards at the airport. Activate your e-SIM instantly and explore {cityName} with seamless connectivity.

- Premium Melbourne Hotels + Premium {cityName} Hotels

@@ -215,7 +216,7 @@ export function HotelEsimOffers({ onEsimsClick, onHotelDiscountsClick }: HotelEs Luxury

- Unlock exclusive rates at Melbourne's finest hotels. Your CityCard membership opens doors to premium CBD and waterfront stays. + Unlock exclusive rates at {cityName}'s finest hotels. Your CityCard membership opens doors to premium CBD and waterfront stays.

@@ -236,10 +237,10 @@ export function HotelEsimOffers({ onEsimsClick, onHotelDiscountsClick }: HotelEs πŸ”₯ MARRIOTT BONVOY PARTNER

- Melbourne Premium Stays at Unbeatable Prices + {cityName} Premium Stays at Unbeatable Prices

- Access exclusive member rates at Melbourne's top hotels including Crown Towers, W Melbourne, and premium CBD properties. Enjoy complimentary upgrades and special amenities. + Access exclusive member rates at {cityName}'s top hotels including Crown Towers, W {cityName}, and premium CBD properties. Enjoy complimentary upgrades and special amenities.

@@ -253,7 +254,7 @@ export function HotelEsimOffers({ onEsimsClick, onHotelDiscountsClick }: HotelEs
25%
Average Savings
-
on Melbourne hotels
+
on {cityName} hotels
- Melbourne Must-Sees + {cityName} Must-Sees

Discover{' '} - Melbourne's + {cityName}'s {' '} Best{' '} Experiences

- Discover Melbourne's iconic landmarks, vibrant culture, world-class dining, and hidden gems - all included with your Melbourne CityCard + Discover {cityName}'s iconic landmarks, vibrant culture, world-class dining, and hidden gems - all included with your {cityName} CityCard

@@ -382,8 +385,9 @@ export function MelbourneAttractions() { whileHover={{ scale: 1.05, boxShadow: "0 20px 40px rgba(99,102,241,0.3)" }} whileTap={{ scale: 0.95 }} className="relative bg-gradient-to-r from-primary to-secondary text-white py-4 px-12 rounded-lg text-lg shadow-xl transition-all duration-300 overflow-hidden group" + onClick={()=>navigate('/passes')} > - Get Your Melbourne Card + Get Your {cityName} Card {/* Shine animation */}
diff --git a/src/components/MelbourneBlogs.tsx b/src/components/MelbourneBlogs.tsx index da06e92..1be345a 100644 --- a/src/components/MelbourneBlogs.tsx +++ b/src/components/MelbourneBlogs.tsx @@ -2,6 +2,8 @@ import { motion } from 'motion/react'; import { ImageWithFallback } from './figma/ImageWithFallback'; import { Calendar, Clock, User, ArrowRight, Coffee, Camera, MapPin, Star } from 'lucide-react'; import { Button } from './ui/button'; +import { useRef } from "react"; +import { useNavigate } from 'react-router-dom'; const blogPosts = [ { @@ -46,7 +48,7 @@ const blogPosts = [ excerpt: "From the iconic MCG to Formula 1 racing, discover why Melbourne holds the title of Australia's sporting capital and home to major international events.", image: "https://images.unsplash.com/photo-1720347247737-9252d85d3027?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtZWxib3VybmUlMjBjaXR5JTIwc2t5bGluZSUyMGZsaW5kZXJzJTIwc3RyZWV0fGVufDF8fHx8MTc1NzMzOTAyNHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral", author: "Sports Fan", - date: "Dec 8, 2024", + date: "Dec 8, 2024", readTime: "6 min read", category: "Sports", featured: false, @@ -88,12 +90,19 @@ const categories = [ ]; export function MelbourneBlogs() { + + const sectionRef = useRef(null); + const navigate = useNavigate(); const featuredPost = blogPosts.find(post => post.featured); const regularPosts = blogPosts.filter(post => !post.featured); + const cityName = localStorage.getItem('cityName'); + return ( -
- {/* Background Pattern */} +
{/* Background Pattern */}
@@ -110,21 +119,21 @@ export function MelbourneBlogs() {
- Melbourne Stories + {cityName} Stories
- +

- Melbourne{' '} + {cityName}{' '} Blogs

- +

- Dive deep into Melbourne's rich cultural tapestry, from hidden laneway treasures to world-renowned - coffee culture. Discover insider stories, local secrets, and expert guides to Australia's cultural capital - that will transform your Melbourne experience into an unforgettable journey. + Dive deep into {cityName}'s rich cultural tapestry, from hidden laneway treasures to world-renowned + coffee culture. Discover insider stories, local secrets, and expert guides to Australia's cultural capital + that will transform your {cityName} experience into an unforgettable journey.

@@ -189,7 +198,7 @@ export function MelbourneBlogs() { className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-700" />
- + {/* Category Badge */}
{post.category} @@ -217,7 +226,7 @@ export function MelbourneBlogs() {

{post.title}

- +

{post.excerpt}

@@ -261,23 +270,30 @@ export function MelbourneBlogs() { >

- Want to explore Melbourne yourself? + Want to explore {cityName} yourself?

- Get your Melbourne CityCard and unlock access to all these incredible experiences and more. + Get your {cityName} CityCard and unlock access to all these incredible experiences and more. Start your adventure today with exclusive deals and insider access.

- +
diff --git a/src/components/MelbourneFAQ.tsx b/src/components/MelbourneFAQ.tsx index bf7d1f4..79ff7e7 100644 --- a/src/components/MelbourneFAQ.tsx +++ b/src/components/MelbourneFAQ.tsx @@ -18,6 +18,8 @@ import { AccordionTrigger, } from "./ui/accordion"; +const cityName = localStorage.getItem('cityName') || 'the city'; + const faqData = [ // { // id: "refund", @@ -27,50 +29,50 @@ const faqData = [ // }, { id: "duration", - question: "How long is my Melbourne CityCard valid?", - answer: "Melbourne CityCards are available in 1, 2, 3, and 5-day options. Your card activates on the first attraction you visit and is valid for consecutive days only. The 5-day Melbourne Unlimited Card provides the best value for extended stays with access to over 40 premium attractions.", + question: `How long is my ${cityName} CityCard valid?`, + answer: `${cityName} CityCards are available in 1, 2, 3, and 5-day options. Your card activates on the first attraction you visit and is valid for consecutive days only. The 5-day ${cityName} Unlimited Card provides the best value for extended stays with access to over 40 premium attractions.`, icon: Calendar }, { id: "transportation", - question: "Does the Melbourne CityCard include public transport?", - answer: "The Melbourne Unlimited Card includes a complimentary Myki card loaded with travel credit for trams, trains, and buses within Melbourne's CBD and inner suburbs. The Selective Card focuses on attractions only, but we provide detailed transport guides for each venue.", + question: `Does the ${cityName} CityCard include public transport?`, + answer: `The ${cityName} Unlimited Card includes a complimentary Myki card loaded with travel credit for trams, trains, and buses within ${cityName}'s CBD and inner suburbs. The Selective Card focuses on attractions only, but we provide detailed transport guides for each venue.`, icon: Train }, { id: "attractions", - question: "What are the must-visit attractions included with my card?", - answer: "Your Melbourne CityCard includes iconic experiences like Eureka Tower SkyDeck, Royal Botanic Gardens tours, Melbourne Zoo, SEA LIFE Melbourne Aquarium, and Melbourne Star observation wheel. Plus unique local experiences like laneways art tours, coffee culture walks, and rooftop dining discounts.", + question: `What are the must-visit attractions included with my ${cityName} CityCard?`, + answer: `Your ${cityName} CityCard includes iconic experiences like Eureka Tower SkyDeck, Royal Botanic Gardens tours, ${cityName} Zoo, SEA LIFE ${cityName} Aquarium, and ${cityName} Star observation wheel. Plus unique local experiences like laneways art tours, coffee culture walks, and rooftop dining discounts.`, icon: Camera }, { id: "best-time", - question: "When is the best time to visit Melbourne?", - answer: "Melbourne is fantastic year-round! Spring (Sep-Nov) offers perfect weather and blooming gardens. Summer (Dec-Feb) brings outdoor festivals and rooftop season. Autumn (Mar-May) showcases beautiful foliage and harvest events. Winter (Jun-Aug) is ideal for cozy cafes, indoor attractions, and cultural experiences.", + question: `When is the best time to visit ${cityName}?`, + answer: `${cityName} is fantastic year-round! Spring (Sep-Nov) offers perfect weather and blooming gardens. Summer (Dec-Feb) brings outdoor festivals and rooftop season. Autumn (Mar-May) showcases beautiful foliage and harvest events. Winter (Jun-Aug) is ideal for cozy cafes, indoor attractions, and cultural experiences.`, icon: Clock }, { id: "coffee-culture", - question: "How can I experience Melbourne's famous coffee culture?", - answer: "Your Melbourne CityCard includes guided coffee tours through famous laneways, visits to historic coffee roasters, and discounts at award-winning cafes. We've partnered with local baristas to offer exclusive tastings and behind-the-scenes experiences at Melbourne's most beloved coffee institutions.", + question: `How can I experience ${cityName}'s famous coffee culture?`, + answer: `Your ${cityName} CityCard includes guided coffee tours through famous laneways, visits to historic coffee roasters, and discounts at award-winning cafes. We've partnered with local baristas to offer exclusive tastings and behind-the-scenes experiences at ${cityName}'s most beloved coffee institutions.`, icon: Coffee }, { id: "group-bookings", - question: "Do you offer group discounts for families or friends?", - answer: "Yes! Groups of 4+ receive automatic discounts, and families with children under 16 get special pricing. School groups and corporate bookings receive additional benefits. Contact our Melbourne team for custom packages that can include private tours and exclusive venue access.", + question: `Do you offer group discounts for families or friends?`, + answer: `Yes! Groups of 4+ receive automatic discounts, and families with children under 16 get special pricing. School groups and corporate bookings receive additional benefits. Contact our ${cityName} team for custom packages that can include private tours and exclusive venue access.`, icon: Users }, { id: "mobile-app", - question: "Do I need the mobile app to use my Melbourne CityCard?", - answer: "While not required, our mobile app enhances your Melbourne experience with interactive maps, real-time attraction wait times, insider tips from locals, and the ability to skip lines at participating venues. Download it for offline access to your itinerary and exclusive app-only deals.", + question: `Do I need the mobile app to use my ${cityName} CityCard?`, + answer: `While not required, our mobile app enhances your ${cityName} experience with interactive maps, real-time attraction wait times, insider tips from locals, and the ability to skip lines at participating venues. Download it for offline access to your itinerary and exclusive app-only deals.`, icon: Smartphone }, { id: "neighborhoods", - question: "Which Melbourne neighborhoods should I explore?", - answer: "Your CityCard provides access to experiences across Melbourne's diverse neighborhoods: Fitzroy for street art and vintage shopping, St. Kilda for beaches and nightlife, Southbank for dining and culture, CBD for iconic attractions, and Richmond for authentic Vietnamese food and shopping.", + question: `Which ${cityName} neighborhoods should I explore?`, + answer: `Your CityCard provides access to experiences across ${cityName}'s diverse neighborhoods: Fitzroy for street art and vintage shopping, St. Kilda for beaches and nightlife, Southbank for dining and culture, CBD for iconic attractions, and Richmond for authentic Vietnamese food and shopping.`, icon: MapPin } ]; @@ -95,7 +97,7 @@ export function MelbourneFAQ() {
- Melbourne Guide + {cityName} Guide
@@ -107,8 +109,8 @@ export function MelbourneFAQ() {

- Everything you need to know about exploring Melbourne with your CityCard. From iconic attractions - to hidden local gems, we've got your Melbourne adventure covered. + Everything you need to know about exploring {cityName} with your CityCard. From iconic attractions + to hidden local gems, we've got your {cityName} adventure covered.

@@ -161,7 +163,7 @@ export function MelbourneFAQ() {
{/* Call to Action */} -
- + */}
); diff --git a/src/components/MelbourneTourOverview.tsx b/src/components/MelbourneTourOverview.tsx index 55882a8..98c98f7 100644 --- a/src/components/MelbourneTourOverview.tsx +++ b/src/components/MelbourneTourOverview.tsx @@ -36,7 +36,7 @@ export function MelbourneTourOverview() { } ]; - const tourHighlights = [ + const MelbourneTourHighlights = [ { icon: Star, text: "Experience the cultural capital's vibrant arts scene and hidden laneways", @@ -69,6 +69,43 @@ export function MelbourneTourOverview() { } ]; + const SydneyTourHighlights = [ + { + icon: Star, + text: "Experience Sydney’s iconic harbour lifestyle with Opera House and Harbour Bridge views", + color: "text-yellow-600" + }, + { + icon: Coffee, + text: "Discover Sydney’s vibrant cafΓ© culture, waterfront dining, and buzzing food markets", + color: "text-amber-600" + }, + { + icon: Camera, + text: "Capture panoramic views from Sydney Tower Eye and scenic harbour cruises", + color: "text-purple-600" + }, + { + icon: Users, + text: "Enjoy beachside vibes at Bondi and Manly, plus lively nightlife in Darling Harbour", + color: "text-green-600" + }, + { + icon: MapPin, + text: "Explore historic charm in The Rocks and coastal walks like Bondi to Coogee", + color: "text-blue-600" + }, + { + icon: Calendar, + text: "Access year-round festivals, cultural events, and dynamic harbour celebrations", + color: "text-rose-600" + } +]; + + + const cityName = localStorage.getItem("cityName") + const selectedHighlights = cityName === 'Melbourne' ? MelbourneTourHighlights : SydneyTourHighlights; + return (
{/* Background Pattern */} @@ -88,7 +125,7 @@ export function MelbourneTourOverview() { className="mb-16" >

- Melbourne{' '} + {cityName}{' '} Tour {' '} @@ -108,11 +145,20 @@ export function MelbourneTourOverview() { viewport={{ once: true }} >

- Melbourne is a must-visit cultural epicenter, and this spectacular experience unlocks - your access around the city in one easy pass. Save over the cost of visiting Melbourne's - landmarks, explore famous laneways and street art, enjoy world-class dining in hidden bars, - and immerse yourself in the sports capital's vibrant atmosphere. From Royal Botanic Gardens - to Federation Square, hotel pickup and drop-off all included. + { cityName === 'Melbourne' && ( + + Melbourne is a must-visit cultural epicenter, and this spectacular experience unlocks + your access around the city in one easy pass. Save over the cost of visiting Melbourne's + landmarks, explore famous laneways and street art, enjoy world-class dining in hidden bars, + and immerse yourself in the sports capital's vibrant atmosphere. From Royal Botanic Gardens + to Federation Square, hotel pickup and drop-off all included. + + )} + { cityName === 'Sydney' && ( + + Sydney is a must-visit global destination, blending iconic landmarks with vibrant coastal charm, and this all-in-one experience gives you seamless access across the city. Save more while exploring Sydney’s top attractions, wander through historic neighborhoods like The Rocks, admire world-famous sights such as the Sydney Opera House and Harbour Bridge, and relax along stunning beaches like Bondi and Manly. Enjoy diverse dining from waterfront restaurants to hidden cafΓ©s, soak in the lively cultural scene, and experience the energy of Australia’s most dynamic harbor cityβ€”all with convenient access to key locations and experiences included. + + )}

@@ -226,7 +272,7 @@ export function MelbourneTourOverview() {

- {tourHighlights.map((highlight, index) => ( + {selectedHighlights.map((highlight, index) => ( void; @@ -17,6 +18,7 @@ interface AttractionCard { } export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTourHeroProps) { + const navigate = useNavigate(); const attractionCards: AttractionCard[] = [ { id: 1, @@ -163,8 +165,8 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou className="flex flex-col sm:flex-row gap-4 items-start sm:items-center" >
+
+
); } diff --git a/src/pages/ItineraryViewPage.tsx b/src/pages/ItineraryViewPage.tsx index 2d5626e..39f7d15 100644 --- a/src/pages/ItineraryViewPage.tsx +++ b/src/pages/ItineraryViewPage.tsx @@ -8,7 +8,7 @@ import Navbar from '../components/Navbar'; import { Footer } from '../components/Footer'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { useGetItineraryDetailsByIdQuery } from '../Redux/services/itinerary.service'; -import { useParams } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import LoadingSpinner from '../components/LoadingSpinner'; interface ItineraryViewPageProps { @@ -65,6 +65,7 @@ export function ItineraryViewPage({ user }: ItineraryViewPageProps) { const [viewMode, setViewMode] = useState<'daily' | 'summary'>('daily'); + const navigate = useNavigate(); // const [favorites, setFavorites] = useState>(new Set()); // ── API Integration ────────────────────────────────────────────────────────── @@ -76,17 +77,7 @@ export function ItineraryViewPage({ const summaries = generatedItinerary?.summary ?? []; // ───────────────────────────────────────────────────────────────────────────── - // const toggleFavorite = (activityKey: string) => { - // setFavorites(prev => { - // const newSet = new Set(prev); - // if (newSet.has(activityKey)) { - // newSet.delete(activityKey); - // } else { - // newSet.add(activityKey); - // } - // return newSet; - // }); - // }; + // ── Loading State ───────────────────────────────────────────────────────────── if (isLoading) { @@ -124,7 +115,7 @@ export function ItineraryViewPage({ /> {/* Header Section */} -
+
{/* Trusted By Companies Section */} -
+
-
+

Trusted by the world's best @@ -206,7 +206,7 @@ export function SuperSavingsPage({

{/* Featured Super Savings Section */} -
+
-
+
{/* Left Sidebar - Filters */}
@@ -269,7 +269,7 @@ export function SuperSavingsPage({ {/* Main Content */}
{/* Breadcrumb */} -
+ {/*

{fromSource === 'passes' ? ( <> @@ -283,7 +283,7 @@ export function SuperSavingsPage({ )}

-
+
*/} {/* Header Section */}
@@ -395,7 +395,7 @@ export function SuperSavingsPage({
-
+ {/*
-
+
*/}