From 193fe3e722322fc13bc28b03139631632205bcb9 Mon Sep 17 00:00:00 2001 From: Hemant Vishwakarma Date: Fri, 20 Mar 2026 14:41:18 +0530 Subject: [PATCH 01/91] remove unused code --- src/components/AttractionDetailsPage.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/AttractionDetailsPage.tsx b/src/components/AttractionDetailsPage.tsx index d92c3b1..4962d84 100644 --- a/src/components/AttractionDetailsPage.tsx +++ b/src/components/AttractionDetailsPage.tsx @@ -1,13 +1,12 @@ -import { useState } from 'react'; +import { ArrowLeft, Calendar, Check, ChevronLeft, ChevronRight, Clock, MapPin, Users, X } from 'lucide-react'; import { motion } from 'motion/react'; -import { ArrowLeft, Clock, Users, Calendar, MapPin, Star, Check, X, ChevronLeft, ChevronRight } from 'lucide-react'; -import { Button } from './ui/button'; -import { Badge } from './ui/badge'; -import { Card, } from './ui/card'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { Layout } from '../Layout'; import { useParams } from 'react-router-dom'; +import { Layout } from '../Layout'; import { useGetAttractionDetailsByIdQuery } from '../Redux/services/attractions.service'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Badge } from './ui/badge'; +import { Button } from './ui/button'; +import { Card, } from './ui/card'; interface AttractionDetailsPageProps { onBackClick: () => void; From 5ca6fada379290de29d8ac8c1b6e32f4983e971a Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 31 Mar 2026 13:14:14 +0530 Subject: [PATCH 02/91] resolve the text cutting issue in italic spans --- src/components/AboutUsPage.tsx | 2 +- src/components/AttractionsPage.tsx | 2 +- src/components/LandingMagicItinerary.tsx | 2 +- src/components/MagicItineraryPage.tsx | 4 ++-- src/components/MobileAppSection.tsx | 2 +- src/components/PassesPage.tsx | 4 ++-- src/components/PersonalizedTourHero.tsx | 3 ++- src/components/PostCardsPage.tsx | 2 +- src/components/WhatsIncluded.tsx | 2 +- src/components/WhatsIncludedHero.tsx | 7 +++++-- src/index.css | 1 + 11 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/components/AboutUsPage.tsx b/src/components/AboutUsPage.tsx index 558ffdb..b68a755 100644 --- a/src/components/AboutUsPage.tsx +++ b/src/components/AboutUsPage.tsx @@ -168,7 +168,7 @@ export function AboutUsPage({ transition={{ duration: 3, repeat: Infinity }} > Meet the{' '} - + Dream Team {' '} ✈️ diff --git a/src/components/AttractionsPage.tsx b/src/components/AttractionsPage.tsx index 7df14cb..79ec7df 100644 --- a/src/components/AttractionsPage.tsx +++ b/src/components/AttractionsPage.tsx @@ -301,7 +301,7 @@ export function AttractionsPage({

Discover{' '} - Melbourne's{' '} + Melbourne's{' '} Best{' '} Attractions

diff --git a/src/components/LandingMagicItinerary.tsx b/src/components/LandingMagicItinerary.tsx index cb5c0f5..a67a853 100644 --- a/src/components/LandingMagicItinerary.tsx +++ b/src/components/LandingMagicItinerary.tsx @@ -131,7 +131,7 @@ export function LandingMagicItinerary() { viewport={{ once: true }} > Plan Your{' '} - + Dream Journey
diff --git a/src/components/MagicItineraryPage.tsx b/src/components/MagicItineraryPage.tsx index 45db6da..eb6ae4b 100644 --- a/src/components/MagicItineraryPage.tsx +++ b/src/components/MagicItineraryPage.tsx @@ -107,8 +107,8 @@ export function MagicItineraryPage({ transition={{ duration: 0.6 }} >

- Plan Your Perfect{' '} - + Plan Your Perfect{' '} + Melbourne Adventure

diff --git a/src/components/MobileAppSection.tsx b/src/components/MobileAppSection.tsx index b4d3b91..4cfafc9 100644 --- a/src/components/MobileAppSection.tsx +++ b/src/components/MobileAppSection.tsx @@ -68,7 +68,7 @@ export function MobileAppSection() { >

Access all your{' '} - + city cards
diff --git a/src/components/PassesPage.tsx b/src/components/PassesPage.tsx index 2c05c99..91a64d9 100644 --- a/src/components/PassesPage.tsx +++ b/src/components/PassesPage.tsx @@ -604,7 +604,7 @@ export function PassesPage({

Access all your{' '} - city cards{' '} + city cards{' '} on your{' '} phone

@@ -663,7 +663,7 @@ export function PassesPage({

Why Choose{' '} - CityCards? + CityCards?

We're committed to providing the best city exploration experience with unmatched value and service diff --git a/src/components/PersonalizedTourHero.tsx b/src/components/PersonalizedTourHero.tsx index e5026cf..eb39f32 100644 --- a/src/components/PersonalizedTourHero.tsx +++ b/src/components/PersonalizedTourHero.tsx @@ -121,7 +121,8 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou {/* Main Heading */}

Create Your{' '} - + Magic Itinerary

diff --git a/src/components/PostCardsPage.tsx b/src/components/PostCardsPage.tsx index 29ff99d..3350ddd 100644 --- a/src/components/PostCardsPage.tsx +++ b/src/components/PostCardsPage.tsx @@ -105,7 +105,7 @@ export function PostCardsPage({ >

Create Beautiful{' '} - + Custom Postcards

diff --git a/src/components/WhatsIncluded.tsx b/src/components/WhatsIncluded.tsx index afc1307..a31114f 100644 --- a/src/components/WhatsIncluded.tsx +++ b/src/components/WhatsIncluded.tsx @@ -41,7 +41,7 @@ interface WhatsIncludedProps { user: User | null; } -export function WhatsIncluded({ +export function WhatsIncluded({ onBackClick, onHomeClick, onMelbourneClick, diff --git a/src/components/WhatsIncludedHero.tsx b/src/components/WhatsIncludedHero.tsx index 6f8c230..0f8c574 100644 --- a/src/components/WhatsIncludedHero.tsx +++ b/src/components/WhatsIncludedHero.tsx @@ -99,10 +99,13 @@ export function WhatsIncludedHero({ onCreateItineraryClick }: WhatsIncludedHeroP className="text-center max-w-4xl" > {/* Main Heading */} -

+

One pass.{' '} - Everything you need + Everything you + {' '} + + need {' '} to explore.

diff --git a/src/index.css b/src/index.css index 5c19f7d..b774dec 100644 --- a/src/index.css +++ b/src/index.css @@ -3661,6 +3661,7 @@ .bg-gradient-to-r { --tw-gradient-position: to right in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); + padding-right: 8px; } .bg-gradient-to-t { From d22087d5eee128a4514ffbe5ab66729e0bb2570a Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 31 Mar 2026 16:08:21 +0530 Subject: [PATCH 03/91] resolve the italic span cuttinn off issue with padding --- src/components/DiscoverPage.tsx | 2 +- src/components/EnhancedTestimonials.tsx | 2 +- src/components/FAQPage.tsx | 2 +- src/components/HowItWorks.tsx | 9 +++++++-- src/components/MagicItineraryPage.tsx | 2 +- src/components/MelbourneAttractions.tsx | 2 +- src/components/MelbourneBlogs.tsx | 2 +- src/components/MelbourneCardComparison.tsx | 2 +- src/components/MelbourneFAQ.tsx | 2 +- src/components/MelbournePage.tsx | 2 +- src/components/MelbourneTourOverview.tsx | 2 +- src/components/MobileAppSection.tsx | 2 +- src/components/PassesPage.tsx | 4 ++-- src/components/PersonalizedTourHero.tsx | 2 +- src/components/SuperSavingsPage.tsx | 4 ++-- src/components/TrustSection.tsx | 2 +- src/components/WhatsIncludedHero.tsx | 4 ++-- src/index.css | 2 +- 18 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/components/DiscoverPage.tsx b/src/components/DiscoverPage.tsx index 1ccebfa..2ec1d43 100644 --- a/src/components/DiscoverPage.tsx +++ b/src/components/DiscoverPage.tsx @@ -483,7 +483,7 @@ export function DiscoverPage({ transition={{ duration: 0.6, delay: 0.1 }} > Unlock Your - Adventure + Adventure

What our{' '} - + travelers {' '} say diff --git a/src/components/FAQPage.tsx b/src/components/FAQPage.tsx index 58e7197..ffe84d2 100644 --- a/src/components/FAQPage.tsx +++ b/src/components/FAQPage.tsx @@ -244,7 +244,7 @@ export function FAQPage({

Frequently Asked{' '} - + Questions

diff --git a/src/components/HowItWorks.tsx b/src/components/HowItWorks.tsx index 35c4691..8950716 100644 --- a/src/components/HowItWorks.tsx +++ b/src/components/HowItWorks.tsx @@ -2,6 +2,7 @@ import { CreditCard, MapPin, Calendar, Zap, ChevronLeft, ChevronRight, Smartphon import { useState } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { ImageWithFallback } from './figma/ImageWithFallback'; +import { useLocation } from 'react-router-dom'; const steps = [ { @@ -51,6 +52,8 @@ const steps = [ export function HowItWorks() { const [activeStep, setActiveStep] = useState(0); // Start with first step active + const location = useLocation() + const nextStep = () => { setActiveStep((prev) => (prev + 1) % steps.length); }; @@ -78,8 +81,10 @@ export function HowItWorks() {

How Your{' '} - Melbourne{' '} - City Card{' '} + {!location.pathname.includes("landing") && + Melbourne + } + City Card{' '} Works.

diff --git a/src/components/MagicItineraryPage.tsx b/src/components/MagicItineraryPage.tsx index eb6ae4b..51b15ad 100644 --- a/src/components/MagicItineraryPage.tsx +++ b/src/components/MagicItineraryPage.tsx @@ -108,7 +108,7 @@ export function MagicItineraryPage({ >

Plan Your Perfect{' '} - + Melbourne Adventure

diff --git a/src/components/MelbourneAttractions.tsx b/src/components/MelbourneAttractions.tsx index 00bd3a2..c8e3f00 100644 --- a/src/components/MelbourneAttractions.tsx +++ b/src/components/MelbourneAttractions.tsx @@ -281,7 +281,7 @@ export function MelbourneAttractions() {

Discover{' '} - + Melbourne's {' '} Best{' '} diff --git a/src/components/MelbourneBlogs.tsx b/src/components/MelbourneBlogs.tsx index d65a7f9..da06e92 100644 --- a/src/components/MelbourneBlogs.tsx +++ b/src/components/MelbourneBlogs.tsx @@ -116,7 +116,7 @@ export function MelbourneBlogs() {

Melbourne{' '} - + Blogs

diff --git a/src/components/MelbourneCardComparison.tsx b/src/components/MelbourneCardComparison.tsx index 58aa1bb..d12ac03 100644 --- a/src/components/MelbourneCardComparison.tsx +++ b/src/components/MelbourneCardComparison.tsx @@ -124,7 +124,7 @@ export function MelbourneCardComparison({ onCheckoutClick }: MelbourneCardCompar

- + Buy {' '} Now diff --git a/src/components/MelbourneFAQ.tsx b/src/components/MelbourneFAQ.tsx index 30afd55..b9c4e83 100644 --- a/src/components/MelbourneFAQ.tsx +++ b/src/components/MelbourneFAQ.tsx @@ -101,7 +101,7 @@ export function MelbourneFAQ() {

Frequently Asked{' '} - + Questions

diff --git a/src/components/MelbournePage.tsx b/src/components/MelbournePage.tsx index 96f0ca6..4960380 100644 --- a/src/components/MelbournePage.tsx +++ b/src/components/MelbournePage.tsx @@ -398,7 +398,7 @@ export function MelbournePage({ viewport={{ once: true }} > Plan Your{' '} - + Dream Journey
diff --git a/src/components/MelbourneTourOverview.tsx b/src/components/MelbourneTourOverview.tsx index 4457593..55882a8 100644 --- a/src/components/MelbourneTourOverview.tsx +++ b/src/components/MelbourneTourOverview.tsx @@ -89,7 +89,7 @@ export function MelbourneTourOverview() { >

Melbourne{' '} - + Tour {' '} Overview diff --git a/src/components/MobileAppSection.tsx b/src/components/MobileAppSection.tsx index 4cfafc9..677347d 100644 --- a/src/components/MobileAppSection.tsx +++ b/src/components/MobileAppSection.tsx @@ -68,7 +68,7 @@ export function MobileAppSection() { >

Access all your{' '} - + city cards
diff --git a/src/components/PassesPage.tsx b/src/components/PassesPage.tsx index 91a64d9..cb87517 100644 --- a/src/components/PassesPage.tsx +++ b/src/components/PassesPage.tsx @@ -189,7 +189,7 @@ export function PassesPage({

- Buy Passes + Buy Passes

Skip the lines, save money, and explore more with our flexible city cards designed for modern travelers @@ -329,7 +329,7 @@ export function PassesPage({

Good to{' '} - Know + Know

Simple tips to help you get the most out of your CityCard experience diff --git a/src/components/PersonalizedTourHero.tsx b/src/components/PersonalizedTourHero.tsx index eb39f32..d7ef775 100644 --- a/src/components/PersonalizedTourHero.tsx +++ b/src/components/PersonalizedTourHero.tsx @@ -122,7 +122,7 @@ export function PersonalizedTourHero({ onCreateItineraryClick }: PersonalizedTou

Create Your{' '} + bg-clip-text text-transparent inline-block overflow-visible whitespace-nowrap pr-2"> Magic Itinerary

diff --git a/src/components/SuperSavingsPage.tsx b/src/components/SuperSavingsPage.tsx index 4124ccc..6743d5d 100644 --- a/src/components/SuperSavingsPage.tsx +++ b/src/components/SuperSavingsPage.tsx @@ -305,7 +305,7 @@ export function SuperSavingsPage({ >

Unlock{' '} - + Super Savings

@@ -355,7 +355,7 @@ export function SuperSavingsPage({ >

Featured{' '} - + Super Savings

diff --git a/src/components/TrustSection.tsx b/src/components/TrustSection.tsx index 14fd60c..327f68d 100644 --- a/src/components/TrustSection.tsx +++ b/src/components/TrustSection.tsx @@ -151,7 +151,7 @@ export function TrustSection() {

What Our{' '} - + Travelers {' '} Say diff --git a/src/components/WhatsIncludedHero.tsx b/src/components/WhatsIncludedHero.tsx index 0f8c574..aed0156 100644 --- a/src/components/WhatsIncludedHero.tsx +++ b/src/components/WhatsIncludedHero.tsx @@ -101,10 +101,10 @@ export function WhatsIncludedHero({ onCreateItineraryClick }: WhatsIncludedHeroP {/* Main Heading */}

One pass.{' '} - + Everything you {' '} - + need {' '} to explore. diff --git a/src/index.css b/src/index.css index b774dec..9c6c605 100644 --- a/src/index.css +++ b/src/index.css @@ -3661,7 +3661,7 @@ .bg-gradient-to-r { --tw-gradient-position: to right in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); - padding-right: 8px; + /* padding-right: 8px; */ } .bg-gradient-to-t { From 3575712d348fc5c94ae7f265c4f2b83fe1d44533 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 31 Mar 2026 16:49:10 +0530 Subject: [PATCH 04/91] add postcard route in navbar --- src/components/Navbar.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 900f3b1..0dcef92 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -142,6 +142,13 @@ export default function Navbar({ path: '/faq', isShared: false }, + { + label: 'Your PostCard', + path: '/postcards', + isShared: true, + landingLabel: 'Your PostCard', + melbourneLabel: 'Your PostCard' + } ], melbourne: [ // Position 1 @@ -177,6 +184,13 @@ export default function Navbar({ isShared: true, landingLabel: 'Your Card', melbourneLabel: 'Your Card' + }, + { + label: 'Your PostCard', + path: '/postcards', + isShared: true, + landingLabel: 'Your PostCard', + melbourneLabel: 'Your PostCard' } ] }; From 66ee65b900f298fa3733c2edce3a955eddc2c4e0 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 31 Mar 2026 16:53:57 +0530 Subject: [PATCH 05/91] resolve the text getting cut off in checkout --- src/components/CheckoutPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CheckoutPage.tsx b/src/components/CheckoutPage.tsx index 790e565..82e5f68 100644 --- a/src/components/CheckoutPage.tsx +++ b/src/components/CheckoutPage.tsx @@ -211,7 +211,7 @@ export function CheckoutPage({ >

Secure{' '} - Checkout + Checkout

Complete your purchase and start exploring Paris From 28f577833b2bc3091897ebe858a7db3ffec89042 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 1 Apr 2026 15:04:26 +0530 Subject: [PATCH 06/91] change the port number --- src/components/PostCardsPage.tsx | 2 +- vite.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/PostCardsPage.tsx b/src/components/PostCardsPage.tsx index 3350ddd..8f94e42 100644 --- a/src/components/PostCardsPage.tsx +++ b/src/components/PostCardsPage.tsx @@ -105,7 +105,7 @@ export function PostCardsPage({ >

Create Beautiful{' '} - + Custom Postcards

diff --git a/vite.config.ts b/vite.config.ts index 551b307..b60eb7e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -84,7 +84,7 @@ import * as path from 'path'; outDir: 'build', }, server: { - port: 4008, + port: 4009, open: true, }, }); \ No newline at end of file From e793f20d83fbc741f64f8e6cf7ed05672567bf70 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 1 Apr 2026 16:08:02 +0530 Subject: [PATCH 07/91] refactor the design in PostCradsPage --- src/assets/front.jpg | Bin 0 -> 153944 bytes src/components/CustomPostcards.tsx | 931 +++++++++++++++-------------- src/components/HowItWorks.tsx | 2 +- src/components/PostCardsPage.tsx | 282 +++++---- 4 files changed, 604 insertions(+), 611 deletions(-) create mode 100644 src/assets/front.jpg diff --git a/src/assets/front.jpg b/src/assets/front.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12f06ef55635fff63f7831cc96d6129353c56730 GIT binary patch literal 153944 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 z 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 literal 0 HcmV?d00001 diff --git a/src/components/CustomPostcards.tsx b/src/components/CustomPostcards.tsx index 6562bfe..3556edb 100644 --- a/src/components/CustomPostcards.tsx +++ b/src/components/CustomPostcards.tsx @@ -4,7 +4,7 @@ import { Button } from './ui/button'; import { ImageWithFallback } from './figma/ImageWithFallback'; import { motion, useMotionValue, useSpring, useTransform, useInView } from 'motion/react'; import { HandwrittenText, useHandwrittenText } from './HandwrittenText'; -import postcardImage from 'figma:asset/d3a880cf8b7f1bec6da9b3f2ce4a76e822e483cf.png'; +import front from '../assets/front.jpg' interface EditableCardProps { isEditing: boolean; @@ -190,485 +190,485 @@ export function CustomPostcards() { }; // Ultra-realistic vintage postcard with responsive scaling and animations - const PostcardFrame = () => { - return ( - - {/* Realistic paper texture with variations */} -

+ // const PostcardFrame = () => { + // return ( + // + // {/* Realistic paper texture with variations */} + //
- {/* Age spots and stains */} -
-
-
-
-
+ // {/* Age spots and stains */} + //
+ //
+ //
+ //
+ //
- {/* Corner wear and creases */} -
-
+ // {/* Corner wear and creases */} + //
+ //
- {/* Subtle crease lines */} -
+ // {/* Subtle crease lines */} + //
- {/* Animated Vintage Vector Logo - Top Right - Mobile Optimized */} - - - {/* Subtle aging overlay for the vector */} -
- + // {/* Animated Vintage Vector Logo - Top Right - Mobile Optimized */} + // + // + // {/* Subtle aging overlay for the vector */} + //
+ // - {/* For Correspondence Text */} -
-

- For correspondence -

-
+ // {/* For Correspondence Text */} + //
+ //

+ // For correspondence + //

+ //
- {/* Realistic vertical divider with ink bleeding - Responsive */} -
+ // {/* Realistic vertical divider with ink bleeding - Responsive */} + //
- {/* Ink bleed effect around divider - Responsive */} -
+ // {/* Ink bleed effect around divider - Responsive */} + //
- {/* Right side content area - Responsive */} -
- {/* Editable Address Label Card - Responsive */} - setEditingCard(editingCard === 'label' ? null : 'label')} - style={{ - position: 'absolute', - top: '4.1%', - left: '0%', - pointerEvents: 'auto', - transform: 'rotate(-0.3deg)' - }} - editIcon={} - > -
- {postcardData.addressLabel} -
-
+ // {/* Right side content area - Responsive */} + //
+ // {/* Editable Address Label Card - Responsive */} + // setEditingCard(editingCard === 'label' ? null : 'label')} + // style={{ + // position: 'absolute', + // top: '4.1%', + // left: '0%', + // pointerEvents: 'auto', + // transform: 'rotate(-0.3deg)' + // }} + // editIcon={} + // > + //
+ // {postcardData.addressLabel} + //
+ //
- {/* Realistic horizontal ruled lines with ink bleeding - Responsive */} -
- {[...Array(9)].map((_, i) => ( -
- {/* Main line */} -
- {/* Ink bleed effect */} -
-
- ))} -
+ // {/* Realistic horizontal ruled lines with ink bleeding - Responsive */} + //
+ // {[...Array(9)].map((_, i) => ( + //
+ // {/* Main line */} + //
+ // {/* Ink bleed effect */} + //
+ //
+ // ))} + //
- {/* Editable Message Card with Handwritten Animation - Responsive */} - setEditingCard(editingCard === 'message' ? null : 'message')} - style={{ - position: 'absolute', - top: '17.6%', - left: '4.4%', - width: '88.2%', - pointerEvents: 'auto', - transform: 'rotate(-0.7deg)' - }} - editIcon={} - > -
- {editingCard === 'message' ? ( - // Show static text when editing -
- {postcardData.message} -
- ) : ( - // Show animated handwritten text when not editing - - )} -
-
+ // {/* Editable Message Card with Handwritten Animation - Responsive */} + // setEditingCard(editingCard === 'message' ? null : 'message')} + // style={{ + // position: 'absolute', + // top: '17.6%', + // left: '4.4%', + // width: '88.2%', + // pointerEvents: 'auto', + // transform: 'rotate(-0.7deg)' + // }} + // editIcon={} + // > + //
+ // {editingCard === 'message' ? ( + // // Show static text when editing + //
+ // {postcardData.message} + //
+ // ) : ( + // // Show animated handwritten text when not editing + // + // )} + //
+ //
- {/* Editable Date Card - Responsive */} - setEditingCard(editingCard === 'date' ? null : 'date')} - style={{ - position: 'absolute', - bottom: '16.2%', - right: '7.4%', - pointerEvents: 'auto', - transform: 'rotate(-1.5deg)' - }} - editIcon={} - > -
- {postcardData.date} -
-
-
+ // {/* Editable Date Card - Responsive */} + // setEditingCard(editingCard === 'date' ? null : 'date')} + // style={{ + // position: 'absolute', + // bottom: '16.2%', + // right: '7.4%', + // pointerEvents: 'auto', + // transform: 'rotate(-1.5deg)' + // }} + // editIcon={} + // > + //
+ // {postcardData.date} + //
+ //
+ //
- {/* Ultra-realistic stamp - Responsive */} - setEditingCard(editingCard === 'stamp' ? null : 'stamp')} - style={{ - position: 'absolute', - width: '12.5%', - height: '19.1%', - right: '3.5%', - bottom: '5.3%', - transform: 'rotate(-12deg)' - }} - editIcon={} - > -
- {/* Stamp aging and wear */} -
+ // {/* Ultra-realistic stamp - Responsive */} + // setEditingCard(editingCard === 'stamp' ? null : 'stamp')} + // style={{ + // position: 'absolute', + // width: '12.5%', + // height: '19.1%', + // right: '3.5%', + // bottom: '5.3%', + // transform: 'rotate(-12deg)' + // }} + // editIcon={} + // > + //
+ // {/* Stamp aging and wear */} + //
- {/* Stamp inner details */} -
-
+ // {/* Stamp inner details */} + //
+ //
- {/* Stamp text */} -
-
- TRAVEL -
-
- MEMORIES -
-
- 2024 -
-
+ // {/* Stamp text */} + //
+ //
+ // TRAVEL + //
+ //
+ // MEMORIES + //
+ //
+ // 2024 + //
+ //
- {/* Stamp perforations with realistic variations */} - {[...Array(20)].map((_, i) => ( -
0.1 ? 1 : 0.3 // Random missing perforations - }} - /> - ))} + // {/* Stamp perforations with realistic variations */} + // {[...Array(20)].map((_, i) => ( + //
0.1 ? 1 : 0.3 // Random missing perforations + // }} + // /> + // ))} - {/* Stamp smudge mark */} -
-
- + // {/* Stamp smudge mark */} + //
+ //
+ // - {/* Additional realistic aging effects */} -
- - ); - }; + // {/* Additional realistic aging effects */} + //
+ // + // ); + // }; return (
@@ -700,7 +700,7 @@ export function CustomPostcards() {

The Only Card That Sends Your - + Holiday {' '} Home. @@ -783,7 +783,8 @@ export function CustomPostcards() { WebkitBackfaceVisibility: "hidden" }} > - + {/* */} + Postcard Image {/* Subtle glow effect */} How Your{' '} {!location.pathname.includes("landing") && - Melbourne + Melbourne } City Card{' '} Works. diff --git a/src/components/PostCardsPage.tsx b/src/components/PostCardsPage.tsx index 8f94e42..8486e7d 100644 --- a/src/components/PostCardsPage.tsx +++ b/src/components/PostCardsPage.tsx @@ -13,6 +13,8 @@ import { CustomPostcards } from './CustomPostcards'; import { HowItWorks } from './HowItWorks'; import { ImageWithFallback } from './figma/ImageWithFallback'; import { Layout } from '../Layout'; +import front from '../assets/front.jpg' + interface User { email: string; @@ -73,165 +75,155 @@ export function PostCardsPage({ return (
{/* Navbar */} - + - {/* Sub Navbar */} - {/* */} + {/* Hero Section */} +
+ {/* Background gradient */} +
- {/* Hero Section */} -
- {/* Background gradient */} -
- -
- -

- Create Beautiful{' '} - - Custom Postcards - -

-

- Transform your travel memories into stunning, personalized postcards with authentic handwritten messages. - Share your journey in a way that feels truly personal and meaningful. -

- -
-
- - {/* Decorative elements */} -
-
-
- - {/* Reuse CustomPostcards Component */} - - - {/* How It Works Section */} - - - {/* Features Section */} - - - {/* Gallery Section */} -
-
- -

Postcard Gallery

-

- Get inspired by beautiful postcards created by our community of travelers -

-
- -
- {[ - { - image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', - title: 'Tropical Paradise', - message: 'Greetings from paradise! The beaches here are absolutely breathtaking...', - location: 'Maldives' - }, - { - image: 'https://images.unsplash.com/photo-1499856871958-5b9627545d1a?w=400&h=600&fit=crop', - title: 'City Adventures', - message: 'Having the most amazing time exploring this incredible city...', - location: 'Paris, France' - }, - { - image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', - title: 'Mountain Views', - message: 'The views from up here are simply unbelievable. Wish you were here...', - location: 'Swiss Alps' - }, - { - image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', - title: 'Cultural Journey', - message: 'Immersing myself in the rich culture and history of this amazing place...', - location: 'Kyoto, Japan' - }, - { - image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', - title: 'Safari Adventure', - message: 'Just saw the most incredible wildlife! This experience is unforgettable...', - location: 'Kenya, Africa' - }, - { - image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', - title: 'Island Escape', - message: 'Living the island life and loving every moment of this peaceful retreat...', - location: 'Santorini, Greece' - } - ].map((postcard, index) => ( - - - -
- - - {postcard.location} - -
-
-

{postcard.title}

-

"{postcard.message}"

-
-
-
-
- ))} + */} + + < img src={front} alt='Postcard image' />
-
-
- {/* Ready to Explore Melbourne Section */} + {/* Decorative elements */} +
+
+
+ + {/* How It Works Section */} + + + {/* Reuse CustomPostcards Component */} + + + {/* Features Section */} + + + {/* Gallery Section */} +
+
+ +

Postcard Gallery

+

+ Get inspired by beautiful postcards created by our community of travelers +

+
+ +
+ {[ + { + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', + title: 'Tropical Paradise', + message: 'Greetings from paradise! The beaches here are absolutely breathtaking...', + location: 'Maldives' + }, + { + image: 'https://images.unsplash.com/photo-1499856871958-5b9627545d1a?w=400&h=600&fit=crop', + title: 'City Adventures', + message: 'Having the most amazing time exploring this incredible city...', + location: 'Paris, France' + }, + { + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', + title: 'Mountain Views', + message: 'The views from up here are simply unbelievable. Wish you were here...', + location: 'Swiss Alps' + }, + { + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', + title: 'Cultural Journey', + message: 'Immersing myself in the rich culture and history of this amazing place...', + location: 'Kyoto, Japan' + }, + { + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', + title: 'Safari Adventure', + message: 'Just saw the most incredible wildlife! This experience is unforgettable...', + location: 'Kenya, Africa' + }, + { + image: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=600&fit=crop', + title: 'Island Escape', + message: 'Living the island life and loving every moment of this peaceful retreat...', + location: 'Santorini, Greece' + } + ].map((postcard, index) => ( + + + +
+ + + {postcard.location} + +
+
+

{postcard.title}

+

"{postcard.message}"

+
+
+
+
+ ))} +
+
+
+ + {/* Ready to Explore Melbourne Section */} - {/* Mobile App Section */} - + {/* Customer Reviews */} + + + {/* Mobile App Section */} + - {/* Customer Reviews */} - -
); From adde5b0c2148a16b9a37101c5967c722b86495dd Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 1 Apr 2026 16:08:57 +0530 Subject: [PATCH 08/91] replace the magicIternary page with the landing-magic-iternary page --- src/components/MagicItineraryPage.tsx | 726 ++++++++++++++------------ 1 file changed, 392 insertions(+), 334 deletions(-) diff --git a/src/components/MagicItineraryPage.tsx b/src/components/MagicItineraryPage.tsx index 51b15ad..b6501e9 100644 --- a/src/components/MagicItineraryPage.tsx +++ b/src/components/MagicItineraryPage.tsx @@ -5,364 +5,422 @@ import { Button } from './ui/button'; import { Card, CardContent } from './ui/card'; import { Badge } from './ui/badge'; import Navbar from './Navbar'; -// import SubNavbar from './SubNavbar'; import { Footer } from './Footer'; import { MobileAppSection } from './MobileAppSection'; import { EnhancedTestimonials } from './EnhancedTestimonials'; import { HowItWorks } from './HowItWorks'; import { ImageWithFallback } from './figma/ImageWithFallback'; +import { PersonalizedTourHero } from './PersonalizedTourHero'; import { Layout } from '../Layout'; interface User { - email: string; - name: string; + email: string; + name: string; } interface MagicItineraryPageProps { - onBackClick: () => void; - onHomeClick: () => void; - onMelbourneClick: () => void; - onPassesClick: () => void; - onCheckoutClick: () => void; - onSignInClick: () => void; - onSignOutClick?: () => void; - onAttractionsClick: () => void; - onBlogsClick: () => void; - onHowItWorksClick: () => void; - onFAQClick: () => void; - onPrivacyPolicyClick: () => void; - onAboutUsClick: () => void; - onProfileClick: () => void; - onCityCardsClick: () => void; - onMagicItineraryClick: () => void; - onPostCardsClick: () => void; - onOffersClick: () => void; - onContactUsClick?: () => void; - onEsimsClick?: () => void; - onHotelDiscountsClick?: () => void; - onCreateItineraryClick: () => void; - onViewItineraryClick: () => void; - currentPage: string; - user: User | null; + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onSuperSavingsClick?: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + onCreateItineraryClick: () => void; + onViewItineraryClick: () => void; + currentPage: string; + user: User | null; } export function MagicItineraryPage({ - onBackClick, - onHomeClick, - onMelbourneClick, - onPassesClick, - onCheckoutClick, - onSignInClick, - onSignOutClick, - onAttractionsClick, - onBlogsClick, - onHowItWorksClick, - onFAQClick, - onPrivacyPolicyClick, - onAboutUsClick, - onProfileClick, - onCityCardsClick, - onMagicItineraryClick, - onPostCardsClick, - onOffersClick, - onContactUsClick, - onEsimsClick, - onHotelDiscountsClick, - onCreateItineraryClick, - onViewItineraryClick, - currentPage, - user + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onSuperSavingsClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + onCreateItineraryClick, + onViewItineraryClick, + currentPage, + user }: MagicItineraryPageProps) { - return ( -
- {/* Navbar */} - + return ( - {/* Sub Navbar */} - {/* */} + - {/* Hero Section */} -
- {/* Background gradient */} -
+
-
- -

- Plan Your Perfect{' '} - - Melbourne Adventure - -

-

- Let our AI create a personalized itinerary just for you. Answer a few questions about your preferences, - and we'll craft the perfect Melbourne experience tailored to your interests. -

- -
-
+ {/* Hero Section */} + - {/* Decorative elements */} -
-
-
+ {/* How It Works Section */} + - {/* How It Works Section */} - + {/* Features Section */} +
+
+ {/* Section Header */} + +

+ Smart Features for{' '} + Smart Travelers +

+

+ Experience intelligent trip planning powered by AI technology +

+
- {/* Features Section */} -
-
-
- {/* Left side - Features */} - -

- Smart Features for
- Smart Travelers -

+
+ {/* Left side - Features */} + + {[ + { + icon: , + title: 'AI-Powered Recommendations', + description: 'Our advanced AI analyzes your preferences to suggest the perfect experiences' + }, + { + icon: , + title: 'Optimized Scheduling', + description: 'Smart timing that considers opening hours, travel time, and crowd patterns' + }, + { + icon: , + title: 'Location-Based Planning', + description: 'Efficiently planned routes that minimize travel time and maximize experiences' + }, + { + icon: , + title: 'Instagram-Worthy Spots', + description: 'Discover hidden gems and perfect photo opportunities along your journey' + } + ].map((feature, index) => ( + + {/* Subtle accent line */} +
-
- {[ - { - icon: , - title: 'AI-Powered Recommendations', - description: 'Our advanced AI analyzes your preferences to suggest the perfect experiences' - }, - { - icon: , - title: 'Optimized Scheduling', - description: 'Smart timing that considers opening hours, travel time, and crowd patterns' - }, - { - icon: , - title: 'Location-Based Planning', - description: 'Efficiently planned routes that minimize travel time and maximize experiences' - }, - { - icon: , - title: 'Instagram-Worthy Spots', - description: 'Discover hidden gems and perfect photo opportunities along your journey' - } - ].map((feature, index) => ( - -
- {feature.icon} -
-
-

{feature.title}

-

{feature.description}

-
-
- ))} -
- +
+
+ {feature.icon} +
+
+

+ {feature.title} +

+

+ {feature.description} +

+
+
+ + ))} + - {/* Right side - Visual */} - -
-

Sample Itinerary

-
- {[ - { time: '9:00 AM', activity: 'Coffee at Degraves Street', duration: '30 min' }, - { time: '10:00 AM', activity: 'Royal Botanic Gardens', duration: '2 hours' }, - { time: '1:00 PM', activity: 'Lunch at Queen Victoria Market', duration: '1 hour' }, - { time: '3:00 PM', activity: 'Street Art Tour in Hosier Lane', duration: '1.5 hours' }, - { time: '6:00 PM', activity: 'Sunset at Eureka Skydeck', duration: '1 hour' } - ].map((item, index) => ( -
-
- {item.time} + {/* Right side - Sample Itinerary */} + +
+ {/* Header */} +
+
+
+ +
+

+ Sample Day Itinerary +

+
+

+ A perfectly planned Melbourne adventure +

+
+ + {/* Timeline */} +
+ {/* Vertical line */} +
+ + {[ + { time: '9:00 AM', activity: 'Coffee at Degraves Street', duration: '30 min', emoji: '☕' }, + { time: '10:00 AM', activity: 'Royal Botanic Gardens', duration: '2 hours', emoji: '🌿' }, + { time: '1:00 PM', activity: 'Lunch at Queen Victoria Market', duration: '1 hour', emoji: '🍽️' }, + { time: '3:00 PM', activity: 'Street Art Tour in Hosier Lane', duration: '1.5 hours', emoji: '🎨' }, + { time: '6:00 PM', activity: 'Sunset at Eureka Skydeck', duration: '1 hour', emoji: '🌅' } + ].map((item, index) => ( + + {/* Timeline dot */} +
+ {index === 0 &&
} +
+ +
+
+
+ {item.emoji} + + {item.time} + +
+ + {item.duration} + +
+

+ {item.activity} +

+
+ + ))} +
+ + {/* Decorative gradient blur */} +
+
+
-
-
{item.activity}
-
{item.duration}
+
+
+ + {/* Benefits Section */} +
+
+ +

Why Use Magic Itinerary?

+

+ Save time, discover more, and create unforgettable memories with personalized planning +

+
+ +
+ {[ + { + icon: , + title: 'Save Planning Time', + description: 'Skip hours of research. Get a complete itinerary in under 5 minutes.', + stat: '90% faster than manual planning' + }, + { + icon: , + title: 'Discover Hidden Gems', + description: 'Find unique experiences and local favorites you might have missed.', + stat: '50+ curated hidden spots' + }, + { + icon: , + title: 'Personalized Experience', + description: 'Every itinerary is unique, tailored specifically to your preferences.', + stat: '1000+ possible combinations' + } + ].map((benefit, index) => ( + + + +
+
+ {benefit.icon} +
+
+

+ {benefit.title} +

+

+ {benefit.description} +

+ + {benefit.stat} + +
+
+
+ ))}
-
- ))} -
-
-
+

+ + + {/* What's Included Section */} +
+
+ +

+ Everything You Need,{' '} + All Included +

+

+ Your Magic Itinerary comes with comprehensive features for an amazing Melbourne experience +

+
+ +
+ {[ + { + emoji: '⏰', + title: 'Detailed Timeline', + description: 'Hour-by-hour schedule with optimal timing' + }, + { + emoji: '🚇', + title: 'Transportation Tips', + description: 'Best routes and transport options between locations' + }, + { + emoji: '⭐', + title: 'Local Recommendations', + description: 'Insider tips on food, shopping, and experiences' + }, + { + emoji: '💰', + title: 'Budget Planning', + description: 'Estimated costs and money-saving suggestions' + }, + { + emoji: '☔', + title: 'Weather Backup Plans', + description: 'Alternative indoor activities for rainy days' + }, + { + emoji: '📸', + title: 'Photo Opportunities', + description: 'Best spots and times for Instagram-worthy shots' + }, + { + emoji: '🏛️', + title: 'Cultural Insights', + description: 'Local history and interesting facts about each location' + }, + { + emoji: '🔔', + title: 'Real-time Updates', + description: 'Live information on closures, events, and crowds' + } + ].map((item, index) => ( + +
+
+
+ {item.emoji} +
+

+ {item.title} +

+

+ {item.description} +

+
+
+
+ ))} +
+
+
+ + {/* CTA Section */} + + + {/* Mobile App Section */} + + + {/* Customer Reviews */} + +
-
- - - {/* Benefits Section */} -
-
- -

Why Use Magic Itinerary?

-

- Save time, discover more, and create unforgettable memories with personalized planning -

-
- -
- {[ - { - icon: , - title: 'Save Planning Time', - description: 'Skip hours of research. Get a complete itinerary in under 5 minutes.', - stat: '90% faster than manual planning' - }, - { - icon: , - title: 'Discover Hidden Gems', - description: 'Find unique experiences and local favorites you might have missed.', - stat: '50+ curated hidden spots' - }, - { - icon: , - title: 'Personalized Experience', - description: 'Every itinerary is unique, tailored specifically to your preferences.', - stat: '1000+ possible combinations' - } - ].map((benefit, index) => ( - - - -
- {benefit.icon} -
-

{benefit.title}

-

{benefit.description}

- - {benefit.stat} - -
-
-
- ))} -
-
-
- - {/* What's Included Section */} -
-
- -

What's Included

-

- Your Magic Itinerary comes with everything you need for an amazing Melbourne experience -

-
- -
- {[ - { - title: 'Detailed Timeline', - description: 'Hour-by-hour schedule with optimal timing' - }, - { - title: 'Transportation Tips', - description: 'Best routes and transport options between locations' - }, - { - title: 'Local Recommendations', - description: 'Insider tips on food, shopping, and experiences' - }, - { - title: 'Budget Planning', - description: 'Estimated costs and money-saving suggestions' - }, - { - title: 'Weather Backup Plans', - description: 'Alternative indoor activities for rainy days' - }, - { - title: 'Photo Opportunities', - description: 'Best spots and times for Instagram-worthy shots' - }, - { - title: 'Cultural Insights', - description: 'Local history and interesting facts about each location' - }, - { - title: 'Real-time Updates', - description: 'Live information on closures, events, and crowds' - } - ].map((item, index) => ( - - - -

{item.title}

-

{item.description}

-
-
-
- ))} -
-
-
- - {/* CTA Section */} - - - {/* Mobile App Section */} - - - {/* Customer Reviews */} - - - - -
- ); + + ); } \ No newline at end of file From a39404b23ddd0e9b5668fde0f6df4b357ca2c122 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 1 Apr 2026 18:10:01 +0530 Subject: [PATCH 09/91] change the layout of postcard gallery in PostCardPage --- src/components/PostCardsPage.tsx | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/components/PostCardsPage.tsx b/src/components/PostCardsPage.tsx index 8486e7d..3eb05f6 100644 --- a/src/components/PostCardsPage.tsx +++ b/src/components/PostCardsPage.tsx @@ -137,8 +137,14 @@ export function PostCardsPage({ transition={{ duration: 0.6, delay: 0.2 }} className="text-center mb-12" > -

Postcard Gallery

-

+

+ Postcard{' '} + + Gallery + {' '} + +

+

Get inspired by beautiful postcards created by our community of travelers

@@ -188,42 +194,36 @@ export function PostCardsPage({ animate={{ opacity: 1, scale: 1 }} transition={{ duration: 0.6, delay: 0.3 + index * 0.1 }} > - - + {/* */} + {/* */}
- +
+
+ {postcard.location} +

{postcard.title}

+

"{postcard.message}"

-
-

{postcard.title}

-

"{postcard.message}"

-
-
-
+ {/*
+
*/} ))}
- {/* Ready to Explore Melbourne Section */} - - - - {/* Customer Reviews */} {/* Mobile App Section */} -
); From e98a54635bdaa111184821f9449f5057bbe4f87d Mon Sep 17 00:00:00 2001 From: aryabenade Date: Thu, 2 Apr 2026 12:18:06 +0530 Subject: [PATCH 10/91] change PostCard to Postcard --- src/components/Navbar.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 0dcef92..b5eee1c 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -143,11 +143,11 @@ export default function Navbar({ isShared: false }, { - label: 'Your PostCard', + label: 'Your Postcard', path: '/postcards', isShared: true, - landingLabel: 'Your PostCard', - melbourneLabel: 'Your PostCard' + landingLabel: 'Your Postcard', + melbourneLabel: 'Your Postcard' } ], melbourne: [ From e1fb13d4c043e3f66e132f59fccf9bcffe5048b4 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Thu, 2 Apr 2026 12:47:07 +0530 Subject: [PATCH 11/91] remove the image from postcard hero section --- src/components/Navbar.tsx | 6 +++--- src/components/PostCardsPage.tsx | 6 +++--- src/components/ProfilePage.tsx | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index b5eee1c..dad69bf 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -186,11 +186,11 @@ export default function Navbar({ melbourneLabel: 'Your Card' }, { - label: 'Your PostCard', + label: 'Your Postcard', path: '/postcards', isShared: true, - landingLabel: 'Your PostCard', - melbourneLabel: 'Your PostCard' + landingLabel: 'Your Postcard', + melbourneLabel: 'Your Postcard' } ] }; diff --git a/src/components/PostCardsPage.tsx b/src/components/PostCardsPage.tsx index 3eb05f6..8892510 100644 --- a/src/components/PostCardsPage.tsx +++ b/src/components/PostCardsPage.tsx @@ -13,7 +13,7 @@ import { CustomPostcards } from './CustomPostcards'; import { HowItWorks } from './HowItWorks'; import { ImageWithFallback } from './figma/ImageWithFallback'; import { Layout } from '../Layout'; -import front from '../assets/front.jpg' +// import front from '../assets/front.jpg' interface User { @@ -89,7 +89,7 @@ export function PostCardsPage({
*/} - < img src={front} alt='Postcard image' /> + {/* < img src={front} alt='Postcard image' /> */}
{/* Decorative elements */} diff --git a/src/components/ProfilePage.tsx b/src/components/ProfilePage.tsx index 02842d6..0cb4dea 100644 --- a/src/components/ProfilePage.tsx +++ b/src/components/ProfilePage.tsx @@ -225,7 +225,7 @@ export function ProfilePage({ >

My{' '} - Profile + Profile

Manage your account, passes, and travel itineraries From 993ccf2c4748211ed3441179a8e37f080e57a1be Mon Sep 17 00:00:00 2001 From: aryabenade Date: Thu, 2 Apr 2026 13:11:18 +0530 Subject: [PATCH 12/91] add a gradient white shadow effect when showing attractions --- src/components/LandingVarietyOfAdventures.tsx | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/components/LandingVarietyOfAdventures.tsx b/src/components/LandingVarietyOfAdventures.tsx index 3e7ab94..4af0519 100644 --- a/src/components/LandingVarietyOfAdventures.tsx +++ b/src/components/LandingVarietyOfAdventures.tsx @@ -154,7 +154,7 @@ export function LandingVarietyOfAdventures() {

{/* Header */}
- Experience{' '} for Every Traveller - - From iconic laneways and world-class coffee to stunning gardens and vibrant markets, + From iconic laneways and world-class coffee to stunning gardens and vibrant markets, discover Melbourne's unique character through curated experiences that showcase the city's soul.
@@ -180,7 +180,7 @@ export function LandingVarietyOfAdventures() { {/* Carousel Container - Full Width */}
{/* Scrolling Track */} -
- + {/* Bottom Content Card */}
-
- + {/* Icon */} -
- + {/* Attraction Info */}
@@ -332,19 +332,19 @@ export function LandingVarietyOfAdventures() { {/* Gradient Fade Edges */} -
-
+
+
{/* CTA Button */} - -
- {/* Content */}
{step === 'email' ? ( + // ... Email step (unchanged)
- {/* Email Input */}
setEmail(e.target.value)} - className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" onKeyDown={(e) => e.key === 'Enter' && handleSendOTP()} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" /> - {helperText && ( -

- {helperText} -

- )} + {error &&

{error}

} + {helperText &&

{helperText}

}
- {/* Send OTP Button */}
) : (
{/* Email Display */}
- -
- {email} + +
+ {email}
- {helperText && ( -

- {helperText} -

- )}
- {/* OTP Input */} + {/* OTP Inputs with Paste Support */}
- {/* Countdown */} {countdown > 0 && ( -

- {formatCountdown(countdown)} +

+ Resend OTP in {formatCountdown(countdown)}

)}
- {/* Verify Button */} + {error &&

{error}

} + - {/* Resend OTP */} {countdown === 0 && ( diff --git a/src/main.tsx b/src/main.tsx index 241b0b3..9cf6d51 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,13 +1,14 @@ import { createRoot } from "react-dom/client"; import { BrowserRouter } from "react-router-dom"; import App from "./App"; -import "./index.css"; import { Provider } from "react-redux"; import { store } from "./Redux/Store"; +import { Toaster } from "sonner"; createRoot(document.getElementById("root")!).render( + From cdb9c7e734e1ea52a2a4c500e40bdef4db81dca1 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Thu, 9 Apr 2026 13:04:08 +0530 Subject: [PATCH 15/91] integrate the register user api --- src/components/LoginModal.tsx | 268 +++++++++++---------- src/components/RegisterModal.tsx | 391 +++++++++++++++++++++++++++++++ src/global.d.ts | 2 + src/main.tsx | 2 + 4 files changed, 540 insertions(+), 123 deletions(-) create mode 100644 src/components/RegisterModal.tsx diff --git a/src/components/LoginModal.tsx b/src/components/LoginModal.tsx index 5eca180..bff54d3 100644 --- a/src/components/LoginModal.tsx +++ b/src/components/LoginModal.tsx @@ -7,6 +7,7 @@ import { Label } from './ui/label'; import { useAuth } from '../context/AuthContext'; import { useLoginMutation, useVerifyOtpMutation } from '../Redux/services/auth.service'; import { toast } from 'sonner'; +import { RegisterModal } from './RegisterModal'; interface LoginModalProps { isOpen: boolean; @@ -20,6 +21,7 @@ export function LoginModal({ isOpen, onClose }: LoginModalProps) { const [countdown, setCountdown] = useState(0); const [helperText, setHelperText] = useState(''); const [error, setError] = useState(''); + const [showRegisterModal, setShowRegisterModal] = useState(false); const { login } = useAuth(); @@ -158,136 +160,156 @@ export function LoginModal({ isOpen, onClose }: LoginModalProps) { }; return ( - - {isOpen && ( - <> - + <> + + {isOpen && ( + <> + - -
-
- + +
+
+ -

- Login -

-

- Enter your email and verify with OTP -

-
+

+ Login +

+

+ Enter your email and verify with OTP +

+
-
- {step === 'email' ? ( - // ... Email step (unchanged) -
-
- - setEmail(e.target.value)} - onKeyDown={(e) => e.key === 'Enter' && handleSendOTP()} - className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" - /> - {error &&

{error}

} - {helperText &&

{helperText}

} -
- - -
- ) : ( -
- {/* Email Display */} -
- -
- {email} -
-
- - {/* OTP Inputs with Paste Support */} -
- -
- {otp.map((digit, index) => ( - handleOTPChange(index, e.target.value.replace(/\D/g, ''))} - onKeyDown={(e) => handleOTPKeyDown(index, e)} - onPaste={handlePaste} // ← Paste support added here - data-otp-index={index} - className="w-12 h-12 text-center font-poppins font-semibold text-lg bg-gray-100 border-0 rounded-xl focus:bg-white focus:ring-2 focus:ring-gray-800 focus:outline-none transition-all" - /> - ))} +
+ {step === 'email' ? ( + // ... Email step (unchanged) +
+
+ + setEmail(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && handleSendOTP()} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> + {error &&

{error}

} + {helperText &&

{helperText}

}
- {countdown > 0 && ( -

- Resend OTP in {formatCountdown(countdown)} -

+ +
+ +
+
+ ) : ( +
+ {/* Email Display */} +
+ +
+ {email} +
+
+ + {/* OTP Inputs with Paste Support */} +
+ +
+ {otp.map((digit, index) => ( + handleOTPChange(index, e.target.value.replace(/\D/g, ''))} + onKeyDown={(e) => handleOTPKeyDown(index, e)} + onPaste={handlePaste} // ← Paste support added here + data-otp-index={index} + className="w-12 h-12 text-center font-poppins font-semibold text-lg bg-gray-300 border-0 rounded-xl focus:bg-white focus:ring-2 focus:ring-gray-800 focus:outline-none transition-all" + /> + ))} +
+ + {countdown > 0 && ( +

+ Resend OTP in {formatCountdown(countdown)} +

+ )} +
+ + {error &&

{error}

} + + + + {countdown === 0 && ( + )}
- - {error &&

{error}

} - - - - {countdown === 0 && ( - - )} -
- )} + )} +
-
- - - )} - + + + ) + } + + setShowRegisterModal(false)} + onLoginClick={() => { + setShowRegisterModal(false); + setStep('email'); + setEmail(''); + }} + /> + ); } \ No newline at end of file diff --git a/src/components/RegisterModal.tsx b/src/components/RegisterModal.tsx new file mode 100644 index 0000000..e690a89 --- /dev/null +++ b/src/components/RegisterModal.tsx @@ -0,0 +1,391 @@ +import { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { X } from 'lucide-react'; +import { Button } from './ui/button'; +import { Input } from './ui/input'; +import { Label } from './ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; +import { useRegisterMutation } from '../Redux/services/auth.service'; +import { toast } from 'sonner'; + +interface RegisterModalProps { + isOpen: boolean; + onClose: () => void; + onLoginClick: () => void; +} + +export function RegisterModal({ isOpen, onClose, onLoginClick }: RegisterModalProps) { + const [formData, setFormData] = useState({ + firstName: '', + lastName: '', + emailAddress: '', + isdCode: '+91', + mobileNumber: '', + address1: '', + address2: '', + city: '', + state: '', + country: 'Australia', + postalCode: '' + }); + const [helperText, setHelperText] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const [register, { isLoading: isRegistering }] = useRegisterMutation(); + + useEffect(() => { + if (!isOpen) { + setFormData({ + firstName: '', + lastName: '', + emailAddress: '', + isdCode: '+91', + mobileNumber: '', + address1: '', + address2: '', + city: '', + state: '', + country: 'Australia', + postalCode: '' + }); + setHelperText(''); + } + }, [isOpen]); + + const handleInputChange = (field: string, value: string) => { + setFormData(prev => ({ ...prev, [field]: value })); + }; + + const validateForm = () => { + if (!formData.firstName.trim()) { + toast.error('First name is required'); + return false; + } + if (!formData.lastName.trim()) { + toast.error('Last name is required'); + return false; + } + if (!formData.emailAddress.trim() || !formData.emailAddress.includes('@')) { + toast.error('Please enter a valid email address'); + return false; + } + if (!formData.mobileNumber.trim()) { + toast.error('Mobile number is required'); + return false; + } + if (!/^\d+$/.test(formData.mobileNumber.trim())) { + toast.error('Mobile number must contain only digits'); + return false; + } + if (!formData.address1.trim()) { + toast.error('Address is required'); + return false; + } + if (!formData.city.trim()) { + toast.error('City is required'); + return false; + } + if (!formData.state.trim()) { + toast.error('State is required'); + return false; + } + if (!formData.postalCode.trim()) { + toast.error('Postal code is required'); + return false; + } + if (!/^\d+$/.test(formData.postalCode.trim())) { + toast.error('Postal code must contain only digits'); + return false; + } + return true; + }; + + + const handleRegister = async () => { + if (!validateForm()) { + return; + } + + setHelperText(''); + setIsLoading(true); + + try { + const response = await register(formData).unwrap(); + console.log('Registration response:', response); + + toast.success('Registration successful! Please login.'); + setTimeout(() => { + onLoginClick(); + onClose(); + }, 2000); + } catch (error: any) { + console.error('Registration error:', error); + const errorMessage = error?.data?.message || 'Registration failed. Please try again.'; + toast.error(errorMessage); + setHelperText(errorMessage); + } finally { + setIsLoading(false); + } + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + e.preventDefault(); + handleRegister(); + } + }; + + return ( + + {isOpen && ( + <> + + + +
+
+ + +

+ Create Account +

+

+ Register to get started with City Cards +

+
+ +
+
+ {/* Personal Information */} +
+

Personal Information

+
+
+ + handleInputChange('firstName', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+ +
+ + handleInputChange('lastName', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+
+ +
+ + handleInputChange('emailAddress', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+ +
+
+ + +
+ +
+ + handleInputChange('mobileNumber', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+
+
+ + {/* Address Information */} +
+

Address Information

+ +
+ + handleInputChange('address1', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+ +
+ + handleInputChange('address2', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+ +
+
+ + handleInputChange('city', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+ +
+ + handleInputChange('state', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+
+ +
+
+ + +
+ +
+ + handleInputChange('postalCode', e.target.value)} + className="font-poppins text-base h-12 bg-gray-50 border-0 rounded-xl placeholder:text-gray-400" + /> +
+
+
+ + {helperText && ( +

+ {helperText} +

+ )} + + + +
+ +
+
+
+
+
+ + )} +
+ ); +} diff --git a/src/global.d.ts b/src/global.d.ts index 903f3f8..eb5a13c 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -32,3 +32,5 @@ declare module '*.mp4' { const src: string; export default src; } + +declare module "*.css"; diff --git a/src/main.tsx b/src/main.tsx index 9cf6d51..6e91c69 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,12 @@ import { createRoot } from "react-dom/client"; import { BrowserRouter } from "react-router-dom"; import App from "./App"; +import "./index.css"; import { Provider } from "react-redux"; import { store } from "./Redux/Store"; import { Toaster } from "sonner"; + createRoot(document.getElementById("root")!).render( From 7c9ec2c28587be408de790a8d38f4766eeb3fb77 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Thu, 9 Apr 2026 15:04:27 +0530 Subject: [PATCH 16/91] move the pages from components to pages folder --- src/AppRouter.tsx | 50 ++- src/Redux/Store.tsx | 5 - src/guidelines/Guidelines.md | 345 ------------------ src/{components => pages}/AboutUsPage.tsx | 14 +- .../AttractionDetailsPage.tsx | 8 +- src/{components => pages}/AttractionsPage.tsx | 12 +- src/{components => pages}/BlogDetailsPage.tsx | 14 +- src/{components => pages}/BlogsPage.tsx | 22 +- src/{components => pages}/CheckoutPage.tsx | 24 +- src/{components => pages}/CityCardsPage.tsx | 19 +- src/{components => pages}/ContactUsPage.tsx | 14 +- .../CreateMagicItineraryPage.tsx | 22 +- src/{components => pages}/DiscoverPage.tsx | 8 +- src/{components => pages}/DownloadAppPage.tsx | 12 +- .../HotelDiscountsPage.tsx | 6 +- .../ItineraryViewPage.tsx | 12 +- .../LandingMagicItineraryPage.tsx | 20 +- .../MagicItineraryPage.tsx | 20 +- src/{components => pages}/MelbournePage.tsx | 28 +- src/{components => pages}/OffersPage.tsx | 26 +- src/{components => pages}/PassesPage.tsx | 16 +- src/{components => pages}/PostCardsPage.tsx | 20 +- .../PrivacyPolicyPage.tsx | 12 +- src/{components => pages}/ProfilePage.tsx | 22 +- .../SecureCheckoutPage.tsx | 18 +- .../SuperSavingsPage.tsx | 26 +- src/{components => pages}/WhatsIncluded.tsx | 10 +- 27 files changed, 223 insertions(+), 582 deletions(-) delete mode 100644 src/guidelines/Guidelines.md rename src/{components => pages}/AboutUsPage.tsx (98%) rename src/{components => pages}/AttractionDetailsPage.tsx (98%) rename src/{components => pages}/AttractionsPage.tsx (98%) rename src/{components => pages}/BlogDetailsPage.tsx (98%) rename src/{components => pages}/BlogsPage.tsx (96%) rename src/{components => pages}/CheckoutPage.tsx (97%) rename src/{components => pages}/CityCardsPage.tsx (96%) rename src/{components => pages}/ContactUsPage.tsx (97%) rename src/{components => pages}/CreateMagicItineraryPage.tsx (99%) rename src/{components => pages}/DiscoverPage.tsx (99%) rename src/{components => pages}/DownloadAppPage.tsx (99%) rename src/{components => pages}/HotelDiscountsPage.tsx (98%) rename src/{components => pages}/ItineraryViewPage.tsx (98%) rename src/{components => pages}/LandingMagicItineraryPage.tsx (97%) rename src/{components => pages}/MagicItineraryPage.tsx (97%) rename src/{components => pages}/MelbournePage.tsx (97%) rename src/{components => pages}/OffersPage.tsx (97%) rename src/{components => pages}/PassesPage.tsx (98%) rename src/{components => pages}/PostCardsPage.tsx (93%) rename src/{components => pages}/PrivacyPolicyPage.tsx (97%) rename src/{components => pages}/ProfilePage.tsx (98%) rename src/{components => pages}/SecureCheckoutPage.tsx (97%) rename src/{components => pages}/SuperSavingsPage.tsx (98%) rename src/{components => pages}/WhatsIncluded.tsx (98%) diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index 1a3c767..28f26f5 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -2,38 +2,36 @@ import { Routes, Route, useParams, useLocation, useNavigate } from 'react-router import { motion, AnimatePresence } from 'motion/react'; // Import all your pages -import { LoginModal } from './components/LoginModal'; -import { MelbournePage } from './components/MelbournePage'; -import { PassesPage } from './components/PassesPage'; -import { AttractionsPage } from './components/AttractionsPage'; -import { AttractionDetailsPage } from './components/AttractionDetailsPage'; -import { CheckoutPage } from './components/CheckoutPage'; -import { SecureCheckoutPage } from './components/SecureCheckoutPage'; -import { BlogsPage } from './components/BlogsPage'; -import { BlogDetailsPage } from './components/BlogDetailsPage'; +import { MelbournePage } from './pages/MelbournePage'; +import { PassesPage } from './pages/PassesPage'; +import { AttractionsPage } from './pages/AttractionsPage'; +import { AttractionDetailsPage } from './pages/AttractionDetailsPage'; +import { CheckoutPage } from './pages/CheckoutPage'; +import { SecureCheckoutPage } from './pages/SecureCheckoutPage'; +import { BlogsPage } from './pages/BlogsPage'; +import { BlogDetailsPage } from './pages/BlogDetailsPage'; import { HowItWorksPage } from './components/HowItWorksPage'; import { FAQPage } from './components/FAQPage'; -import { PrivacyPolicyPage } from './components/PrivacyPolicyPage'; -import { AboutUsPage } from './components/AboutUsPage'; -import { ProfilePage } from './components/ProfilePage'; -import { CreateMagicItineraryPage } from './components/CreateMagicItineraryPage'; -import { ItineraryViewPage } from './components/ItineraryViewPage'; -import { OffersPage } from './components/OffersPage'; -import { CityCardsPage } from './components/CityCardsPage'; -import { MagicItineraryPage } from './components/MagicItineraryPage'; -import { PostCardsPage } from './components/PostCardsPage'; -import { DownloadAppPage } from './components/DownloadAppPage'; -import { EsimsPage } from './components/EsimsPage'; -import { HotelDiscountsPage } from './components/HotelDiscountsPage'; -import { ContactUsPage } from './components/ContactUsPage'; +import { PrivacyPolicyPage } from './pages/PrivacyPolicyPage'; +import { AboutUsPage } from './pages/AboutUsPage'; +import { ProfilePage } from './pages/ProfilePage'; +import { CreateMagicItineraryPage } from './pages/CreateMagicItineraryPage'; +import { ItineraryViewPage } from './pages/ItineraryViewPage'; +import { OffersPage } from './pages/OffersPage'; +import { CityCardsPage } from './pages/CityCardsPage'; +import { MagicItineraryPage } from './pages/MagicItineraryPage'; +import { PostCardsPage } from './pages/PostCardsPage'; +import { DownloadAppPage } from './pages/DownloadAppPage'; +import { HotelDiscountsPage } from './pages/HotelDiscountsPage'; +import { ContactUsPage } from './pages/ContactUsPage'; import { pageTransition } from './utils/animations'; import { LandingPage } from './pages/landingPage'; import ComingSoonPage from './pages/ComingSoonPage'; -import { SuperSavingsPage } from './components/SuperSavingsPage'; -import { WhatsIncluded } from './components/WhatsIncluded'; -import { LandingMagicItineraryPage } from './components/LandingMagicItineraryPage'; -import { DiscoverPage } from './components/DiscoverPage'; +import { SuperSavingsPage } from './pages/SuperSavingsPage'; +import { WhatsIncluded } from './pages/WhatsIncluded'; +import { LandingMagicItineraryPage } from './pages/LandingMagicItineraryPage'; +import { DiscoverPage } from './pages/DiscoverPage'; // User type definition interface User { diff --git a/src/Redux/Store.tsx b/src/Redux/Store.tsx index 04e0e46..444e72e 100644 --- a/src/Redux/Store.tsx +++ b/src/Redux/Store.tsx @@ -1,23 +1,18 @@ import { configureStore } from "@reduxjs/toolkit"; -import { fakeApi } from "./services/fakeApi.service"; import { attractionsApi } from "./services/attractions.service"; import { citiesApi } from "./services/cities.service"; import { authApi } from "./services/auth.service"; export const store = configureStore({ reducer: { - [fakeApi.reducerPath]: fakeApi.reducer, [attractionsApi.reducerPath]: attractionsApi.reducer, [citiesApi.reducerPath]: citiesApi.reducer, [authApi.reducerPath]:authApi.reducer }, - middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat( - - fakeApi.middleware, attractionsApi.middleware, citiesApi.middleware, authApi.middleware diff --git a/src/guidelines/Guidelines.md b/src/guidelines/Guidelines.md deleted file mode 100644 index 4a00ca3..0000000 --- a/src/guidelines/Guidelines.md +++ /dev/null @@ -1,345 +0,0 @@ -# Image Reference Guidelines - -**IMPORTANT**: When I provide an image for reference, it is for design reference only. Do NOT use that image inside any image section in the code. The image is provided to help understand the layout, styling, and visual direction - not to be embedded as an actual image in the application. - -# CityCards Typography Guidelines - -**Project**: Typography Guidelines for CityCards Travel Website - -## Font System - -### Primary Font -- **Poppins**: Used for all text including headings (H1–H6), body text, buttons, labels, and forms - Clean, readable, and consistent throughout - -### Font Weight Scale & Usage -- **font-light (300)**: Hero headings only - For creating dynamic contrast in H1/H2 -- **font-normal (400)**: Standard body text - Default weight for paragraphs -- **font-medium (500)**: Buttons, navigation links, subtle emphasis -- **font-semibold (600)**: Section headings, primary buttons -- **font-bold (700)**: Hero keywords, strong emphasis - -## Heading Typography Specifications - -### H1 - Hero/Main Page Headings -- **Font**: Poppins -- **Size**: `text-5xl md:text-6xl lg:text-7xl` (48px/60px/72px - targeting ~64px) -- **Line Height**: `leading-tight` -- **Pattern**: Dynamic multi-weight with gradient/italic accents (max 2 emphasis styles) - -```jsx -

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

-``` - -### H2 - Section Headings -- **Font**: Poppins -- **Size**: `text-2xl md:text-3xl lg:text-4xl` (24px/36px/48px) -- **Line Height**: `leading-tight` -- **Pattern**: Mixed weights with gradient emphasis - -```jsx -

- Explore{' '} - - Amazing - {' '} - Cities -

-``` - -### H3 - Subsection Headings -- **Font**: Poppins -- **Size**: `text-xl md:text-2xl` (24px/30px) -- **Line Height**: `leading-snug` -- **Weight**: `font-semibold` - -```jsx -

- Feature Title -

-``` - -### H4 - Component Headings -- **Font**: Poppins -- **Size**: `text-lg md:text-xl` (20px/24px) -- **Line Height**: `leading-snug` -- **Weight**: `font-medium` or `font-semibold` - -```jsx -

- Component Heading -

-``` - -### H5 - Card/Item Titles -- **Font**: Poppins -- **Size**: `text-lg` (18px) -- **Line Height**: `leading-snug` -- **Weight**: `font-medium` - -```jsx -
- Card Title -
-``` - -### H6 - Small Headings -- **Font**: Poppins -- **Size**: `text-base` (16px) -- **Line Height**: `leading-snug` -- **Weight**: `font-medium` - -```jsx -
- Small Heading -
-``` - -## Body Typography Specifications - -### Large Body Text -- **Font**: Poppins -- **Size**: `text-xl` (20px) -- **Line Height**: `leading-relaxed` -- **Weight**: `font-normal` - -```jsx -

- Large descriptive text for important sections -

-``` - -### Regular Body Text -- **Font**: Poppins -- **Size**: `text-base` (16px) -- **Line Height**: `leading-relaxed` -- **Weight**: `font-normal` - -```jsx -

- Regular body text content -

-``` - -### Small Body Text -- **Font**: Poppins -- **Size**: `text-sm` (14px) -- **Line Height**: `leading-relaxed` -- **Weight**: `font-normal` or `font-light` - -```jsx -

- Caption or meta information -

-``` - -## Interactive Element Typography - -### Buttons -- **Font**: Poppins -- **Primary Weight**: `font-semibold` -- **Secondary Weight**: `font-medium` -- **Min Size**: 16px - -```jsx -// Primary Button - - -// Secondary Button - -``` - -### Navigation Links -- **Font**: Poppins -- **Weight**: `font-medium` -- **Size**: `text-base` (16px) - -```jsx - - Navigation Link - -``` - -### Form Labels -- **Font**: Poppins -- **Weight**: `font-light` or `font-normal` -- **Size**: `text-sm` or `text-base` (14px/16px) - -```jsx - -``` - -### Form Inputs -- **Font**: Poppins -- **Weight**: `font-normal` -- **Size**: `text-base` (16px) - -```jsx - -``` - -## Accessibility Standards - -### Text Size Requirements -- **Minimum Text Size**: 14px -- **Interactive Minimum Size**: 16px -- **Contrast**: WCAG AA or higher -- **Heading Hierarchy**: Maintain semantic order (H1 → H2 → H3 etc.) - -### Implementation Requirements -```jsx -// Always include explicit font and size classes to override defaults -

- Content with explicit styling -

-``` - -## Typography Rules - -### DO ✅ -- Use Poppins for all text (headings and body) -- Apply max 2 emphasis styles per heading -- Use gradient effects sparingly -- Keep line-heights consistent -- Always specify explicit font classes to override component defaults - -### DON'T ❌ -- Don't use font-light in small text -- Don't mix more than 3 weights in one heading -- Don't go below 14px for captions -- Don't override font sizes without Tailwind classes -- Don't break semantic heading hierarchy - -## Implementation Guidelines - -### Component Styling Override -**IMPORTANT**: Always explicitly set typography classes to override component defaults: - -```jsx -// ✅ CORRECT - Explicit typography classes - - - - Card Title - - - -

- Card content with explicit styling -

-
-
- -// ❌ INCORRECT - Relying on defaults - - - Card Title - - -

Card content without explicit styling

-
-
-``` - -### Dynamic Heading Patterns -```jsx -// Pattern 1: Light → Bold (H1/H2 only) -

- Discover{' '} - - Amazing - {' '} - Destinations -

- -// Pattern 2: Normal → Semibold (H3/H4) -

- Experience{' '} - Melbourne's Culture -

-``` - -### Responsive Typography -```jsx -// Mobile-first responsive scaling -

- Responsive Heading -

- -

- Responsive body text -

-``` - -**Add your own guidelines here** - diff --git a/src/components/AboutUsPage.tsx b/src/pages/AboutUsPage.tsx similarity index 98% rename from src/components/AboutUsPage.tsx rename to src/pages/AboutUsPage.tsx index b68a755..29b87fd 100644 --- a/src/components/AboutUsPage.tsx +++ b/src/pages/AboutUsPage.tsx @@ -1,13 +1,13 @@ import React from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Heart, MapPin, Zap, Globe, Users, Camera, Coffee } from 'lucide-react'; -import { Button } from './ui/button'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { MobileAppSection } from './MobileAppSection'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { ReviewsSection } from './ReviewsSection'; +// import { Button } from './ui/button'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { ReviewsSection } from '../components/ReviewsSection'; interface User { email: string; diff --git a/src/components/AttractionDetailsPage.tsx b/src/pages/AttractionDetailsPage.tsx similarity index 98% rename from src/components/AttractionDetailsPage.tsx rename to src/pages/AttractionDetailsPage.tsx index d92c3b1..8998f12 100644 --- a/src/components/AttractionDetailsPage.tsx +++ b/src/pages/AttractionDetailsPage.tsx @@ -1,10 +1,10 @@ import { useState } from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Clock, Users, Calendar, MapPin, Star, Check, X, ChevronLeft, ChevronRight } from 'lucide-react'; -import { Button } from './ui/button'; -import { Badge } from './ui/badge'; -import { Card, } from './ui/card'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from '../components/ui/button'; +import { Badge } from '../components/ui/badge'; +import { Card, } from '../components/ui/card'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { Layout } from '../Layout'; import { useParams } from 'react-router-dom'; import { useGetAttractionDetailsByIdQuery } from '../Redux/services/attractions.service'; diff --git a/src/components/AttractionsPage.tsx b/src/pages/AttractionsPage.tsx similarity index 98% rename from src/components/AttractionsPage.tsx rename to src/pages/AttractionsPage.tsx index 79ec7df..588ea14 100644 --- a/src/components/AttractionsPage.tsx +++ b/src/pages/AttractionsPage.tsx @@ -2,12 +2,12 @@ import { useEffect, useState } from 'react'; import { motion } from 'motion/react'; import { Search, Star, Clock } from 'lucide-react'; import { useNavigate, useParams } from 'react-router-dom'; -import { Button } from './ui/button'; -import { Input } from './ui/input'; -import { Card, CardContent } from './ui/card'; -import { Badge } from './ui/badge'; -import { Checkbox } from './ui/checkbox'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from '../components/ui/button'; +import { Input } from '../components/ui/input'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import { Checkbox } from '../components/ui/checkbox'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { Layout } from '../Layout'; import { useGetAttractionFiltersQuery, useGetCustomerAttractionsQuery } from '../Redux/services/attractions.service'; interface User { diff --git a/src/components/BlogDetailsPage.tsx b/src/pages/BlogDetailsPage.tsx similarity index 98% rename from src/components/BlogDetailsPage.tsx rename to src/pages/BlogDetailsPage.tsx index 675c7de..5c935cc 100644 --- a/src/components/BlogDetailsPage.tsx +++ b/src/pages/BlogDetailsPage.tsx @@ -1,13 +1,13 @@ import { useState } from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Calendar, User, Clock, Share2, BookmarkPlus, ThumbsUp, MessageSquare, Tag, MapPin } from 'lucide-react'; -import { Button } from './ui/button'; -import { Badge } from './ui/badge'; -import { Card, CardContent } from './ui/card'; -import { Separator } from './ui/separator'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from '../components/ui/button'; +import { Badge } from '../components/ui/badge'; +import { Card, CardContent } from '../components/ui/card'; +import { Separator } from '../components/ui/separator'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; interface User { email: string; diff --git a/src/components/BlogsPage.tsx b/src/pages/BlogsPage.tsx similarity index 96% rename from src/components/BlogsPage.tsx rename to src/pages/BlogsPage.tsx index df21c8b..677c947 100644 --- a/src/components/BlogsPage.tsx +++ b/src/pages/BlogsPage.tsx @@ -1,18 +1,18 @@ import { useState } from 'react'; import { motion } from 'motion/react'; import { Calendar, User, Clock, ArrowRight, Search, Tag, CreditCard, MapPin, Check, Smartphone, Star, Heart, Share2 } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card'; -import { Badge } from './ui/badge'; -import { Input } from './ui/input'; -import Navbar from './Navbar'; +import { Button } from '../components/ui/button'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import { Input } from '../components/ui/input'; +import Navbar from '../components/Navbar'; // import { CitySubmenu } from './CitySubmenu'; -import { MobileAppSection } from './MobileAppSection'; -import { WhyChooseCityCards } from './WhyChooseCityCards'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { ReviewsSection } from './ReviewsSection'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { WhyChooseCityCards } from '../components/WhyChooseCityCards'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { ReviewsSection } from '../components/ReviewsSection'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import imgFrame1597884939 from "figma:asset/5da1b0444c0d21bc7ee776c49e36e2a8ea4d3e12.png"; // Blog Mobile App Section Component diff --git a/src/components/CheckoutPage.tsx b/src/pages/CheckoutPage.tsx similarity index 97% rename from src/components/CheckoutPage.tsx rename to src/pages/CheckoutPage.tsx index 82e5f68..f34b555 100644 --- a/src/components/CheckoutPage.tsx +++ b/src/pages/CheckoutPage.tsx @@ -1,20 +1,20 @@ import { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { ArrowLeft, CreditCard, Users, Calendar, MapPin, Shield, Truck, Clock, ChevronRight, Check, ChevronDown, X, Mail, Smartphone } from 'lucide-react'; -import { Button } from './ui/button'; -import { Input } from './ui/input'; -import { Label } from './ui/label'; -import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; -import { Separator } from './ui/separator'; -import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from './ui/dialog'; -import { RadioGroup, RadioGroupItem } from './ui/radio-group'; -import { Checkbox } from './ui/checkbox'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; -import { Badge } from './ui/badge'; -import { Textarea } from './ui/textarea'; +import { Button } from '../components/ui/button'; +import { Input } from '../components/ui/input'; +import { Label } from '../components/ui/label'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Separator } from '../components/ui/separator'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '../components/ui/dialog'; +import { RadioGroup, RadioGroupItem } from '../components/ui/radio-group'; +import { Checkbox } from '../components/ui/checkbox'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../components/ui/select'; +import { Badge } from '../components/ui/badge'; +import { Textarea } from '../components/ui/textarea'; import Navbar from './Navbar'; import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { Layout } from '../Layout'; interface CheckoutPageProps { diff --git a/src/components/CityCardsPage.tsx b/src/pages/CityCardsPage.tsx similarity index 96% rename from src/components/CityCardsPage.tsx rename to src/pages/CityCardsPage.tsx index 1ae32fa..5a27856 100644 --- a/src/components/CityCardsPage.tsx +++ b/src/pages/CityCardsPage.tsx @@ -1,18 +1,15 @@ import React from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Star, MapPin, Clock, CreditCard, Users, Shield, Smartphone, Check } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; -// import SubNavbar from './SubNavbar'; -import { Footer } from './Footer'; -import { MobileAppSection } from './MobileAppSection'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; +import { Button } from '../components/ui/button'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; import { FAQPage } from './FAQPage'; -import { HowItWorks } from './HowItWorks'; -import { WhyChooseCityCards } from './WhyChooseCityCards'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { HowItWorks } from '../components/HowItWorks'; +import { WhyChooseCityCards } from '../components/WhyChooseCityCards'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { Layout } from '../Layout'; interface User { diff --git a/src/components/ContactUsPage.tsx b/src/pages/ContactUsPage.tsx similarity index 97% rename from src/components/ContactUsPage.tsx rename to src/pages/ContactUsPage.tsx index d8f9483..46852a3 100644 --- a/src/components/ContactUsPage.tsx +++ b/src/pages/ContactUsPage.tsx @@ -12,13 +12,13 @@ import { ChevronRight, CheckCircle } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; -import { Input } from './ui/input'; -import { Label } from './ui/label'; -import { Textarea } from './ui/textarea'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; +import { Button } from '../components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Input } from '../components/ui/input'; +import { Label } from '../components/ui/label'; +import { Textarea } from '../components/ui/textarea'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; interface ContactUsPageProps { onBackClick: () => void; diff --git a/src/components/CreateMagicItineraryPage.tsx b/src/pages/CreateMagicItineraryPage.tsx similarity index 99% rename from src/components/CreateMagicItineraryPage.tsx rename to src/pages/CreateMagicItineraryPage.tsx index 71c5f21..5735da3 100644 --- a/src/components/CreateMagicItineraryPage.tsx +++ b/src/pages/CreateMagicItineraryPage.tsx @@ -18,17 +18,17 @@ import { ChevronDown, ChevronUp } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent } from './ui/card'; -import { Badge } from './ui/badge'; -import { Progress } from './ui/progress'; -import { Calendar as CalendarComponent } from './ui/calendar'; -import { Input } from './ui/input'; -import { Popover, PopoverContent, PopoverTrigger } from './ui/popover'; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import { Progress } from '../components/ui/progress'; +import { Calendar as CalendarComponent } from '../components/ui/calendar'; +import { Input } from '../components/ui/input'; +import { Popover, PopoverContent, PopoverTrigger } from '../components/ui/popover'; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../components/ui/collapsible'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; interface User { diff --git a/src/components/DiscoverPage.tsx b/src/pages/DiscoverPage.tsx similarity index 99% rename from src/components/DiscoverPage.tsx rename to src/pages/DiscoverPage.tsx index 2ec1d43..73a9ad0 100644 --- a/src/components/DiscoverPage.tsx +++ b/src/pages/DiscoverPage.tsx @@ -2,10 +2,10 @@ import { ArrowRight, Check, CreditCard, DollarSign, MapPin, Palette, Sparkles, T import { AnimatePresence, motion } from 'motion/react'; import { useEffect, useState } from 'react'; import { Layout } from '../Layout'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { MobileAppSection } from './MobileAppSection'; -import { TrustSection } from './TrustSection'; -import { Button } from './ui/button'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { TrustSection } from '../components/TrustSection'; +import { Button } from '../components/ui/button'; interface User { email: string; diff --git a/src/components/DownloadAppPage.tsx b/src/pages/DownloadAppPage.tsx similarity index 99% rename from src/components/DownloadAppPage.tsx rename to src/pages/DownloadAppPage.tsx index 7b0c1e0..fe125a4 100644 --- a/src/components/DownloadAppPage.tsx +++ b/src/pages/DownloadAppPage.tsx @@ -1,12 +1,12 @@ import { useState } from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, ChevronRight, QrCode, CreditCard, Calendar, MapPin, Star, CheckCircle, Sparkles, Users, Clock, Gift, Ticket } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent } from './ui/card'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; interface User { email: string; diff --git a/src/components/HotelDiscountsPage.tsx b/src/pages/HotelDiscountsPage.tsx similarity index 98% rename from src/components/HotelDiscountsPage.tsx rename to src/pages/HotelDiscountsPage.tsx index 3811808..798f4f0 100644 --- a/src/components/HotelDiscountsPage.tsx +++ b/src/pages/HotelDiscountsPage.tsx @@ -1,10 +1,6 @@ import { motion } from 'motion/react'; import { BadgePercent, Clock, Crown, Check, ArrowRight } from 'lucide-react'; -import { Button } from './ui/button'; -import Navbar from './Navbar'; -// import { SubNavbar } from './SubNavbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import cityCardsLogo from '../assets/cityLogo.png'; import marriottHotelImage from '../assets/marriott-hotel.png'; import { Layout } from '../Layout'; diff --git a/src/components/ItineraryViewPage.tsx b/src/pages/ItineraryViewPage.tsx similarity index 98% rename from src/components/ItineraryViewPage.tsx rename to src/pages/ItineraryViewPage.tsx index 0f72882..522604a 100644 --- a/src/components/ItineraryViewPage.tsx +++ b/src/pages/ItineraryViewPage.tsx @@ -1,12 +1,12 @@ import React, { useState } from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Calendar, Clock, MapPin, Users, Star, Heart, Share2, Download, CheckCircle, Navigation, Cloud, Sun } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent } from './ui/card'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; interface ItineraryViewPageProps { onBackClick: () => void; diff --git a/src/components/LandingMagicItineraryPage.tsx b/src/pages/LandingMagicItineraryPage.tsx similarity index 97% rename from src/components/LandingMagicItineraryPage.tsx rename to src/pages/LandingMagicItineraryPage.tsx index 32fa27c..0c7f059 100644 --- a/src/components/LandingMagicItineraryPage.tsx +++ b/src/pages/LandingMagicItineraryPage.tsx @@ -1,16 +1,16 @@ import React from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Sparkles, MapPin, Clock, Users, Calendar, Star, Zap, Heart, Camera } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent } from './ui/card'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { MobileAppSection } from './MobileAppSection'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { HowItWorks } from './HowItWorks'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { PersonalizedTourHero } from './PersonalizedTourHero'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { HowItWorks } from '../components/HowItWorks'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { PersonalizedTourHero } from '../components/PersonalizedTourHero'; import { Layout } from '../Layout'; interface User { diff --git a/src/components/MagicItineraryPage.tsx b/src/pages/MagicItineraryPage.tsx similarity index 97% rename from src/components/MagicItineraryPage.tsx rename to src/pages/MagicItineraryPage.tsx index b6501e9..95eacf0 100644 --- a/src/components/MagicItineraryPage.tsx +++ b/src/pages/MagicItineraryPage.tsx @@ -1,16 +1,16 @@ import React from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Sparkles, MapPin, Clock, Users, Calendar, Star, Zap, Heart, Camera } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent } from './ui/card'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { MobileAppSection } from './MobileAppSection'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { HowItWorks } from './HowItWorks'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { PersonalizedTourHero } from './PersonalizedTourHero'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { HowItWorks } from '../components/HowItWorks'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { PersonalizedTourHero } from '../components/PersonalizedTourHero'; import { Layout } from '../Layout'; interface User { diff --git a/src/components/MelbournePage.tsx b/src/pages/MelbournePage.tsx similarity index 97% rename from src/components/MelbournePage.tsx rename to src/pages/MelbournePage.tsx index 4960380..a4dbe82 100644 --- a/src/components/MelbournePage.tsx +++ b/src/pages/MelbournePage.tsx @@ -1,22 +1,22 @@ import { motion, useAnimationControls, AnimatePresence } from 'motion/react'; -import { Button } from './ui/button'; +import { Button } from '../components/ui/button'; import { ArrowRight, Calendar, Thermometer, Eye, MapPin, Clock, Users, Ticket, Wand2, Plane, Sparkles } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; -import Navbar from './Navbar'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { MelbourneAttractions } from './MelbourneAttractions'; -import { MelbourneCardComparison } from './MelbourneCardComparison'; -import { MelbourneTourOverview } from './MelbourneTourOverview'; -import { MelbourneBlogs } from './MelbourneBlogs'; -import { CustomPostcards } from './CustomPostcards'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { MobileAppPromotion } from './MobileAppPromotion'; -import { MelbourneFAQ } from './MelbourneFAQ'; -import { Footer } from './Footer'; +import Navbar from '../components/Navbar'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { MelbourneAttractions } from '../components/MelbourneAttractions'; +import { MelbourneCardComparison } from '../components/MelbourneCardComparison'; +import { MelbourneTourOverview } from '../components/MelbourneTourOverview'; +import { MelbourneBlogs } from '../components/MelbourneBlogs'; +import { CustomPostcards } from '../components/CustomPostcards'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { MobileAppPromotion } from '../components/MobileAppPromotion'; +import { MelbourneFAQ } from '../components/MelbourneFAQ'; +import { Footer } from '../components/Footer'; // import { MinimalHeroBanner } from './MinimalHeroBanner'; import { Layout } from '../Layout'; -import { HeroBannerCarousel } from './HeroBannerCarousel'; -import { HotelEsimOffers } from './HotelEsimOffers'; +import { HeroBannerCarousel } from '../components/HeroBannerCarousel'; +import { HotelEsimOffers } from '../components/HotelEsimOffers'; interface User { email: string; diff --git a/src/components/OffersPage.tsx b/src/pages/OffersPage.tsx similarity index 97% rename from src/components/OffersPage.tsx rename to src/pages/OffersPage.tsx index c9c5fb1..4e1a26d 100644 --- a/src/components/OffersPage.tsx +++ b/src/pages/OffersPage.tsx @@ -1,20 +1,20 @@ import { useState } from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Search, Filter, Star, MapPin, Clock, Tag, Heart, Share2, Copy, ChevronDown, ChevronRight, Check, Hotel, Plane, Building2, MapPinned, Home } from 'lucide-react'; -import { Button } from './ui/button'; -import { Input } from './ui/input'; -import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; -import { Badge } from './ui/badge'; -import { Separator } from './ui/separator'; -import { Checkbox } from './ui/checkbox'; -import Navbar from './Navbar'; +import { Button } from '../components/ui/button'; +import { Input } from '../components/ui/input'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import { Separator } from '../components/ui/separator'; +import { Checkbox } from '../components/ui/checkbox'; +import Navbar from '../components/Navbar'; // import SubNavbar from './SubNavbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { TrustSection } from './TrustSection'; -import { MobileAppSection } from './MobileAppSection'; -import { ReviewsSection } from './ReviewsSection'; -import { TrustedCompanies } from './TrustedCompanies'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { TrustSection } from '../components/TrustSection'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { ReviewsSection } from '../components/ReviewsSection'; +import { TrustedCompanies } from '../components/TrustedCompanies'; import { Layout } from '../Layout'; interface OffersPageProps { diff --git a/src/components/PassesPage.tsx b/src/pages/PassesPage.tsx similarity index 98% rename from src/components/PassesPage.tsx rename to src/pages/PassesPage.tsx index cb87517..154ac1e 100644 --- a/src/components/PassesPage.tsx +++ b/src/pages/PassesPage.tsx @@ -1,14 +1,14 @@ import { useState } from 'react'; import { Check, X, Star, Shield, Clock, Smartphone, Download, QrCode, Heart, Users, Award, Headphones } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card'; -import { RadioGroup, RadioGroupItem } from './ui/radio-group'; -import { Badge } from './ui/badge'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { ReviewsSection } from './ReviewsSection'; +import { Button } from '../components/ui/button'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../components/ui/card'; +import { RadioGroup, RadioGroupItem } from '../components/ui/radio-group'; +import { Badge } from '../components/ui/badge'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { ReviewsSection } from '../components/ReviewsSection'; import { Layout } from '../Layout'; -import { LoginModal } from './LoginModal'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { LoginModal } from '../components/LoginModal'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { useAuth } from '../context/AuthContext'; import { useNavigate } from 'react-router-dom'; diff --git a/src/components/PostCardsPage.tsx b/src/pages/PostCardsPage.tsx similarity index 93% rename from src/components/PostCardsPage.tsx rename to src/pages/PostCardsPage.tsx index 8892510..2228d7f 100644 --- a/src/components/PostCardsPage.tsx +++ b/src/pages/PostCardsPage.tsx @@ -1,17 +1,17 @@ import React from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Camera, Edit3, Upload, Heart, Star, Download, Share2 } from 'lucide-react'; -import { Button } from './ui/button'; -import { Card, CardContent } from './ui/card'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; // import SubNavbar from './SubNavbar'; -import { Footer } from './Footer'; -import { MobileAppSection } from './MobileAppSection'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { CustomPostcards } from './CustomPostcards'; -import { HowItWorks } from './HowItWorks'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Footer } from '../components/Footer'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { CustomPostcards } from '../components/CustomPostcards'; +import { HowItWorks } from '../components/HowItWorks'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { Layout } from '../Layout'; // import front from '../assets/front.jpg' diff --git a/src/components/PrivacyPolicyPage.tsx b/src/pages/PrivacyPolicyPage.tsx similarity index 97% rename from src/components/PrivacyPolicyPage.tsx rename to src/pages/PrivacyPolicyPage.tsx index 5117319..9787bc2 100644 --- a/src/components/PrivacyPolicyPage.tsx +++ b/src/pages/PrivacyPolicyPage.tsx @@ -1,13 +1,13 @@ import { useState, useEffect } from 'react'; import { motion, useScroll, useTransform } from 'motion/react'; import { ArrowLeft } from 'lucide-react'; -import Navbar from './Navbar'; +import Navbar from '../components/Navbar'; // import { CitySubmenu } from './CitySubmenu'; -import { Footer } from './Footer'; -import { MobileAppSection } from './MobileAppSection'; -import { WhyChooseCityCards } from './WhyChooseCityCards'; -import { EnhancedTestimonials } from './EnhancedTestimonials'; -import { ReviewsSection } from './ReviewsSection'; +import { Footer } from '../components/Footer'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { WhyChooseCityCards } from '../components/WhyChooseCityCards'; +import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; +import { ReviewsSection } from '../components/ReviewsSection'; interface User { email: string; diff --git a/src/components/ProfilePage.tsx b/src/pages/ProfilePage.tsx similarity index 98% rename from src/components/ProfilePage.tsx rename to src/pages/ProfilePage.tsx index 0cb4dea..b7df501 100644 --- a/src/components/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -15,17 +15,17 @@ import { Badge as BadgeIcon, Camera } from 'lucide-react'; -import { Button } from './ui/button'; -import { Input } from './ui/input'; -import { Label } from './ui/label'; -import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; -import { Separator } from './ui/separator'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; +import { Button } from '../components/ui/button'; +import { Input } from '../components/ui/input'; +import { Label } from '../components/ui/label'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Separator } from '../components/ui/separator'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '../components/ui/tabs'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../components/ui/select'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; interface ProfilePageProps { onBackClick: () => void; diff --git a/src/components/SecureCheckoutPage.tsx b/src/pages/SecureCheckoutPage.tsx similarity index 97% rename from src/components/SecureCheckoutPage.tsx rename to src/pages/SecureCheckoutPage.tsx index 2b61d96..e987298 100644 --- a/src/components/SecureCheckoutPage.tsx +++ b/src/pages/SecureCheckoutPage.tsx @@ -1,15 +1,15 @@ import { useState } from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Lock, Shield, CreditCard, Check, X, Tag } from 'lucide-react'; -import { Button } from './ui/button'; -import { Input } from './ui/input'; -import { Label } from './ui/label'; -import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs'; -import { Separator } from './ui/separator'; -import { Badge } from './ui/badge'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; +import { Button } from '../components/ui/button'; +import { Input } from '../components/ui/input'; +import { Label } from '../components/ui/label'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '../components/ui/tabs'; +import { Separator } from '../components/ui/separator'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; interface User { email: string; diff --git a/src/components/SuperSavingsPage.tsx b/src/pages/SuperSavingsPage.tsx similarity index 98% rename from src/components/SuperSavingsPage.tsx rename to src/pages/SuperSavingsPage.tsx index 6743d5d..eb8263d 100644 --- a/src/components/SuperSavingsPage.tsx +++ b/src/pages/SuperSavingsPage.tsx @@ -1,19 +1,19 @@ import { useState } from 'react'; import { motion } from 'motion/react'; import { ArrowLeft, Search, Filter, Star, MapPin, Clock, Tag, Heart, Share2, ChevronDown, ChevronRight, Check, Hotel, Plane, Building2, MapPinned, Home, Gift, Percent } from 'lucide-react'; -import { Button } from './ui/button'; -import { Input } from './ui/input'; -import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; -import { Badge } from './ui/badge'; -import { Separator } from './ui/separator'; -import { Checkbox } from './ui/checkbox'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { TrustSection } from './TrustSection'; -import { MobileAppSection } from './MobileAppSection'; -import { ReviewsSection } from './ReviewsSection'; -import { TrustedCompanies } from './TrustedCompanies'; +import { Button } from '../components/ui/button'; +import { Input } from '../components/ui/input'; +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import { Separator } from '../components/ui/separator'; +import { Checkbox } from '../components/ui/checkbox'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { TrustSection } from '../components/TrustSection'; +import { MobileAppSection } from '../components/MobileAppSection'; +import { ReviewsSection } from '../components/ReviewsSection'; +import { TrustedCompanies } from '../components/TrustedCompanies'; import { Layout } from '../Layout'; interface SuperSavingsPageProps { diff --git a/src/components/WhatsIncluded.tsx b/src/pages/WhatsIncluded.tsx similarity index 98% rename from src/components/WhatsIncluded.tsx rename to src/pages/WhatsIncluded.tsx index a31114f..0bdec15 100644 --- a/src/components/WhatsIncluded.tsx +++ b/src/pages/WhatsIncluded.tsx @@ -1,11 +1,11 @@ import { ArrowRight, Hotel, Mail, MapPin, Sparkles, Ticket, Wifi } from 'lucide-react'; import { motion } from 'motion/react'; import { Layout } from '../Layout'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { SmartSaving } from './SmartSaving'; -import { Badge } from './ui/badge'; -import { Button } from './ui/button'; -import { WhatsIncludedHero } from './WhatsIncludedHero'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { SmartSaving } from '../components/SmartSaving'; +import { Badge } from '../components/ui/badge'; +import { Button } from '../components/ui/button'; +import { WhatsIncludedHero } from '../components/WhatsIncludedHero'; interface User { email: string; From 169a29f63c85935c97126e8f78da0f9e2141c570 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Thu, 9 Apr 2026 15:29:17 +0530 Subject: [PATCH 17/91] change the route according to cityName instead of id --- src/components/CitySelectionDialog.tsx | 2 +- src/components/Navbar.tsx | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/CitySelectionDialog.tsx b/src/components/CitySelectionDialog.tsx index 203aa72..07f2ff2 100644 --- a/src/components/CitySelectionDialog.tsx +++ b/src/components/CitySelectionDialog.tsx @@ -40,7 +40,7 @@ export function CitySelectionDialog({ // ✅ Call the onCitySelect callback if provided (passing cityId) if (onCitySelect) { - onCitySelect(String(city.id)); + onCitySelect(String(city.cityName)); } else { // ✅ Default behavior: navigate to passes page navigate(`/passes?city=${encodeURIComponent(city.cityName)}`); diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 9374a6a..ca6e863 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -299,11 +299,11 @@ export default function Navbar({ setDialogSource('navbar'); }; - const handleCitySelectFromNavbar = (cityId: string) => { - console.log('City selected from navbar:', cityId); - onCityChange(cityId); + const handleCitySelectFromNavbar = (cityName: string) => { + console.log('City selected from navbar:', cityName); + onCityChange(cityName); - if (cityId.toLowerCase() === '1') { + if (cityName.toLowerCase() === 'melbourne') { setNavigationSource('melbourne'); navigate('/melbourne'); } else { @@ -334,11 +334,11 @@ export default function Navbar({ handleCloseCityDialog(); }; - const handleCitySelect = (cityId: string) => { + const handleCitySelect = (cityName: string) => { if (dialogSource === 'cta') { - handleCitySelectFromCTA(cityId); + handleCitySelectFromCTA(cityName); } else { - handleCitySelectFromNavbar(cityId); + handleCitySelectFromNavbar(cityName); } }; From f3b16e8e1a588b542ecde328d4bba79d7e521c97 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Thu, 9 Apr 2026 16:06:15 +0530 Subject: [PATCH 18/91] change the duration of the toaster to 2s --- src/{imports => components}/AfterLogin.tsx | 0 src/{imports => components}/BeforeLogin.tsx | 0 src/components/CTAButton.tsx | 4 ++-- src/main.tsx | 3 +-- 4 files changed, 3 insertions(+), 4 deletions(-) rename src/{imports => components}/AfterLogin.tsx (100%) rename src/{imports => components}/BeforeLogin.tsx (100%) diff --git a/src/imports/AfterLogin.tsx b/src/components/AfterLogin.tsx similarity index 100% rename from src/imports/AfterLogin.tsx rename to src/components/AfterLogin.tsx diff --git a/src/imports/BeforeLogin.tsx b/src/components/BeforeLogin.tsx similarity index 100% rename from src/imports/BeforeLogin.tsx rename to src/components/BeforeLogin.tsx diff --git a/src/components/CTAButton.tsx b/src/components/CTAButton.tsx index 9b80d9f..0c16431 100644 --- a/src/components/CTAButton.tsx +++ b/src/components/CTAButton.tsx @@ -1,6 +1,6 @@ import { motion } from 'motion/react'; -import BeforeLogin from '../imports/BeforeLogin'; -import AfterLogin from '../imports/AfterLogin'; +import BeforeLogin from './BeforeLogin'; +import AfterLogin from './AfterLogin'; interface User { email: string; diff --git a/src/main.tsx b/src/main.tsx index 6e91c69..b8619fc 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -6,11 +6,10 @@ import { Provider } from "react-redux"; import { store } from "./Redux/Store"; import { Toaster } from "sonner"; - createRoot(document.getElementById("root")!).render( - + From 439ad4b2640a7485659b4ea870299d2d9b23ec7e Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 13 Apr 2026 16:12:05 +0530 Subject: [PATCH 19/91] send accessToken to the backend after login --- index.html | 2 +- src/Redux/baseQuery.ts | 4 ++-- src/components/LoginModal.tsx | 9 +++++++-- src/context/AuthContext.tsx | 8 +++++++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 000821d..daa01f8 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - CityCards Travel 22-8-2025 + CityCards Customer-web diff --git a/src/Redux/baseQuery.ts b/src/Redux/baseQuery.ts index 7ffc8d8..36c9339 100644 --- a/src/Redux/baseQuery.ts +++ b/src/Redux/baseQuery.ts @@ -8,9 +8,9 @@ export const baseQuery = fetchBaseQuery({ const token = localStorage.getItem("accessToken"); if (token) { headers.set("Authorization", `Bearer ${token}`); - // headers.set("access-token", token); + headers.set("access-token", token); } // headers.set("Content-Type", "application/json"); return headers; }, -}); +}); \ No newline at end of file diff --git a/src/components/LoginModal.tsx b/src/components/LoginModal.tsx index bff54d3..b4378d0 100644 --- a/src/components/LoginModal.tsx +++ b/src/components/LoginModal.tsx @@ -140,8 +140,10 @@ export function LoginModal({ isOpen, onClose }: LoginModalProps) { }).unwrap(); const userData = { + userId:response?.user?.id, email: response?.email || email, name: response?.name || email.split('@')[0].charAt(0).toUpperCase() + email.split('@')[0].slice(1), + accessToken:response?.accessToken, }; login(userData); @@ -285,11 +287,14 @@ export function LoginModal({ isOpen, onClose }: LoginModalProps) { onClick={() => { setStep('email'); setOtp(['', '', '', '', '', '']); + setHelperText("") setError(''); }} - className="w-full text-sm text-gray-600 hover:text-gray-800 font-poppins" + className="w-full text-sm text-gray-600 hover:text-gray-800 font-poppins cursor-pointer" > - Didn't receive OTP? Send again + Didn't receive OTP? + Send again + {/* Send again */} )}
diff --git a/src/context/AuthContext.tsx b/src/context/AuthContext.tsx index 8cabeb8..50dba2a 100644 --- a/src/context/AuthContext.tsx +++ b/src/context/AuthContext.tsx @@ -3,7 +3,9 @@ import { useNavigate } from 'react-router-dom'; interface User { email: string; - name: string + name: string; + accessToken:string; + userId:string; } interface AuthContextType { @@ -29,11 +31,15 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const login = (userData: User) => { setUser(userData) localStorage.setItem("user", JSON.stringify(userData)) + localStorage.setItem("accessToken", userData?.accessToken) + localStorage.setItem("userId", userData?.userId) } const logout = () => { setUser(null) localStorage.removeItem("user") + localStorage.removeItem("accessToken") + localStorage.removeItem("userId") navigate("/") } From 0a0cb9f6f13dbe7e2359d5e87f4d5dee445faa3e Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 13 Apr 2026 16:13:09 +0530 Subject: [PATCH 20/91] add loading spinners --- src/Redux/services/fakeApi.service.ts | 19 ------------------- src/components/CitySelectionDialog.tsx | 9 ++++++++- src/components/LandingUpcomingCities.tsx | 11 +++++++++-- src/pages/AttractionDetailsPage.tsx | 17 ++++++++++++----- src/pages/AttractionsPage.tsx | 19 +++++++++++++------ 5 files changed, 42 insertions(+), 33 deletions(-) delete mode 100644 src/Redux/services/fakeApi.service.ts diff --git a/src/Redux/services/fakeApi.service.ts b/src/Redux/services/fakeApi.service.ts deleted file mode 100644 index b5f90ae..0000000 --- a/src/Redux/services/fakeApi.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' - -export const fakeApi = createApi({ - reducerPath: 'fakeApi', - baseQuery: fetchBaseQuery({ - baseUrl: " https://fakestoreapi.com", - - }), - endpoints: (builder) => ({ - getProducts: builder.query({ - query: () => ({ - url: 'products', - method: 'GET', - }), - }), - }), -}) - -export const { useGetProductsQuery} = fakeApi diff --git a/src/components/CitySelectionDialog.tsx b/src/components/CitySelectionDialog.tsx index 07f2ff2..3ede930 100644 --- a/src/components/CitySelectionDialog.tsx +++ b/src/components/CitySelectionDialog.tsx @@ -31,7 +31,14 @@ export function CitySelectionDialog({ const { data: cities, isLoading } = useGetCityListWithBannerQuery({ search }) if (isLoading) { - return
Loading...
+ return ( +
+
+
+

Loading...

+
+
+ ); } diff --git a/src/components/LandingUpcomingCities.tsx b/src/components/LandingUpcomingCities.tsx index 2d724a0..cd15393 100644 --- a/src/components/LandingUpcomingCities.tsx +++ b/src/components/LandingUpcomingCities.tsx @@ -113,8 +113,15 @@ export function LandingUpcomingCities() { const { data, isLoading } = useGetUpcomingCitiesQuery(listType) - if(isLoading){ - return
Loading...
+ if (isLoading) { + return ( +
+
+
+

Loading...

+
+
+ ); } const handleMouseDown = (e: React.MouseEvent) => { diff --git a/src/pages/AttractionDetailsPage.tsx b/src/pages/AttractionDetailsPage.tsx index 8998f12..34fd0d6 100644 --- a/src/pages/AttractionDetailsPage.tsx +++ b/src/pages/AttractionDetailsPage.tsx @@ -31,7 +31,14 @@ export function AttractionDetailsPage({ const { data: attraction, isLoading } = useGetAttractionDetailsByIdQuery(Number(attractionId)); if (isLoading) { - return
loading...
+ return ( +
+
+
+

Loading...

+
+
+ ); } return ( @@ -40,7 +47,7 @@ export function AttractionDetailsPage({ onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} user={user} - // showCitySubmenu={false} + // showCitySubmenu={false} >
{/* Back Button */} @@ -82,7 +89,7 @@ export function AttractionDetailsPage({ {attraction.title} {' '} - Day Trip by {attraction.partner.businessName} + Day Trip by {attraction.partner.businessName}
@@ -99,10 +106,10 @@ export function AttractionDetailsPage({
{/* Gallery images */} - {attraction.attractionGalleries.slice().map((image:any) => ( + {attraction.attractionGalleries.slice().map((image: any) => (
diff --git a/src/pages/AttractionsPage.tsx b/src/pages/AttractionsPage.tsx index 588ea14..4a7d35b 100644 --- a/src/pages/AttractionsPage.tsx +++ b/src/pages/AttractionsPage.tsx @@ -230,7 +230,7 @@ export function AttractionsPage({ const [selectedPassType, setSelectedPassType] = useState(null); const cityId = 1 - + const { data: filterData, isLoading } = useGetAttractionFiltersQuery(cityId) const { data: attractions } = useGetCustomerAttractionsQuery({ cityId, // required @@ -239,9 +239,16 @@ export function AttractionsPage({ cardType: selectedPassType, // optional search, // optional }); - + if (isLoading) { - return
Loading...
+ return ( +
+
+
+

Loading...

+
+
+ ); } const handleAttractionClick = (attractionId: string) => { @@ -254,7 +261,7 @@ export function AttractionsPage({ const showingFrom = 1; const showingTo = Math.min(12, attractions?.length); const totalItems = attractions?.length; - + function handlePassTypeSelection(key: string, checked: boolean) { if (checked) { setSelectedPassType(key); // only keep the newly selected one @@ -403,7 +410,7 @@ export function AttractionsPage({ htmlFor={key} className="font-poppins text-sm text-[#414141] cursor-pointer flex-1 font-normal" > - {key==="selective_pass" ?"Selective":"Unlimited"} ({count as number}) + {key === "selective_pass" ? "Selective" : "Unlimited"} ({count as number})
))} @@ -493,7 +500,7 @@ export function AttractionsPage({
@@ -384,7 +454,7 @@ export function ProfilePage({ // Determine which pass type to show const hasUnlimitedPass = activePasses.some(pass => pass.type === 'Unlimited Pass'); const hasSelectivePass = activePasses.some(pass => pass.type === 'Flexi Pass'); - + if (hasUnlimitedPass) { return ( <> @@ -394,7 +464,7 @@ export function ProfilePage({ Melbourne Unlimited Card

- Unlimited access to 25+ attractions. Visit as many places as you want with one simple card. + Unlimited access to 25+ attractions. Visit as many places as you want with one simple card. Save up to 40% compared to individual tickets.

@@ -423,13 +493,13 @@ export function ProfilePage({ {/* Purchase CTA */}
- -
@@ -478,13 +548,13 @@ export function ProfilePage({ {/* Purchase CTA */}
- -
@@ -535,13 +605,13 @@ export function ProfilePage({ {/* Purchase CTA */}
- -
- +
Attractions: @@ -616,10 +686,10 @@ export function ProfilePage({ ))}
- + {/* Offers Button */}
-
- +
Attractions visited: @@ -689,7 +759,7 @@ export function ProfilePage({ >

My Itineraries

-
- +
@@ -728,8 +798,8 @@ export function ProfilePage({
- diff --git a/src/main.tsx b/src/main.tsx index b8619fc..cfff6d7 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -9,7 +9,7 @@ import { Toaster } from "sonner"; createRoot(document.getElementById("root")!).render( - + diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index 91c0d1c..adf6491 100644 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -28,6 +28,7 @@ import { Footer } from '../components/Footer'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { useGetUserProfileDetailsQuery, useUpdateUserProfileDetailsMutation } from '../Redux/services/profile.service'; import { toast } from 'sonner'; +import { useNavigate } from 'react-router-dom'; interface ProfilePageProps { onBackClick: () => void; @@ -57,18 +58,6 @@ interface ProfilePageProps { currentPage: string; } -// Mock user data -const mockUserData = { - firstName: 'John', - lastName: 'Doe', - email: 'john.doe@example.com', - phone: '+1 (555) 123-4567', - country: 'us', - address: '123 Main Street', - city: 'New York', - postalCode: '10001' -}; - // Mock passes data const mockPasses = [ { @@ -174,8 +163,11 @@ export function ProfilePage({ postalCode: '' }); + const navigate = useNavigate() const userId = localStorage.getItem("userId") const { data: userDetails, isLoading } = useGetUserProfileDetailsQuery(userId) + const [updateUserProfileDetails, { isLoading: savingChanges }] = useUpdateUserProfileDetailsMutation(); + const { data: passes, isLoading: loadingPasses } = useGetUserProfileDetailsQuery(userId) useEffect(() => { if (userDetails) { @@ -194,7 +186,6 @@ export function ProfilePage({ }, [userDetails]) - const [updateUserProfileDetails] = useUpdateUserProfileDetailsMutation(); const handleInputChange = (field: string, value: string) => { setFormData(prev => ({ ...prev, [field]: value })); @@ -215,7 +206,7 @@ export function ProfilePage({ const activePasses = mockPasses.filter(pass => pass.status === 'active'); const expiredPasses = mockPasses.filter(pass => pass.status === 'expired'); - if (isLoading) { + if (isLoading && loadingPasses) { return (
@@ -259,8 +250,8 @@ export function ProfilePage({
{/* Back Button */} navigate(-1)} + className="flex items-center gap-2 text-gray-600 hover:text-gray-900 mb-6 transition-colors duration-200 cursor-pointer" initial={{ opacity: 0, x: -20 }} animate={{ opacity: 1, x: 0 }} transition={{ duration: 0.5 }} @@ -434,7 +425,7 @@ export function ProfilePage({ onClick={handleSaveProfile} className="w-full bg-gradient-to-r from-primary to-secondary hover:from-primary/90 hover:to-secondary/90 text-white font-normal py-3 font-poppins cursor-pointer" > - Save Changes + {savingChanges ? "Saving Changes..." : "Save Changes"} From 729f9ffa0d2273b42ff8997bdb6f9ce8701961dc Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 13 Apr 2026 22:04:14 +0530 Subject: [PATCH 23/91] solve errors in tsconfig --- src/pages/ProfilePage.tsx | 21 +++------------------ tsconfig.json | 4 ++-- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index adf6491..d8f91c8 100644 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -222,28 +222,13 @@ export function ProfilePage({ {/* Navbar */} { }} - onHomeClick={onHomeClick} - onMelbourneClick={onMelbourneClick} - onPassesClick={onPassesClick} - onCheckoutClick={onCheckoutClick} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} - onAttractionsClick={onAttractionsClick} - onBlogsClick={onBlogsClick} - onHowItWorksClick={onHowItWorksClick} - onFAQClick={onFAQClick} - onPrivacyPolicyClick={onPrivacyPolicyClick} - onAboutUsClick={onAboutUsClick} - onProfileClick={onProfileClick} - onCityCardsClick={onCityCardsClick} - onMagicItineraryClick={onMagicItineraryClick} - onPostCardsClick={onPostCardsClick} - onOffersClick={onOffersClick} - currentPage={currentPage} isUserSignedIn={true} user={{ email: "user@example.com", name: "John Doe" }} - /> + onCityChange={function (city: string): void { + throw new Error('Function not implemented.'); + }} /> {/* Header Section */}
diff --git a/tsconfig.json b/tsconfig.json index 3d0a51a..e444793 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,12 +5,12 @@ "lib": ["DOM", "DOM.Iterable", "ESNext"], "allowJs": false, "skipLibCheck": true, - "esModuleInterop": false, + "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, From dbdf974475cdc34d54301f71918e9ea2eda548e4 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 14 Apr 2026 18:14:13 +0530 Subject: [PATCH 24/91] save the selected city to localstorage --- src/AppRouter.tsx | 6 +- src/components/CitySelectionDialog.tsx | 11 +- src/components/Navbar.tsx | 26 ++-- src/pages/AttractionsPage.tsx | 192 +------------------------ 4 files changed, 33 insertions(+), 202 deletions(-) diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index 28f26f5..52bf4f0 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -88,11 +88,11 @@ export function AppRouter({ } /> {/* Home Route */} - - } /> + } /> {/* Passes Route */} {/* Attractions Routes */} - diff --git a/src/components/CitySelectionDialog.tsx b/src/components/CitySelectionDialog.tsx index 3ede930..e4d6503 100644 --- a/src/components/CitySelectionDialog.tsx +++ b/src/components/CitySelectionDialog.tsx @@ -20,6 +20,9 @@ interface CitySelectionDialogProps { onCitySelect?: (cityId: string) => void; // ✅ Updated to pass cityId } +export const slugify = (name: string | null) => + name?.toLowerCase().replace(/\s+/g, '-'); + export function CitySelectionDialog({ isOpen, onClose, @@ -41,13 +44,17 @@ export function CitySelectionDialog({ ); } - const handleCityClick = (city: City) => { console.log('Selected city:', city.cityName); // ✅ Call the onCitySelect callback if provided (passing cityId) if (onCitySelect) { - onCitySelect(String(city.cityName)); + // onCitySelect(String(city.cityName)); + // navigate(`/${city.cityName}/${city.id}`) + + navigate(`/${slugify(city.cityName)}/${city.id}`); + localStorage.setItem("cityId", String(city.id)) + localStorage.setItem("cityName", String(city.cityName)) } else { // ✅ Default behavior: navigate to passes page navigate(`/passes?city=${encodeURIComponent(city.cityName)}`); diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index ca6e863..36980ca 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -8,7 +8,7 @@ import { ImageWithFallback } from './figma/ImageWithFallback'; import { CTAButton } from './CTAButton'; import logoImage from '../assets/cit-logo.png'; import melbourneLogo from '../assets/melbourne-logo.png'; -import { CitySelectionDialog } from './CitySelectionDialog'; +import { CitySelectionDialog, slugify } from './CitySelectionDialog'; import { useAuth } from '../context/AuthContext'; import { LoginModal } from './LoginModal'; @@ -104,6 +104,8 @@ export default function Navbar({ } }; + const cityId = localStorage.getItem("cityId") + const cityName = localStorage.getItem("cityName") // More flexible navigation configuration const navigationConfig = { @@ -129,20 +131,20 @@ export default function Navbar({ isShared: false }, // Position 4 - Shared item - { - label: 'Your Card', - path: '/passes', - isShared: true, - landingLabel: 'Your Card', - melbourneLabel: 'Your Card' - }, + // { + // label: 'Your Card', + // path: '/passes', + // isShared: true, + // landingLabel: 'Your Card', + // melbourneLabel: 'Your Card' + // }, // Position 5 { label: 'FAQ', path: '/faq', isShared: false }, - { + { label: 'Your Postcard', path: '/postcards', isShared: true, @@ -154,7 +156,7 @@ export default function Navbar({ // Position 1 { label: 'Attractions', - path: '/attractions', + path: `/${slugify(cityName)}/${cityId}/attractions`, isShared: false }, // Position 2 @@ -185,7 +187,7 @@ export default function Navbar({ landingLabel: 'Your Card', melbourneLabel: 'Your Card' }, - { + { label: 'Your Postcard', path: '/postcards', isShared: true, @@ -559,7 +561,7 @@ export default function Navbar({ whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} > - + void; onSignOutClick?: () => void; @@ -229,7 +48,10 @@ export function AttractionsPage({ const [selectedCategory, setSelectedCategory] = useState(null); const [selectedPassType, setSelectedPassType] = useState(null); - const cityId = 1 + const { cityId } = useParams() + const cityName = localStorage.getItem("cityName") + + console.log(cityName) const { data: filterData, isLoading } = useGetAttractionFiltersQuery(cityId) const { data: attractions } = useGetCustomerAttractionsQuery({ @@ -308,12 +130,12 @@ export function AttractionsPage({

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

- Skip the lines and explore Melbourne's most iconic destinations with your CityCard pass + Skip the lines and explore {cityName}'s most iconic destinations with your CityCard pass

{/* City Card Promotional Banner */} @@ -423,7 +245,7 @@ export function AttractionsPage({
{/* Header */}
-

Attractions in Melbourne

+

Attractions in {cityName}

{/* Results count */}

Showing {showingFrom}-{showingTo} of {totalItems} Item(s) From 743462d088ab14f73b2c465d9bae2150933874ad Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 15 Apr 2026 11:07:13 +0530 Subject: [PATCH 25/91] make the card comparison section in selected city page dynamic --- src/Redux/services/cities.service.ts | 6 +- src/components/MelbourneCardComparison.tsx | 156 ++++++++++++++------- src/components/Navbar.tsx | 19 ++- src/pages/MelbournePage.tsx | 26 ++-- 4 files changed, 137 insertions(+), 70 deletions(-) diff --git a/src/Redux/services/cities.service.ts b/src/Redux/services/cities.service.ts index e1dfb06..9754016 100644 --- a/src/Redux/services/cities.service.ts +++ b/src/Redux/services/cities.service.ts @@ -23,8 +23,12 @@ export const citiesApi = createApi({ query: (listType) => `/cities/list/all?listType=${listType}`, + }), + + getSelectedCityDetails:builder.query({ + query: (cityId) => `/website/${cityId}`, }) }), }); -export const { useGetCityListWithBannerQuery,useGetUpcomingCitiesQuery } = citiesApi; \ No newline at end of file +export const { useGetCityListWithBannerQuery,useGetUpcomingCitiesQuery,useGetSelectedCityDetailsQuery } = citiesApi; \ No newline at end of file diff --git a/src/components/MelbourneCardComparison.tsx b/src/components/MelbourneCardComparison.tsx index d12ac03..e32bdaa 100644 --- a/src/components/MelbourneCardComparison.tsx +++ b/src/components/MelbourneCardComparison.tsx @@ -3,52 +3,52 @@ import { Check, X, Star, Users, MapPin, Calendar, Clock, Zap, Eye } from 'lucide import { Button } from './ui/button'; import { motion } from 'motion/react'; -const cardOptions = [ - { - id: 'selective', - name: 'Flexi Card', - subtitle: 'Pick 5-10 things to do from a choice of 102 attractions tours and activities', - priceRange: '$89-159', - duration: '3-7 days', - popular: false, - color: 'from-blue-500 to-cyan-500', - features: { - passCategory: 'Selective Card', - accessToAttractions: true, - entryToAttractions: true, - accessToExperiences: true, - entryToSites: true, - accessToVenues: false, - entryToEvents: 'Pass Category', - accessToLocations: 'Pass Category', - entryToActivities: true, - accessToExhibits: true, - entryToActivitiesSecond: true - } - }, - { - id: 'unlimited', - name: 'Melbourne Unlimited Card', - subtitle: 'Pick 5-30 things to do from a choice of 102 attractions tours and activities', - priceRange: '$159-299', - duration: '3-7 days', - popular: true, - color: 'from-purple-500 to-pink-500', - features: { - passCategory: 'Pass Category', - accessToAttractions: true, - entryToAttractions: true, - accessToExperiences: true, - entryToSites: true, - accessToVenues: true, - entryToEvents: 'Pass Category', - accessToLocations: 'Pass Category', - entryToActivities: true, - accessToExhibits: true, - entryToActivitiesSecond: true - } - } -]; +// const cardOptions = [ +// { +// id: 'selective', +// name: 'Flexi Card', +// subtitle: 'Pick 5-10 things to do from a choice of 102 attractions tours and activities', +// priceRange: '$89-159', +// duration: '3-7 days', +// popular: false, +// color: 'from-blue-500 to-cyan-500', +// features: { +// passCategory: 'Selective Card', +// accessToAttractions: true, +// entryToAttractions: true, +// accessToExperiences: true, +// entryToSites: true, +// accessToVenues: false, +// entryToEvents: 'Pass Category', +// accessToLocations: 'Pass Category', +// entryToActivities: true, +// accessToExhibits: true, +// entryToActivitiesSecond: true +// } +// }, +// { +// id: 'unlimited', +// name: 'Melbourne Unlimited Card', +// subtitle: 'Pick 5-30 things to do from a choice of 102 attractions tours and activities', +// priceRange: '$159-299', +// duration: '3-7 days', +// popular: true, +// color: 'from-purple-500 to-pink-500', +// features: { +// passCategory: 'Pass Category', +// accessToAttractions: true, +// entryToAttractions: true, +// accessToExperiences: true, +// entryToSites: true, +// accessToVenues: true, +// entryToEvents: 'Pass Category', +// accessToLocations: 'Pass Category', +// entryToActivities: true, +// accessToExhibits: true, +// entryToActivitiesSecond: true +// } +// } +// ]; const features = [ { key: 'passCategory', label: 'Pass Category', icon: Star }, @@ -71,11 +71,59 @@ const FeatureIcon = ({ feature }: { feature: typeof features[0] }) => { interface MelbourneCardComparisonProps { onCheckoutClick?: () => void; + cards: any[] } -export function MelbourneCardComparison({ onCheckoutClick }: MelbourneCardComparisonProps) { +export function MelbourneCardComparison({ onCheckoutClick,cards }: MelbourneCardComparisonProps) { const [selectedCard, setSelectedCard] = useState('unlimited'); + const cardOptions = [ + { + id: cards[0]?.id, + name: cards[0]?.title, + subtitle: cards[0]?.description, + priceRange: `$${cards[0]?.adultPrice}`, + duration: '3-7 days', + popular: false, + color: 'from-blue-500 to-cyan-500', + features: { + passCategory: 'Selective Card', + accessToAttractions: true, + entryToAttractions: true, + accessToExperiences: true, + entryToSites: true, + accessToVenues: false, + entryToEvents: 'Pass Category', + accessToLocations: 'Pass Category', + entryToActivities: true, + accessToExhibits: true, + entryToActivitiesSecond: true + } + }, + { + id: cards[1]?.id, + name: cards[1]?.title, + subtitle: cards[1]?.description, + priceRange: `$${cards[1]?.adultPrice}`, + duration: '3-7 days', + popular: true, + color: 'from-purple-500 to-pink-500', + features: { + passCategory: 'Pass Category', + accessToAttractions: true, + entryToAttractions: true, + accessToExperiences: true, + entryToSites: true, + accessToVenues: true, + entryToEvents: 'Pass Category', + accessToLocations: 'Pass Category', + entryToActivities: true, + accessToExhibits: true, + entryToActivitiesSecond: true + } + } + ]; + const renderFeatureValue = (value: boolean | string, cardId: string) => { if (typeof value === 'boolean') { return value ? ( @@ -92,7 +140,7 @@ export function MelbourneCardComparison({ onCheckoutClick }: MelbourneCardCompar

); } - + return (
{value} @@ -122,17 +170,17 @@ export function MelbourneCardComparison({ onCheckoutClick }: MelbourneCardCompar Choose Your Adventure
- +

Buy {' '} Now

- +

- Melbourne is a must-visit cultural epicenter, and this spectacular trip unlocks - your access around the city in one easy. Save over the cost of visiting Melbourne's + Melbourne is a must-visit cultural epicenter, and this spectacular trip unlocks + your access around the city in one easy. Save over the cost of visiting Melbourne's landmarks, have lunch at Phi Phi Leh, snorkel at Bamboo Island, and visit Monkey Beach.

@@ -179,7 +227,7 @@ export function MelbourneCardComparison({ onCheckoutClick }: MelbourneCardCompar {feature.label}
- + {cardOptions.map((card) => (
{renderFeatureValue(card.features[feature.key as keyof typeof card.features], card.id)} @@ -196,7 +244,7 @@ export function MelbourneCardComparison({ onCheckoutClick }: MelbourneCardCompar
Ready to explore?
Compare features above
- + {cardOptions.map((card) => (
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 36980ca..9190dfc 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -91,6 +91,10 @@ export default function Navbar({ const { user, login, logout } = useAuth(); // from AuthContext + const cityLogo = sessionStorage.getItem("cityLogo") || "" + + const baseUrl = import.meta.env.VITE_BASE_URL; + const protectedPaths = ["/passes", "/whats-included", "/", "/melbourne"]; const handleOpenLoginModal = () => { @@ -563,8 +567,7 @@ export default function Navbar({ >
{/* Enhanced Navigation Items with source tracking */} {navigationItems.map((item) => { @@ -625,12 +628,13 @@ export default function Navbar({ onClick={handleOpenCityDialogFromNavbar} > - {!activeCity || activeCity === 'shared' + {/* {!activeCity || activeCity === 'shared' ? 'City' : ['landing', 'landingpage'].includes(activeCity.toLowerCase()) ? 'City' : activeCity.charAt(0).toUpperCase() + activeCity.slice(1) - } + } */} + {cityName ? cityName : "City"} @@ -786,10 +790,11 @@ export default function Navbar({ trigger={
- {activeCity && activeCity !== 'shared' ? + {/* {activeCity && activeCity !== 'shared' ? activeCity.charAt(0).toUpperCase() + activeCity.slice(1) : currentSource === 'melbourne' ? 'Melbourne' : 'Select City' - } + } */} + {cityName ? cityName : "City"}
diff --git a/src/pages/MelbournePage.tsx b/src/pages/MelbournePage.tsx index a4dbe82..64c8c11 100644 --- a/src/pages/MelbournePage.tsx +++ b/src/pages/MelbournePage.tsx @@ -1,8 +1,7 @@ import { motion, useAnimationControls, AnimatePresence } from 'motion/react'; import { Button } from '../components/ui/button'; import { ArrowRight, Calendar, Thermometer, Eye, MapPin, Clock, Users, Ticket, Wand2, Plane, Sparkles } from 'lucide-react'; -import { useEffect, useRef, useState } from 'react'; -import Navbar from '../components/Navbar'; +import { useState } from 'react'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { MelbourneAttractions } from '../components/MelbourneAttractions'; import { MelbourneCardComparison } from '../components/MelbourneCardComparison'; @@ -12,11 +11,10 @@ import { CustomPostcards } from '../components/CustomPostcards'; import { EnhancedTestimonials } from '../components/EnhancedTestimonials'; import { MobileAppPromotion } from '../components/MobileAppPromotion'; import { MelbourneFAQ } from '../components/MelbourneFAQ'; -import { Footer } from '../components/Footer'; -// import { MinimalHeroBanner } from './MinimalHeroBanner'; import { Layout } from '../Layout'; import { HeroBannerCarousel } from '../components/HeroBannerCarousel'; import { HotelEsimOffers } from '../components/HotelEsimOffers'; +import { useGetSelectedCityDetailsQuery } from '../Redux/services/cities.service'; interface User { email: string; @@ -149,6 +147,18 @@ export function MelbournePage({ const [currentCardIndex, setCurrentCardIndex] = useState(0); const [isAnimating, setIsAnimating] = useState(false); + const cityId = localStorage.getItem("cityId") + + const { data: cityDetails, isLoading: loadingCityDetails } = useGetSelectedCityDetailsQuery(cityId) + + + if (loadingCityDetails) { + return
Loading...
+ } + + const cards = cityDetails?.city?.cards + sessionStorage.setItem("cityLogo", String(cityDetails?.city?.cityIconPath)) + const currentCard = itineraryCards[currentCardIndex]; const nextCard = itineraryCards[(currentCardIndex + 1) % itineraryCards.length]; const thirdCard = itineraryCards[(currentCardIndex + 2) % itineraryCards.length]; @@ -257,12 +267,12 @@ export function MelbournePage({ {/* Attractions Section */}
- +
{/* Pass Comparison */}
- +
{/* Tour Overview */} @@ -740,8 +750,8 @@ export function MelbournePage({ }, 400); }} className={`font-poppins group relative transition-all duration-300 px-4 py-2 rounded-full font-medium ${idx === currentCardIndex - ? 'bg-gradient-to-r from-primary to-orange-500 text-white shadow-lg scale-110' - : 'bg-white/80 backdrop-blur-sm text-gray-600 hover:text-primary hover:bg-white border border-gray-200 hover:border-primary/30 hover:scale-105' + ? 'bg-gradient-to-r from-primary to-orange-500 text-white shadow-lg scale-110' + : 'bg-white/80 backdrop-blur-sm text-gray-600 hover:text-primary hover:bg-white border border-gray-200 hover:border-primary/30 hover:scale-105' }`} whileHover={{ y: -2 }} whileTap={{ scale: 0.95 }} From 929359d7e214b74e4884575450a9dc32cef1446a Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 15 Apr 2026 11:34:44 +0530 Subject: [PATCH 26/91] make loading spinner component and pass it to all loading states --- src/components/CitySelectionDialog.tsx | 8 ++------ src/components/LandingUpcomingCities.tsx | 8 ++------ src/components/LoadingSpinner.tsx | 12 ++++++++++++ src/components/MelbourneCardComparison.tsx | 2 +- src/pages/AttractionDetailsPage.tsx | 8 ++------ src/pages/AttractionsPage.tsx | 8 ++------ src/pages/MelbournePage.tsx | 9 ++++++--- src/pages/ProfilePage.tsx | 8 ++------ 8 files changed, 29 insertions(+), 34 deletions(-) create mode 100644 src/components/LoadingSpinner.tsx diff --git a/src/components/CitySelectionDialog.tsx b/src/components/CitySelectionDialog.tsx index e4d6503..e087e4e 100644 --- a/src/components/CitySelectionDialog.tsx +++ b/src/components/CitySelectionDialog.tsx @@ -7,6 +7,7 @@ import { Input } from './ui/input'; import { motion, AnimatePresence } from 'motion/react'; import { ImageWithFallback } from './figma/ImageWithFallback'; import { useGetCityListWithBannerQuery } from '../Redux/services/cities.service'; +import LoadingSpinner from './LoadingSpinner'; interface City { id: number; @@ -35,12 +36,7 @@ export function CitySelectionDialog({ if (isLoading) { return ( -
-
-
-

Loading...

-
-
+ ); } diff --git a/src/components/LandingUpcomingCities.tsx b/src/components/LandingUpcomingCities.tsx index cd15393..c5c70a1 100644 --- a/src/components/LandingUpcomingCities.tsx +++ b/src/components/LandingUpcomingCities.tsx @@ -4,6 +4,7 @@ import { Button } from './ui/button'; import { useRef, useState, useEffect } from 'react'; import Image592Traced from '../imports/Image592Traced-5025-559'; import { useGetUpcomingCitiesQuery } from '../Redux/services/cities.service'; +import LoadingSpinner from './LoadingSpinner'; // const upcomingCities = [ // { @@ -115,12 +116,7 @@ export function LandingUpcomingCities() { if (isLoading) { return ( -
-
-
-

Loading...

-
-
+ ); } diff --git a/src/components/LoadingSpinner.tsx b/src/components/LoadingSpinner.tsx new file mode 100644 index 0000000..bde2706 --- /dev/null +++ b/src/components/LoadingSpinner.tsx @@ -0,0 +1,12 @@ +const LoadingSpinner = () => { + return ( +
+
+
+

Loading...

+
+
+ ) +} + +export default LoadingSpinner \ No newline at end of file diff --git a/src/components/MelbourneCardComparison.tsx b/src/components/MelbourneCardComparison.tsx index e32bdaa..5258954 100644 --- a/src/components/MelbourneCardComparison.tsx +++ b/src/components/MelbourneCardComparison.tsx @@ -253,7 +253,7 @@ export function MelbourneCardComparison({ onCheckoutClick,cards }: MelbourneCard
- -
+ Start Saving Now + +
+
- {/* Decorative elements */} -
-
- + {/* Decorative elements */} +
+
+ - {/* Trusted By Companies Section */} -
-
-
-
-

- Trusted by the - world's best -

-

- Join thousands of savvy travelers enjoying massive savings on premium experiences -

-
- -
-
-
- - {/* Featured Super Savings Section */} -
-
- -

- Featured{' '} - - Super Savings - + {/* Trusted By Companies Section */} +
+
+
+
+

+ Trusted by the + world's best

-

- Check out our biggest discounts and start saving on premium experiences +

+ Join thousands of savvy travelers enjoying massive savings on premium experiences

- +
+ +
+
+
-
-
- {/* Left Sidebar - Filters */} -
- -
- {/* Search by header */} -
-
-

Search by

-
+ {/* Featured Super Savings Section */} +
+
+ +

+ Featured{' '} + + Super Savings + +

+

+ Check out our biggest discounts and start saving on premium experiences +

+
- {/* Filter categories */} -
- {filterCategories.map(category => ( -
- toggleCategory(category.value)} - className="border-gray-400" - /> - -
- ))} -
+
+
+ {/* Left Sidebar - Filters */} +
+ +
+ {/* Search by header */} +
+
+

Search by

- -
- {/* Main Content */} -
- {/* Breadcrumb */} -
-

- {fromSource === 'passes' ? ( - <> - My Profile{'>'}My passes{'>'} - Super Savings - - ) : ( - <> - Our Products{'>'} - Super Savings - - )} -

-
- - {/* Header Section */} -
-

- Super Savings -

-

- Exclusive discounts up to 65% off on premium experiences -

-
- - {/* Savings Grid */} -
- {displayedSavings.map((saving, index) => ( - - - {/* Image */} -
- - - - {/* Discount Badge */} -
- {saving.discount} -
-
- - - {/* Business Name */} -
-
- {saving.business} -
- - {/* Title */} -

- {saving.title} -

- - {/* Saved Amount Display */} -
-
- - - {saving.savedAmount} - -
-
-
-
-
- ))} -
- - {/* Minimal Pagination */} -
-
- - -
- {[1, 2, 3].map((page) => ( - - ))} -
- - + {category.categoryName} ({category.offerCount}) + +
+ ))}
+
+
+ + {/* Main Content */} +
+ {/* Breadcrumb */} +
+

+ {fromSource === 'passes' ? ( + <> + My Profile{'>'}My passes{'>'} + Super Savings + + ) : ( + <> + Our Products{'>'} + Super Savings + + )} +

+
+ + {/* Header Section */} +
+

+ Super Savings +

+

+ Exclusive discounts up to 65% off on premium experiences +

+
+ + {/* Offers Grid */} +
+ {offers.map((offer: any, index: number) => ( + + + {/* Image */} +
+ + {/* */} + + {/* Discount Badge */} +
+ {offer.offerCode} +
+
+ + + {/* Business Name */} +
+
+ {offer.partnerName} +
+ + {/* Title */} +

+ {offer.description} +

+ + {/* Saved Amount Display */} +
+
+ {/* */} + + {offer.title} + +
+
+
+
+
+ ))} +
+ + {/* Minimal Pagination */} +
+
+ {/* Previous button */} + + + {/* Page numbers */} +
+ {Array.from({ length: totalPages }, (_, i) => i + 1).map(p => ( + + ))} +
+ + {/* Next button */} + +
- -
- -
-
- {/* How It Works Section */} -
- {/* Background decorative elements */} -
-
- -
- +
-
+
+

- {/* Categories Section */} -
- {/* Abstract Travel Patterns */} -
+ {/* How It Works Section */} +
+ {/* Background decorative elements */} +
+
-
- {/* Section Header */} -
- -
-
- Explore Collections -
-

- Curated for the Modern Traveler -

-

- Discover exclusive savings across our most sought-after travel categories. -

-
- - - - +
+ +
+
+ Simple Process +
+

+ Start Saving in Minutes +

+

+ Your journey to smarter travel and bigger savings begins with three simple steps. +

+
- {/* Bento Grid Layout */} -
- {categoriesData.map((category, index) => ( +
+ {/* Connecting line for desktop */} +
+ +
+ {[ + { + step: '01', + title: 'Unlock Access', + description: 'Get your CityCards pass to instantly activate membership perks.', + icon: MapPinned + }, + { + step: '02', + title: 'Discover Deals', + description: 'Browse exclusive offers on hotels, flights, and experiences.', + icon: Search + }, + { + step: '03', + title: 'Enjoy Savings', + description: 'Redeem discounts instantly and watch your travel budget grow.', + icon: Percent + } + ].map((item, index) => ( -
+ {/* Icon Container */} +
+
+
+ +
+
+ {index + 1} +
+
+ +

+ {item.title} +

+

+ {item.description} +

+
+
+ ))} +
+
+ + +
+
+ + {/* Categories Section */} +
+ {/* Abstract Travel Patterns */} +
+ +
+ {/* Section Header */} +
+ +
+
+ Explore Collections +
+

+ Curated for the Modern Traveler +

+

+ Discover exclusive savings across our most sought-after travel categories. +

+
+ + + + +
+ + {/* Bento Grid Layout */} +
+ {categoriesData.map((category, index) => ( + +
- {/* Background Gradient Hover */} -
+ > + {/* Background Gradient Hover */} +
- {/* Large Watermark Icon for visual depth */} - + {/* Large Watermark Icon for visual depth */} + -
-
-
+
+
- -
- - {category.savings} - +
- -

- {category.title} -

-

- {category.description} -

+ + {category.savings} +
-
- Explore Deals - -
+

+ {category.title} +

+

+ {category.description} +

- - ))} -
- {/* Mobile View All Button */} -
- -
+
+ Explore Deals + +
+
+
+ ))}
-
- {/* Access Your CityCards Section */} -
- -
+ {/* Mobile View All Button */} +
+ +
+
+ + + {/* Access Your CityCards Section */} +
+ +
+ +
+ + ); -
- - ); - } } From ce3c095727b588b728fc7f1038deb51346c95343 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Fri, 17 Apr 2026 14:45:03 +0530 Subject: [PATCH 29/91] show cards on the passes page coming from backend --- src/AppRouter.tsx | 4 +- src/components/Navbar.tsx | 12 +- src/pages/CheckoutPage.tsx | 2 - src/pages/PassesPage.tsx | 288 ++++++++++++++++++++++--------------- 4 files changed, 184 insertions(+), 122 deletions(-) diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index b3e28a0..12945be 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -106,7 +106,7 @@ export function AppRouter({ } /> {/* Attractions Routes */} - @@ -265,7 +265,7 @@ export function AppRouter({ } /> - diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 5568776..7e421a3 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -162,25 +162,25 @@ export default function Navbar({ // Position 1 { label: 'Attractions', - path: `/${slugify(cityName)}/attractions`, + path: `/attractions`, isShared: false }, // Position 2 { label: 'Magic Itinerary', - path: `/${slugify(cityName)}/magic-itinerary`, + path: `/magic-itinerary`, isShared: false }, // Position 3 { label: 'Super Savings', - path: `/${slugify(cityName)}/super-savings`, + path: `/super-savings`, isShared: false }, // Position 4 - Shared item { label: 'How It Works', - path: `/${slugify(cityName)}/how-it-works`, + path: `/how-it-works`, isShared: true, landingLabel: 'Discover', melbourneLabel: 'How It Works' @@ -188,14 +188,14 @@ export default function Navbar({ // Position 5 - Shared item { label: 'Your Card', - path: `/${slugify(cityName)}/passes`, + path: `/passes`, isShared: true, landingLabel: 'Your Card', melbourneLabel: 'Your Card' }, { label: 'Your Postcard', - path: `/${slugify(cityName)}/postcards`, + path: `/postcards`, isShared: true, landingLabel: 'Your Postcard', melbourneLabel: 'Your Postcard' diff --git a/src/pages/CheckoutPage.tsx b/src/pages/CheckoutPage.tsx index f34b555..235aa7e 100644 --- a/src/pages/CheckoutPage.tsx +++ b/src/pages/CheckoutPage.tsx @@ -12,8 +12,6 @@ import { Checkbox } from '../components/ui/checkbox'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../components/ui/select'; import { Badge } from '../components/ui/badge'; import { Textarea } from '../components/ui/textarea'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { Layout } from '../Layout'; diff --git a/src/pages/PassesPage.tsx b/src/pages/PassesPage.tsx index 154ac1e..171ca2e 100644 --- a/src/pages/PassesPage.tsx +++ b/src/pages/PassesPage.tsx @@ -11,6 +11,8 @@ import { LoginModal } from '../components/LoginModal'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { useAuth } from '../context/AuthContext'; import { useNavigate } from 'react-router-dom'; +import { useGetSelectedCityDetailsQuery } from '../Redux/services/cities.service'; +import LoadingSpinner from '../components/LoadingSpinner'; interface PassesPageProps { onCheckoutClick?: () => void; @@ -148,21 +150,29 @@ export function PassesPage({ onSignInClick, onSignOutClick, }: PassesPageProps) { - const [selectedPass, setSelectedPass] = useState('unlimited'); + const [selectedPass, setSelectedPass] = useState(passTypes[1].id); const [isLoginOpen, setIsLoginOpen] = useState(false); const { user } = useAuth(); // from AuthContext - const navigate= useNavigate() + const navigate = useNavigate() + const cityId = localStorage.getItem("cityId") + + const { data: cityDetails, isLoading: loadingCityDetails } = useGetSelectedCityDetailsQuery(cityId) + const cards = cityDetails?.city?.cards ?? [] + console.log(cards) + + if (loadingCityDetails) { + return () + } - - const handleCheckoutClick = () => { + const handleCheckoutClick = () => { console.log('Proceeding to checkout for user:', user); // Add your checkout logic here navigate('/checkout'); }; - const handleSignInClick = () => { + const handleSignInClick = () => { setIsLoginOpen(true); }; @@ -189,7 +199,7 @@ export function PassesPage({

- Buy Passes + Buy Cards

Skip the lines, save money, and explore more with our flexible city cards designed for modern travelers @@ -200,130 +210,184 @@ export function PassesPage({ {/* Pass Comparison Section */}

- {passTypes.map((pass) => ( -
- + {/* Flexi Pass Card */} +
+ setSelectedPass(passTypes[0].id)} + > +
+ {/* */} +
- {/* Popular Badge */} - {pass.popular && ( -
- - Most Popular - -
- )} + + + {cards[0].title} + + + {cards[0].description} + + - {/* Radio Button */} -
- + {/* Pricing */} +
+
+ + ${cards[0].adultPrice} + + + / {passTypes[0].period} +
- - {/* Header - Fixed Height */} - - - {pass.title} - - - {pass.description} - - - - {/* Attraction Images Grid */} -
-
-
- +
+ {cards[0].adultPrice && ( +
+ {/* Strikethrough price = originalPrice + $5 */} + + ${parseFloat(cards[0].adultPrice) + 5} + + + Save{" "} + {Math.round( + ((5) / (parseFloat(cards[0].adultPrice) + 5)) * 100 + )} + % +
-
- -
-
- -
-
- -
-
+ )}
+
- {/* Pricing Section - Fixed Height */} -
-
- {pass.price} - / {pass.period} -
-
- {pass.originalPrice && ( -
- {pass.originalPrice} - Save {Math.round(((parseFloat(pass.originalPrice.slice(1)) - parseFloat(pass.price.slice(1))) / parseFloat(pass.originalPrice.slice(1))) * 100)}% + + +
+
+ {passTypes[0].features.map((feature, index) => ( +
+ + {feature}
- )} + ))}
- {/* Content - Flexible Height with Fixed Features Area */} - - {/* Features List - Fixed height */} -
-
- {pass.features.slice(0, 6).map((feature, index) => ( -
- - {feature} -
- ))} +
+ +

+ ✓ Free cancellation up to 24 hours • Instant delivery +

+
+ + +
+ + {/* Unlimited Pass Card */} +
+ setSelectedPass(passTypes[1].id)} + + > + {passTypes[1].popular && ( +
+ + Most Popular + +
+ )} + +
+ {/* */} +
+ + + + {cards[1].title} + + + {cards[1].description} + + + + {/* Pricing */} +
+
+ ${cards[1].adultPrice} + / {passTypes[1].period} +
+
+ {cards[1].adultPrice && ( +
+ {/* Strikethrough price = originalPrice + $5 */} + + ${parseFloat(cards[1].adultPrice) + 5} + + + Save{" "} + {Math.round( + ((5) / (parseFloat(cards[1].adultPrice) + 5)) * 100 + )} + % +
-
+ )} +
+
- {/* CTA Button - Pushed to bottom */} -
- - -

- ✓ Free cancellation up to 24 hours • Instant delivery -

+ +
+
+ {passTypes[1].features.map((feature, index) => ( +
+ + {feature} +
+ ))}
- - -
- ))} +
+ +
+ +

+ ✓ Free cancellation up to 24 hours • Instant delivery +

+
+ + +
+ {/* Good to Know Section */}
From cdadee5df40960af2263c2e5e6f4a8f234b7d5b0 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Fri, 17 Apr 2026 15:56:35 +0530 Subject: [PATCH 30/91] remove calendar from attraction details page --- src/pages/AttractionDetailsPage.tsx | 126 +--------------------------- 1 file changed, 1 insertion(+), 125 deletions(-) diff --git a/src/pages/AttractionDetailsPage.tsx b/src/pages/AttractionDetailsPage.tsx index 53770f6..4c9f90c 100644 --- a/src/pages/AttractionDetailsPage.tsx +++ b/src/pages/AttractionDetailsPage.tsx @@ -258,131 +258,7 @@ export function AttractionDetailsPage({
{/* Right Sidebar - Calendar and Booking */} -
- {/* Calendar Widget with Custom Design */} - -
-

Select Date

-

Choose your preferred visit date

-
- - {/* Custom Calendar Design */} -
- {/* Calendar Header */} -
- - September 2025 - -
- - {/* Days of week */} -
-
Su
-
Mo
-
Tu
-
We
-
Th
-
Fr
-
Sa
-
- - {/* Calendar Grid */} -
- {/* Previous month */} - - - {/* Current month */} - {Array.from({ length: 30 }, (_, i) => { - const day = i + 1; - const isSelected = day === 27; - const isToday = day === 15; - return ( - - ); - })} - - {/* Next month */} - {Array.from({ length: 4 }, (_, i) => ( - - ))} -
-
- - {/* Selected Date Display */} -
-
- -
-

Selected Date

-

September 27, 2025

-
-
-
-
- - {/* Pricing Card */} - -
-
- Adult Ticket - {attraction.ticketPriceAdult} -
-
- Service Fee - $5 -
-
-
- Total - ${attraction.ticketPriceAdult + 5} -
-
-
-
- - {/* Confirm Booking Button */} - - - {/* Trust Indicators */} -
-
- - Instant Confirmation -
-
- - Free Cancellation -
-
-
+
From 27d73fa90c371e74f2eb88757f3ef78e65434b0c Mon Sep 17 00:00:00 2001 From: Hemant Vishwakarma Date: Fri, 17 Apr 2026 19:13:43 +0530 Subject: [PATCH 31/91] super savings details page added --- src/AppRouter.tsx | 8 + src/Redux/services/cities.service.ts | 8 +- src/pages/AttractionDetailsPage.tsx | 13 +- src/pages/SuperSavingsDetailsPage.tsx | 387 ++++++++++++++++++++++++++ src/pages/SuperSavingsPage.tsx | 5 +- 5 files changed, 407 insertions(+), 14 deletions(-) create mode 100644 src/pages/SuperSavingsDetailsPage.tsx diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index 12945be..0683ff4 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -32,6 +32,7 @@ import { SuperSavingsPage } from './pages/SuperSavingsPage'; import { WhatsIncluded } from './pages/WhatsIncluded'; import { LandingMagicItineraryPage } from './pages/LandingMagicItineraryPage'; import { DiscoverPage } from './pages/DiscoverPage'; +import { SuperSavingsDetailsPage } from './pages/SuperSavingsDetailsPage'; // User type definition interface User { @@ -270,6 +271,13 @@ export function AppRouter({ } /> + + + navigate(-1)} /> + + } /> diff --git a/src/Redux/services/cities.service.ts b/src/Redux/services/cities.service.ts index acc5b31..c064904 100644 --- a/src/Redux/services/cities.service.ts +++ b/src/Redux/services/cities.service.ts @@ -41,7 +41,13 @@ export const citiesApi = createApi({ return `/website/super-savings/list/offers?${params.toString()}`; } }), + + getOfferDetailsById: builder.query({ + query: (id: number) => `/website/super-savings/list/offers/${id}`, + }), + + }), }); -export const { useGetCityListWithBannerQuery, useGetUpcomingCitiesQuery, useGetSelectedCityDetailsQuery, useGetSelectedCityOffersQuery } = citiesApi; \ No newline at end of file +export const { useGetCityListWithBannerQuery, useGetUpcomingCitiesQuery, useGetSelectedCityDetailsQuery, useGetSelectedCityOffersQuery, useGetOfferDetailsByIdQuery } = citiesApi; \ No newline at end of file diff --git a/src/pages/AttractionDetailsPage.tsx b/src/pages/AttractionDetailsPage.tsx index 64223b9..4c9f90c 100644 --- a/src/pages/AttractionDetailsPage.tsx +++ b/src/pages/AttractionDetailsPage.tsx @@ -1,25 +1,14 @@ -import { ArrowLeft, Calendar, Check, ChevronLeft, ChevronRight, Clock, MapPin, Users, X } from 'lucide-react'; +import { useState } from 'react'; import { motion } from 'motion/react'; -<<<<<<< HEAD:src/components/AttractionDetailsPage.tsx -======= import { ArrowLeft, Clock, Users, Calendar, MapPin, Star, Check, X, ChevronLeft, ChevronRight } from 'lucide-react'; import { Button } from '../components/ui/button'; import { Badge } from '../components/ui/badge'; import { Card, } from '../components/ui/card'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { Layout } from '../Layout'; ->>>>>>> cdadee5df40960af2263c2e5e6f4a8f234b7d5b0:src/pages/AttractionDetailsPage.tsx import { useParams } from 'react-router-dom'; -import { Layout } from '../Layout'; import { useGetAttractionDetailsByIdQuery } from '../Redux/services/attractions.service'; -<<<<<<< HEAD:src/components/AttractionDetailsPage.tsx -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { Badge } from './ui/badge'; -import { Button } from './ui/button'; -import { Card, } from './ui/card'; -======= import LoadingSpinner from '../components/LoadingSpinner'; ->>>>>>> cdadee5df40960af2263c2e5e6f4a8f234b7d5b0:src/pages/AttractionDetailsPage.tsx interface AttractionDetailsPageProps { onBackClick: () => void; diff --git a/src/pages/SuperSavingsDetailsPage.tsx b/src/pages/SuperSavingsDetailsPage.tsx new file mode 100644 index 0000000..23c3988 --- /dev/null +++ b/src/pages/SuperSavingsDetailsPage.tsx @@ -0,0 +1,387 @@ +import { ArrowLeft, Check, Clock, MapPin, Users, X } from 'lucide-react'; +import { motion } from 'motion/react'; +import { useParams } from 'react-router-dom'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import LoadingSpinner from '../components/LoadingSpinner'; +import { Badge } from '../components/ui/badge'; +import { Button } from '../components/ui/button'; +import { Card } from '../components/ui/card'; +import { Layout } from '../Layout'; +import { useGetOfferDetailsByIdQuery } from '../Redux/services/cities.service'; + +interface SuperSavingsDetailsPageProps { + onBackClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + user?: { email: string; name: string } | null; +} + +export function SuperSavingsDetailsPage({ + onBackClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + user, +}: SuperSavingsDetailsPageProps) { + const { id } = useParams(); + const { data: offer, isLoading } = useGetOfferDetailsByIdQuery(Number(id)); + const baseUrl = import.meta.env.VITE_BASE_URL; + + + if (isLoading) { + return ; + } + + // Guard against missing data – but keep all UI elements + const safeOffer = offer || { + id: 0, + title: 'Offer Details', + description: 'No description available.', + cityXid: 0, + cardXid: 0, + cardTypeXid: 0, + categoryXid: 0, + partnerName: '', + offerCode: '', + websiteBannerImage: '', + mobileBannerImage: '', + redemptionLink: '', + passType: '', + startDateTime: null, + endDateTime: null, + applyToPasses: false, + stepsForBooking: null, + offerStatus: '', + isActive: true, + createdAt: '', + updatedAt: '', + city: { id: 0, cityName: 'Unknown City' }, + card: { id: 0, title: 'Unknown Card' }, + cardType: { id: 0, cardTypeDisplayName: 'Standard' }, + category: { id: 0, categoryName: 'General' }, + }; + + // Build badges from available API data (preserves the badge UI section) + const superSavingsBadges = [ + safeOffer.category && { badgeXid: safeOffer.category.id, badge: { badgeName: safeOffer.category.categoryName } }, + safeOffer.cardType && { badgeXid: safeOffer.cardType.id, badge: { badgeName: safeOffer.cardType.cardTypeDisplayName } }, + safeOffer.offerCode && { badgeXid: -1, badge: { badgeName: `Code: ${safeOffer.offerCode}` } }, + safeOffer.offerStatus && { badgeXid: -2, badge: { badgeName: safeOffer.offerStatus.toUpperCase() } }, + ].filter(Boolean); + + // Build gallery array from banner images (original expected superSavingsGalleries) + const superSavingsGalleries = []; + if (safeOffer.websiteBannerImage) { + superSavingsGalleries.push({ id: 1, filePathUrl: safeOffer.websiteBannerImage }); + } + if (safeOffer.mobileBannerImage) { + superSavingsGalleries.push({ id: 2, filePathUrl: safeOffer.mobileBannerImage }); + } + // If no images, add a placeholder + if (superSavingsGalleries.length === 0) { + superSavingsGalleries.push({ id: 0, filePathUrl: 'https://placehold.co/1200x800?text=No+Image' }); + } + + // Mock data for sections not present in API (preserve structure but show empty/fallback) + const durations = safeOffer.startDateTime && safeOffer.endDateTime + ? Math.round((new Date(safeOffer.endDateTime).getTime() - new Date(safeOffer.startDateTime).getTime()) / (1000 * 60)) + : 'Not specified'; + const groupSize = 'Not specified'; + const ageRange = 'All ages'; + const superSavingsLanguages: any[] = []; // API has no language data + const superSavingsHighlights: any[] = []; // API has no highlights + // Inclusions: API has none, so show empty state (or we could derive from redemptionLink etc.) + const superSavingsInclusions: any[] = []; + const address = safeOffer.city?.cityName || 'Location not specified'; + + return ( + +
+ {/* Back Button */} + + + + + {/* Title and Badges Section */} +
+
+ {superSavingsBadges.map((badge: any, index: number) => ( + + {badge.badge.badgeName} + + ))} +
+ +

+ + {safeOffer.title} + {' '} + + Day Trip by {safeOffer.partnerName || safeOffer.card?.title || 'Partner'} + +

+
+ + {/* Image Gallery Section - preserved exactly as original */} +
+ {/* Main large image */} +
+ +
+ + {/* Gallery images - use remaining images or repeat first if needed */} + {superSavingsGalleries.slice(1, 5).map((image: any) => ( +
+ +
+ ))} + {/* If less than 4 extra images, fill with placeholders to maintain grid */} + {superSavingsGalleries.slice(1, 5).length < 4 && + Array(4 - superSavingsGalleries.slice(1, 5).length) + .fill(null) + .map((_, idx) => ( +
+
+ No Image +
+
+ ))} +
+ + {/* Main Content Grid */} +
+ {/* Left Content - Tour Details */} +
+ {/* Overview Cards - preserved */} +
+ {/* Duration */} + +
+ +
+

Duration

+

+ {typeof durations === 'number' ? `${durations} mins` : durations} +

+
+ + {/* Group Size */} + +
+ +
+

Group Size

+

{groupSize}

+
+ + {/* Age Range */} + +
+ +
+

Age Range

+

{ageRange}

+
+ + {/* Languages */} + +
+ +
+

Languages

+

+ {superSavingsLanguages?.length > 0 + ? superSavingsLanguages?.map((lang: any) => lang.language.name).join(', ') + : 'English (default)'} +

+
+
+ + {/* Tour Overview */} +
+
+
+

+ Tour Overview +

+
+

+ {safeOffer.description} +

+
+ + {/* Tour Highlights - preserved even if empty */} +
+
+
+

+ Tour Highlights +

+
+ {superSavingsHighlights.length > 0 ? ( +
    + {superSavingsHighlights.map((highlight: any) => ( +
  • +
    +
    +
    + {highlight.title} +
  • + ))} +
+ ) : ( +

No highlights listed for this offer.

+ )} +
+ + {/* What's Included/Not Included - preserved */} +
+
+
+

+ What's included +

+
+
+ {/* Included */} +
+

+ + Included +

+ {superSavingsInclusions.filter((inc: any) => inc.isInclusion === true).length > 0 ? ( + superSavingsInclusions + .filter((inclusion: any) => inclusion.isInclusion === true) + .map((inclusion: any) => ( +
+
+ +
+ {inclusion.title} +
+ )) + ) : ( +

No included items specified.

+ )} +
+ + {/* Not Included */} +
+

+ + Not Included +

+ {superSavingsInclusions.filter((inc: any) => inc.isInclusion === false).length > 0 ? ( + superSavingsInclusions + .filter((inclusion: any) => inclusion.isInclusion === false) + .map((inclusion: any) => ( +
+
+ +
+ {inclusion.title} +
+ )) + ) : ( +

No excluded items specified.

+ )} +
+
+
+ + {/* Location on map - preserved */} +
+
+
+

+ Location on map +

+
+
+
+
+ +
+

Interactive Map

+

{safeOffer.title}

+

{address}

+
+
+
+
+ + {/* Right Sidebar - Calendar and Booking (preserved, but you can add a real calendar if needed) */} +
+ +

Book This Offer

+
+
+ Availability + + {safeOffer.offerStatus === 'active' ? 'Available' : 'Unavailable'} + +
+ {safeOffer.startDateTime && ( +
+ Valid from + + {new Date(safeOffer.startDateTime).toLocaleDateString()} + +
+ )} + {safeOffer.endDateTime && ( +
+ Valid until + + {new Date(safeOffer.endDateTime).toLocaleDateString()} + +
+ )} +
+ +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/pages/SuperSavingsPage.tsx b/src/pages/SuperSavingsPage.tsx index 8b9e680..40be9f3 100644 --- a/src/pages/SuperSavingsPage.tsx +++ b/src/pages/SuperSavingsPage.tsx @@ -17,6 +17,7 @@ import { TrustedCompanies } from '../components/TrustedCompanies'; import { Layout } from '../Layout'; import { useGetSelectedCityOffersQuery } from '../Redux/services/cities.service'; import LoadingSpinner from '../components/LoadingSpinner'; +import { useNavigate } from 'react-router-dom'; interface SuperSavingsPageProps { onBackClick: () => void; @@ -113,6 +114,7 @@ export function SuperSavingsPage({ user }: SuperSavingsPageProps) { + const navigate = useNavigate(); const [categoryId, setCategoryId] = useState(null) const [page, setPage] = useState(1) const [limit, setLimit] = useState(4) @@ -302,7 +304,8 @@ export function SuperSavingsPage({ animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5, delay: index * 0.1 }} > - + navigate(`/super-savings/${offer.id}`)}> {/* Image */}
Date: Sun, 19 Apr 2026 11:46:13 +0530 Subject: [PATCH 32/91] import cart page and payment page code from figma --- src/AppRouter.tsx | 13 + src/components/Navbar.tsx | 7 +- src/pages/CartPage.tsx | 877 +++++++++++++++++++++++++++++++ src/pages/PaymentDetailsPage.tsx | 494 +++++++++++++++++ 4 files changed, 1388 insertions(+), 3 deletions(-) create mode 100644 src/pages/CartPage.tsx create mode 100644 src/pages/PaymentDetailsPage.tsx diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index 12945be..aa6c388 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -32,6 +32,8 @@ import { SuperSavingsPage } from './pages/SuperSavingsPage'; import { WhatsIncluded } from './pages/WhatsIncluded'; import { LandingMagicItineraryPage } from './pages/LandingMagicItineraryPage'; import { DiscoverPage } from './pages/DiscoverPage'; +import { CartPage } from './pages/CartPage'; +import { PaymentDetailsPage } from './pages/PaymentDetailsPage'; // User type definition interface User { @@ -270,6 +272,17 @@ export function AppRouter({ } /> + + + + + } /> + + + + } /> diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 7e421a3..e1444e5 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -656,7 +656,7 @@ export default function Navbar({ /> {/* Shopping Cart */} - setActiveCartDropdown(prev => !prev)} @@ -674,7 +674,8 @@ export default function Navbar({
} - /> + /> */} + navigate("/cart-page")} /> {/* Enhanced City Card Button with Source Tracking */}
@@ -690,7 +691,7 @@ export default function Navbar({ label: 'My Profile', icon: , action: () => { - navigate(citySelected?`/${slugify(cityName)}/profile`:'/profile'); + navigate(citySelected ? `/${slugify(cityName)}/profile` : '/profile'); setActiveUserDropdown(false); } }, diff --git a/src/pages/CartPage.tsx b/src/pages/CartPage.tsx new file mode 100644 index 0000000..497f6ec --- /dev/null +++ b/src/pages/CartPage.tsx @@ -0,0 +1,877 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { + Users, Baby, ShoppingBag, Trash2, Check, CreditCard, Mail, + ChevronRight, ChevronDown, Minus, Plus, Calendar, ArrowLeft, MapPin, + Zap, Shield, Clock, Percent, Sparkles +} from 'lucide-react'; +import Navbar from './Navbar'; +import { Footer } from './Footer'; +import { ImageWithFallback } from './figma/ImageWithFallback'; +import { CheckoutStepper } from './CheckoutStepper'; +import imgRectangle26 from "figma:asset/2496f45326066d3adf0d5494c1dc1595575894ff.png"; + +/* ─── Types ─── */ +export interface CartItem { + id: string; + city: string; + cardType: 'Flexi' | 'Unlimited'; + days: number; + adults: number; + children: number; + quantity: number; + pricePerUnit: number; + image: string; +} + +interface Attraction { + id: string; + name: string; + image: string; + category: string; + included: boolean; +} + +interface CartPageProps { + onBackClick: () => void; + onHomeClick: () => void; + onPassesClick: () => void; + onCheckoutClick?: () => void; + onSecureCheckoutClick?: (item: CartItem) => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + onAttractionsClick?: () => void; + onBlogsClick?: () => void; + onHowItWorksClick?: () => void; + onFAQClick?: () => void; + onPrivacyPolicyClick?: () => void; + onAboutUsClick?: () => void; + onProfileClick?: () => void; + onCityCardsClick?: () => void; + onMagicItineraryClick?: () => void; + onPostCardsClick?: () => void; + onOffersClick?: () => void; + onSuperSavingsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + onContactUsClick?: () => void; + onCartClick?: () => void; + currentPage?: string; + user?: { email: string; name: string } | null; +} + +/* ─── Data ─── */ +const initialCartItems: CartItem[] = [ + { + id: '1', city: 'Melbourne', cardType: 'Flexi', days: 3, adults: 3, children: 3, quantity: 2, pricePerUnit: 49.50, + image: 'https://images.unsplash.com/photo-1655963754904-2cf2b562a681?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBmbGluZGVycyUyMHN0YXRpb24lMjBzdW5zZXR8ZW58MXx8fHwxNzc2MzE5NDgzfDA&ixlib=rb-4.1.0&q=80&w=1080', + }, + { + id: '2', city: 'Sydney', cardType: 'Flexi', days: 3, adults: 3, children: 3, quantity: 2, pricePerUnit: 49.50, + image: 'https://images.unsplash.com/photo-1695018228065-2e0026c654af?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBvcGVyYSUyMGhvdXNlJTIwaGFyYm91ciUyMGJyaWRnZXxlbnwxfHx8fDE3NzYzMTk0ODN8MA&ixlib=rb-4.1.0&q=80&w=1080', + }, + { + id: '3', city: 'Melbourne', cardType: 'Unlimited', days: 6, adults: 2, children: 1, quantity: 1, pricePerUnit: 79.00, + image: 'https://images.unsplash.com/photo-1705120624704-0970afc29fea?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBzdHJlZXQlMjBhcnQlMjBsYW5ld2F5c3xlbnwxfHx8fDE3NzYzMTk0ODR8MA&ixlib=rb-4.1.0&q=80&w=1080', + }, +]; + +const dayOptions = [3, 6, 12, 18, 24]; + +const attractionsData: Record> = { + Melbourne: { + Flexi: [ + { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, + { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + ], + Unlimited: [ + { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, + { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + { id: 'mel-5', name: 'Melbourne Star Wheel', image: 'https://images.unsplash.com/photo-1769880659692-fa77e04c5ffa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxvYnNlcnZhdGlvbiUyMHdoZWVsJTIwYW11c2VtZW50JTIwbmlnaHR8ZW58MXx8fHwxNzc2MzE5OTc2fDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + { id: 'mel-6', name: 'Penguin Parade', image: 'https://images.unsplash.com/photo-1670391050251-d1cfbc3891c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxwZW5ndWlucyUyMHdpbGRsaWZlJTIwbmF0dXJlfGVufDF8fHx8MTc3NjMxOTk3Nnww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-7', name: 'Yarra River Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + ], + }, + Sydney: { + Flexi: [ + { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, + { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + ], + Unlimited: [ + { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, + { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + { id: 'syd-4', name: 'Sydney Harbour Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + { id: 'syd-5', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + ], + }, +}; + +const offersData: Record = { + Flexi: [ + { title: 'Astor Hotels Ultra Deluxe', description: '15% Discount on all treatments for first-time clients', image: 'https://images.unsplash.com/photo-1715191904112-4a5d9c3089fa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxsdXh1cnklMjBob3RlbCUyMHJlc29ydCUyMGV4dGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2MXww&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Green Valley Spa Lux', description: '20% Off on membership plans for new members', image: 'https://images.unsplash.com/photo-1759216853079-831ef8c8b327?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzcGElMjB3ZWxsbmVzcyUyMHRyZWF0bWVudCUyMGludGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2M3ww&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Harbour Dining Co.', description: '10% Off your first dining experience at waterfront', image: 'https://images.unsplash.com/photo-1676471932681-45fa972d848a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyZXN0YXVyYW50JTIwZmluZSUyMGRpbmluZ3xlbnwxfHx8fDE3NzYzMTkxNDl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'National Gallery Exhibition', description: 'Free audio guide with every gallery visit', image: 'https://images.unsplash.com/photo-1569342380852-035f42d9ca41?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtdXNldW0lMjBnYWxsZXJ5JTIwZXhoaWJpdGlvbnxlbnwxfHx8fDE3NzYyNDYwMjh8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Sunset Harbour Cruise', description: 'Complimentary drink on every sunset cruise booking', image: 'https://images.unsplash.com/photo-1765783800962-83d99ff7b158?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxjcnVpc2UlMjBib2F0JTIwaGFyYm9yJTIwdG91cnxlbnwxfHx8fDE3NzYzMjE2MDd8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + ], + Unlimited: [ + { title: 'SkyView Ferris Wheel', description: 'Complimentary second ride for all pass holders', image: 'https://images.unsplash.com/photo-1626209025747-b41ee6ec191f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxmZXJyaXMlMjB3aGVlbCUyMGFtdXNlbWVudCUyMHBhcmt8ZW58MXx8fHwxNzc2MzE3NDI2fDA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'City Mall Boutique', description: '15% Off at select boutique stores with your pass', image: 'https://images.unsplash.com/photo-1567966689299-819568579d36?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzaG9wcGluZyUyMG1hbGwlMjBib3V0aXF1ZSUyMHJldGFpbHxlbnwxfHx8fDE3NzYzMjEzNjN8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Adventure Outfitters', description: 'Free gear rental on outdoor adventure bookings', image: 'https://images.unsplash.com/photo-1761131221577-0716baffc6ef?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhZHZlbnR1cmUlMjBzcG9ydHMlMjBvdXRkb29yJTIwYWN0aXZpdHl8ZW58MXx8fHwxNzc2MzIxMzYzfDA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Skyline Rooftop Lounge', description: 'Buy one get one free on signature cocktails', image: 'https://images.unsplash.com/photo-1642114955097-8f3d0e141641?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyb29mdG9wJTIwYmFyJTIwY2l0eSUyMHNreWxpbmUlMjBuaWdodHxlbnwxfHx8fDE3NzYyNDU2NTl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Yarra Valley Wines', description: 'Exclusive wine tasting tour with pass holders discount', image: 'https://images.unsplash.com/photo-1764649841527-c8852b63cc53?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHx3aW5lJTIwdGFzdGluZyUyMHZpbmV5YXJkJTIwY2VsbGFyfGVufDF8fHx8MTc3NjMyMTYwOHww&ixlib=rb-4.1.0&q=80&w=1080' }, + ], +}; + +const priceTable: Record> = { + Flexi: { 3: 49.5, 6: 69, 12: 99, 18: 129, 24: 159 }, + Unlimited: { 3: 79, 6: 109, 12: 149, 18: 189, 24: 229 }, +}; + +/* ═══════════════════════════════════════════ + FIGMA CARD TYPE COMPONENTS + ═══════════════════════════════════════════ */ + +function FlexiCardPreview({ city, adultPrice, childPrice, isSelected }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean }) { + return ( +
+ {/* Card bg */} +
+ {/* City image */} +
+ +
+ {/* City name - left aligned */} +
+

{city}

+
+ {/* Pricing */} +
+
+ From + ${adultPrice} + /Adult +
+
+ and + ${childPrice} + /Child +
+
+ {/* Description */} +
+

+ Dive into an extensive selection of thrilling destinations! +

+
+ {/* Side tab - Flexi (pink) */} +
+ Card + Flexi +
+ {/* Selected checkmark */} + {isSelected && ( +
+ +
+ )} +
+ ); +} + +function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean }) { + return ( +
+ {/* Card bg */} +
+ {/* City image */} +
+ +
+ {/* City name - left aligned */} +
+

{city}

+
+ {/* Pricing */} +
+
+ From + ${adultPrice} + /Adult +
+
+ and + ${childPrice} + /Child +
+
+ {/* Description */} +
+

+ Dive into an extensive selection of thrilling destinations! +

+
+ {/* Side tab - Unlimited (coral) */} +
+ Card + Unlimited +
+ {/* Selected checkmark */} + {isSelected && ( +
+ +
+ )} +
+ ); +} + +/* ═══════════════════════════════════════════ + CHECKOUT CONFIGURATION CARD (Mobile-first) + ═══════════════════════════════════════════ */ + +function CheckoutConfigCard({ + item, + onChange, + onProceed, +}: { + item: CartItem; + onChange: (updates: Partial) => void; + onProceed: () => void; +}) { + const [daysOpen, setDaysOpen] = useState(false); + const originalPrice = (item.pricePerUnit * item.quantity * 1.35); + const totalPrice = item.pricePerUnit * item.quantity; + + return ( +
+ {/* City header */} +
+

{item.city}

+
+ + {item.cardType} Card + +
+
+ + {/* Configuration rows */} +
+ {/* No. of Adults */} +
+ No. of Adults +
+ + {item.adults} + +
+
+ + {/* No. of Children */} +
+ No. of Children +
+ + {item.children} + +
+
+ + {/* No. of Days (dropdown) */} +
+ + {item.cardType === 'Flexi' ? 'No. of Attractions' : 'No. of Days'} + +
+ + + {daysOpen && ( + + {dayOptions.map((d) => ( + + ))} + + )} + +
+
+ + {/* You Pay */} +
+ You Pay +
+ + ${originalPrice.toFixed(0)} + + + ${totalPrice.toFixed(0)} + +
+
+
+ + {/* Proceed button */} +
+ + Proceed to Pay + +
+
+ ); +} + +/* ═══════════════════════════════════════════ + MAIN CART PAGE + ═══════════════════════════════════════════ */ + +export function CartPage({ + onBackClick, + onHomeClick, + onPassesClick, + onCheckoutClick, + onSecureCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onSuperSavingsClick, + onEsimsClick, + onHotelDiscountsClick, + onContactUsClick, + onCartClick, + currentPage, + user, +}: CartPageProps) { + const [activeTab, setActiveTab] = useState<'cards' | 'postcards'>('cards'); + const [cartItems, setCartItems] = useState(initialCartItems); + const [selectedCardId, setSelectedCardId] = useState(null); + const [view, setView] = useState<'cart' | 'checkout'>('cart'); + const [checkoutItem, setCheckoutItem] = useState(null); + + const handleRemoveItem = (id: string) => { + setCartItems(prev => prev.filter(item => item.id !== id)); + if (selectedCardId === id) setSelectedCardId(null); + }; + + const handleSelectCard = (id: string) => { + setSelectedCardId(prev => (prev === id ? null : id)); + }; + + const handleGoToCheckout = () => { + const item = cartItems.find(i => i.id === selectedCardId); + if (item) { + setCheckoutItem({ ...item }); + setView('checkout'); + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + }; + + const handleBackToCart = () => { + setView('cart'); + setCheckoutItem(null); + }; + + const handleCheckoutItemChange = (updates: Partial) => { + if (!checkoutItem) return; + const updated = { ...checkoutItem, ...updates }; + const prices = priceTable[updated.cardType]; + if (prices && prices[updated.days] !== undefined) { + updated.pricePerUnit = prices[updated.days]; + } + setCheckoutItem(updated); + }; + + const isEmpty = cartItems.length === 0; + const selectedItem = cartItems.find(i => i.id === selectedCardId); + const attractions = checkoutItem ? (attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []) : []; + const offers = checkoutItem ? (offersData[checkoutItem.cardType] || []) : []; + + return ( +
+ {}} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} onCheckoutClick={onCheckoutClick} onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} onBlogsClick={onBlogsClick} onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} onPrivacyPolicyClick={onPrivacyPolicyClick} onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} onCityCardsClick={onCityCardsClick} onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} onOffersClick={onOffersClick} onSuperSavingsClick={onSuperSavingsClick} + onEsimsClick={onEsimsClick} onHotelDiscountsClick={onHotelDiscountsClick} onCartClick={onCartClick} + currentPage={currentPage as any} user={user} + /> + + + {view === 'cart' ? ( + /* ─── CART VIEW ─── */ + + {/* Header */} +
+

+ Your{' '} + Cart +

+

+ {isEmpty ? 'Your cart is empty' : `${cartItems.length} ${cartItems.length === 1 ? 'item' : 'items'} in your cart`} +

+
+ + {/* Tab switcher */} + {/* Cards listed directly below */} + + {/* Content */} + + {activeTab === 'cards' ? ( + + {isEmpty ? ( + } title="No cards in your cart" description="Browse our city passes to unlock amazing experiences and savings on your next adventure" actionLabel="Explore Passes" onAction={onPassesClick} /> + ) : ( +
+ {/* Table header (desktop) */} +
+
City Cards
+
Travellers
+
Qty
+
Price
+
+
+ + + {cartItems.map((item) => { + const isSelected = selectedCardId === item.id; + const totalPrice = item.pricePerUnit * item.quantity; + + return ( + handleSelectCard(item.id)} + className={`relative bg-white rounded-2xl overflow-hidden cursor-pointer transition-all duration-300 ${ + isSelected ? 'ring-2 ring-[#F95F62] shadow-lg shadow-[#F95F62]/8' : 'ring-1 ring-gray-100 hover:ring-gray-200 hover:shadow-md' + }`} + > + {/* Selected badge */} + + {isSelected && ( + + + + )} + + + {/* Mobile layout */} +
+
+ +
+
+
+
+
{item.city}
+
+ {item.cardType} + {item.days}d +
+
+ +
+
+ {item.adults}A · {item.children}C · Qty {item.quantity} +
+ ${totalPrice.toFixed(2)} + {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)}/ea} +
+
+
+
+ + {/* Desktop layout */} +
+
+
+ +
+
+
{item.city}
+
+ {item.cardType} Card + {item.days} days +
+
+
+
+
+ {item.adults} + {item.children} +
+
+
+ {item.quantity} +
+
+ ${totalPrice.toFixed(2)} + {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)} per unit} +
+
+ +
+
+
+ ); + })} +
+ + {/* Bottom checkout bar */} + +
+ {selectedItem ? ( + <> +

+ Selected: {selectedItem.city} {selectedItem.cardType} · {selectedItem.days}d · Qty {selectedItem.quantity} +

+

+ ${(selectedItem.pricePerUnit * selectedItem.quantity).toFixed(2)} +

+ + ) : ( +

Tap a card above to select it for checkout

+ )} +
+ + Secure Checkout + +
+
+ )} + + ) : ( + + } title="No post cards yet" description="Send beautiful digital post cards to friends and family from your favourite destinations around the world" actionLabel="Browse Post Cards" onAction={onPostCardsClick} /> + + )} + + + ) : ( + /* ─── CHECKOUT VIEW ─── */ + + {checkoutItem && ( + <> + {/* Back */} + + + {/* Stepper */} + + + {/* Checkout heading */} +
+

+ Checkout{' '} + {checkoutItem.city} +

+ +
+ +
+ {/* Left column */} +
+ + {/* ── Card Type Selection (Figma cards) ── */} +
+

+ Choose Your Card +

+

+ Select the card type that best suits your travel style +

+
+ {/* Flexi */} + + + {/* Unlimited */} + +
+ + {/* ── Config Card (mobile only) — right after card selection ── */} +
+ checkoutItem && onSecureCheckoutClick?.(checkoutItem)} + /> +
+ + {/* Features Comparison */} +
+
+ {/* Header */} +

Features

+

Flexi

+

Unlimited

+ {[ + { feature: 'Access to attractions', flexi: true, unlimited: true }, + { feature: 'Entry to attractions', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: true, unlimited: true }, + { feature: 'Entry to sites', flexi: false, unlimited: true }, + { feature: 'Access to venues', flexi: true, unlimited: true }, + { feature: 'Entry to events', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: false, unlimited: true }, + { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, + { feature: 'Access to postcard creation', flexi: false, unlimited: true }, + ].map((row, i) => ( + +

+ {row.feature} +

+
+ {row.flexi ? ( +
+ +
+ ) : ( + + )} +
+
+ {row.unlimited ? ( +
+ +
+ ) : ( + + )} +
+
+ ))} +
+
+
+ + {/* ── Offers ── */} +
+

+ {checkoutItem.cardType} Card Offers +

+

+ Exclusive deals and discounts included with your {checkoutItem.cardType} pass +

+
+ {offers.map((offer, idx) => ( +
+
+
+ +
+
+

+ {offer.title} +

+
+
+

+ {offer.description} +

+
+
+
+
+ ))} +
+
+ + {/* ── Available Attractions ── */} +
+
+

Available Attractions

+ {attractions.length} included +
+

+ Explore all the experiences you can enjoy with your pass +

+
+ {attractions.map((a) => ( +
+
+ +
+
+ {a.category} +
+
+
{a.name}
+
+ +
+
+ ))} +
+
+
+ + {/* Right column: Config card (desktop only, sticky) */} +
+
+ checkoutItem && onSecureCheckoutClick?.(checkoutItem)} + /> +
+
+
+ + )} + + )} + + +
+
+ ); +} + +/* ─── Empty state ─── */ +function EmptyState({ icon, title, description, actionLabel, onAction }: { + icon: React.ReactNode; title: string; description: string; actionLabel: string; onAction?: () => void; +}) { + return ( + + {icon} +

{title}

+

{description}

+ {actionLabel} +
+ ); +} \ No newline at end of file diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx new file mode 100644 index 0000000..b863f0d --- /dev/null +++ b/src/pages/PaymentDetailsPage.tsx @@ -0,0 +1,494 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { + ArrowLeft, User, MapPin, Lock, Shield, ChevronDown, + Check, AlertCircle, Pencil, UserCheck, Gift +} from 'lucide-react'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { Card, CardContent, CardHeader } from '../components/ui/card'; +import { Separator } from '../components/ui/separator'; + +export interface CheckoutOrderItem { + city: string; + cardType: 'Flexi' | 'Unlimited'; + days: number; + adults: number; + children: number; + quantity: number; + pricePerUnit: number; +} + +interface PaymentDetailsPageProps { + checkoutOrder?: CheckoutOrderItem | null; + onBackClick: () => void; + onPaymentComplete: () => void; + onHomeClick: () => void; + onPassesClick: () => void; + onAttractionsClick?: () => void; + onBlogsClick?: () => void; + onHowItWorksClick?: () => void; + onFAQClick?: () => void; + onPrivacyPolicyClick?: () => void; + onAboutUsClick?: () => void; + onProfileClick?: () => void; + onCityCardsClick?: () => void; + onMagicItineraryClick?: () => void; + onPostCardsClick?: () => void; + onOffersClick?: () => void; + onSuperSavingsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + onContactUsClick?: () => void; + onCartClick?: () => void; + onCheckoutClick?: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + currentPage?: string; + user?: { email: string; name: string } | null; +} + +/* ─── Profile data ─── */ +const profileData = { + firstName: 'John', + lastName: 'Doe', + email: 'john.doe@example.com', + phone: '+1 (555) 123-4567', + address: '123 Main Street', + city: 'New York', + state: 'NY', + postcode: '10001', + country: 'United States', +}; + +/* ─── Editable field ─── */ +function Field({ + label, value, onChange, placeholder, type = 'text', + error, maxLength, inputMode, prefilled, +}: { + label: string; value: string; onChange: (v: string) => void; placeholder?: string; + type?: string; error?: string; maxLength?: number; + inputMode?: React.HTMLAttributes['inputMode']; prefilled?: boolean; +}) { + const [focused, setFocused] = useState(false); + return ( +
+ +
+ onChange(e.target.value)} + onFocus={() => setFocused(true)} + onBlur={() => setFocused(false)} + placeholder={placeholder} + maxLength={maxLength} + inputMode={inputMode} + className={`w-full border rounded-xl px-4 py-3 pr-10 font-poppins text-base font-normal text-[#2a2a2a] outline-none transition-all duration-200 placeholder:text-[#ccc] ${ + error + ? 'border-red-300 focus:border-red-400 bg-red-50/30' + : focused + ? 'border-[#F95F62] ring-2 ring-[#F95F62]/10' + : prefilled + ? 'border-[#F95F62]/25 bg-[#F95F62]/[0.02]' + : 'border-gray-200' + }`} + /> + {prefilled && !focused && ( + + )} +
+ {error && ( + + {error} + + )} +
+ ); +} + +/* ─── Card type badge ─── */ +function CardTypeBadge({ cardType }: { cardType: 'Flexi' | 'Unlimited' }) { + return ( + + {cardType} Card + + ); +} + +/* ─── Main component ─── */ +export function PaymentDetailsPage({ + checkoutOrder, + onBackClick, + onPaymentComplete, + onHomeClick, + onPassesClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onSuperSavingsClick, + onEsimsClick, + onHotelDiscountsClick, + onContactUsClick, + onCartClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + currentPage, + user, +}: PaymentDetailsPageProps) { + + /* ── Purchase type ── */ + const [selectedTab, setSelectedTab] = useState<'myself' | 'gift'>('myself'); + const [giftName, setGiftName] = useState(''); + const [giftEmail, setGiftEmail] = useState(''); + + /* ── Personal Info ── */ + const [firstName, setFirstName] = useState(profileData.firstName); + const [lastName, setLastName] = useState(profileData.lastName); + const [email, setEmail] = useState(user?.email || profileData.email); + const [phone, setPhone] = useState(profileData.phone); + + /* ── Billing Address ── */ + const [address, setAddress] = useState(profileData.address); + const [billingCity, setBillingCity] = useState(profileData.city); + const [state, setState] = useState(profileData.state); + const [postcode, setPostcode] = useState(profileData.postcode); + const [country, setCountry] = useState(profileData.country); + + /* ── Validation ── */ + const [errors, setErrors] = useState>({}); + const [submitting, setSubmitting] = useState(false); + + const order = checkoutOrder || { + city: 'Melbourne', cardType: 'Flexi' as const, + days: 3, adults: 2, children: 0, quantity: 1, pricePerUnit: 49.50, + }; + + const subtotal = order.pricePerUnit * order.quantity; + const tax = subtotal * 0.1; + const total = subtotal + tax; + + const validate = () => { + const e: Record = {}; + if (!firstName.trim()) e.firstName = 'Required'; + if (!lastName.trim()) e.lastName = 'Required'; + if (!email.trim() || !/\S+@\S+\.\S+/.test(email)) e.email = 'Valid email required'; + if (!phone.trim()) e.phone = 'Required'; + if (!address.trim()) e.address = 'Required'; + if (!billingCity.trim()) e.billingCity = 'Required'; + if (!postcode.trim()) e.postcode = 'Required'; + return e; + }; + + const handleSubmit = () => { + const e = validate(); + setErrors(e); + if (Object.keys(e).length > 0) return; + setSubmitting(true); + setTimeout(() => { + setSubmitting(false); + onPaymentComplete(); + }, 1800); + }; + + return ( +
+ {}} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} onCheckoutClick={onCheckoutClick} onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} onBlogsClick={onBlogsClick} onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} onPrivacyPolicyClick={onPrivacyPolicyClick} onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} onCityCardsClick={onCityCardsClick} onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} onOffersClick={onOffersClick} onSuperSavingsClick={onSuperSavingsClick} + onEsimsClick={onEsimsClick} onHotelDiscountsClick={onHotelDiscountsClick} onCartClick={onCartClick} + currentPage={currentPage as any} user={user} + /> + +
+ + {/* Back */} + + + {/* Page heading */} + +
+

+ Secure{' '} + Checkout +

+
+ + SSL Secured +
+
+

+ Complete your purchase securely. Your payment information is protected. +

+
+ +
+ + {/* ── LEFT: Forms ── */} + + + + {/* Purchase type tabs */} + +
+ + +
+
+ + + + {/* Pre-filled notice banner */} + +
+ +
+

+ Details pre-filled from your profile.{' '} + All fields are editable — just tap to make changes. +

+
+ + + + {/* 1. Personal Information */} + +
+
+ 1 +
+

Personal Information

+
+
+ + +
+
+ + +
+
+ + {/* Gift recipient section */} + + {selectedTab === 'gift' && ( + +
+
+ +

Gift Recipient Details

+
+
+ + +
+
+
+ )} +
+ + + + {/* 2. Billing Address */} + +
+
+ 2 +
+

Billing Address

+
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+
+
+ +
+
+
+ + {/* ── RIGHT: Order Summary ── */} + +
+ +
+
+

Order Summary

+
+ + {/* Card info */} +
+
+
+ {order.cardType} +
+
+
+

{order.city}

+ +
+

+ {order.cardType === 'Flexi' ? `${order.days} Attractions` : `${order.days} Days`} +

+
+
+
+ {[ + { label: 'Adults', value: order.adults }, + { label: 'Children', value: order.children }, + { label: 'Qty', value: order.quantity }, + ].map(({ label, value }) => ( +
+ {label} + {value} +
+ ))} +
+
+ + {/* Pricing breakdown */} +
+
+
+ Subtotal + ${subtotal.toFixed(2)} +
+
+ GST (10%) + ${tax.toFixed(2)} +
+
+ Booking fee + Free +
+
+ Total + ${total.toFixed(2)} +
+
+
+
+ + {/* CTA */} + + {submitting ? ( + <> + + Processing… + + ) : ( + <> + + Complete Payment · ${total.toFixed(2)} + + )} + + +

+ By completing your purchase you agree to our Terms of Service and Privacy Policy +

+
+
+ +
+
+ +
+
+ ); +} From 99811b1e8738025c9e389e65f7a6d8b281476864 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Sun, 19 Apr 2026 20:14:44 +0530 Subject: [PATCH 33/91] integrate showCartItems api in the CartPage --- src/Redux/Store.tsx | 7 +- src/Redux/services/cards.service.ts | 37 + src/pages/CartPage.tsx | 1586 ++++++++++++++------------- 3 files changed, 841 insertions(+), 789 deletions(-) create mode 100644 src/Redux/services/cards.service.ts diff --git a/src/Redux/Store.tsx b/src/Redux/Store.tsx index ecb7f5d..725a87a 100644 --- a/src/Redux/Store.tsx +++ b/src/Redux/Store.tsx @@ -3,13 +3,15 @@ import { attractionsApi } from "./services/attractions.service"; import { citiesApi } from "./services/cities.service"; import { authApi } from "./services/auth.service"; import { profileApi } from "./services/profile.service"; +import { cardsApi } from "./services/cards.service"; export const store = configureStore({ reducer: { [attractionsApi.reducerPath]: attractionsApi.reducer, [citiesApi.reducerPath]: citiesApi.reducer, [authApi.reducerPath]: authApi.reducer, - [profileApi.reducerPath]: profileApi.reducer + [profileApi.reducerPath]: profileApi.reducer, + [cardsApi.reducerPath]:cardsApi.reducer }, @@ -18,7 +20,8 @@ export const store = configureStore({ attractionsApi.middleware, citiesApi.middleware, authApi.middleware, - profileApi.middleware + profileApi.middleware, + cardsApi.middleware ), }); export type RootState = ReturnType; diff --git a/src/Redux/services/cards.service.ts b/src/Redux/services/cards.service.ts new file mode 100644 index 0000000..689e9cf --- /dev/null +++ b/src/Redux/services/cards.service.ts @@ -0,0 +1,37 @@ + +import { createApi } from "@reduxjs/toolkit/query/react"; +import { baseQuery } from "../baseQuery"; + +export const cardsApi = createApi({ + reducerPath: "cardsApi", + baseQuery, + + tagTypes: ["cardsInCart"], + + endpoints: (builder) => ({ + + getCardsinCart: builder.query({ + query: (cityId) => { + const params = new URLSearchParams() + params.append('cityXid', cityId); + return `/website/passes/cart/passes?${params.toString()}` + }, + providesTags: ["cardsInCart"] + }), + + getUpcomingCities: builder.query({ + query: (listType) => `/cities/list/all?listType=${listType}`, + + }), + + getCheckoutPageData:builder.query({ + query: (cityId) => `/website/pass/${cityId}`, + + }), + }) +}); + +export const { + useGetCardsinCartQuery, + useGetCheckoutPageDataQuery +} = cardsApi; \ No newline at end of file diff --git a/src/pages/CartPage.tsx b/src/pages/CartPage.tsx index 497f6ec..3f06370 100644 --- a/src/pages/CartPage.tsx +++ b/src/pages/CartPage.tsx @@ -1,137 +1,140 @@ import React, { useState } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { - Users, Baby, ShoppingBag, Trash2, Check, CreditCard, Mail, - ChevronRight, ChevronDown, Minus, Plus, Calendar, ArrowLeft, MapPin, - Zap, Shield, Clock, Percent, Sparkles + Users, Baby, ShoppingBag, Trash2, Check, CreditCard, Mail, + ChevronRight, ChevronDown, Minus, Plus, Calendar, ArrowLeft, MapPin, + Zap, Shield, Clock, Percent, Sparkles } from 'lucide-react'; -import Navbar from './Navbar'; -import { Footer } from './Footer'; -import { ImageWithFallback } from './figma/ImageWithFallback'; -import { CheckoutStepper } from './CheckoutStepper'; -import imgRectangle26 from "figma:asset/2496f45326066d3adf0d5494c1dc1595575894ff.png"; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { useNavigate } from 'react-router-dom'; +import { useGetCardsinCartQuery } from '../Redux/services/cards.service'; +import LoadingSpinner from '../components/LoadingSpinner'; +// import { CheckoutStepper } from './CheckoutStepper'; +// import imgRectangle26 from "figma:asset/2496f45326066d3adf0d5494c1dc1595575894ff.png"; /* ─── Types ─── */ export interface CartItem { - id: string; - city: string; - cardType: 'Flexi' | 'Unlimited'; - days: number; - adults: number; - children: number; - quantity: number; - pricePerUnit: number; - image: string; + id: string; + city: string; + cardType: 'Flexi' | 'Unlimited'; + days: number; + adults: number; + children: number; + quantity: number; + pricePerUnit: number; + image: string; } interface Attraction { - id: string; - name: string; - image: string; - category: string; - included: boolean; + id: string; + name: string; + image: string; + category: string; + included: boolean; } interface CartPageProps { - onBackClick: () => void; - onHomeClick: () => void; - onPassesClick: () => void; - onCheckoutClick?: () => void; - onSecureCheckoutClick?: (item: CartItem) => void; - onSignInClick: () => void; - onSignOutClick?: () => void; - onAttractionsClick?: () => void; - onBlogsClick?: () => void; - onHowItWorksClick?: () => void; - onFAQClick?: () => void; - onPrivacyPolicyClick?: () => void; - onAboutUsClick?: () => void; - onProfileClick?: () => void; - onCityCardsClick?: () => void; - onMagicItineraryClick?: () => void; - onPostCardsClick?: () => void; - onOffersClick?: () => void; - onSuperSavingsClick?: () => void; - onEsimsClick?: () => void; - onHotelDiscountsClick?: () => void; - onContactUsClick?: () => void; - onCartClick?: () => void; - currentPage?: string; - user?: { email: string; name: string } | null; + onBackClick: () => void; + onHomeClick: () => void; + onPassesClick: () => void; + onCheckoutClick?: () => void; + onSecureCheckoutClick?: (item: CartItem) => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + onAttractionsClick?: () => void; + onBlogsClick?: () => void; + onHowItWorksClick?: () => void; + onFAQClick?: () => void; + onPrivacyPolicyClick?: () => void; + onAboutUsClick?: () => void; + onProfileClick?: () => void; + onCityCardsClick?: () => void; + onMagicItineraryClick?: () => void; + onPostCardsClick?: () => void; + onOffersClick?: () => void; + onSuperSavingsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + onContactUsClick?: () => void; + onCartClick?: () => void; + currentPage?: string; + user?: { email: string; name: string } | null; } /* ─── Data ─── */ const initialCartItems: CartItem[] = [ - { - id: '1', city: 'Melbourne', cardType: 'Flexi', days: 3, adults: 3, children: 3, quantity: 2, pricePerUnit: 49.50, - image: 'https://images.unsplash.com/photo-1655963754904-2cf2b562a681?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBmbGluZGVycyUyMHN0YXRpb24lMjBzdW5zZXR8ZW58MXx8fHwxNzc2MzE5NDgzfDA&ixlib=rb-4.1.0&q=80&w=1080', - }, - { - id: '2', city: 'Sydney', cardType: 'Flexi', days: 3, adults: 3, children: 3, quantity: 2, pricePerUnit: 49.50, - image: 'https://images.unsplash.com/photo-1695018228065-2e0026c654af?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBvcGVyYSUyMGhvdXNlJTIwaGFyYm91ciUyMGJyaWRnZXxlbnwxfHx8fDE3NzYzMTk0ODN8MA&ixlib=rb-4.1.0&q=80&w=1080', - }, - { - id: '3', city: 'Melbourne', cardType: 'Unlimited', days: 6, adults: 2, children: 1, quantity: 1, pricePerUnit: 79.00, - image: 'https://images.unsplash.com/photo-1705120624704-0970afc29fea?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBzdHJlZXQlMjBhcnQlMjBsYW5ld2F5c3xlbnwxfHx8fDE3NzYzMTk0ODR8MA&ixlib=rb-4.1.0&q=80&w=1080', - }, + { + id: '1', city: 'Melbourne', cardType: 'Flexi', days: 3, adults: 3, children: 3, quantity: 2, pricePerUnit: 49.50, + image: 'https://images.unsplash.com/photo-1655963754904-2cf2b562a681?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBmbGluZGVycyUyMHN0YXRpb24lMjBzdW5zZXR8ZW58MXx8fHwxNzc2MzE5NDgzfDA&ixlib=rb-4.1.0&q=80&w=1080', + }, + { + id: '2', city: 'Sydney', cardType: 'Flexi', days: 3, adults: 3, children: 3, quantity: 2, pricePerUnit: 49.50, + image: 'https://images.unsplash.com/photo-1695018228065-2e0026c654af?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBvcGVyYSUyMGhvdXNlJTIwaGFyYm91ciUyMGJyaWRnZXxlbnwxfHx8fDE3NzYzMTk0ODN8MA&ixlib=rb-4.1.0&q=80&w=1080', + }, + { + id: '3', city: 'Melbourne', cardType: 'Unlimited', days: 6, adults: 2, children: 1, quantity: 1, pricePerUnit: 79.00, + image: 'https://images.unsplash.com/photo-1705120624704-0970afc29fea?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBzdHJlZXQlMjBhcnQlMjBsYW5ld2F5c3xlbnwxfHx8fDE3NzYzMTk0ODR8MA&ixlib=rb-4.1.0&q=80&w=1080', + }, ]; const dayOptions = [3, 6, 12, 18, 24]; const attractionsData: Record> = { - Melbourne: { - Flexi: [ - { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, - { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, - ], - Unlimited: [ - { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, - { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, - { id: 'mel-5', name: 'Melbourne Star Wheel', image: 'https://images.unsplash.com/photo-1769880659692-fa77e04c5ffa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxvYnNlcnZhdGlvbiUyMHdoZWVsJTIwYW11c2VtZW50JTIwbmlnaHR8ZW58MXx8fHwxNzc2MzE5OTc2fDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, - { id: 'mel-6', name: 'Penguin Parade', image: 'https://images.unsplash.com/photo-1670391050251-d1cfbc3891c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxwZW5ndWlucyUyMHdpbGRsaWZlJTIwbmF0dXJlfGVufDF8fHx8MTc3NjMxOTk3Nnww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - { id: 'mel-7', name: 'Yarra River Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, - ], - }, - Sydney: { - Flexi: [ - { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, - { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, - ], - Unlimited: [ - { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, - { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, - { id: 'syd-4', name: 'Sydney Harbour Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, - { id: 'syd-5', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, - ], - }, + Melbourne: { + Flexi: [ + { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, + { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + ], + Unlimited: [ + { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, + { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + { id: 'mel-5', name: 'Melbourne Star Wheel', image: 'https://images.unsplash.com/photo-1769880659692-fa77e04c5ffa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxvYnNlcnZhdGlvbiUyMHdoZWVsJTIwYW11c2VtZW50JTIwbmlnaHR8ZW58MXx8fHwxNzc2MzE5OTc2fDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + { id: 'mel-6', name: 'Penguin Parade', image: 'https://images.unsplash.com/photo-1670391050251-d1cfbc3891c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxwZW5ndWlucyUyMHdpbGRsaWZlJTIwbmF0dXJlfGVufDF8fHx8MTc3NjMxOTk3Nnww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-7', name: 'Yarra River Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + ], + }, + Sydney: { + Flexi: [ + { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, + { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + ], + Unlimited: [ + { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, + { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + { id: 'syd-4', name: 'Sydney Harbour Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + { id: 'syd-5', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + ], + }, }; const offersData: Record = { - Flexi: [ - { title: 'Astor Hotels Ultra Deluxe', description: '15% Discount on all treatments for first-time clients', image: 'https://images.unsplash.com/photo-1715191904112-4a5d9c3089fa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxsdXh1cnklMjBob3RlbCUyMHJlc29ydCUyMGV4dGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2MXww&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'Green Valley Spa Lux', description: '20% Off on membership plans for new members', image: 'https://images.unsplash.com/photo-1759216853079-831ef8c8b327?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzcGElMjB3ZWxsbmVzcyUyMHRyZWF0bWVudCUyMGludGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2M3ww&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'Harbour Dining Co.', description: '10% Off your first dining experience at waterfront', image: 'https://images.unsplash.com/photo-1676471932681-45fa972d848a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyZXN0YXVyYW50JTIwZmluZSUyMGRpbmluZ3xlbnwxfHx8fDE3NzYzMTkxNDl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'National Gallery Exhibition', description: 'Free audio guide with every gallery visit', image: 'https://images.unsplash.com/photo-1569342380852-035f42d9ca41?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtdXNldW0lMjBnYWxsZXJ5JTIwZXhoaWJpdGlvbnxlbnwxfHx8fDE3NzYyNDYwMjh8MA&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'Sunset Harbour Cruise', description: 'Complimentary drink on every sunset cruise booking', image: 'https://images.unsplash.com/photo-1765783800962-83d99ff7b158?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxjcnVpc2UlMjBib2F0JTIwaGFyYm9yJTIwdG91cnxlbnwxfHx8fDE3NzYzMjE2MDd8MA&ixlib=rb-4.1.0&q=80&w=1080' }, - ], - Unlimited: [ - { title: 'SkyView Ferris Wheel', description: 'Complimentary second ride for all pass holders', image: 'https://images.unsplash.com/photo-1626209025747-b41ee6ec191f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxmZXJyaXMlMjB3aGVlbCUyMGFtdXNlbWVudCUyMHBhcmt8ZW58MXx8fHwxNzc2MzE3NDI2fDA&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'City Mall Boutique', description: '15% Off at select boutique stores with your pass', image: 'https://images.unsplash.com/photo-1567966689299-819568579d36?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzaG9wcGluZyUyMG1hbGwlMjBib3V0aXF1ZSUyMHJldGFpbHxlbnwxfHx8fDE3NzYzMjEzNjN8MA&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'Adventure Outfitters', description: 'Free gear rental on outdoor adventure bookings', image: 'https://images.unsplash.com/photo-1761131221577-0716baffc6ef?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhZHZlbnR1cmUlMjBzcG9ydHMlMjBvdXRkb29yJTIwYWN0aXZpdHl8ZW58MXx8fHwxNzc2MzIxMzYzfDA&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'Skyline Rooftop Lounge', description: 'Buy one get one free on signature cocktails', image: 'https://images.unsplash.com/photo-1642114955097-8f3d0e141641?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyb29mdG9wJTIwYmFyJTIwY2l0eSUyMHNreWxpbmUlMjBuaWdodHxlbnwxfHx8fDE3NzYyNDU2NTl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, - { title: 'Yarra Valley Wines', description: 'Exclusive wine tasting tour with pass holders discount', image: 'https://images.unsplash.com/photo-1764649841527-c8852b63cc53?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHx3aW5lJTIwdGFzdGluZyUyMHZpbmV5YXJkJTIwY2VsbGFyfGVufDF8fHx8MTc3NjMyMTYwOHww&ixlib=rb-4.1.0&q=80&w=1080' }, - ], + Flexi: [ + { title: 'Astor Hotels Ultra Deluxe', description: '15% Discount on all treatments for first-time clients', image: 'https://images.unsplash.com/photo-1715191904112-4a5d9c3089fa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxsdXh1cnklMjBob3RlbCUyMHJlc29ydCUyMGV4dGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2MXww&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Green Valley Spa Lux', description: '20% Off on membership plans for new members', image: 'https://images.unsplash.com/photo-1759216853079-831ef8c8b327?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzcGElMjB3ZWxsbmVzcyUyMHRyZWF0bWVudCUyMGludGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2M3ww&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Harbour Dining Co.', description: '10% Off your first dining experience at waterfront', image: 'https://images.unsplash.com/photo-1676471932681-45fa972d848a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyZXN0YXVyYW50JTIwZmluZSUyMGRpbmluZ3xlbnwxfHx8fDE3NzYzMTkxNDl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'National Gallery Exhibition', description: 'Free audio guide with every gallery visit', image: 'https://images.unsplash.com/photo-1569342380852-035f42d9ca41?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtdXNldW0lMjBnYWxsZXJ5JTIwZXhoaWJpdGlvbnxlbnwxfHx8fDE3NzYyNDYwMjh8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Sunset Harbour Cruise', description: 'Complimentary drink on every sunset cruise booking', image: 'https://images.unsplash.com/photo-1765783800962-83d99ff7b158?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxjcnVpc2UlMjBib2F0JTIwaGFyYm9yJTIwdG91cnxlbnwxfHx8fDE3NzYzMjE2MDd8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + ], + Unlimited: [ + { title: 'SkyView Ferris Wheel', description: 'Complimentary second ride for all pass holders', image: 'https://images.unsplash.com/photo-1626209025747-b41ee6ec191f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxmZXJyaXMlMjB3aGVlbCUyMGFtdXNlbWVudCUyMHBhcmt8ZW58MXx8fHwxNzc2MzE3NDI2fDA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'City Mall Boutique', description: '15% Off at select boutique stores with your pass', image: 'https://images.unsplash.com/photo-1567966689299-819568579d36?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzaG9wcGluZyUyMG1hbGwlMjBib3V0aXF1ZSUyMHJldGFpbHxlbnwxfHx8fDE3NzYzMjEzNjN8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Adventure Outfitters', description: 'Free gear rental on outdoor adventure bookings', image: 'https://images.unsplash.com/photo-1761131221577-0716baffc6ef?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhZHZlbnR1cmUlMjBzcG9ydHMlMjBvdXRkb29yJTIwYWN0aXZpdHl8ZW58MXx8fHwxNzc2MzIxMzYzfDA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Skyline Rooftop Lounge', description: 'Buy one get one free on signature cocktails', image: 'https://images.unsplash.com/photo-1642114955097-8f3d0e141641?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyb29mdG9wJTIwYmFyJTIwY2l0eSUyMHNreWxpbmUlMjBuaWdodHxlbnwxfHx8fDE3NzYyNDU2NTl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Yarra Valley Wines', description: 'Exclusive wine tasting tour with pass holders discount', image: 'https://images.unsplash.com/photo-1764649841527-c8852b63cc53?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHx3aW5lJTIwdGFzdGluZyUyMHZpbmV5YXJkJTIwY2VsbGFyfGVufDF8fHx8MTc3NjMyMTYwOHww&ixlib=rb-4.1.0&q=80&w=1080' }, + ], }; const priceTable: Record> = { - Flexi: { 3: 49.5, 6: 69, 12: 99, 18: 129, 24: 159 }, - Unlimited: { 3: 79, 6: 109, 12: 149, 18: 189, 24: 229 }, + Flexi: { 3: 49.5, 6: 69, 12: 99, 18: 129, 24: 159 }, + Unlimited: { 3: 79, 6: 109, 12: 149, 18: 189, 24: 229 }, }; /* ═══════════════════════════════════════════ @@ -139,101 +142,99 @@ const priceTable: Record> = { ═══════════════════════════════════════════ */ function FlexiCardPreview({ city, adultPrice, childPrice, isSelected }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean }) { - return ( -
- {/* Card bg */} -
- {/* City image */} -
- -
- {/* City name - left aligned */} -
-

{city}

-
- {/* Pricing */} -
-
- From - ${adultPrice} - /Adult + return ( +
+ {/* Card bg */} +
+ {/* City image */} +
+ {/* */} +
+ {/* City name - left aligned */} +
+

{city}

+
+ {/* Pricing */} +
+
+ From + ${adultPrice} + /Adult +
+
+ and + ${childPrice} + /Child +
+
+ {/* Description */} +
+

+ Dive into an extensive selection of thrilling destinations! +

+
+ {/* Side tab - Flexi (pink) */} +
+ Card + Flexi +
+ {/* Selected checkmark */} + {isSelected && ( +
+ +
+ )}
-
- and - ${childPrice} - /Child -
-
- {/* Description */} -
-

- Dive into an extensive selection of thrilling destinations! -

-
- {/* Side tab - Flexi (pink) */} -
- Card - Flexi -
- {/* Selected checkmark */} - {isSelected && ( -
- -
- )} -
- ); + ); } function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean }) { - return ( -
- {/* Card bg */} -
- {/* City image */} -
- -
- {/* City name - left aligned */} -
-

{city}

-
- {/* Pricing */} -
-
- From - ${adultPrice} - /Adult + return ( +
+ {/* Card bg */} +
+ {/* City image */} +
+ {/* */} +
+ {/* City name - left aligned */} +
+

{city}

+
+ {/* Pricing */} +
+
+ From + ${adultPrice} + /Adult +
+
+ and + ${childPrice} + /Child +
+
+ {/* Description */} +
+

+ Dive into an extensive selection of thrilling destinations! +

+
+ {/* Side tab - Unlimited (coral) */} +
+ Card + Unlimited +
+ {/* Selected checkmark */} + {isSelected && ( +
+ +
+ )}
-
- and - ${childPrice} - /Child -
-
- {/* Description */} -
-

- Dive into an extensive selection of thrilling destinations! -

-
- {/* Side tab - Unlimited (coral) */} -
- Card - Unlimited -
- {/* Selected checkmark */} - {isSelected && ( -
- -
- )} -
- ); + ); } /* ═══════════════════════════════════════════ @@ -241,150 +242,148 @@ function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected }: { ci ═══════════════════════════════════════════ */ function CheckoutConfigCard({ - item, - onChange, - onProceed, + item, + onChange, + onProceed, }: { - item: CartItem; - onChange: (updates: Partial) => void; - onProceed: () => void; + item: CartItem; + onChange: (updates: Partial) => void; + onProceed: () => void; }) { - const [daysOpen, setDaysOpen] = useState(false); - const originalPrice = (item.pricePerUnit * item.quantity * 1.35); - const totalPrice = item.pricePerUnit * item.quantity; + const [daysOpen, setDaysOpen] = useState(false); + const originalPrice = (item.pricePerUnit * item.quantity * 1.35); + const totalPrice = item.pricePerUnit * item.quantity; - return ( -
- {/* City header */} -
-

{item.city}

-
- - {item.cardType} Card - -
-
+ const navigate = useNavigate() - {/* Configuration rows */} -
- {/* No. of Adults */} -
- No. of Adults -
- - {item.adults} - -
-
+ return ( +
+ {/* City header */} +
+

{item.city}

+
+ + {item.cardType} Card + +
+
- {/* No. of Children */} -
- No. of Children -
- - {item.children} - -
-
+ {/* Configuration rows */} +
+ {/* No. of Adults */} +
+ No. of Adults +
+ + {item.adults} + +
+
- {/* No. of Days (dropdown) */} -
- - {item.cardType === 'Flexi' ? 'No. of Attractions' : 'No. of Days'} - -
- - - {daysOpen && ( - + No. of Children +
+ + {item.children} + +
+
+ + {/* No. of Days (dropdown) */} +
+ + {item.cardType === 'Flexi' ? 'No. of Attractions' : 'No. of Days'} + +
+ + + {daysOpen && ( + + {dayOptions.map((d) => ( + + ))} + + )} + +
+
+ + {/* You Pay */} +
+ You Pay +
+ + ${originalPrice.toFixed(0)} + + + ${totalPrice.toFixed(0)} + +
+
+
+ + {/* Proceed button */} +
+ navigate("/payment")} + className="w-full py-4 rounded-full bg-[#f95f62] text-white font-poppins text-base font-medium hover:bg-[#e8545a] transition-colors shadow-lg shadow-[#f95f62]/20" > - {dayOptions.map((d) => ( - - ))} - - )} - -
+ Proceed to Pay + +
- - {/* You Pay */} -
- You Pay -
- - ${originalPrice.toFixed(0)} - - - ${totalPrice.toFixed(0)} - -
-
-
- - {/* Proceed button */} -
- - Proceed to Pay - -
-
- ); + ); } /* ═══════════════════════════════════════════ @@ -392,486 +391,499 @@ function CheckoutConfigCard({ ═══════════════════════════════════════════ */ export function CartPage({ - onBackClick, - onHomeClick, - onPassesClick, - onCheckoutClick, - onSecureCheckoutClick, - onSignInClick, - onSignOutClick, - onAttractionsClick, - onBlogsClick, - onHowItWorksClick, - onFAQClick, - onPrivacyPolicyClick, - onAboutUsClick, - onProfileClick, - onCityCardsClick, - onMagicItineraryClick, - onPostCardsClick, - onOffersClick, - onSuperSavingsClick, - onEsimsClick, - onHotelDiscountsClick, - onContactUsClick, - onCartClick, - currentPage, - user, + onBackClick, + onHomeClick, + onPassesClick, + onCheckoutClick, + onSecureCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onSuperSavingsClick, + onEsimsClick, + onHotelDiscountsClick, + onContactUsClick, + onCartClick, + currentPage, + user, }: CartPageProps) { - const [activeTab, setActiveTab] = useState<'cards' | 'postcards'>('cards'); - const [cartItems, setCartItems] = useState(initialCartItems); - const [selectedCardId, setSelectedCardId] = useState(null); - const [view, setView] = useState<'cart' | 'checkout'>('cart'); - const [checkoutItem, setCheckoutItem] = useState(null); + const [activeTab, setActiveTab] = useState<'cards' | 'postcards'>('cards'); + const [cartItems, setCartItems] = useState(initialCartItems); + const [selectedCardId, setSelectedCardId] = useState(null); + const [view, setView] = useState<'cart' | 'checkout'>('cart'); + const [checkoutItem, setCheckoutItem] = useState(null); - const handleRemoveItem = (id: string) => { - setCartItems(prev => prev.filter(item => item.id !== id)); - if (selectedCardId === id) setSelectedCardId(null); - }; + const navigate = useNavigate() - const handleSelectCard = (id: string) => { - setSelectedCardId(prev => (prev === id ? null : id)); - }; + const cityId = localStorage.getItem("cityId") - const handleGoToCheckout = () => { - const item = cartItems.find(i => i.id === selectedCardId); - if (item) { - setCheckoutItem({ ...item }); - setView('checkout'); - window.scrollTo({ top: 0, behavior: 'smooth' }); + const { data, isLoading } = useGetCardsinCartQuery(cityId) + + const CartItems = data?.cartItems ?? [] + + if (isLoading) { + return ( + + ) } - }; - const handleBackToCart = () => { - setView('cart'); - setCheckoutItem(null); - }; + const handleRemoveItem = (id: string) => { + setCartItems(prev => prev.filter(item => item.id !== id)); + if (selectedCardId === id) setSelectedCardId(null); + }; - const handleCheckoutItemChange = (updates: Partial) => { - if (!checkoutItem) return; - const updated = { ...checkoutItem, ...updates }; - const prices = priceTable[updated.cardType]; - if (prices && prices[updated.days] !== undefined) { - updated.pricePerUnit = prices[updated.days]; - } - setCheckoutItem(updated); - }; + const handleSelectCard = (id: string) => { + setSelectedCardId(prev => (prev === id ? null : id)); + }; - const isEmpty = cartItems.length === 0; - const selectedItem = cartItems.find(i => i.id === selectedCardId); - const attractions = checkoutItem ? (attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []) : []; - const offers = checkoutItem ? (offersData[checkoutItem.cardType] || []) : []; + const handleGoToCheckout = () => { + // const item = cartItems.find(i => i.id === selectedCardId); + // if (item) { + // setCheckoutItem({ ...item }); + // setView('checkout'); + // window.scrollTo({ top: 0, behavior: 'smooth' }); + // } + navigate("/payment") + }; - return ( -
- {}} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} - onPassesClick={onPassesClick} onCheckoutClick={onCheckoutClick} onHomeClick={onHomeClick} - onAttractionsClick={onAttractionsClick} onBlogsClick={onBlogsClick} onHowItWorksClick={onHowItWorksClick} - onFAQClick={onFAQClick} onPrivacyPolicyClick={onPrivacyPolicyClick} onAboutUsClick={onAboutUsClick} - onProfileClick={onProfileClick} onCityCardsClick={onCityCardsClick} onMagicItineraryClick={onMagicItineraryClick} - onPostCardsClick={onPostCardsClick} onOffersClick={onOffersClick} onSuperSavingsClick={onSuperSavingsClick} - onEsimsClick={onEsimsClick} onHotelDiscountsClick={onHotelDiscountsClick} onCartClick={onCartClick} - currentPage={currentPage as any} user={user} - /> + const handleBackToCart = () => { + setView('cart'); + setCheckoutItem(null); + }; - - {view === 'cart' ? ( - /* ─── CART VIEW ─── */ - - {/* Header */} -
-

- Your{' '} - Cart -

-

- {isEmpty ? 'Your cart is empty' : `${cartItems.length} ${cartItems.length === 1 ? 'item' : 'items'} in your cart`} -

-
+ const handleCheckoutItemChange = (updates: Partial) => { + if (!checkoutItem) return; + const updated = { ...checkoutItem, ...updates }; + const prices = priceTable[updated.cardType]; + if (prices && prices[updated.days] !== undefined) { + updated.pricePerUnit = prices[updated.days]; + } + setCheckoutItem(updated); + }; - {/* Tab switcher */} - {/* Cards listed directly below */} + const isEmpty = cartItems.length === 0; + const selectedItem = CartItems.find((i: any) => i.id === selectedCardId); + const attractions = checkoutItem ? (attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []) : []; + const offers = checkoutItem ? (offersData[checkoutItem.cardType] || []) : []; + + return ( +
+ { }} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} onCheckoutClick={onCheckoutClick} onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} onBlogsClick={onBlogsClick} onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} onPrivacyPolicyClick={onPrivacyPolicyClick} onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} onCityCardsClick={onCityCardsClick} onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} onOffersClick={onOffersClick} onSuperSavingsClick={onSuperSavingsClick} + onEsimsClick={onEsimsClick} onHotelDiscountsClick={onHotelDiscountsClick} onCartClick={onCartClick} + currentPage={currentPage as any} user={user} + /> - {/* Content */} - {activeTab === 'cards' ? ( - - {isEmpty ? ( - } title="No cards in your cart" description="Browse our city passes to unlock amazing experiences and savings on your next adventure" actionLabel="Explore Passes" onAction={onPassesClick} /> - ) : ( -
- {/* Table header (desktop) */} -
-
City Cards
-
Travellers
-
Qty
-
Price
-
-
+ {view === 'cart' ? ( + /* ─── CART VIEW ─── */ + + {/* Header */} +
+

+ Your{' '} + Cart +

+

+ {isEmpty ? 'Your cart is empty' : `${CartItems.length} ${CartItems.length === 1 ? 'item' : 'items'} in your cart`} +

+
- - {cartItems.map((item) => { - const isSelected = selectedCardId === item.id; - const totalPrice = item.pricePerUnit * item.quantity; + {/* Tab switcher */} + {/* Cards listed directly below */} - return ( - handleSelectCard(item.id)} - className={`relative bg-white rounded-2xl overflow-hidden cursor-pointer transition-all duration-300 ${ - isSelected ? 'ring-2 ring-[#F95F62] shadow-lg shadow-[#F95F62]/8' : 'ring-1 ring-gray-100 hover:ring-gray-200 hover:shadow-md' - }`} - > - {/* Selected badge */} - - {isSelected && ( - - - - )} - + {/* Content */} + + {activeTab === 'cards' ? ( + + {isEmpty ? ( + } title="No cards in your cart" description="Browse our city passes to unlock amazing experiences and savings on your next adventure" actionLabel="Explore Passes" onAction={onPassesClick} /> + ) : ( +
+ {/* Table header (desktop) */} +
+
City Cards
+
Travellers
+ {/*
Qty
*/} +
Price
+
+
- {/* Mobile layout */} -
-
- -
-
-
-
-
{item.city}
-
- {item.cardType} - {item.days}d -
-
- -
-
- {item.adults}A · {item.children}C · Qty {item.quantity} -
- ${totalPrice.toFixed(2)} - {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)}/ea} -
-
-
-
+ + {CartItems.map((item: any) => { + const isSelected = selectedCardId === item.id; + const totalPrice = item.pricePerUnit * item.quantity; - {/* Desktop layout */} -
-
-
- -
-
-
{item.city}
-
- {item.cardType} Card - {item.days} days -
-
-
-
-
- {item.adults} - {item.children} -
-
-
- {item.quantity} -
-
- ${totalPrice.toFixed(2)} - {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)} per unit} -
-
- -
-
- - ); - })} -
+ return ( + handleSelectCard(item.id)} + className={`relative bg-white rounded-2xl overflow-hidden cursor-pointer transition-all duration-300 ${isSelected ? 'ring-2 ring-[#F95F62] shadow-lg shadow-[#F95F62]/8' : 'ring-1 ring-gray-100 hover:ring-gray-200 hover:shadow-md' + }`} + > + {/* Selected badge */} + + {isSelected && ( + + + + )} + - {/* Bottom checkout bar */} - -
- {selectedItem ? ( + {/* Mobile layout */} +
+
+ +
+
+
+
+
{item.city?.cityName}
+
+ {item.displayCardMode} + {item.cardMode === 'flexi' ? `${item.noOfAttractions} ${item.noOfAttractions === 1 ? 'attraction' : 'attractions'}` : `${item.noOfDays} ${item.noOfDays === 1 ? 'day' : 'days'}`} +
+
+ {/* */} +
+
+ {item.totalAdult}A · {item.totalChild}C +
+ ${item.totalAmount} + {/* {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)}/ea} */} +
+
+
+
+ + {/* Desktop layout */} +
+
+
+ +
+
+
{item.city?.cityName}
+
+ {item.displayCardMode} + {item.cardMode === 'flexi' ? `${item.noOfAttractions} ${item.noOfAttractions === 1 ? 'attraction' : 'attractions'}` : `${item.noOfDays} ${item.noOfDays === 1 ? 'day' : 'days'}`} +
+
+
+
+
+ {item.totalAdult} + {item.totalChild} +
+
+ {/*
+ {item.quantity} +
*/} +
+ ${item.totalAmount} + {/* {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)} per unit} */} +
+ {/*
+ +
*/} +
+ + ); + })} + + + {/* Bottom checkout bar */} + +
+ {selectedItem ? ( + <> +

+ Selected: {selectedItem.city.cityName} {selectedItem.displayCardMode} · {selectedItem.cardMode === 'flexi' ? `${selectedItem.noOfAttractions} ${selectedItem.noOfAttractions === 1 ? 'attraction' : 'attractions'}` : `${selectedItem.noOfDays} ${selectedItem.noOfDays === 1 ? 'day' : 'days'}`} +

+

+ ${selectedItem.totalAmount} +

+ + ) : ( +

Tap a card above to select it for checkout

+ )} +
+ + Secure Checkout + +
+
+ )} +
+ ) : ( + + } title="No post cards yet" description="Send beautiful digital post cards to friends and family from your favourite destinations around the world" actionLabel="Browse Post Cards" onAction={onPostCardsClick} /> + + )} + +
+ ) : ( + /* ─── CHECKOUT VIEW ─── */ + + {checkoutItem && ( <> -

- Selected: {selectedItem.city} {selectedItem.cardType} · {selectedItem.days}d · Qty {selectedItem.quantity} -

-

- ${(selectedItem.pricePerUnit * selectedItem.quantity).toFixed(2)} -

+ {/* Back */} + + + {/* Stepper */} + {/* */} + + {/* Checkout heading */} +
+

+ Checkout{' '} + {checkoutItem.city} +

+ +
+ +
+ {/* Left column */} +
+ + {/* ── Card Type Selection (Figma cards) ── */} +
+

+ Choose Your Card +

+

+ Select the card type that best suits your travel style +

+
+ {/* Flexi */} + + + {/* Unlimited */} + +
+ + {/* ── Config Card (mobile only) — right after card selection ── */} +
+ checkoutItem && onSecureCheckoutClick?.(checkoutItem)} + /> +
+ + {/* Features Comparison */} +
+
+ {/* Header */} +

Features

+

Flexi

+

Unlimited

+ {[ + { feature: 'Access to attractions', flexi: true, unlimited: true }, + { feature: 'Entry to attractions', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: true, unlimited: true }, + { feature: 'Entry to sites', flexi: false, unlimited: true }, + { feature: 'Access to venues', flexi: true, unlimited: true }, + { feature: 'Entry to events', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: false, unlimited: true }, + { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, + { feature: 'Access to postcard creation', flexi: false, unlimited: true }, + ].map((row, i) => ( + +

+ {row.feature} +

+
+ {row.flexi ? ( +
+ +
+ ) : ( + + )} +
+
+ {row.unlimited ? ( +
+ +
+ ) : ( + + )} +
+
+ ))} +
+
+
+ + {/* ── Offers ── */} +
+

+ {checkoutItem.cardType} Card Offers +

+

+ Exclusive deals and discounts included with your {checkoutItem.cardType} pass +

+
+ {offers.map((offer, idx) => ( +
+
+
+ +
+
+

+ {offer.title} +

+
+
+

+ {offer.description} +

+
+
+
+
+ ))} +
+
+ + {/* ── Available Attractions ── */} +
+
+

Available Attractions

+ {attractions.length} included +
+

+ Explore all the experiences you can enjoy with your pass +

+
+ {attractions.map((a) => ( +
+
+ +
+
+ {a.category} +
+
+
{a.name}
+
+ +
+
+ ))} +
+
+
+ + {/* Right column: Config card (desktop only, sticky) */} +
+
+ checkoutItem && onSecureCheckoutClick?.(checkoutItem)} + /> +
+
+
- ) : ( -

Tap a card above to select it for checkout

- )} -
- - Secure Checkout - - -
- )} -
- ) : ( - - } title="No post cards yet" description="Send beautiful digital post cards to friends and family from your favourite destinations around the world" actionLabel="Browse Post Cards" onAction={onPostCardsClick} /> - - )} + )} + + )} - - ) : ( - /* ─── CHECKOUT VIEW ─── */ - - {checkoutItem && ( - <> - {/* Back */} - - {/* Stepper */} - - - {/* Checkout heading */} -
-

- Checkout{' '} - {checkoutItem.city} -

- -
- -
- {/* Left column */} -
- - {/* ── Card Type Selection (Figma cards) ── */} -
-

- Choose Your Card -

-

- Select the card type that best suits your travel style -

-
- {/* Flexi */} - - - {/* Unlimited */} - -
- - {/* ── Config Card (mobile only) — right after card selection ── */} -
- checkoutItem && onSecureCheckoutClick?.(checkoutItem)} - /> -
- - {/* Features Comparison */} -
-
- {/* Header */} -

Features

-

Flexi

-

Unlimited

- {[ - { feature: 'Access to attractions', flexi: true, unlimited: true }, - { feature: 'Entry to attractions', flexi: true, unlimited: true }, - { feature: 'Access to experiences', flexi: true, unlimited: true }, - { feature: 'Entry to sites', flexi: false, unlimited: true }, - { feature: 'Access to venues', flexi: true, unlimited: true }, - { feature: 'Entry to events', flexi: true, unlimited: true }, - { feature: 'Access to experiences', flexi: false, unlimited: true }, - { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, - { feature: 'Access to postcard creation', flexi: false, unlimited: true }, - ].map((row, i) => ( - -

- {row.feature} -

-
- {row.flexi ? ( -
- -
- ) : ( - - )} -
-
- {row.unlimited ? ( -
- -
- ) : ( - - )} -
-
- ))} -
-
-
- - {/* ── Offers ── */} -
-

- {checkoutItem.cardType} Card Offers -

-

- Exclusive deals and discounts included with your {checkoutItem.cardType} pass -

-
- {offers.map((offer, idx) => ( -
-
-
- -
-
-

- {offer.title} -

-
-
-

- {offer.description} -

-
-
-
-
- ))} -
-
- - {/* ── Available Attractions ── */} -
-
-

Available Attractions

- {attractions.length} included -
-

- Explore all the experiences you can enjoy with your pass -

-
- {attractions.map((a) => ( -
-
- -
-
- {a.category} -
-
-
{a.name}
-
- -
-
- ))} -
-
-
- - {/* Right column: Config card (desktop only, sticky) */} -
-
- checkoutItem && onSecureCheckoutClick?.(checkoutItem)} - /> -
-
-
- - )} - - )} - - -
-
- ); +
+
+ ); } /* ─── Empty state ─── */ function EmptyState({ icon, title, description, actionLabel, onAction }: { - icon: React.ReactNode; title: string; description: string; actionLabel: string; onAction?: () => void; + icon: React.ReactNode; title: string; description: string; actionLabel: string; onAction?: () => void; }) { - return ( - - {icon} -

{title}

-

{description}

- {actionLabel} -
- ); + return ( + + {icon} +

{title}

+

{description}

+ {actionLabel} +
+ ); } \ No newline at end of file From fca33f55a76d23063a54f9383745d8a1c4f062e9 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 20 Apr 2026 12:10:46 +0530 Subject: [PATCH 34/91] integrate api in the checkoutpage2 component --- src/AppRouter.tsx | 18 +- src/components/Navbar.tsx | 5 +- src/pages/CartPage.tsx | 6 +- src/pages/CheckoutPage2.tsx | 805 ++++++++++++++++++++++++++++++++++++ 4 files changed, 826 insertions(+), 8 deletions(-) create mode 100644 src/pages/CheckoutPage2.tsx diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index aa6c388..b3227f4 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -34,6 +34,8 @@ import { LandingMagicItineraryPage } from './pages/LandingMagicItineraryPage'; import { DiscoverPage } from './pages/DiscoverPage'; import { CartPage } from './pages/CartPage'; import { PaymentDetailsPage } from './pages/PaymentDetailsPage'; +import { CartPageDesign } from './pages/CartPageDesign'; +import { CheckoutPage2 } from './pages/CheckoutPage2'; // User type definition interface User { @@ -126,11 +128,11 @@ export function AppRouter({ } /> {/* Checkout Routes */} -
- } /> + } /> */} @@ -278,7 +280,17 @@ export function AppRouter({ } /> - + + + } /> + + + + } /> + diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index e1444e5..f090f9e 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -95,7 +95,8 @@ export default function Navbar({ const cityId = localStorage.getItem("cityId") const cityName = localStorage.getItem("cityName") - const citySelected = location.pathname.includes(slugify(cityName) || "") + // const citySelected = location.pathname.includes(slugify(cityName) || "") + const citySelected = cityName const baseUrl = import.meta.env.VITE_BASE_URL; @@ -675,7 +676,7 @@ export default function Navbar({
} /> */} - navigate("/cart-page")} /> + navigate("/cart")} /> {/* Enhanced City Card Button with Source Tracking */}
diff --git a/src/pages/CartPage.tsx b/src/pages/CartPage.tsx index 3f06370..dc61438 100644 --- a/src/pages/CartPage.tsx +++ b/src/pages/CartPage.tsx @@ -446,14 +446,14 @@ export function CartPage({ setSelectedCardId(prev => (prev === id ? null : id)); }; - const handleGoToCheckout = () => { + const handleGoToCheckout = (selectedItemId:number) => { // const item = cartItems.find(i => i.id === selectedCardId); // if (item) { // setCheckoutItem({ ...item }); // setView('checkout'); // window.scrollTo({ top: 0, behavior: 'smooth' }); // } - navigate("/payment") + navigate(`/payment/${selectedItemId}`) }; const handleBackToCart = () => { @@ -641,7 +641,7 @@ export function CartPage({ handleGoToCheckout(selectedItem.id)} disabled={!selectedItem} className={`sm:w-auto px-8 py-3.5 rounded-xl font-poppins text-base font-medium flex items-center justify-center gap-2 transition-all duration-200 ${selectedItem ? 'bg-[#F95F62] text-white hover:bg-[#e8545a] shadow-lg shadow-[#F95F62]/20' : 'bg-gray-100 text-gray-400 cursor-not-allowed' }`} diff --git a/src/pages/CheckoutPage2.tsx b/src/pages/CheckoutPage2.tsx new file mode 100644 index 0000000..d8d6abe --- /dev/null +++ b/src/pages/CheckoutPage2.tsx @@ -0,0 +1,805 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { + ArrowLeft, Check, Minus, Plus, ChevronDown +} from 'lucide-react'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { useNavigate } from 'react-router-dom'; +import { useGetCheckoutPageDataQuery } from '../Redux/services/cards.service'; +import LoadingSpinner from '../components/LoadingSpinner'; + +/* ─── Types ─── */ +export interface CartItem { + id: string; + city: string; + cardType: 'Flexi' | 'Unlimited'; + days: number; + adults: number; + children: number; + quantity: number; + pricePerUnit: number; + image: string; +} + +interface Attraction { + id: string; + name: string; + image: string; + category: string; + included: boolean; +} + +/* ─── Data (Same as Original) ─── */ +const dayOptions = [3, 6, 12, 18, 24]; + +const priceTable: Record> = { + Flexi: { 3: 49.5, 6: 69, 12: 99, 18: 129, 24: 159 }, + Unlimited: { 3: 79, 6: 109, 12: 149, 18: 189, 24: 229 }, +}; + +const attractionsData: Record> = { + Melbourne: { + Flexi: [ + { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, + { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + ], + Unlimited: [ + { id: 'mel-1', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-2', name: 'Melbourne Zoo', image: 'https://images.unsplash.com/photo-1730074888490-31239540bacf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjB6b28lMjB3aWxkbGlmZXxlbnwxfHx8fDE3NzYzMTk5NzB8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-3', name: 'Royal Botanic Gardens', image: 'https://images.unsplash.com/photo-1585894507208-eeead8cb9a56?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBib3RhbmljYWwlMjBnYXJkZW4lMjBncmVlbnxlbnwxfHx8fDE3NzYzMTk5NzF8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Nature', included: true }, + { id: 'mel-4', name: 'NGV Art Gallery', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + { id: 'mel-5', name: 'Melbourne Star Wheel', image: 'https://images.unsplash.com/photo-1769880659692-fa77e04c5ffa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxvYnNlcnZhdGlvbiUyMHdoZWVsJTIwYW11c2VtZW50JTIwbmlnaHR8ZW58MXx8fHwxNzc2MzE5OTc2fDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + { id: 'mel-6', name: 'Penguin Parade', image: 'https://images.unsplash.com/photo-1670391050251-d1cfbc3891c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxwZW5ndWlucyUyMHdpbGRsaWZlJTIwbmF0dXJlfGVufDF8fHx8MTc3NjMxOTk3Nnww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'mel-7', name: 'Yarra River Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + ], + }, + Sydney: { + Flexi: [ + { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, + { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + ], + Unlimited: [ + { id: 'syd-1', name: 'Harbour Bridge Climb', image: 'https://images.unsplash.com/photo-1767974062666-2685a670e353?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwY2xpbWJ8ZW58MXx8fHwxNzc2MzE5OTcxfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Adventure', included: true }, + { id: 'syd-2', name: 'Taronga Zoo', image: 'https://images.unsplash.com/photo-1704852168456-b70e08441917?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxTeWRuZXklMjB0YXJvbmdhJTIwem9vJTIwYW5pbWFsc3xlbnwxfHx8fDE3NzYzMTk5NzJ8MA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + { id: 'syd-3', name: 'Art Gallery NSW', image: 'https://images.unsplash.com/photo-1752429242469-55ba7ec210d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhcnQlMjBnYWxsZXJ5JTIwbXVzZXVtJTIwaW50ZXJpb3J8ZW58MXx8fHwxNzc2MzE5OTczfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Culture', included: true }, + { id: 'syd-4', name: 'Sydney Harbour Cruise', image: 'https://images.unsplash.com/photo-1562003914-018a4a6c2171?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyaXZlciUyMGNydWlzZSUyMGJvYXQlMjBjaXR5fGVufDF8fHx8MTc3NjMxOTk3M3ww&ixlib=rb-4.1.0&q=80&w=1080', category: 'Experience', included: true }, + { id: 'syd-5', name: 'SEA LIFE Aquarium', image: 'https://images.unsplash.com/photo-1536845111858-bb269af65cb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxNZWxib3VybmUlMjBhcXVhcml1bSUyMHVuZGVyd2F0ZXJ8ZW58MXx8fHwxNzc2MzE5OTcwfDA&ixlib=rb-4.1.0&q=80&w=1080', category: 'Wildlife', included: true }, + ], + }, +}; + +const offersData: Record = { + Flexi: [ + { title: 'Astor Hotels Ultra Deluxe', description: '15% Discount on all treatments for first-time clients', image: 'https://images.unsplash.com/photo-1715191904112-4a5d9c3089fa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxsdXh1cnklMjBob3RlbCUyMHJlc29ydCUyMGV4dGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2MXww&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Green Valley Spa Lux', description: '20% Off on membership plans for new members', image: 'https://images.unsplash.com/photo-1759216853079-831ef8c8b327?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzcGElMjB3ZWxsbmVzcyUyMHRyZWF0bWVudCUyMGludGVyaW9yfGVufDF8fHx8MTc3NjMyMTM2M3ww&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Harbour Dining Co.', description: '10% Off your first dining experience at waterfront', image: 'https://images.unsplash.com/photo-1676471932681-45fa972d848a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyZXN0YXVyYW50JTIwZmluZSUyMGRpbmluZ3xlbnwxfHx8fDE3NzYzMTkxNDl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'National Gallery Exhibition', description: 'Free audio guide with every gallery visit', image: 'https://images.unsplash.com/photo-1569342380852-035f42d9ca41?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtdXNldW0lMjBnYWxsZXJ5JTIwZXhoaWJpdGlvbnxlbnwxfHx8fDE3NzYyNDYwMjh8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Sunset Harbour Cruise', description: 'Complimentary drink on every sunset cruise booking', image: 'https://images.unsplash.com/photo-1765783800962-83d99ff7b158?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxjcnVpc2UlMjBib2F0JTIwaGFyYm9yJTIwdG91cnxlbnwxfHx8fDE3NzYzMjE2MDd8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + ], + Unlimited: [ + { title: 'SkyView Ferris Wheel', description: 'Complimentary second ride for all pass holders', image: 'https://images.unsplash.com/photo-1626209025747-b41ee6ec191f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxmZXJyaXMlMjB3aGVlbCUyMGFtdXNlbWVudCUyMHBhcmt8ZW58MXx8fHwxNzc2MzE3NDI2fDA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'City Mall Boutique', description: '15% Off at select boutique stores with your pass', image: 'https://images.unsplash.com/photo-1567966689299-819568579d36?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzaG9wcGluZyUyMG1hbGwlMjBib3V0aXF1ZSUyMHJldGFpbHxlbnwxfHx8fDE3NzYzMjEzNjN8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Adventure Outfitters', description: 'Free gear rental on outdoor adventure bookings', image: 'https://images.unsplash.com/photo-1761131221577-0716baffc6ef?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhZHZlbnR1cmUlMjBzcG9ydHMlMjBvdXRkb29yJTIwYWN0aXZpdHl8ZW58MXx8fHwxNzc2MzIxMzYzfDA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Skyline Rooftop Lounge', description: 'Buy one get one free on signature cocktails', image: 'https://images.unsplash.com/photo-1642114955097-8f3d0e141641?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxyb29mdG9wJTIwYmFyJTIwY2l0eSUyMHNreWxpbmUlMjBuaWdodHxlbnwxfHx8fDE3NzYyNDU2NTl8MA&ixlib=rb-4.1.0&q=80&w=1080' }, + { title: 'Yarra Valley Wines', description: 'Exclusive wine tasting tour with pass holders discount', image: 'https://images.unsplash.com/photo-1764649841527-c8852b63cc53?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHx3aW5lJTIwdGFzdGluZyUyMHZpbmV5YXJkJTIwY2VsbGFyfGVufDF8fHx8MTc3NjMyMTYwOHww&ixlib=rb-4.1.0&q=80&w=1080' }, + ], +}; + +/* ─── FIGMA CARD PREVIEWS (Exact Copy) ─── */ +function FlexiCardPreview({ city, adultPrice, childPrice, isSelected }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean }) { + return ( +
+
+
+ {/* */} +
+

{city}

+
+
+
+ From + ${adultPrice} + /Adult +
+
+ and + ${childPrice} + /Child +
+
+
+

+ Dive into an extensive selection of thrilling destinations! +

+
+
+ Card + Flexi +
+ {isSelected && ( +
+ +
+ )} +
+ ); +} + +function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean }) { + return ( +
+
+
+ {/* */} +
+

{city}

+
+
+
+ From + ${adultPrice} + /Adult +
+
+ and + ${childPrice} + /Child +
+
+
+

+ Dive into an extensive selection of thrilling destinations! +

+
+
+ Card + Unlimited +
+ {isSelected && ( +
+ +
+ )} +
+ ); +} + +/* ─── CheckoutConfigCard (Exact Copy) ─── */ +function CheckoutConfigCard({ + item, + onChange, + onProceed, +}: { + item: CartItem; + onChange: (updates: Partial) => void; + onProceed: () => void; +}) { + const [daysOpen, setDaysOpen] = useState(false); + const originalPrice = (item.pricePerUnit * item.quantity * 1.35); + const totalPrice = item.pricePerUnit * item.quantity; + const navigate = useNavigate(); + + return ( +
+
+

{item.city}

+
+ + {item.cardType}3 + +
+
+
+
+ No. of Adults +
+ + {item.adults} + +
+
+ +
+ No. of Children +
+ + {item.children} + +
+
+ +
+ + {item.cardType === 'Flexi' ? 'No. of Attractions' : 'No. of Days'} + +
+ + + {daysOpen && ( + + {dayOptions.map((d) => ( + + ))} + + )} + +
+
+ +
+ You Pay +
+ ${originalPrice.toFixed(0)} + ${totalPrice.toFixed(0)} +
+
+
+ +
+ + Proceed to Pay + +
+
+ ); +} + +/* ─── MAIN CHECKOUT PAGE 2 ─── */ +// export function CheckoutPage2({ +// onHomeClick, +// onPassesClick, +// onAttractionsClick, +// onBlogsClick, +// onHowItWorksClick, +// onFAQClick, +// onPrivacyPolicyClick, +// onAboutUsClick, +// onContactUsClick, +// onSignInClick, +// onSignOutClick, +// onProfileClick, +// user, +// currentPage, +// }: any) { +// const navigate = useNavigate(); + +// // Default item (you can pass via props later) +// const [checkoutItem, setCheckoutItem] = useState({ +// id: '1', +// city: 'Melbourne', +// cardType: 'Flexi', +// days: 3, +// adults: 2, +// children: 1, +// quantity: 1, +// pricePerUnit: 49.5, +// image: '', +// }); + +// const cityId = localStorage.getItem("cityId") +// const { data: checkoutPageData, isLoading } = useGetCheckoutPageDataQuery(cityId) + +// const cards = checkoutPageData?.cards ?? [] + +// if (isLoading) { +// return +// } else { +// console.log(checkoutPageData) +// } + +// const handleCheckoutItemChange = (updates: Partial) => { +// const updated = { ...checkoutItem, ...updates }; +// const prices = priceTable[updated.cardType]; +// if (prices && prices[updated.days] !== undefined) { +// updated.pricePerUnit = prices[updated.days]; +// } +// setCheckoutItem(updated); +// }; + +// const attractions = attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []; +// const offers = offersData[checkoutItem.cardType] || []; + +// return ( +//
+// { }} +// onSignInClick={onSignInClick} +// onSignOutClick={onSignOutClick} +// onPassesClick={onPassesClick} +// onCheckoutClick={() => { }} +// onHomeClick={onHomeClick} +// onAttractionsClick={onAttractionsClick} +// onBlogsClick={onBlogsClick} +// onHowItWorksClick={onHowItWorksClick} +// onFAQClick={onFAQClick} +// onPrivacyPolicyClick={onPrivacyPolicyClick} +// onAboutUsClick={onAboutUsClick} +// onProfileClick={onProfileClick} +// onCityCardsClick={() => { }} +// onMagicItineraryClick={() => { }} +// onPostCardsClick={() => { }} +// onOffersClick={() => { }} +// onSuperSavingsClick={() => { }} +// onEsimsClick={() => { }} +// onHotelDiscountsClick={() => { }} +// onCartClick={() => { }} +// currentPage={currentPage} +// user={user} +// /> + +//
+// + +//
+//

+// Checkout{' '} +// {checkoutItem.city} +//

+//
+ +//
+// {/* Left Column */} +//
+// {/* Card Type Selection */} +//
+//

Choose Your Card

+//

Select the card type that best suits your travel style

+//
+// +// +//
+ +// {/* Features Comparison (Exact Copy) */} +//
+//
+//

Features

+//

Flexi

+//

Unlimited

+// {[ +// { feature: 'Access to attractions', flexi: true, unlimited: true }, +// { feature: 'Entry to attractions', flexi: true, unlimited: true }, +// { feature: 'Access to experiences', flexi: true, unlimited: true }, +// { feature: 'Entry to sites', flexi: false, unlimited: true }, +// { feature: 'Access to venues', flexi: true, unlimited: true }, +// { feature: 'Entry to events', flexi: true, unlimited: true }, +// { feature: 'Access to experiences', flexi: false, unlimited: true }, +// { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, +// { feature: 'Access to postcard creation', flexi: false, unlimited: true }, +// ].map((row, i) => ( +// +//

+// {row.feature} +//

+//
+// {row.flexi ?
: } +//
+//
+// {row.unlimited ?
: } +//
+//
+// ))} +//
+//
+//
+ +// {/* Offers Section (Exact) */} +//
+//

{checkoutItem.cardType} Card Offers

+//

Exclusive deals and discounts included with your {checkoutItem.cardType} pass

+//
+// {offers.map((offer, idx) => ( +//
+//
+//
+// +//
+//
+//

{offer.title}

+//
+//
+//

{offer.description}

+//
+//
+//
+//
+// ))} +//
+//
+ +// {/* Attractions Section (Exact) */} +//
+//
+//

Available Attractions

+// {attractions.length} included +//
+//

Explore all the experiences you can enjoy with your pass

+//
+// {attractions.map((a) => ( +//
+//
+// +//
+//
+// {a.category} +//
+//
+//
{a.name}
+//
+//
+//
+// ))} +//
+//
+//
+ +// {/* Right Column - Config Card */} +//
+//
+// navigate("/payment")} +// /> +//
+//
+ +// {/* Mobile Config Card */} +//
+// navigate("/payment")} +// /> +//
+//
+//
+ +//
+//
+// ); +// } + +export function CheckoutPage2({ + onHomeClick, + onPassesClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onContactUsClick, + onSignInClick, + onSignOutClick, + onProfileClick, + user, + currentPage, +}: any) { + const navigate = useNavigate(); + + const cityId = localStorage.getItem("cityId"); + const { data: checkoutPageData, isLoading } = useGetCheckoutPageDataQuery(cityId); + + const city = checkoutPageData?.city; + const allCards = checkoutPageData?.cards ?? []; + const allAttractions = checkoutPageData?.attractions ?? []; + const allOffers = checkoutPageData?.offers ?? []; + + const baseUrl = import.meta.env.VITE_BASE_URL; + + + // Initialize with first card (Flexi) as default + const defaultCard = allCards[0] || null; + + const [checkoutItem, setCheckoutItem] = useState({ + id: defaultCard?.id?.toString() || '1', + city: city?.name || 'Melbourne', + cardType: defaultCard?.cardType?.displayName || 'Flexi', + days: defaultCard?.validityDuration || 3, + adults: 2, + children: 1, + quantity: 1, + pricePerUnit: defaultCard?.adultPrice || 49.5, + image: city?.heroBanner?.image || '', + }); + + if (isLoading) { + return ; + } + + const handleCheckoutItemChange = (updates: Partial) => { + const updated = { ...checkoutItem, ...updates }; + + // If card type changes, update with real card data + if (updates.cardType) { + const selectedCard = allCards.find( + c => c.cardType?.displayName === updates.cardType + ); + if (selectedCard) { + updated.id = selectedCard.id.toString(); + updated.days = selectedCard.validityDuration; + updated.pricePerUnit = selectedCard.adultPrice; + } + } + + setCheckoutItem(updated); + }; + + // Get currently selected card + const selectedCard = allCards.find(c => + c.cardType?.displayName === checkoutItem.cardType + ) || allCards[0]; + + // Offers for selected card (fallback to global offers) + const currentOffers = selectedCard?.offers?.length + ? selectedCard.offers + : allOffers; + + return ( +
+ { }} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} + onCheckoutClick={() => { }} + onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={() => { }} + onMagicItineraryClick={() => { }} + onPostCardsClick={() => { }} + onOffersClick={() => { }} + onSuperSavingsClick={() => { }} + onEsimsClick={() => { }} + onHotelDiscountsClick={() => { }} + onCartClick={() => { }} + currentPage={currentPage} + user={user} + /> + +
+ + +
+

+ Checkout{' '} + + {city?.name || checkoutItem.city} + +

+
+ +
+ {/* Left Column */} +
+ {/* Card Type Selection */} +
+

Choose Your Card

+

+ Select the card type that best suits your travel style +

+
+ {allCards.map((card) => ( + + ))} +
+ + {/* Features Comparison - Kept as is (no CSS change) */} +
+
+ {/* Header */} +

Features

+

Flexi

+

Unlimited

+ {[ + { feature: 'Access to attractions', flexi: true, unlimited: true }, + { feature: 'Entry to attractions', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: true, unlimited: true }, + { feature: 'Entry to sites', flexi: false, unlimited: true }, + { feature: 'Access to venues', flexi: true, unlimited: true }, + { feature: 'Entry to events', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: false, unlimited: true }, + { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, + { feature: 'Access to postcard creation', flexi: false, unlimited: true }, + ].map((row, i) => ( + +

+ {row.feature} +

+
+ {row.flexi ? ( +
+ +
+ ) : ( + + )} +
+
+ {row.unlimited ? ( +
+ +
+ ) : ( + + )} +
+
+ ))} +
+
+
+ + {/* Offers Section */} +
+

+ {checkoutItem.cardType} Card Offers +

+

+ Exclusive deals and discounts included with your {checkoutItem.cardType} pass +

+
+ {currentOffers.map((offer, idx) => ( +
+
+
+ +
+
+

+ {offer.title} +

+
+
+

+ {offer.description} +

+
+
+
+
+ ))} +
+
+ + {/* Attractions Section */} +
+
+

Available Attractions

+ + {allAttractions.length} included + +
+

+ Explore all the experiences you can enjoy with your pass +

+
+ {allAttractions.map((attraction) => ( +
+
+ +
+
+
+ {attraction.title} +
+
+
+
+ ))} +
+
+
+ + {/* Right Column - Config Card */} +
+
+ navigate("/payment")} + /> +
+
+ + {/* Mobile Config Card */} +
+ navigate("/payment")} + /> +
+
+
+ +
+
+ ); +} \ No newline at end of file From 326d5e58718a5489a31df75962615820f38ea43b Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 20 Apr 2026 12:11:12 +0530 Subject: [PATCH 35/91] integrate userdetails api in the payment page --- src/Redux/services/cards.service.ts | 13 +- src/pages/PaymentDetailsPage.tsx | 318 ++++++++++++++++++---------- 2 files changed, 208 insertions(+), 123 deletions(-) diff --git a/src/Redux/services/cards.service.ts b/src/Redux/services/cards.service.ts index 689e9cf..c2850cf 100644 --- a/src/Redux/services/cards.service.ts +++ b/src/Redux/services/cards.service.ts @@ -19,19 +19,18 @@ export const cardsApi = createApi({ providesTags: ["cardsInCart"] }), - getUpcomingCities: builder.query({ - query: (listType) => `/cities/list/all?listType=${listType}`, - + getCheckoutPageData: builder.query({ + query: (cityId) => `/website/pass/${cityId}`, }), - getCheckoutPageData:builder.query({ - query: (cityId) => `/website/pass/${cityId}`, - + getCardBookingDetails: builder.query({ + query: (bookingId) => `/website/passes/${bookingId}/details`, }), }) }); export const { useGetCardsinCartQuery, - useGetCheckoutPageDataQuery + useGetCheckoutPageDataQuery, + useGetCardBookingDetailsQuery } = cardsApi; \ No newline at end of file diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx index b863f0d..49c4912 100644 --- a/src/pages/PaymentDetailsPage.tsx +++ b/src/pages/PaymentDetailsPage.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { ArrowLeft, User, MapPin, Lock, Shield, ChevronDown, @@ -8,6 +8,10 @@ import Navbar from '../components/Navbar'; import { Footer } from '../components/Footer'; import { Card, CardContent, CardHeader } from '../components/ui/card'; import { Separator } from '../components/ui/separator'; +import { useGetUserProfileDetailsQuery } from '../Redux/services/profile.service'; +import LoadingSpinner from '../components/LoadingSpinner'; +import { useParams } from 'react-router-dom'; +import { useGetCardBookingDetailsQuery } from '../Redux/services/cards.service'; export interface CheckoutOrderItem { city: string; @@ -48,32 +52,37 @@ interface PaymentDetailsPageProps { user?: { email: string; name: string } | null; } -/* ─── Profile data ─── */ -const profileData = { - firstName: 'John', - lastName: 'Doe', - email: 'john.doe@example.com', - phone: '+1 (555) 123-4567', - address: '123 Main Street', - city: 'New York', - state: 'NY', - postcode: '10001', - country: 'United States', -}; - /* ─── Editable field ─── */ function Field({ - label, value, onChange, placeholder, type = 'text', - error, maxLength, inputMode, prefilled, + label, + value, + onChange, + placeholder, + type = 'text', + error, + maxLength, + inputMode, + prefilled, + disabled = false, // ← New prop }: { - label: string; value: string; onChange: (v: string) => void; placeholder?: string; - type?: string; error?: string; maxLength?: number; - inputMode?: React.HTMLAttributes['inputMode']; prefilled?: boolean; + label: string; + value: string; + onChange: (v: string) => void; + placeholder?: string; + type?: string; + error?: string; + maxLength?: number; + inputMode?: React.HTMLAttributes['inputMode']; + prefilled?: boolean; + disabled?: boolean; // ← Added }) { const [focused, setFocused] = useState(false); + return (
- +
- {prefilled && !focused && ( + + {/* Pencil icon only when prefilled AND not disabled AND not focused */} + {prefilled && !focused && !disabled && ( )}
+ {error && ( {error} @@ -110,11 +125,10 @@ function Field({ /* ─── Card type badge ─── */ function CardTypeBadge({ cardType }: { cardType: 'Flexi' | 'Unlimited' }) { return ( - + {cardType} Card ); @@ -152,21 +166,50 @@ export function PaymentDetailsPage({ /* ── Purchase type ── */ const [selectedTab, setSelectedTab] = useState<'myself' | 'gift'>('myself'); - const [giftName, setGiftName] = useState(''); + + /* ── Gift Recipient Details (Only editable fields) ── */ + const [giftFirstName, setGiftFirstName] = useState(''); + const [giftLastName, setGiftLastName] = useState(''); const [giftEmail, setGiftEmail] = useState(''); + const [giftPhone, setGiftPhone] = useState(''); + const [giftCity, setGiftCity] = useState(''); + const [giftCountry, setGiftCountry] = useState(''); - /* ── Personal Info ── */ - const [firstName, setFirstName] = useState(profileData.firstName); - const [lastName, setLastName] = useState(profileData.lastName); - const [email, setEmail] = useState(user?.email || profileData.email); - const [phone, setPhone] = useState(profileData.phone); + /* ── Profile Data (Same as ProfilePage) ── */ + const [formData, setFormData] = useState({ + firstName: '', + lastName: '', + email: '', + phone: '', + country: '', + address1: '', + address2: '', + city: '', + postalCode: '' + }); - /* ── Billing Address ── */ - const [address, setAddress] = useState(profileData.address); - const [billingCity, setBillingCity] = useState(profileData.city); - const [state, setState] = useState(profileData.state); - const [postcode, setPostcode] = useState(profileData.postcode); - const [country, setCountry] = useState(profileData.country); + const userId = localStorage.getItem("userId"); + const { bookingId } = useParams() + const { data: userDetails, isLoading } = useGetUserProfileDetailsQuery(userId); + const { data: bookingDetails } = useGetCardBookingDetailsQuery(bookingId); + console.log(bookingDetails) + + // Populate formData from API (exactly like ProfilePage) + useEffect(() => { + if (userDetails) { + setFormData({ + firstName: userDetails?.firstName, + lastName: userDetails?.lastName, + email: userDetails?.emailAddress, + phone: userDetails?.mobileNumber, + country: userDetails?.country, + address1: userDetails?.address1, + address2: userDetails?.address2, + city: userDetails?.cityName, + postalCode: userDetails?.zipCode, + }); + } + }, [userDetails]); /* ── Validation ── */ const [errors, setErrors] = useState>({}); @@ -183,20 +226,32 @@ export function PaymentDetailsPage({ const validate = () => { const e: Record = {}; - if (!firstName.trim()) e.firstName = 'Required'; - if (!lastName.trim()) e.lastName = 'Required'; - if (!email.trim() || !/\S+@\S+\.\S+/.test(email)) e.email = 'Valid email required'; - if (!phone.trim()) e.phone = 'Required'; - if (!address.trim()) e.address = 'Required'; - if (!billingCity.trim()) e.billingCity = 'Required'; - if (!postcode.trim()) e.postcode = 'Required'; + + if (selectedTab === 'gift') { + if (!giftFirstName.trim()) e.giftFirstName = 'Required'; + if (!giftLastName.trim()) e.giftLastName = 'Required'; + + if (!giftEmail.trim() || !/\S+@\S+\.\S+/.test(giftEmail)) { + e.giftEmail = 'Valid email required'; + } + + if (!giftPhone.trim() || !/^\+?[0-9]{7,15}$/.test(giftPhone)) { + e.giftPhone = 'Valid phone required'; + } + + if (!giftCity.trim()) e.giftCity = 'Required'; + if (!giftCountry.trim()) e.giftCountry = 'Required'; + } + return e; }; + const handleSubmit = () => { const e = validate(); setErrors(e); if (Object.keys(e).length > 0) return; + setSubmitting(true); setTimeout(() => { setSubmitting(false); @@ -204,10 +259,14 @@ export function PaymentDetailsPage({ }, 1800); }; + if (isLoading) { + return ; + } + return (
{}} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} + activeCity="Melbourne" onCityChange={() => { }} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} onPassesClick={onPassesClick} onCheckoutClick={onCheckoutClick} onHomeClick={onHomeClick} onAttractionsClick={onAttractionsClick} onBlogsClick={onBlogsClick} onHowItWorksClick={onHowItWorksClick} onFAQClick={onFAQClick} onPrivacyPolicyClick={onPrivacyPolicyClick} onAboutUsClick={onAboutUsClick} @@ -219,7 +278,7 @@ export function PaymentDetailsPage({
- {/* Back */} + {/* Back Button */}

- - + + + + + + + + + + + +
)} - - {/* 2. Billing Address */} + {/* Billing Address */}
@@ -352,26 +456,17 @@ export function PaymentDetailsPage({

Billing Address

- + { }} prefilled disabled={true} /> + { }} prefilled disabled={true} />
- - + { }} prefilled disabled={true} /> + { }} prefilled disabled={true} />
- + { }} inputMode="numeric" prefilled disabled={true} />
-
- - + { }} prefilled disabled={true} />
@@ -382,40 +477,37 @@ export function PaymentDetailsPage({ - {/* ── RIGHT: Order Summary ── */} + {/* RIGHT: Order Summary (unchanged) */}
-

Order Summary

- {/* Card info */}
-
- {order.cardType} +
+ {bookingDetails?.city?.cardMode}
-

{order.city}

- +

{bookingDetails?.city?.name}

+

- {order.cardType === 'Flexi' ? `${order.days} Attractions` : `${order.days} Days`} + {bookingDetails?.city?.cardMode.toLowerCase() === 'flexi' ? `${bookingDetails?.city?.noOfAttractions} Attractions` : `${bookingDetails?.city?.noOfDays} Days`}

{[ - { label: 'Adults', value: order.adults }, - { label: 'Children', value: order.children }, - { label: 'Qty', value: order.quantity }, + { label: 'Adults', value: bookingDetails?.city?.totalAdult }, + { label: 'Children', value: bookingDetails?.city?.totalChild }, + // { label: 'Qty', value: order.quantity }, ].map(({ label, value }) => (
{label} @@ -425,7 +517,6 @@ export function PaymentDetailsPage({
- {/* Pricing breakdown */}
@@ -448,7 +539,6 @@ export function PaymentDetailsPage({
- {/* CTA */} {submitting ? ( <> - + Processing… ) : ( From b19d3194cf50fa22580f1e5d979c433dd72b5db0 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 20 Apr 2026 16:08:50 +0530 Subject: [PATCH 36/91] integrate storeRecipentData api in the payment page --- src/Redux/services/cards.service.ts | 11 ++- src/pages/PaymentDetailsPage.tsx | 105 ++++++++++++++++++++-------- 2 files changed, 87 insertions(+), 29 deletions(-) diff --git a/src/Redux/services/cards.service.ts b/src/Redux/services/cards.service.ts index c2850cf..08116c9 100644 --- a/src/Redux/services/cards.service.ts +++ b/src/Redux/services/cards.service.ts @@ -26,11 +26,20 @@ export const cardsApi = createApi({ getCardBookingDetails: builder.query({ query: (bookingId) => `/website/passes/${bookingId}/details`, }), + + storeRecipientDetails: builder.mutation({ + query: ({ recipientDetails, bookingId }) => ({ // keep the name of the variables being passed here same as when calling the mutation hook + url: `/website/passes/${bookingId}/store-gift-details`, + method: "PUT", + body: recipientDetails + }), + }), }) }); export const { useGetCardsinCartQuery, useGetCheckoutPageDataQuery, - useGetCardBookingDetailsQuery + useGetCardBookingDetailsQuery, + useStoreRecipientDetailsMutation } = cardsApi; \ No newline at end of file diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx index 49c4912..7054559 100644 --- a/src/pages/PaymentDetailsPage.tsx +++ b/src/pages/PaymentDetailsPage.tsx @@ -11,7 +11,8 @@ import { Separator } from '../components/ui/separator'; import { useGetUserProfileDetailsQuery } from '../Redux/services/profile.service'; import LoadingSpinner from '../components/LoadingSpinner'; import { useParams } from 'react-router-dom'; -import { useGetCardBookingDetailsQuery } from '../Redux/services/cards.service'; +import { useGetCardBookingDetailsQuery, useStoreRecepientDetailsMutation, useStoreRecipientDetailsMutation } from '../Redux/services/cards.service'; +import { toast } from 'sonner'; export interface CheckoutOrderItem { city: string; @@ -174,6 +175,8 @@ export function PaymentDetailsPage({ const [giftPhone, setGiftPhone] = useState(''); const [giftCity, setGiftCity] = useState(''); const [giftCountry, setGiftCountry] = useState(''); + const [giftIsd, setGiftIsd] = useState("") + const [giftMessage, setGiftMessage] = useState("") /* ── Profile Data (Same as ProfilePage) ── */ const [formData, setFormData] = useState({ @@ -191,8 +194,10 @@ export function PaymentDetailsPage({ const userId = localStorage.getItem("userId"); const { bookingId } = useParams() const { data: userDetails, isLoading } = useGetUserProfileDetailsQuery(userId); - const { data: bookingDetails } = useGetCardBookingDetailsQuery(bookingId); - console.log(bookingDetails) + const { data } = useGetCardBookingDetailsQuery(bookingId); + const [storeRecipientDetails, { isLoading: savingChanges }] = useStoreRecipientDetailsMutation(); + + const bookingDetails = data?.bookingDetails ?? null // Populate formData from API (exactly like ProfilePage) useEffect(() => { @@ -230,6 +235,8 @@ export function PaymentDetailsPage({ if (selectedTab === 'gift') { if (!giftFirstName.trim()) e.giftFirstName = 'Required'; if (!giftLastName.trim()) e.giftLastName = 'Required'; + if (!giftIsd.trim()) e.giftIsd = 'Required'; + if (!giftMessage.trim()) e.giftMessage = 'Required'; if (!giftEmail.trim() || !/\S+@\S+\.\S+/.test(giftEmail)) { e.giftEmail = 'Valid email required'; @@ -246,17 +253,44 @@ export function PaymentDetailsPage({ return e; }; + const recipientDetails = { + isForSelf: true, + recipientFirstName: giftFirstName, + recipientLastName: giftLastName, + recipientEmail: giftEmail, + recipientIsdCode: `+${giftIsd}`, + recipientPhone: giftPhone, + recipientCity: giftCity, + recipientCountry: giftCountry, + giftMessage: giftMessage, + }; - const handleSubmit = () => { + + const handleSaveProfile = async () => { + try { + console.log("Saving profile...", recipientDetails); + const response = await storeRecipientDetails({ recipientDetails, bookingId }); + console.log(response) + toast.success("gift details saved successfully!"); + } catch (error) { + console.error("Error saving profile:", error); + toast.error("Failed to update profile. Please try again."); + } + }; + + const handleSubmit = async () => { const e = validate(); setErrors(e); if (Object.keys(e).length > 0) return; - - setSubmitting(true); - setTimeout(() => { - setSubmitting(false); - onPaymentComplete(); - }, 1800); + try { + console.log("Saving profile...", recipientDetails); + const response = await storeRecipientDetails({ recipientDetails, bookingId }); + console.log(response) + toast.success("gift details saved successfully!"); + } catch (error) { + console.error("Error saving profile:", error); + toast.error("Failed to update profile. Please try again."); + } }; if (isLoading) { @@ -406,16 +440,15 @@ export function PaymentDetailsPage({ placeholder="Enter recipient's last name" error={errors.giftLastName} /> - + + + +
@@ -487,26 +536,26 @@ export function PaymentDetailsPage({
-
- {bookingDetails?.city?.cardMode} + {bookingDetails?.cardMode}
-

{bookingDetails?.city?.name}

- +

{bookingDetails?.name}

+

- {bookingDetails?.city?.cardMode.toLowerCase() === 'flexi' ? `${bookingDetails?.city?.noOfAttractions} Attractions` : `${bookingDetails?.city?.noOfDays} Days`} + {bookingDetails?.cardMode.toLowerCase() === 'flexi' ? `${bookingDetails?.noOfAttractions} Attractions` : `${bookingDetails?.noOfDays} Days`}

{[ - { label: 'Adults', value: bookingDetails?.city?.totalAdult }, - { label: 'Children', value: bookingDetails?.city?.totalChild }, + { label: 'Adults', value: bookingDetails?.totalAdult }, + { label: 'Children', value: bookingDetails?.totalChild }, // { label: 'Qty', value: order.quantity }, ].map(({ label, value }) => (
@@ -521,11 +570,11 @@ export function PaymentDetailsPage({
Subtotal - ${subtotal.toFixed(2)} + ${bookingDetails?.baseAmount}
GST (10%) - ${tax.toFixed(2)} + ${bookingDetails?.totalTaxAmount}
Booking fee @@ -533,7 +582,7 @@ export function PaymentDetailsPage({
Total - ${total.toFixed(2)} + ${bookingDetails?.totalAmount}
@@ -554,7 +603,7 @@ export function PaymentDetailsPage({ ) : ( <> - Complete Payment · ${total.toFixed(2)} + Complete Payment · ${bookingDetails.totalAmount} )} From a88958603e0db1710f22f7758aa8282065bdc437 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 20 Apr 2026 16:25:27 +0530 Subject: [PATCH 37/91] change the heading of paymentPage --- src/pages/CheckoutPage2.tsx | 6 +++--- src/pages/PaymentDetailsPage.tsx | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pages/CheckoutPage2.tsx b/src/pages/CheckoutPage2.tsx index d8d6abe..32bff5b 100644 --- a/src/pages/CheckoutPage2.tsx +++ b/src/pages/CheckoutPage2.tsx @@ -254,7 +254,7 @@ function CheckoutConfigCard({
- + navigate(`/payment/390`)} className="w-full py-4 rounded-full bg-[#f95f62] text-white font-poppins text-base font-medium hover:bg-[#e8545a] transition-colors shadow-lg shadow-[#f95f62]/20"> Proceed to Pay
@@ -604,13 +604,13 @@ export function CheckoutPage2({ onClick={() => navigate(-1)} className="flex items-center gap-2 text-[#8e8e8e] hover:text-[#2a2a2a] transition-colors font-poppins text-sm font-normal mb-8" > - Back to Cart + Back

Checkout{' '} - + {city?.name || checkoutItem.city}

diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx index 7054559..0f22825 100644 --- a/src/pages/PaymentDetailsPage.tsx +++ b/src/pages/PaymentDetailsPage.tsx @@ -10,7 +10,7 @@ import { Card, CardContent, CardHeader } from '../components/ui/card'; import { Separator } from '../components/ui/separator'; import { useGetUserProfileDetailsQuery } from '../Redux/services/profile.service'; import LoadingSpinner from '../components/LoadingSpinner'; -import { useParams } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import { useGetCardBookingDetailsQuery, useStoreRecepientDetailsMutation, useStoreRecipientDetailsMutation } from '../Redux/services/cards.service'; import { toast } from 'sonner'; @@ -190,6 +190,7 @@ export function PaymentDetailsPage({ city: '', postalCode: '' }); + const navigate = useNavigate() const userId = localStorage.getItem("userId"); const { bookingId } = useParams() @@ -314,7 +315,7 @@ export function PaymentDetailsPage({ {/* Back Button */} + {item.adults} + +
+
+ + {/* No. of Children */} +
+ No. of Children +
+ + {item.children} + +
+
+ + {/* No. of Days (dropdown) */} +
+ + {item.cardType === 'Flexi' ? 'No. of Attractions' : 'No. of Days'} + +
+ + + {daysOpen && ( + + {dayOptions.map((d) => ( + + ))} + + )} + +
+
+ + {/* You Pay */} +
+ You Pay +
+ + ${originalPrice.toFixed(0)} + + + ${totalPrice.toFixed(0)} + +
+
+
+ + {/* Proceed button */} +
+ + Proceed to Pay + +
+
+ ); +} + +/* ═══════════════════════════════════════════ + MAIN CART PAGE + ═══════════════════════════════════════════ */ + +export function CartPageDesign({ + onBackClick, + onHomeClick, + onPassesClick, + onCheckoutClick, + onSecureCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onSuperSavingsClick, + onEsimsClick, + onHotelDiscountsClick, + onContactUsClick, + onCartClick, + currentPage, + user, +}: CartPageDesignProps) { + const [activeTab, setActiveTab] = useState<'cards' | 'postcards'>('cards'); + const [cartItems, setCartItems] = useState(initialCartItems); + const [selectedCardId, setSelectedCardId] = useState(null); + const [view, setView] = useState<'cart' | 'checkout'>('cart'); + const [checkoutItem, setCheckoutItem] = useState(null); + + const handleRemoveItem = (id: string) => { + setCartItems(prev => prev.filter(item => item.id !== id)); + if (selectedCardId === id) setSelectedCardId(null); + }; + + const handleSelectCard = (id: string) => { + setSelectedCardId(prev => (prev === id ? null : id)); + }; + + const handleGoToCheckout = () => { + const item = cartItems.find(i => i.id === selectedCardId); + if (item) { + setCheckoutItem({ ...item }); + setView('checkout'); + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + }; + + const handleBackToCart = () => { + setView('cart'); + setCheckoutItem(null); + }; + + const handleCheckoutItemChange = (updates: Partial) => { + if (!checkoutItem) return; + const updated = { ...checkoutItem, ...updates }; + const prices = priceTable[updated.cardType]; + if (prices && prices[updated.days] !== undefined) { + updated.pricePerUnit = prices[updated.days]; + } + setCheckoutItem(updated); + }; + + const isEmpty = cartItems.length === 0; + const selectedItem = cartItems.find(i => i.id === selectedCardId); + const attractions = checkoutItem ? (attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []) : []; + const offers = checkoutItem ? (offersData[checkoutItem.cardType] || []) : []; + + return ( +
+ {}} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} onCheckoutClick={onCheckoutClick} onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} onBlogsClick={onBlogsClick} onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} onPrivacyPolicyClick={onPrivacyPolicyClick} onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} onCityCardsClick={onCityCardsClick} onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} onOffersClick={onOffersClick} onSuperSavingsClick={onSuperSavingsClick} + onEsimsClick={onEsimsClick} onHotelDiscountsClick={onHotelDiscountsClick} onCartClick={onCartClick} + currentPage={currentPage as any} user={user} + /> + + + {view === 'cart' ? ( + /* ─── CART VIEW ─── */ + + {/* Header */} +
+

+ Your{' '} + Cart +

+

+ {isEmpty ? 'Your cart is empty' : `${cartItems.length} ${cartItems.length === 1 ? 'item' : 'items'} in your cart`} +

+
+ + {/* Tab switcher */} + {/* Cards listed directly below */} + + {/* Content */} + + {activeTab === 'cards' ? ( + + {isEmpty ? ( + } title="No cards in your cart" description="Browse our city passes to unlock amazing experiences and savings on your next adventure" actionLabel="Explore Passes" onAction={onPassesClick} /> + ) : ( +
+ {/* Table header (desktop) */} +
+
City Cards
+
Travellers
+
Qty
+
Price
+
+
+ + + {cartItems.map((item) => { + const isSelected = selectedCardId === item.id; + const totalPrice = item.pricePerUnit * item.quantity; + + return ( + handleSelectCard(item.id)} + className={`relative bg-white rounded-2xl overflow-hidden cursor-pointer transition-all duration-300 ${ + isSelected ? 'ring-2 ring-[#F95F62] shadow-lg shadow-[#F95F62]/8' : 'ring-1 ring-gray-100 hover:ring-gray-200 hover:shadow-md' + }`} + > + {/* Selected badge */} + + {isSelected && ( + + + + )} + + + {/* Mobile layout */} +
+
+ +
+
+
+
+
{item.city}
+
+ {item.cardType} + {item.days}d +
+
+ +
+
+ {item.adults}A · {item.children}C · Qty {item.quantity} +
+ ${totalPrice.toFixed(2)} + {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)}/ea} +
+
+
+
+ + {/* Desktop layout */} +
+
+
+ +
+
+
{item.city}
+
+ {item.cardType} Card + {item.days} days +
+
+
+
+
+ {item.adults} + {item.children} +
+
+
+ {item.quantity} +
+
+ ${totalPrice.toFixed(2)} + {item.quantity > 1 && ${item.pricePerUnit.toFixed(2)} per unit} +
+
+ +
+
+
+ ); + })} +
+ + {/* Bottom checkout bar */} + +
+ {selectedItem ? ( + <> +

+ Selected: {selectedItem.city} {selectedItem.cardType} · {selectedItem.days}d · Qty {selectedItem.quantity} +

+

+ ${(selectedItem.pricePerUnit * selectedItem.quantity).toFixed(2)} +

+ + ) : ( +

Tap a card above to select it for checkout

+ )} +
+ + Secure Checkout + +
+
+ )} + + ) : ( + + } title="No post cards yet" description="Send beautiful digital post cards to friends and family from your favourite destinations around the world" actionLabel="Browse Post Cards" onAction={onPostCardsClick} /> + + )} + + + ) : ( + /* ─── CHECKOUT VIEW ─── */ + + {checkoutItem && ( + <> + {/* Back */} + + + {/* Stepper */} + {/* */} + + {/* Checkout heading */} +
+

+ Checkout{' '} + {checkoutItem.city} +

+ +
+ +
+ {/* Left column */} +
+ + {/* ── Card Type Selection (Figma cards) ── */} +
+

+ Choose Your Card +

+

+ Select the card type that best suits your travel style +

+
+ {/* Flexi */} + + + {/* Unlimited */} + +
+ + {/* ── Config Card (mobile only) — right after card selection ── */} +
+ checkoutItem && onSecureCheckoutClick?.(checkoutItem)} + /> +
+ + {/* Features Comparison */} +
+
+ {/* Header */} +

Features

+

Flexi

+

Unlimited

+ {[ + { feature: 'Access to attractions', flexi: true, unlimited: true }, + { feature: 'Entry to attractions', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: true, unlimited: true }, + { feature: 'Entry to sites', flexi: false, unlimited: true }, + { feature: 'Access to venues', flexi: true, unlimited: true }, + { feature: 'Entry to events', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: false, unlimited: true }, + { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, + { feature: 'Access to postcard creation', flexi: false, unlimited: true }, + ].map((row, i) => ( + +

+ {row.feature} +

+
+ {row.flexi ? ( +
+ +
+ ) : ( + + )} +
+
+ {row.unlimited ? ( +
+ +
+ ) : ( + + )} +
+
+ ))} +
+
+
+ + {/* ── Offers ── */} +
+

+ {checkoutItem.cardType} Card Offers +

+

+ Exclusive deals and discounts included with your {checkoutItem.cardType} pass +

+
+ {offers.map((offer, idx) => ( +
+
+
+ +
+
+

+ {offer.title} +

+
+
+

+ {offer.description} +

+
+
+
+
+ ))} +
+
+ + {/* ── Available Attractions ── */} +
+
+

Available Attractions

+ {attractions.length} included +
+

+ Explore all the experiences you can enjoy with your pass +

+
+ {attractions.map((a) => ( +
+
+ +
+
+ {a.category} +
+
+
{a.name}
+
+ +
+
+ ))} +
+
+
+ + {/* Right column: Config card (desktop only, sticky) */} +
+
+ checkoutItem && onSecureCheckoutClick?.(checkoutItem)} + /> +
+
+
+ + )} + + )} + + +
+
+ ); +} + +/* ─── Empty state ─── */ +function EmptyState({ icon, title, description, actionLabel, onAction }: { + icon: React.ReactNode; title: string; description: string; actionLabel: string; onAction?: () => void; +}) { + return ( + + {icon} +

{title}

+

{description}

+ {actionLabel} +
+ ); +} \ No newline at end of file diff --git a/src/pages/CheckoutPage2.tsx b/src/pages/CheckoutPage2.tsx index 32bff5b..7f8f136 100644 --- a/src/pages/CheckoutPage2.tsx +++ b/src/pages/CheckoutPage2.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { ArrowLeft, Check, Minus, Plus, ChevronDown @@ -91,15 +91,21 @@ const offersData: Record +
+ {/* Card bg */}
-
- {/* */} + {/* City image */} +
+ +
+ {/* City name - left aligned */}

{city}

+ {/* Pricing */}
From @@ -112,15 +118,18 @@ function FlexiCardPreview({ city, adultPrice, childPrice, isSelected }: { city: /Child
+ {/* Description */}

Dive into an extensive selection of thrilling destinations!

+ {/* Side tab - Flexi (pink) */}
Card Flexi
+ {/* Selected checkmark */} {isSelected && (
@@ -130,15 +139,21 @@ function FlexiCardPreview({ city, adultPrice, childPrice, isSelected }: { city: ); } -function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean }) { +function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected, image }: { city: string; adultPrice: number; childPrice: number; isSelected: boolean, image: string; }) { return ( -
+
+ {/* Card bg */}
-
- {/* */} + {/* City image */} +
+ +
+ {/* City name - left aligned */}

{city}

+ {/* Pricing */}
From @@ -151,15 +166,18 @@ function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected }: { ci /Child
+ {/* Description */}

Dive into an extensive selection of thrilling destinations!

+ {/* Side tab - Unlimited (coral) */}
Card Unlimited
+ {/* Selected checkmark */} {isSelected && (
@@ -172,25 +190,39 @@ function UnlimitedCardPreview({ city, adultPrice, childPrice, isSelected }: { ci /* ─── CheckoutConfigCard (Exact Copy) ─── */ function CheckoutConfigCard({ item, - onChange, onProceed, }: { - item: CartItem; - onChange: (updates: Partial) => void; + item: any; onProceed: () => void; }) { - const [daysOpen, setDaysOpen] = useState(false); - const originalPrice = (item.pricePerUnit * item.quantity * 1.35); - const totalPrice = item.pricePerUnit * item.quantity; + const [dropdownOpen, setDropdownOpen] = useState(false); + const [noOfAdults, setNoOfAdults] = useState(1) + const [noOfChildren, setNoOfChildren] = useState(0) + const [noOfAttractions, setNoOfAttractions] = useState(item?.minNumber); + + const adultPrice = item?.adultPrice * noOfAdults + const childPrice = item?.childPrice * noOfChildren + const originalPrice = adultPrice + childPrice + const totalPrice = originalPrice - 20 + + useEffect(() => { + setNoOfAttractions(item?.minNumber) + }, [item]) + + const numberArray = Array.from( + { length: item?.maxNumber - item?.minNumber + 1 }, + (_, i) => item?.minNumber + i + ); + const navigate = useNavigate(); return (
-

{item.city}

+

{item?.city}

- - {item.cardType}3 + + {item?.cardType?.displayName}
@@ -198,11 +230,11 @@ function CheckoutConfigCard({
No. of Adults
- - {item.adults} -
@@ -211,11 +243,11 @@ function CheckoutConfigCard({
No. of Children
- - {item.children} -
@@ -223,19 +255,35 @@ function CheckoutConfigCard({
- {item.cardType === 'Flexi' ? 'No. of Attractions' : 'No. of Days'} + {item?.cardType?.name === 'selective_pass' ? 'No. of Attractions' : 'No. of Days'}
- - {daysOpen && ( - - {dayOptions.map((d) => ( - ))} @@ -247,8 +295,8 @@ function CheckoutConfigCard({
You Pay
- ${originalPrice.toFixed(0)} - ${totalPrice.toFixed(0)} + ${originalPrice} + ${totalPrice}
@@ -263,6 +311,233 @@ function CheckoutConfigCard({ } /* ─── MAIN CHECKOUT PAGE 2 ─── */ +export function CheckoutPage2({ + onHomeClick, + onPassesClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onContactUsClick, + onSignInClick, + onSignOutClick, + onProfileClick, + user, + currentPage, +}: any) { + const navigate = useNavigate(); + + // Default item (you can pass via props later) + + const cityId = localStorage.getItem("cityId") + const { data: checkoutPageData, isLoading } = useGetCheckoutPageDataQuery(cityId) + + const cityName = checkoutPageData?.city?.name ?? "" + const cityImage = checkoutPageData?.city?.heroBanner?.image ?? "" + const cards = checkoutPageData?.cards ?? [] + const flexiCard = checkoutPageData?.cards[0] ?? null + const unlimitedCard = checkoutPageData?.cards[1] ?? null + + const [checkoutItem, setCheckoutItem] = useState(flexiCard); + + useEffect(() => { + setCheckoutItem(flexiCard) + }, [cards]) + + console.log(checkoutItem) + + if (isLoading) { + return + } else { + console.log(flexiCard) + } + + const handleCheckoutItemChange = (cardObject: any) => { + setCheckoutItem(cardObject); + }; + + // const attractions = attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []; + // const offers = offersData[checkoutItem.cardType] || []; + + return ( +
+ { }} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} + onCheckoutClick={() => { }} + onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={() => { }} + onMagicItineraryClick={() => { }} + onPostCardsClick={() => { }} + onOffersClick={() => { }} + onSuperSavingsClick={() => { }} + onEsimsClick={() => { }} + onHotelDiscountsClick={() => { }} + onCartClick={() => { }} + currentPage={currentPage} + user={user} + /> + +
+ + +
+

+ Checkout{' '} + {cityName} +

+
+ +
+ {/* Left Column */} +
+ {/* Card Type Selection */} +
+

Choose Your Card

+

Select the card type that best suits your travel style

+
+ + +
+ + {/* Features Comparison (Exact Copy) */} +
+
+

Features

+

Flexi

+

Unlimited

+ {[ + { feature: 'Access to attractions', flexi: true, unlimited: true }, + { feature: 'Entry to attractions', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: true, unlimited: true }, + { feature: 'Entry to sites', flexi: false, unlimited: true }, + { feature: 'Access to venues', flexi: true, unlimited: true }, + { feature: 'Entry to events', flexi: true, unlimited: true }, + { feature: 'Access to experiences', flexi: false, unlimited: true }, + { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, + { feature: 'Access to postcard creation', flexi: false, unlimited: true }, + ].map((row, i) => ( + +

+ {row.feature} +

+
+ {row.flexi ?
: } +
+
+ {row.unlimited ?
: } +
+
+ ))} +
+
+
+ + {/* Offers Section (Exact) */} + {/*
+

{checkoutItem.cardType} Card Offers

+

Exclusive deals and discounts included with your {checkoutItem.cardType} pass

+
+ {offers.map((offer, idx) => ( +
+
+
+ +
+
+

{offer.title}

+
+
+

{offer.description}

+
+
+
+
+ ))} +
+
*/} + + {/* Attractions Section (Exact) */} + {/*
+
+

Available Attractions

+ {attractions.length} included +
+

Explore all the experiences you can enjoy with your pass

+
+ {attractions.map((a) => ( +
+
+ +
+
+ {a.category} +
+
+
{a.name}
+
+
+
+ ))} +
+
*/} +
+ + {/* Right Column - Config Card */} +
+
+ navigate("/payment")} + /> +
+
+ + {/* Mobile Config Card */} + {/*
+ navigate("/payment")} + /> +
*/} +
+
+ +
+
+ ); +} + // export function CheckoutPage2({ // onHomeClick, // onPassesClick, @@ -281,46 +556,68 @@ function CheckoutConfigCard({ // }: any) { // const navigate = useNavigate(); -// // Default item (you can pass via props later) +// const cityId = localStorage.getItem("cityId"); +// const { data: checkoutPageData, isLoading } = useGetCheckoutPageDataQuery(cityId); + +// const city = checkoutPageData?.city; +// const allCards = checkoutPageData?.cards ?? []; +// const allAttractions = checkoutPageData?.attractions ?? []; +// const allOffers = checkoutPageData?.offers ?? []; + +// const baseUrl = import.meta.env.VITE_BASE_URL; + + +// // Initialize with first card (Flexi) as default +// const defaultCard = allCards[0] || null; + // const [checkoutItem, setCheckoutItem] = useState({ -// id: '1', -// city: 'Melbourne', -// cardType: 'Flexi', -// days: 3, +// id: defaultCard?.id?.toString() || '1', +// city: city?.name || 'Melbourne', +// cardType: defaultCard?.cardType?.displayName || 'Flexi', +// days: defaultCard?.validityDuration || 3, // adults: 2, // children: 1, // quantity: 1, -// pricePerUnit: 49.5, -// image: '', +// pricePerUnit: defaultCard?.adultPrice || 49.5, +// image: city?.heroBanner?.image || '', // }); -// const cityId = localStorage.getItem("cityId") -// const { data: checkoutPageData, isLoading } = useGetCheckoutPageDataQuery(cityId) - -// const cards = checkoutPageData?.cards ?? [] - // if (isLoading) { -// return -// } else { -// console.log(checkoutPageData) +// return ; // } // const handleCheckoutItemChange = (updates: Partial) => { // const updated = { ...checkoutItem, ...updates }; -// const prices = priceTable[updated.cardType]; -// if (prices && prices[updated.days] !== undefined) { -// updated.pricePerUnit = prices[updated.days]; + +// // If card type changes, update with real card data +// if (updates.cardType) { +// const selectedCard = allCards.find( +// c => c.cardType?.displayName === updates.cardType +// ); +// if (selectedCard) { +// updated.id = selectedCard.id.toString(); +// updated.days = selectedCard.validityDuration; +// updated.pricePerUnit = selectedCard.adultPrice; +// } // } + // setCheckoutItem(updated); // }; -// const attractions = attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []; -// const offers = offersData[checkoutItem.cardType] || []; +// // Get currently selected card +// const selectedCard = allCards.find(c => +// c.cardType?.displayName === checkoutItem.cardType +// ) || allCards[0]; + +// // Offers for selected card (fallback to global offers) +// const currentOffers = selectedCard?.offers?.length +// ? selectedCard.offers +// : allOffers; // return ( //
// { }} // onSignInClick={onSignInClick} // onSignOutClick={onSignOutClick} @@ -347,14 +644,19 @@ function CheckoutConfigCard({ // /> //
-// //
//

// Checkout{' '} -// {checkoutItem.city} +// +// {city?.name || checkoutItem.city} +// //

//
@@ -364,19 +666,40 @@ function CheckoutConfigCard({ // {/* Card Type Selection */} //
//

Choose Your Card

-//

Select the card type that best suits your travel style

+//

+// Select the card type that best suits your travel style +//

//
-// -// +// {allCards.map((card) => ( +// +// ))} //
-// {/* Features Comparison (Exact Copy) */} +// {/* Features Comparison - Kept as is (no CSS change) */} //
//
+// {/* Header */} //

Features

//

Flexi

//

Unlimited

@@ -396,10 +719,22 @@ function CheckoutConfigCard({ // {row.feature} //

//
-// {row.flexi ?
: } +// {row.flexi ? ( +//
+// +//
+// ) : ( +// +// )} //
//
-// {row.unlimited ?
: } +// {row.unlimited ? ( +//
+// +//
+// ) : ( +// +// )} //
// // ))} @@ -407,22 +742,34 @@ function CheckoutConfigCard({ //
//
-// {/* Offers Section (Exact) */} +// {/* Offers Section */} //
-//

{checkoutItem.cardType} Card Offers

-//

Exclusive deals and discounts included with your {checkoutItem.cardType} pass

+//

+// {checkoutItem.cardType} Card Offers +//

+//

+// Exclusive deals and discounts included with your {checkoutItem.cardType} pass +//

//
-// {offers.map((offer, idx) => ( +// {currentOffers.map((offer, idx) => ( //
//
//
-// +// //
//
-//

{offer.title}

+//

+// {offer.title} +//

//
//
-//

{offer.description}

+//

+// {offer.description} +//

//
//
//
@@ -431,24 +778,31 @@ function CheckoutConfigCard({ //
//
-// {/* Attractions Section (Exact) */} +// {/* Attractions Section */} //
//
//

Available Attractions

-// {attractions.length} included +// +// {allAttractions.length} included +// //
-//

Explore all the experiences you can enjoy with your pass

+//

+// Explore all the experiences you can enjoy with your pass +//

//
-// {attractions.map((a) => ( -//
+// {allAttractions.map((attraction) => ( +//
//
-// +// //
-//
-// {a.category} -//
//
-//
{a.name}
+//
+// {attraction.title} +//
//
//
//
@@ -492,314 +846,4 @@ function CheckoutConfigCard({ // /> //
// ); -// } - -export function CheckoutPage2({ - onHomeClick, - onPassesClick, - onAttractionsClick, - onBlogsClick, - onHowItWorksClick, - onFAQClick, - onPrivacyPolicyClick, - onAboutUsClick, - onContactUsClick, - onSignInClick, - onSignOutClick, - onProfileClick, - user, - currentPage, -}: any) { - const navigate = useNavigate(); - - const cityId = localStorage.getItem("cityId"); - const { data: checkoutPageData, isLoading } = useGetCheckoutPageDataQuery(cityId); - - const city = checkoutPageData?.city; - const allCards = checkoutPageData?.cards ?? []; - const allAttractions = checkoutPageData?.attractions ?? []; - const allOffers = checkoutPageData?.offers ?? []; - - const baseUrl = import.meta.env.VITE_BASE_URL; - - - // Initialize with first card (Flexi) as default - const defaultCard = allCards[0] || null; - - const [checkoutItem, setCheckoutItem] = useState({ - id: defaultCard?.id?.toString() || '1', - city: city?.name || 'Melbourne', - cardType: defaultCard?.cardType?.displayName || 'Flexi', - days: defaultCard?.validityDuration || 3, - adults: 2, - children: 1, - quantity: 1, - pricePerUnit: defaultCard?.adultPrice || 49.5, - image: city?.heroBanner?.image || '', - }); - - if (isLoading) { - return ; - } - - const handleCheckoutItemChange = (updates: Partial) => { - const updated = { ...checkoutItem, ...updates }; - - // If card type changes, update with real card data - if (updates.cardType) { - const selectedCard = allCards.find( - c => c.cardType?.displayName === updates.cardType - ); - if (selectedCard) { - updated.id = selectedCard.id.toString(); - updated.days = selectedCard.validityDuration; - updated.pricePerUnit = selectedCard.adultPrice; - } - } - - setCheckoutItem(updated); - }; - - // Get currently selected card - const selectedCard = allCards.find(c => - c.cardType?.displayName === checkoutItem.cardType - ) || allCards[0]; - - // Offers for selected card (fallback to global offers) - const currentOffers = selectedCard?.offers?.length - ? selectedCard.offers - : allOffers; - - return ( -
- { }} - onSignInClick={onSignInClick} - onSignOutClick={onSignOutClick} - onPassesClick={onPassesClick} - onCheckoutClick={() => { }} - onHomeClick={onHomeClick} - onAttractionsClick={onAttractionsClick} - onBlogsClick={onBlogsClick} - onHowItWorksClick={onHowItWorksClick} - onFAQClick={onFAQClick} - onPrivacyPolicyClick={onPrivacyPolicyClick} - onAboutUsClick={onAboutUsClick} - onProfileClick={onProfileClick} - onCityCardsClick={() => { }} - onMagicItineraryClick={() => { }} - onPostCardsClick={() => { }} - onOffersClick={() => { }} - onSuperSavingsClick={() => { }} - onEsimsClick={() => { }} - onHotelDiscountsClick={() => { }} - onCartClick={() => { }} - currentPage={currentPage} - user={user} - /> - -
- - -
-

- Checkout{' '} - - {city?.name || checkoutItem.city} - -

-
- -
- {/* Left Column */} -
- {/* Card Type Selection */} -
-

Choose Your Card

-

- Select the card type that best suits your travel style -

-
- {allCards.map((card) => ( - - ))} -
- - {/* Features Comparison - Kept as is (no CSS change) */} -
-
- {/* Header */} -

Features

-

Flexi

-

Unlimited

- {[ - { feature: 'Access to attractions', flexi: true, unlimited: true }, - { feature: 'Entry to attractions', flexi: true, unlimited: true }, - { feature: 'Access to experiences', flexi: true, unlimited: true }, - { feature: 'Entry to sites', flexi: false, unlimited: true }, - { feature: 'Access to venues', flexi: true, unlimited: true }, - { feature: 'Entry to events', flexi: true, unlimited: true }, - { feature: 'Access to experiences', flexi: false, unlimited: true }, - { feature: 'Access to Itinerary creation', flexi: false, unlimited: true }, - { feature: 'Access to postcard creation', flexi: false, unlimited: true }, - ].map((row, i) => ( - -

- {row.feature} -

-
- {row.flexi ? ( -
- -
- ) : ( - - )} -
-
- {row.unlimited ? ( -
- -
- ) : ( - - )} -
-
- ))} -
-
-
- - {/* Offers Section */} -
-

- {checkoutItem.cardType} Card Offers -

-

- Exclusive deals and discounts included with your {checkoutItem.cardType} pass -

-
- {currentOffers.map((offer, idx) => ( -
-
-
- -
-
-

- {offer.title} -

-
-
-

- {offer.description} -

-
-
-
-
- ))} -
-
- - {/* Attractions Section */} -
-
-

Available Attractions

- - {allAttractions.length} included - -
-

- Explore all the experiences you can enjoy with your pass -

-
- {allAttractions.map((attraction) => ( -
-
- -
-
-
- {attraction.title} -
-
-
-
- ))} -
-
-
- - {/* Right Column - Config Card */} -
-
- navigate("/payment")} - /> -
-
- - {/* Mobile Config Card */} -
- navigate("/payment")} - /> -
-
-
- -
-
- ); -} \ No newline at end of file +// } \ No newline at end of file diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx index 0f22825..08b5ad3 100644 --- a/src/pages/PaymentDetailsPage.tsx +++ b/src/pages/PaymentDetailsPage.tsx @@ -11,7 +11,7 @@ import { Separator } from '../components/ui/separator'; import { useGetUserProfileDetailsQuery } from '../Redux/services/profile.service'; import LoadingSpinner from '../components/LoadingSpinner'; import { useNavigate, useParams } from 'react-router-dom'; -import { useGetCardBookingDetailsQuery, useStoreRecepientDetailsMutation, useStoreRecipientDetailsMutation } from '../Redux/services/cards.service'; +import { useGetCardBookingDetailsQuery, useStoreRecipientDetailsMutation } from '../Redux/services/cards.service'; import { toast } from 'sonner'; export interface CheckoutOrderItem { From 0543627f426970845e4ca926f2e933f60ca6bdd0 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Mon, 20 Apr 2026 23:46:22 +0530 Subject: [PATCH 39/91] render the offers and attractions in checkoutPage2 --- src/pages/CheckoutPage2.tsx | 72 ++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/src/pages/CheckoutPage2.tsx b/src/pages/CheckoutPage2.tsx index 7f8f136..4897c2f 100644 --- a/src/pages/CheckoutPage2.tsx +++ b/src/pages/CheckoutPage2.tsx @@ -199,23 +199,44 @@ function CheckoutConfigCard({ const [noOfAdults, setNoOfAdults] = useState(1) const [noOfChildren, setNoOfChildren] = useState(0) const [noOfAttractions, setNoOfAttractions] = useState(item?.minNumber); + const [noOfDays, setNoOfDays] = useState(item?.minNumber) + const cityId = localStorage.getItem("cityId") + + const cardTypeId = item?.cardType?.id + const cardId = item?.id + const cardMode = item?.cardType?.name === "selective_pass" ? "flexi" : "unlimited" const adultPrice = item?.adultPrice * noOfAdults const childPrice = item?.childPrice * noOfChildren - const originalPrice = adultPrice + childPrice - const totalPrice = originalPrice - 20 + const basePrice = adultPrice + childPrice + const taxAmount = 10 + const strikedPrice = basePrice - 20 useEffect(() => { setNoOfAttractions(item?.minNumber) + setNoOfDays(item?.minNumber) }, [item]) const numberArray = Array.from( { length: item?.maxNumber - item?.minNumber + 1 }, (_, i) => item?.minNumber + i ); - const navigate = useNavigate(); + const cardBookingDetails = { + cityId, + cardTypeId, + cardId, + noOfAdults, + cardMode, + noOfChildren, + taxAmount, + noOfAttractions, + noOfDays + } + + + return (
@@ -259,7 +280,7 @@ function CheckoutConfigCard({
@@ -275,13 +296,14 @@ function CheckoutConfigCard({ @@ -295,8 +317,8 @@ function CheckoutConfigCard({
You Pay
- ${originalPrice} - ${totalPrice} + ${basePrice} + ${strikedPrice}
@@ -330,6 +352,7 @@ export function CheckoutPage2({ const navigate = useNavigate(); // Default item (you can pass via props later) + const baseUrl = import.meta.env.VITE_BASE_URL; const cityId = localStorage.getItem("cityId") const { data: checkoutPageData, isLoading } = useGetCheckoutPageDataQuery(cityId) @@ -339,6 +362,7 @@ export function CheckoutPage2({ const cards = checkoutPageData?.cards ?? [] const flexiCard = checkoutPageData?.cards[0] ?? null const unlimitedCard = checkoutPageData?.cards[1] ?? null + const attractions = checkoutPageData?.attractions ?? []; const [checkoutItem, setCheckoutItem] = useState(flexiCard); @@ -351,15 +375,13 @@ export function CheckoutPage2({ if (isLoading) { return } else { - console.log(flexiCard) + // console.log(flexiCard) } const handleCheckoutItemChange = (cardObject: any) => { setCheckoutItem(cardObject); }; - // const attractions = attractionsData[checkoutItem.city]?.[checkoutItem.cardType] || []; - // const offers = offersData[checkoutItem.cardType] || []; return (
@@ -452,15 +474,15 @@ export function CheckoutPage2({
{/* Offers Section (Exact) */} - {/*
-

{checkoutItem.cardType} Card Offers

-

Exclusive deals and discounts included with your {checkoutItem.cardType} pass

+
+

{checkoutItem?.cardType?.displayName} Offers

+

Exclusive deals and discounts included with your {checkoutItem?.cardType.displayName} pass

- {offers.map((offer, idx) => ( -
+ {checkoutItem?.offers.map((offer: any) => ( +
- +

{offer.title}

@@ -473,32 +495,32 @@ export function CheckoutPage2({
))}
-
*/} +
{/* Attractions Section (Exact) */} - {/*
+

Available Attractions

{attractions.length} included

Explore all the experiences you can enjoy with your pass

- {attractions.map((a) => ( + {attractions.map((a: any) => (
- +
{a.category}
-
{a.name}
+
{a.title}
))}
-
*/} +
{/* Right Column - Config Card */} From c490a820e4907399cd3dd24148b4c8a1519bb3d6 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 21 Apr 2026 11:51:35 +0530 Subject: [PATCH 40/91] integrate add to cart api in the checkoutConfig card --- src/Redux/services/cards.service.ts | 10 +++++- src/pages/CheckoutPage2.tsx | 55 ++++++++++++++++++----------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/Redux/services/cards.service.ts b/src/Redux/services/cards.service.ts index 08116c9..fbc43e3 100644 --- a/src/Redux/services/cards.service.ts +++ b/src/Redux/services/cards.service.ts @@ -34,6 +34,13 @@ export const cardsApi = createApi({ body: recipientDetails }), }), + addCardToCart: builder.mutation({ + query: (cardBookingDetails) => ({ // keep the name of the variables being passed here same as when calling the mutation hook + url: `/website/passes/add-to-cart`, + method: "POST", + body: cardBookingDetails + }), + }), }) }); @@ -41,5 +48,6 @@ export const { useGetCardsinCartQuery, useGetCheckoutPageDataQuery, useGetCardBookingDetailsQuery, - useStoreRecipientDetailsMutation + useStoreRecipientDetailsMutation, + useAddCardToCartMutation } = cardsApi; \ No newline at end of file diff --git a/src/pages/CheckoutPage2.tsx b/src/pages/CheckoutPage2.tsx index 4897c2f..4235469 100644 --- a/src/pages/CheckoutPage2.tsx +++ b/src/pages/CheckoutPage2.tsx @@ -7,8 +7,9 @@ import Navbar from '../components/Navbar'; import { Footer } from '../components/Footer'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; import { useNavigate } from 'react-router-dom'; -import { useGetCheckoutPageDataQuery } from '../Redux/services/cards.service'; +import { useAddCardToCartMutation, useGetCheckoutPageDataQuery } from '../Redux/services/cards.service'; import LoadingSpinner from '../components/LoadingSpinner'; +import { toast } from 'sonner'; /* ─── Types ─── */ export interface CartItem { @@ -202,15 +203,17 @@ function CheckoutConfigCard({ const [noOfDays, setNoOfDays] = useState(item?.minNumber) const cityId = localStorage.getItem("cityId") - + const cityName = localStorage.getItem("cityName") const cardTypeId = item?.cardType?.id const cardId = item?.id const cardMode = item?.cardType?.name === "selective_pass" ? "flexi" : "unlimited" const adultPrice = item?.adultPrice * noOfAdults const childPrice = item?.childPrice * noOfChildren const basePrice = adultPrice + childPrice - const taxAmount = 10 - const strikedPrice = basePrice - 20 + const taxAmount = basePrice * 0.1 + const strikedPrice = basePrice + 20 + + const [addCardToCart] = useAddCardToCartMutation() useEffect(() => { setNoOfAttractions(item?.minNumber) @@ -224,23 +227,35 @@ function CheckoutConfigCard({ const navigate = useNavigate(); const cardBookingDetails = { - cityId, - cardTypeId, - cardId, - noOfAdults, - cardMode, - noOfChildren, + cityXid: cityId, + cardTypeXid: cardTypeId, + cardXid: cardId, + cardMode, // stays as-is + totalAdult: noOfAdults, + baseAmount: basePrice, // static value taxAmount, + totalChild: noOfChildren, noOfAttractions, noOfDays + }; + + const handleProceedToPayment = async () => { + try { + console.log("Adding card to cart", cardBookingDetails); + const response = await addCardToCart(cardBookingDetails); + console.log(response) + const bookingId = response?.data?.id + navigate(`/payment/${bookingId}`) + } catch (error) { + console.error("Error adding card to cart:", error); + toast.error("Failed to move forward. Please try again."); + } } - - return (
-

{item?.city}

+

{cityName}

{item?.cardType?.displayName} @@ -296,12 +311,12 @@ function CheckoutConfigCard({
- navigate(`/payment/390`)} className="w-full py-4 rounded-full bg-[#f95f62] text-white font-poppins text-base font-medium hover:bg-[#e8545a] transition-colors shadow-lg shadow-[#f95f62]/20"> + Proceed to Pay
@@ -414,7 +429,7 @@ export function CheckoutPage2({
From 4c199f721af05bdda80466e5f1e1e476a0468b07 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 21 Apr 2026 19:12:52 +0530 Subject: [PATCH 41/91] integrate the create iternary api in the CreateIternaryPage --- src/App.tsx | 2 +- src/AppRouter.tsx | 18 + src/Redux/Store.tsx | 7 +- src/Redux/services/itinerary.service.ts | 28 + src/components/Navbar.tsx | 6 +- src/pages/CreateMagicIternaryPageDesign.tsx | 1125 +++++++++++++++++++ src/pages/ItineraryViewPageDesign.tsx | 746 ++++++++++++ 7 files changed, 1926 insertions(+), 6 deletions(-) create mode 100644 src/Redux/services/itinerary.service.ts create mode 100644 src/pages/CreateMagicIternaryPageDesign.tsx create mode 100644 src/pages/ItineraryViewPageDesign.tsx diff --git a/src/App.tsx b/src/App.tsx index ea15e93..17afb49 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -185,7 +185,7 @@ function App() {
{/* Card Title in Orange */} -

+

{stickyCardType === 'unlimited' ? ( <>Melbourne Unlimited Card ) : ( diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index 0b5fb55..e076e54 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -37,6 +37,8 @@ import { PaymentDetailsPage } from './pages/PaymentDetailsPage'; import { CartPageDesign } from './pages/CartPageDesign'; import { CheckoutPage2 } from './pages/CheckoutPage2'; import { SuperSavingsDetailsPage } from './pages/SuperSavingsDetailsPage'; +import { ViewCardDetailsPage } from './pages/ViewCardDetailsPageDesign'; +import { CreateMagicItineraryPageDesign } from './pages/CreateMagicIternaryPageDesign'; // User type definition interface User { @@ -194,6 +196,12 @@ export function AppRouter({ } /> + + + + } /> + {/* Itinerary Routes */} } /> + + + + } /> } /> + + + + } /> diff --git a/src/Redux/Store.tsx b/src/Redux/Store.tsx index 725a87a..363baba 100644 --- a/src/Redux/Store.tsx +++ b/src/Redux/Store.tsx @@ -4,6 +4,7 @@ import { citiesApi } from "./services/cities.service"; import { authApi } from "./services/auth.service"; import { profileApi } from "./services/profile.service"; import { cardsApi } from "./services/cards.service"; +import { itineraryApi } from "./services/itinerary.service"; export const store = configureStore({ reducer: { @@ -11,7 +12,8 @@ export const store = configureStore({ [citiesApi.reducerPath]: citiesApi.reducer, [authApi.reducerPath]: authApi.reducer, [profileApi.reducerPath]: profileApi.reducer, - [cardsApi.reducerPath]:cardsApi.reducer + [cardsApi.reducerPath]:cardsApi.reducer, + [itineraryApi.reducerPath]:itineraryApi.reducer }, @@ -21,7 +23,8 @@ export const store = configureStore({ citiesApi.middleware, authApi.middleware, profileApi.middleware, - cardsApi.middleware + cardsApi.middleware, + itineraryApi.middleware ), }); export type RootState = ReturnType; diff --git a/src/Redux/services/itinerary.service.ts b/src/Redux/services/itinerary.service.ts new file mode 100644 index 0000000..f19723e --- /dev/null +++ b/src/Redux/services/itinerary.service.ts @@ -0,0 +1,28 @@ + +import { createApi} from "@reduxjs/toolkit/query/react"; +import { baseQuery } from "../baseQuery"; + +export const itineraryApi = createApi({ + reducerPath: "itApi", + baseQuery, + + endpoints: (builder) => ({ + + + + createMagicItinerary: builder.mutation({ + query: (itineraryDetails) => ({ // keep the name of the variables being passed here same as when calling the mutation hook + url: `/website/itinerary`, + method: "POST", + body: itineraryDetails + }), + + }), + + + }) +}); + +export const { + useCreateMagicItineraryMutation, +} = itineraryApi; \ No newline at end of file diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index f090f9e..fbdc857 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -425,9 +425,9 @@ export default function Navbar({ }, []); useEffect(() => { - if (activeCity.toLowerCase() === 'melbourne') { + if (activeCity?.toLowerCase() === 'melbourne') { setLastKnownCity('melbourne'); - } else if (activeCity.toLowerCase() === 'landing' || activeCity.toLowerCase() === 'landingpage') { + } else if (activeCity?.toLowerCase() === 'landing' || activeCity?.toLowerCase() === 'landingpage') { setLastKnownCity('landing'); } }, [activeCity]); @@ -692,7 +692,7 @@ export default function Navbar({ label: 'My Profile', icon: , action: () => { - navigate(citySelected ? `/${slugify(cityName)}/profile` : '/profile'); + navigate(citySelected ? `/profile` : '/profile'); setActiveUserDropdown(false); } }, diff --git a/src/pages/CreateMagicIternaryPageDesign.tsx b/src/pages/CreateMagicIternaryPageDesign.tsx new file mode 100644 index 0000000..7ae60d8 --- /dev/null +++ b/src/pages/CreateMagicIternaryPageDesign.tsx @@ -0,0 +1,1125 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { + ArrowLeft, + ArrowRight, + MapPin, + Sparkles, + CheckCircle, + X, + Clock, + Calendar, + + Search, + Navigation, + Heart, + ChevronDown, + ChevronUp, + Share2, + Download, + ChevronRight, +} from 'lucide-react'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import { Progress } from '../components/ui/progress'; +import { Calendar as CalendarComponent } from '../components/ui/calendar'; +import { Input } from '../components/ui/input'; +import { Popover, PopoverContent, PopoverTrigger } from '../components/ui/popover'; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../components/ui/collapsible'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import svgRelaxPaths from '../imports/svg-s8leuc872s'; +import svgRunningPaths from '../imports/svg-hgtc6d03x0'; +import svgLuggagePaths from '../imports/svg-rfrt8mx1lu'; +import svgYogaPaths from '../imports/svg-rf4f5wcll0'; +import NounKidsIcon from '../imports/NounRelax65970551-9919-190'; +import NounSoloIcon from '../imports/NounRelax65970551-9919-186'; +import DietPizzaIcon from '../imports/NounRelax65970551-9919-366'; +import DietVeganIcon from '../imports/NounRelax65970551-9919-370'; +import DietPescatarianIcon from '../imports/NounRelax65970551-9919-374'; +import DietVegetarianIcon from '../imports/NounRelax65970551-9919-378'; +import DietHalalIcon from '../imports/NounRelax65970551-9919-382'; +import DietKosherIcon from '../imports/NounRelax65970551-9919-386'; +import MuseumNotInterestedIcon from '../imports/NounRelax65970551-9923-625'; +import MuseumMaybeIcon from '../imports/NounRelax65970551-9923-629'; +import MuseumSoundsGoodIcon from '../imports/NounRelax65970551-9923-633'; +import MuseumLoveItIcon from '../imports/NounRelax65970551-9923-637'; +import { useCreateMagicItineraryMutation } from '../Redux/services/itinerary.service'; +import { toast } from 'sonner'; + + +interface User { + email: string; + name: string; +} + +interface CreateMagicItineraryPageDesignProps { + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + currentPage: string; + user: User | null; +} + +interface ItineraryData { + destination: string; + locationSearch: string; + startDate: Date | undefined; + endDate: Date | undefined; + energy: string; + withKids: boolean; + museums: string; + dietaryPreferences: string[]; + +} + +const destinations = [ + { + id: 'melbourne', + name: 'Melbourne', + country: 'Australia', + image: 'https://images.unsplash.com/photo-1595434971780-79d5c20c5090?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtZWxib3VybmUlMjBza3lsaW5lJTIwYXVzdHJhbGlhfGVufDF8fHx8MTc1ODk2MzkxOHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral' + }, + { + id: 'sydney', + name: 'Sydney', + country: 'Australia', + image: 'https://images.unsplash.com/photo-1595563382617-fe6fa4fd0394?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxzeWRuZXklMjBoYXJib3VyJTIwYnJpZGdlJTIwYXVzdHJhbGlhfGVufDF8fHx8MTc1ODk2MzkyMXww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral' + }, + { + id: 'brisbane', + name: 'Brisbane', + country: 'Australia', + image: 'https://images.unsplash.com/photo-1729904987421-12490733e013?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxicmlzYmFuZSUyMGNpdHklMjByaXZlciUyMGF1c3RyYWxpYXxlbnwxfHx8fDE3NTg5NjM5Mjd8MA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral' + } +]; + +const energyOptions = [ + { + id: 'adventurous', + name: 'Adventurous', + description: 'High energy activities and exploration', + image: 'https://images.unsplash.com/photo-1587502537147-2ba64a62e3d3?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxhZHZlbnR1cmUlMjBvdXRkb29yJTIwaGlraW5nfGVufDF8fHx8MTc1ODk2NDQ2N3ww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral' + }, + { + id: 'relaxed', + name: 'Relaxed', + description: 'Peaceful and laid-back experiences', + image: 'https://images.unsplash.com/photo-1716893933701-73d59789bba7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHxyZWxheGVkJTIwc3BhJTIwcGVhY2VmdWx8ZW58MXx8fHwxNzU4OTY0NDcxfDA&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral' + } +]; + +const questionImages = { + museums: 'https://images.unsplash.com/photo-1747918157024-a1e1c77336fa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxtdXNldW0lMjBhcnQlMjBnYWxsZXJ5fGVufDF8fHx8MTc1ODkwOTYwMHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral' +}; + +const dietaryOptions = ['No Restrictions', 'Vegetarian', 'Vegan', 'Pescatarian', 'Halal', 'Kosher']; + +export function CreateMagicItineraryPageDesign({ + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + currentPage, + user +}: CreateMagicItineraryPageDesignProps) { + const [currentStep, setCurrentStep] = useState(1); + const [isGenerating, setIsGenerating] = useState(false); + const [showResults, setShowResults] = useState(false); + const [viewMode, setViewMode] = useState<'daily' | 'summary'>('daily'); + const [selectedDayTab, setSelectedDayTab] = useState(1); + + const [startDate, setStartDate] = useState(undefined); + const [tripEnergy, setTripEnergy] = useState("") + const [travellingWithKids, setTravellingWithKids] = useState(undefined) + const [dietaryPreferences, setDietaryPreferences] = useState([]) + const [artAndMuseums, setArtAndMuseums] = useState(undefined) + + const [itineraryData, setItineraryData] = useState({ + destination: 'melbourne', + locationSearch: 'Melbourne', + startDate: undefined, + endDate: undefined, + energy: '', + withKids: false, + museums: '', + dietaryPreferences: [], + + }); + + const [generatedItinerary, setGeneratedItinerary] = useState(null); + const [favorites, setFavorites] = useState>(new Set()); + const [openDays, setOpenDays] = useState>(new Set([1])); // First day open by default + const [selectedActivity, setSelectedActivity] = useState(null); + const [createMagicItinerary] = useCreateMagicItineraryMutation(); + + const toggleFavorite = (activityKey: string) => { + setFavorites(prev => { + const newSet = new Set(prev); + if (newSet.has(activityKey)) { + newSet.delete(activityKey); + } else { + newSet.add(activityKey); + } + return newSet; + }); + }; + + const toggleDay = (dayNumber: number) => { + setOpenDays(prev => { + const newSet = new Set(prev); + if (newSet.has(dayNumber)) { + newSet.delete(dayNumber); + } else { + newSet.add(dayNumber); + } + return newSet; + }); + }; + + const handleActivityClick = (activityKey: string) => { + setSelectedActivity(selectedActivity === activityKey ? null : activityKey); + }; + + const totalSteps = 5; + const progress = (currentStep / totalSteps) * 100; + + + const cityId = localStorage.getItem("cityId") + + const itineraryDetails = { + cityXid: cityId, // from your variable + startDate: startDate, // from your state + tripEnergy: tripEnergy, // from your variable + travelingWithKids: travellingWithKids, // note spelling difference + dietaryPreferences: dietaryPreferences, // your string[] state + preferences: { + artAndMuseums: artAndMuseums, + } + }; + + + const handleNext = () => { + if (currentStep < totalSteps) { + setCurrentStep(currentStep + 1); + } else { + generateItinerary(); + } + }; + + const handlePrevious = () => { + if (currentStep > 1) { + setCurrentStep(currentStep - 1); + } + }; + + const generateItinerary = async () => { + try { + console.log("creating itinerary...", itineraryDetails); + setIsGenerating(true); + const response = await createMagicItinerary(itineraryDetails); + console.log(response) + setGeneratedItinerary(response); + setShowResults(true); + toast.success("Itinerary created successfully!"); + } catch (error) { + console.error("Error creating itinerary:", error); + toast.error("Failed to create itinerary. Please try again."); + } finally { + setIsGenerating(false); + } + } + + const canProceed = () => { + switch (currentStep) { + case 1: return !!startDate; + case 2: return tripEnergy !== ''; + case 3: return travellingWithKids !== undefined; // Kids question - always allow proceeding + case 4: return true; // Dietary preferences - always allow proceeding + case 5: return artAndMuseums !== undefined; // Optional preference questions + default: return true; + } + }; + + const handleDietaryToggle = (option: string) => { + setDietaryPreferences(prev => + prev.includes(option) + ? prev.filter(item => item !== option) // remove if already present + : [...prev, option] // add if not present + ); + }; + + + const renderStepper = () => ( +

+
+ {Array.from({ length: totalSteps }, (_, index) => { + const stepNumber = index + 1; + const isActive = stepNumber === currentStep; + const isCompleted = stepNumber < currentStep; + + return ( +
+
+ {isCompleted ? ( + + ) : ( + {stepNumber} + )} +
+ {stepNumber < totalSteps && ( +
+ )} +
+ ); + })} +
+
+ ); + + const renderStep = () => { + if (isGenerating) { + return ( + +
+ + + +
+ +
+

Creating your

+

Magic Itinerary

+

+ Your smart itinerary is being created — we're crafting the perfect travel experience based on your preferences... +

+
+ +
+ +
+
+ ); + } + + if (showResults) { + const totalStops = generatedItinerary?.dailyPlans?.reduce((acc: number, day: any) => acc + (day.activities?.length || 0), 0) || 0; + const tripStartDate = itineraryData.startDate ? itineraryData.startDate.toLocaleDateString('en-AU', { day: '2-digit', month: '2-digit', year: 'numeric' }) : ''; + const selectedDayPlan = generatedItinerary?.dailyPlans?.find((d: any) => d.day === selectedDayTab); + + return ( + + {/* Title */} +
+

+ Your +

+

+ Melbourne Magic Itinerary +

+
+ + {/* Trip Details Card */} +
+ {/* Background Image */} +
+ +
+
+

Your Trip

+

Melbourne, Australia

+
+
+ {/* Stats Row */} +
+
+ {generatedItinerary?.totalDays} + Days +
+
+ {totalStops} + Stops +
+
+ {tripStartDate} + Start Date +
+
+
+ + {/* Share & Download Buttons */} +
+ + +
+ + {/* View Toggle */} +
+
+ + +
+
+ + {/* Daily View */} + {viewMode === 'daily' && ( +
+ {/* Day Tabs */} +
+ {generatedItinerary?.dailyPlans?.map((day: any) => ( + + ))} + {generatedItinerary?.dailyPlans?.length > 4 && ( + + )} +
+ + {/* Activities for selected day */} + {selectedDayPlan && ( + + + {selectedDayPlan.activities?.map((activity: any, actIndex: number) => { + const activityKey = `day${selectedDayPlan.day}-act${actIndex}`; + const isFavorite = favorites.has(activityKey); + + return ( + + {/* Time Label */} +

+ {activity.time} +

+ + {/* Activity Card */} + + + {/* Image */} +
+ + {/* Favorite Button */} +
+ +
+ {/* Get Directions Badge */} +
+ +
+
+ + {/* Content */} +
+

+ {activity.activity} +

+

+ {activity.address} +

+ + {/* Category Tags */} +
+ {activity.categories?.map((cat: string, ci: number) => ( + + {cat} + + ))} +
+ + {/* Bullet Points */} +
+ {activity.description?.map((detail: string, di: number) => ( +
+ + {detail} +
+ ))} +
+
+
+
+
+ ); + })} +
+
+ )} +
+ )} + + {/* Summary View */} + {viewMode === 'summary' && ( +
+ {generatedItinerary?.dailyPlans?.map((day: any, dayIndex: number) => { + const dayDate = itineraryData.startDate + ? new Date(new Date(itineraryData.startDate).setDate(itineraryData.startDate.getDate() + dayIndex)).toLocaleDateString('en-AU', { day: '2-digit', month: '2-digit', year: 'numeric' }) + : ''; + + return ( +
+ {/* Day Header */} +
+

Day {day.day}:

+
+ + {dayDate} +
+
+ + {/* Activity List */} +
+ {day.activities?.map((activity: any, actIndex: number) => { + const activityKey = `summary-day${day.day}-act${actIndex}`; + const isExpanded = selectedActivity === activityKey; + + return ( +
+
handleActivityClick(activityKey)} + > +

+ {activity.time}: {activity.activity} +

+ +
+ + + {isExpanded && ( + +
+ {activity.description?.map((detail: string, di: number) => ( +
+ + {detail} +
+ ))} + +
+
+ )} +
+
+ ); + })} +
+
+ ); + })} +
+ )} + + {/* Bottom Action */} +
+ +
+ + ); + } + + switch (currentStep) { + case 1: + return ( + + {/* Destination badge — centered */} +
+
+ + Melbourne, Australia +
+
+ + {/* Question — left aligned */} +
+

+ When are you planning{' '} + to visit? +

+

Pick your arrival date and we'll build your itinerary around it

+
+ + {/* Inline Calendar — centered */} +
+
+
+
+ + + {startDate + ? startDate.toLocaleDateString('en-AU', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }) + : 'Select your arrival date'} + +
+ setStartDate(date)} + disabled={(date: Date) => date < new Date()} + initialFocus + className="p-3 mx-auto" + classNames={{ + month: "flex flex-col gap-4 items-center w-full", + caption: "flex justify-center pt-1 relative items-center w-full transition-all duration-300", + head_row: "flex w-full justify-around", + head_cell: "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem] text-center", + row: "flex w-full mt-2 justify-around", + cell: "relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:rounded-full h-9 w-9 flex items-center justify-center transition-all duration-200 ease-out [&:has([aria-selected])]:scale-110", + day: "h-9 w-9 p-0 font-normal aria-selected:opacity-100 flex items-center justify-center rounded-full transition-all duration-200 ease-out hover:scale-110 hover:bg-primary/10 active:scale-95 cursor-pointer", + day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-full shadow-lg shadow-primary/30 scale-110 transition-all duration-200 ease-out", + day_today: "bg-accent text-accent-foreground ring-2 ring-primary/20", + day_disabled: "text-muted-foreground opacity-50 hover:scale-100 hover:bg-transparent cursor-not-allowed", + table: "w-full border-collapse", + }} + /> +
+ + {/* Confirmation pill */} + {startDate && ( + + +
+

Arrival date set!

+

+ {startDate.toLocaleDateString('en-AU', { day: 'numeric', month: 'long', year: 'numeric' })} +

+
+
+ )} +
+
+
+ ); + + case 2: + return ( + +
+

+ What kind of energy are you after on{' '} + this trip? +

+

Choose the pace that suits you best

+
+ +
+ {([ + { + id: 'relaxed', + name: 'Relaxed', + renderIcon: (sel: boolean) => ( + + + + ) + }, + { + id: 'balanced', + name: 'Balanced', + renderIcon: (sel: boolean) => ( + + + + + ) + }, + { + id: 'active', + name: 'Action Packed', + renderIcon: (sel: boolean) => ( + + + + ) + }, + { + id: 'adventure', + name: 'Explorer', + renderIcon: (sel: boolean) => ( + + + + ) + } + ] as Array<{ id: string; name: string; renderIcon: (sel: boolean) => React.ReactElement }>).map((option) => { + const isSelected = tripEnergy === option.id; + return ( + + setTripEnergy(option.id)} + > +
+ {option.renderIcon(false)} +
+

+ {option.name} +

+
+
+ ); + })} +
+
+ ); + + case 3: + return ( + +
+

+ Are you{' '} + travelling with kids? +

+

We'll tailor the experience to your group

+
+ +
+ {[ + { value: true, label: 'Yes', Icon: NounKidsIcon }, + { value: false, label: 'No', Icon: NounSoloIcon } + ].map((option) => { + const isSelected = travellingWithKids === option.value; + return ( + + setTravellingWithKids(option.value)} + > +
+ +
+

+ {option.label} +

+
+
+ ); + })} +
+
+ ); + + case 4: + return ( + +
+

+ Do you follow any{' '} + dietary preferences? +

+

We'll find the best food spots for you

+
+ +
+ {[ + { id: 'no-restriction', label: 'No Restrictions', Icon: DietPizzaIcon }, + { id: 'veg', label: 'Vegetarian', Icon: DietVegetarianIcon }, + { id: 'vegan', label: 'Vegan', Icon: DietVeganIcon }, + { id: 'pescatarian', label: 'Pescatarian', Icon: DietPescatarianIcon }, + { id: 'halal', label: 'Halal', Icon: DietHalalIcon }, + { id: 'kosher', label: 'Kosher', Icon: DietKosherIcon } + ].map((option) => { + const isSelected = dietaryPreferences.includes(option.id); + return ( + + handleDietaryToggle(option.id)} + > +
+ +
+

+ {option.label} +

+
+
+ ); + })} +
+
+ ); + + case 5: + return ( + +
+

+ Do you enjoy visiting{' '} + museums and art galleries? +

+

Help us personalise your cultural experiences

+
+ +
+ {[ + { id: 0, label: 'Not interested', Icon: MuseumNotInterestedIcon }, + { id: 1, label: 'Maybe one or two', Icon: MuseumMaybeIcon }, + { id: 2, label: 'Sounds good!', Icon: MuseumSoundsGoodIcon }, + { id: 3, label: 'Absolutely love it!', Icon: MuseumLoveItIcon } + ].map((option) => { + const isSelected = artAndMuseums === option.id; + return ( + + setArtAndMuseums(option.id)} + > +
+ +
+

+ {option.label} +

+
+
+ ); + })} +
+
+ ); + + + + default: + return null; + } + }; + + return ( +
+ { }} + onHomeClick={onHomeClick} + onPassesClick={onPassesClick} + onSignInClick={onSignInClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + currentPage="create-itinerary" + isUserSignedIn={!!user} + user={user} + /> + +
+
+ {/* Step header — left aligned, travel-magazine style */} + {!isGenerating && !showResults && ( +
+ {/* Step label */} +
+ + Step {currentStep} of {totalSteps} + +
+ + {/* Dashed flight-path progress */} +
+ {Array.from({ length: totalSteps }, (_, index) => { + const stepNumber = index + 1; + const isCompleted = stepNumber < currentStep; + const isActive = stepNumber === currentStep; + return ( + +
+ {isCompleted ? ( + + ) : ( + {stepNumber} + )} +
+ {stepNumber < totalSteps && ( +
+ {Array.from({ length: 4 }).map((_, di) => ( +
+ ))} +
+ )} + + ); + })} +
+ + {/* Thin fill bar */} +
+ +
+
+ )} + + {/* Main content card */} +
+ {!isGenerating && !showResults && ( +
+ + {renderStep()} + + + {/* Navigation */} +
+ + + +
+
+ )} + + {(isGenerating || showResults) && ( + + {renderStep()} + + )} +
+
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/pages/ItineraryViewPageDesign.tsx b/src/pages/ItineraryViewPageDesign.tsx new file mode 100644 index 0000000..bb78d02 --- /dev/null +++ b/src/pages/ItineraryViewPageDesign.tsx @@ -0,0 +1,746 @@ +import React, { useState } from 'react'; +import { motion } from 'motion/react'; +import { ArrowLeft, Calendar, Clock, MapPin, Users, Star, Heart, Share2, Download, CheckCircle, Navigation, Cloud, Sun } from 'lucide-react'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { Badge } from '../components/ui/badge'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; + +interface ItineraryViewPageDesignProps { + onBackClick: () => void; + onHomeClick: () => void; + onMelbourneClick: () => void; + onPassesClick: () => void; + onCheckoutClick: () => void; + onSignInClick: () => void; + onSignOutClick: () => void; + onAttractionsClick: () => void; + onBlogsClick: () => void; + onHowItWorksClick: () => void; + onFAQClick: () => void; + onPrivacyPolicyClick: () => void; + onAboutUsClick: () => void; + onProfileClick: () => void; + onCityCardsClick: () => void; + onMagicItineraryClick: () => void; + onPostCardsClick: () => void; + onOffersClick: () => void; + onCreateItineraryClick: () => void; + onContactUsClick?: () => void; + onEsimsClick?: () => void; + onHotelDiscountsClick?: () => void; + currentPage: string; + user?: { email: string; name: string; } | null; +} + +// Enhanced activity type with more details +interface Activity { + time: string; + activity: string; + location: string; + address: string; + image: string; + categories: string[]; + description: string[]; + isFavorite?: boolean; +} + +export function ItineraryViewPageDesign({ + onBackClick, + onHomeClick, + onMelbourneClick, + onPassesClick, + onCheckoutClick, + onSignInClick, + onSignOutClick, + onAttractionsClick, + onBlogsClick, + onHowItWorksClick, + onFAQClick, + onPrivacyPolicyClick, + onAboutUsClick, + onProfileClick, + onCityCardsClick, + onMagicItineraryClick, + onPostCardsClick, + onOffersClick, + onCreateItineraryClick, + onContactUsClick, + onEsimsClick, + onHotelDiscountsClick, + currentPage, + user +}: ItineraryViewPageDesignProps) { + const [viewMode, setViewMode] = useState<'daily' | 'summary'>('daily'); + const [favorites, setFavorites] = useState>(new Set()); + + const toggleFavorite = (activityKey: string) => { + setFavorites(prev => { + const newSet = new Set(prev); + if (newSet.has(activityKey)) { + newSet.delete(activityKey); + } else { + newSet.add(activityKey); + } + return newSet; + }); + }; + + // Enhanced itinerary data with images, addresses, and detailed info + const generatedItinerary = { + destination: { + name: 'Melbourne', + country: 'Australia', + weather: '18°C, Sunny', + image: 'https://images.unsplash.com/photo-1514395462725-fb4566210144?w=400&h=300&fit=crop' + }, + totalDays: 3, + estimatedCost: '$450 AUD', + includedActivities: 18, + dailyPlans: [ + { + day: 1, + title: "City Center & Culture", + activities: [ + { + time: '8:00 am', + activity: 'The Langham Melbourne', + location: 'The Langham Melbourne', + address: '1 Southgate Avenue, Southbank VIC 3006', + image: 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800&h=600&fit=crop', + categories: ['Accommodation', 'Luxury'], + description: [ + 'Check-in at luxury riverside hotel', + 'Enjoy complimentary breakfast', + 'Relax at the spa facilities', + 'Explore the surrounding Southbank area' + ] + }, + { + time: '10:00 am', + activity: 'Federation Square', + location: 'Federation Square', + address: 'Corner Swanston & Flinders Streets, Melbourne VIC 3000', + image: 'https://images.unsplash.com/photo-1514395462725-fb4566210144?w=800&h=600&fit=crop', + categories: ['Culture', 'Landmark'], + description: [ + 'Explore Melbourne\'s cultural precinct', + 'Visit the ACMI museum', + 'Enjoy street performances', + 'Take photos at iconic locations' + ] + }, + { + time: '12:00 pm', + activity: 'Degrave Street Café', + location: 'Degrave Street Espresso Bar', + address: '23-25 Degraves Street, Melbourne VIC 3000', + image: 'https://images.unsplash.com/photo-1554118811-1e0d58224f24?w=800&h=600&fit=crop', + categories: ['Food', 'Drinks', 'Culture'], + description: [ + 'Coffee at Pellegrini\'s Espresso Bar (iconic old-school cafe)', + 'Try the famous jam doughnuts', + 'Shop for fresh produce in the Deli Hall', + 'Pick up unique souvenirs in the General Merchandise section' + ] + }, + { + time: '2:00 pm', + activity: 'Royal Botanic Gardens', + location: 'Royal Botanic Gardens Victoria', + address: 'Birdwood Avenue, South Yarra VIC 3141', + image: 'https://images.unsplash.com/photo-1585320806297-9794b3e4eeae?w=800&h=600&fit=crop', + categories: ['Nature', 'Culture'], + description: [ + 'Stroll through stunning landscaped gardens', + 'Visit the Australian Forest Walk', + 'Relax by the Ornamental Lake', + 'Join a free guided walking tour' + ] + }, + { + time: '4:00 pm', + activity: 'National Gallery of Victoria', + location: 'NGV International', + address: '180 St Kilda Road, Melbourne VIC 3006', + image: 'https://images.unsplash.com/photo-1564399577149-749794d74eee?w=800&h=600&fit=crop', + categories: ['Culture', 'Art'], + description: [ + 'Explore Australia\'s oldest art museum', + 'View international and Australian art collections', + 'Visit the stunning water wall entrance', + 'Browse the NGV design store' + ] + }, + { + time: '7:00 pm', + activity: 'Dinner at Chin Chin', + location: 'Chin Chin Restaurant', + address: '125 Flinders Lane, Melbourne VIC 3000', + image: 'https://images.unsplash.com/photo-1552566626-52f8b828add9?w=800&h=600&fit=crop', + categories: ['Food', 'Drinks'], + description: [ + 'Experience modern Thai cuisine', + 'Try signature dishes like the Betel Leaf', + 'Enjoy the vibrant atmosphere', + 'Book ahead or walk-in for bar seating' + ] + } + ] + }, + { + day: 2, + title: "Markets & Neighborhoods", + activities: [ + { + time: '8:00 am', + activity: 'Queen Victoria Market', + location: 'Queen Victoria Market', + address: 'Queen Street, Melbourne VIC 3000', + image: 'https://images.unsplash.com/photo-1555939594-58d7cb561ad1?w=800&h=600&fit=crop', + categories: ['Food', 'Shopping', 'Culture'], + description: [ + 'Explore Melbourne\'s historic market (since 1878)', + 'Sample fresh local produce', + 'Shop for artisan goods and souvenirs', + 'Grab breakfast at the Deli Hall' + ] + }, + { + time: '10:30 am', + activity: 'Fitzroy Street Art Tour', + location: 'Fitzroy Arts Precinct', + address: 'Gertrude Street, Fitzroy VIC 3065', + image: 'https://images.unsplash.com/photo-1499781350541-7783f6c6a0c8?w=800&h=600&fit=crop', + categories: ['Culture', 'Art'], + description: [ + 'Walk through famous street art laneways', + 'Discover works by renowned artists', + 'Visit independent galleries', + 'Explore vintage and record stores' + ] + }, + { + time: '12:30 pm', + activity: 'Brunswick Street Lunch', + location: 'Brunswick Street Precinct', + address: 'Brunswick Street, Fitzroy VIC 3065', + image: 'https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=800&h=600&fit=crop', + categories: ['Food', 'Drinks'], + description: [ + 'Choose from diverse dining options', + 'Try local cafes and restaurants', + 'Explore bookshops and boutiques', + 'Enjoy the vibrant neighborhood atmosphere' + ] + }, + { + time: '2:30 pm', + activity: 'Carlton Gardens', + location: 'Carlton Gardens', + address: 'Carlton Gardens, Carlton VIC 3053', + image: 'https://images.unsplash.com/photo-1519331379826-f10be5486c6f?w=800&h=600&fit=crop', + categories: ['Nature', 'Culture', 'Landmark'], + description: [ + 'Visit the UNESCO World Heritage site', + 'See the Royal Exhibition Building', + 'Stroll through Victorian-era gardens', + 'Relax by the ornamental fountains' + ] + }, + { + time: '4:00 pm', + activity: 'Melbourne Museum', + location: 'Melbourne Museum', + address: '11 Nicholson Street, Carlton VIC 3053', + image: 'https://images.unsplash.com/photo-1566127992631-137a642a90f4?w=800&h=600&fit=crop', + categories: ['Culture', 'Museum'], + description: [ + 'Explore natural and cultural history', + 'Visit the Bunjilaka Aboriginal Centre', + 'See the Forest Gallery living ecosystem', + 'Discover Melbourne\'s story exhibition' + ] + }, + { + time: '7:00 pm', + activity: 'Rooftop Bar Experience', + location: 'Naked for Satan', + address: '285 Brunswick Street, Fitzroy VIC 3065', + image: 'https://images.unsplash.com/photo-1514933651103-005eec06c04b?w=800&h=600&fit=crop', + categories: ['Drinks', 'Food'], + description: [ + 'Enjoy sunset views from the rooftop', + 'Try Spanish-style pintxos', + 'Sample craft cocktails and local beers', + 'Experience Melbourne\'s bar culture' + ] + } + ] + }, + { + day: 3, + title: "Coastal Adventure", + activities: [ + { + time: '8:00 am', + activity: 'St. Kilda Beach', + location: 'St. Kilda Beach', + address: 'Jacka Boulevard, St Kilda VIC 3182', + image: 'https://images.unsplash.com/photo-1505142468610-359e7d316be0?w=800&h=600&fit=crop', + categories: ['Nature', 'Beach'], + description: [ + 'Morning walk along the iconic beach', + 'Visit the historic St Kilda Pier', + 'See the little penguins at sunset', + 'Explore the Sunday Esplanade Market (weekends)' + ] + }, + { + time: '10:00 am', + activity: 'Acland Street Cafes', + location: 'Acland Street', + address: 'Acland Street, St Kilda VIC 3182', + image: 'https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=800&h=600&fit=crop', + categories: ['Food', 'Drinks'], + description: [ + 'Brunch at famous cake shops', + 'Try traditional European pastries', + 'Visit Lentil as Anything (pay-as-you-feel)', + 'Browse vintage shops and bookstores' + ] + }, + { + time: '12:00 pm', + activity: 'Luna Park Melbourne', + location: 'Luna Park Melbourne', + address: '18 Lower Esplanade, St Kilda VIC 3182', + image: 'https://images.unsplash.com/photo-1513026705753-bc3fffca8bf4?w=800&h=600&fit=crop', + categories: ['Entertainment', 'Landmark'], + description: [ + 'Visit Melbourne\'s iconic amusement park', + 'Ride the historic Scenic Railway (1912)', + 'Take photos at Mr Moon entrance', + 'Enjoy carnival games and rides' + ] + }, + { + time: '2:00 pm', + activity: 'Brighton Beach Boxes', + location: 'Brighton Beach', + address: 'Esplanade, Brighton VIC 3186', + image: 'https://images.unsplash.com/photo-1520208422220-d12a3c588e6c?w=800&h=600&fit=crop', + categories: ['Culture', 'Landmark'], + description: [ + 'Photograph the famous colorful bathing boxes', + 'Walk along the pristine beach', + 'Learn about the heritage structures', + 'Relax in the beachside atmosphere' + ] + }, + { + time: '4:00 pm', + activity: 'Southbank Promenade', + location: 'Southbank', + address: 'Southbank Promenade, Southbank VIC 3006', + image: 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?w=800&h=600&fit=crop', + categories: ['Culture', 'Shopping'], + description: [ + 'Stroll along the Yarra River', + 'Visit arts and craft markets', + 'Explore restaurants and cafes', + 'Enjoy river views and street performers' + ] + }, + { + time: '7:00 pm', + activity: 'Farewell Dinner at Vue de Monde', + location: 'Vue de Monde', + address: 'Level 55, Rialto, 525 Collins Street, Melbourne VIC 3000', + image: 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=800&h=600&fit=crop', + categories: ['Food', 'Drinks', 'Luxury'], + description: [ + 'Experience fine dining at 55th floor', + 'Enjoy panoramic Melbourne views', + 'Taste modern Australian cuisine', + 'Celebrate the end of your journey' + ] + } + ] + } + ] + }; + + return ( +
+ {/* Navbar */} + {}} + onSignInClick={onSignInClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onHomeClick={onHomeClick} + onMelbourneClick={onMelbourneClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + currentPage="itinerary-view" + isUserSignedIn={!!user} + user={user} + /> + + {/* Header Section */} +
+
+ + + +
+ +

+ Your{' '} + Magic Itinerary +

+ +
+

+ Here's your personalized {generatedItinerary.totalDays}-day adventure in {generatedItinerary.destination.name}! +

+
+
+
+ + {/* Main Content */} +
+
+
+ {/* View Toggle */} +
+
+ + +
+
+ + {/* Itinerary Overview */} + + +
+
+
{generatedItinerary.totalDays}
+
Days
+
+
+
{generatedItinerary.includedActivities}
+
Activities
+
+
+
{generatedItinerary.estimatedCost}
+
Estimated Cost
+
+
+
+
+ + {/* Daily Plans - Enhanced View */} + {viewMode === 'daily' && ( + + {generatedItinerary.dailyPlans.map((day, dayIndex) => ( +
+ {/* Location Header with Weather - Only show for first day or when city actually changes */} + {(() => { + // Get current day's destination (fallback to main destination if not specified) + const currentDestination = (day as any).destination || generatedItinerary.destination; + + // Check if this is the first day + if (dayIndex === 0) return true; + + // Check if destination changed from previous day + if (dayIndex > 0) { + const previousDay = generatedItinerary.dailyPlans[dayIndex - 1]; + const previousDestination = (previousDay as any).destination || generatedItinerary.destination; + + // Only show if city name is different + return currentDestination.name !== previousDestination.name; + } + + return false; + })() && ( + +
+
+

+ {((day as any).destination || generatedItinerary.destination).name}, {((day as any).destination || generatedItinerary.destination).country} +

+

{((day as any).destination || generatedItinerary.destination).weather}

+
+
+ +
+
+
+ )} + + {/* Day Header */} + +
+ {day.day} +
+
+

Day {day.day}

+

{day.title}

+
+
+ + {/* GMT Label */} +
+

GMT

+
+ + {/* Activity Cards - Desktop Grid Layout */} +
+ {day.activities.map((activity, actIndex) => { + const activityKey = `day${day.day}-act${actIndex}`; + const isFavorite = favorites.has(activityKey); + + return ( + + {/* Time Column */} +
+
{activity.time}
+
+ + {/* Activity Card */} +
+ + + {/* Hero Image with Overlay Buttons */} +
+ + + {/* Favorite Heart Button - Top Right */} +
+ +
+ + {/* Get Directions Button - Bottom Left */} +
+ +
+
+ + {/* Content Section */} +
+ {/* Location Name & Address */} +
+

+ {activity.activity} +

+
+ + {activity.address} +
+
+ + {/* Category Badges */} +
+ {activity.categories.map((category, catIndex) => ( + + {category} + + ))} +
+ + {/* Activity Details - Bullet Points */} +
+ {activity.description.map((detail, detailIndex) => ( +
+ + {detail} +
+ ))} +
+
+
+
+
+
+ ); + })} +
+
+ ))} +
+ )} + + {/* Summary View */} + {viewMode === 'summary' && ( + +

Trip Summary

+ +
+ {generatedItinerary.dailyPlans.map((day, index) => ( +
+
+ +

Day {day.day}: {day.title}

+
+
+ {day.activities.map((activity, actIndex) => ( +
+ +
+ {activity.activity} +
+ {activity.time} + + {activity.location} +
+
+
+ ))} +
+
+ ))} +
+
+
+ )} + + {/* Action Buttons */} + + + + + +
+
+
+ + {/* Footer */} +
+
+ ); +} \ No newline at end of file From 37f50275a39742c61a34bf92152940efd7be0669 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 21 Apr 2026 19:14:21 +0530 Subject: [PATCH 42/91] integrate the show purchased passes api in the profile page --- src/Redux/services/profile.service.ts | 7 +- src/pages/ProfilePage.tsx | 97 +++++++++++++++++---------- 2 files changed, 66 insertions(+), 38 deletions(-) diff --git a/src/Redux/services/profile.service.ts b/src/Redux/services/profile.service.ts index afa50f0..fa888a0 100644 --- a/src/Redux/services/profile.service.ts +++ b/src/Redux/services/profile.service.ts @@ -24,11 +24,10 @@ export const profileApi = createApi({ invalidatesTags: ["userDetails"] }), - getUserPasses: builder.query({ - query: ({ cardMode, sort }) => { + getUserCards: builder.query({ + query: (sort ) => { const params = new URLSearchParams() - if(cardMode) params.append('cardMode',cardMode); if(sort) params.append('sort',sort); return `/website/passes/all?${params.toString()}` @@ -41,5 +40,5 @@ export const profileApi = createApi({ export const { useGetUserProfileDetailsQuery, useUpdateUserProfileDetailsMutation, - useGetUserPassesQuery + useGetUserCardsQuery } = profileApi; \ No newline at end of file diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index 2295a7d..3641fcf 100644 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -26,7 +26,7 @@ import { Badge } from '../components/ui/badge'; import Navbar from '../components/Navbar'; import { Footer } from '../components/Footer'; import { ImageWithFallback } from '../components/figma/ImageWithFallback'; -import { useGetUserProfileDetailsQuery, useUpdateUserProfileDetailsMutation } from '../Redux/services/profile.service'; +import { useGetUserCardsQuery, useGetUserProfileDetailsQuery, useUpdateUserProfileDetailsMutation } from '../Redux/services/profile.service'; import { toast } from 'sonner'; import { useNavigate } from 'react-router-dom'; import LoadingSpinner from '../components/LoadingSpinner'; @@ -164,11 +164,14 @@ export function ProfilePage({ postalCode: '' }); + const [sort, setSort] = useState("latest") const navigate = useNavigate() const userId = localStorage.getItem("userId") const { data: userDetails, isLoading } = useGetUserProfileDetailsQuery(userId) const [updateUserProfileDetails, { isLoading: savingChanges }] = useUpdateUserProfileDetailsMutation(); - const { data: passes, isLoading: loadingPasses } = useGetUserProfileDetailsQuery(userId) + const { data, isLoading: loadingCards } = useGetUserCardsQuery(sort) + + const cards = data ?? [] useEffect(() => { if (userDetails) { @@ -204,12 +207,12 @@ export function ProfilePage({ } }; - const activePasses = mockPasses.filter(pass => pass.status === 'active'); - const expiredPasses = mockPasses.filter(pass => pass.status === 'expired'); + const activeCards = cards.filter((card: any) => card.isActive === true); + const expiredCards = cards.filter((card: any) => card.isActive === false); - if (isLoading && loadingPasses) { + if (isLoading && loadingCards) { return ( - + ); } @@ -424,8 +427,8 @@ export function ProfilePage({ {(() => { // Determine which pass type to show - const hasUnlimitedPass = activePasses.some(pass => pass.type === 'Unlimited Pass'); - const hasSelectivePass = activePasses.some(pass => pass.type === 'Flexi Pass'); + const hasUnlimitedPass = activeCards.some((card:any) => card.cardType.cardTypeName === 'selective_pass'); + const hasSelectivePass = activeCards.some((card:any) => card.cardType.cardTypeName === 'unlimited_card'); if (hasUnlimitedPass) { return ( @@ -612,45 +615,61 @@ export function ProfilePage({ >

Active Passes

- {activePasses.map((pass) => ( - + {activeCards.map((card: any) => ( +
onDownloadAppClick?.()} >
-

{pass.name}

- - {pass.status} +

{card.card.title}

+ + {card.isActive && "Active"}
-
${pass.price}
-
${pass.originalPrice}
+
${card.totalAmount}
+
${card.totalAmount + 50}
- Attractions: - {pass.usedAttractions}/{pass.attractions} + {card.cardMode === "flexi" ? ( + <> + Attractions: + {card.noOfAttractions} + + ) : ( + <> + Days: + {card.noOfDays} + + ) + }
Valid until: - {new Date(pass.validUntil).toLocaleDateString()} + {new Date(card.validUpto).toLocaleDateString()}
Days remaining: - {pass.daysRemaining} days + {Math.max( + 0, + Math.ceil( + (new Date(card.validUpto).getTime() - new Date().getTime()) / + (1000 * 60 * 60 * 24) + ) + )} days
@@ -662,7 +681,7 @@ export function ProfilePage({ {/* Offers Button */}
+ + + {/* Pass Card - Redesigned */} + + + {/* Gradient Header Bar */} +
+ + + {/* Card Header */} +
+
+ {/* Icon */} +
+ +
+ + {/* Title and Status */} +
+

+ {currentPass.name} +

+ +
+ {currentPass.status} +
+
+
+ + {/* Date Badge */} +
+
+ + {currentPass.date} +
+
+
+ + {/* Stats Grid */} +
+ {/* Duration */} +
+
+ +
+
Duration
+
{currentPass.duration}
+
+ + {/* Adults */} +
+
+ +
+
Adults
+
{currentPass.adults}
+
+ + {/* Kids */} +
+
+ +
+
Kids
+
{currentPass.kids}
+
+
+
+
+
+ + {/* Attractions Section - Redesigned */} + + + + {/* Section Header */} +
+
+
+ +
+
+

+ Included Attractions +

+

+ Explore amazing places +

+
+
+ + 25+ Places + +
+ + {/* Attractions Scroll */} +
+ {attractions.map((attraction, index) => ( + + + + {/* Image */} +
+ +
+ + {/* Info */} +
+

+ {attraction.name} +

+
+ + {attraction.tours} +
+
+
+
+
+ ))} +
+ + {/* View All Button */} + +
+
+
+ + {/* Special Benefits & Offers - Redesigned */} + + + + {/* Header */} +
+
+
+ +
+
+

+ Exclusive Offers +

+

+ 50+ special deals for cardholders +

+
+
+ + + Limited Time + +
+ + {/* Featured Offers Grid */} +
+ {/* Offer 1 - Restaurant Discount */} + +
+
+
+ +
+
+

+ Restaurant Discounts +

+

+ At partner restaurants +

+
+
+
+ 25% + OFF +
+
+
+

+ Valid at 30+ dining locations +

+ +
+
+ + {/* Offer 2 - Hotel Savings */} + +
+
+
+ +
+
+

+ Hotel Bookings +

+

+ Premium accommodations +

+
+
+
+ 15% + OFF +
+
+
+

+ Exclusive rates on 100+ hotels +

+ +
+
+ + {/* Offer 3 - Shopping Deals */} + +
+
+
+ +
+
+

+ Shopping Vouchers +

+

+ Top retail stores +

+
+
+
+ 20% + OFF +
+
+
+

+ Redeemable at 50+ stores +

+ +
+
+
+ + {/* View All Offers CTA */} +
+
+
+ {/* User Avatars - Social Proof */} +
+ {userProfiles.slice(0, 3).map((profile, index) => ( +
+ +
+ ))} +
+ +10K +
+
+ + {/* Text */} +
+

+ 10,000+ Users Saved +

+

+ Over $2M in total savings +

+
+
+ + {/* View All Offers Button */} + +
+
+
+
+
+ + {/* Main Content Grid */} +
+ {/* Left Content - Dynamic Card Selection */} + + {/* Toggle between Unlimited and Flexi */} +
+ + +
+ + {cardType === 'unlimited' ? ( + <> +
+

+ Get{' '} + Melbourne Unlimited Card +

+ +

+ Unlimited access to 25+ top Melbourne attractions. Visit as many places as you want + with one simple card and save up to 40% compared to individual tickets. +

+
+ + {/* Benefits List */} +
+
+
+ +
+
+

Unlimited Entries

+

Visit all 25+ attractions as many times as you want

+
+
+ +
+
+ +
+
+

7-Day Validity

+

Explore at your own pace for 7 consecutive days

+
+
+ +
+
+ +
+
+

Skip the Queue

+

Fast-track entry at major attractions

+
+
+
+ + {/* CTA Buttons */} +
+ + +
+ + ) : ( + <> +
+

+ Get{' '} + Flexi Card{' '} + now +

+ +

+ Choose your own adventure with 12 hand-picked attractions. Perfect for visitors + who want flexibility and great value for money. +

+
+ + {/* Benefits List */} +
+
+
+ +
+
+

12 Curated Attractions

+

Choose from the best Melbourne has to offer

+
+
+ +
+
+ +
+
+

Flexible 7-Day Period

+

Plan your visits within a week

+
+
+ +
+
+ +
+
+

40% Savings

+

Save big on combined ticket prices

+
+
+
+ + {/* CTA Buttons */} +
+ + +
+ + )} +
+ + {/* Right Content - Card Preview */} + + +
+ + {/* Card Header */} +
+
+

+ {cardType === 'unlimited' ? 'Melbourne Unlimited' : 'Melbourne Flexi'} +

+ + {cardType === 'unlimited' ? 'Most Popular' : 'Great Value'} + +
+ +
+ + {/* Pricing */} +
+
+ ${cardType === 'unlimited' ? '149' : '89'} +
+
+ ${cardType === 'unlimited' ? '249' : '149'} +
+ + Save {cardType === 'unlimited' ? '40' : '40'}% + +
+ + {/* Features */} +
+
+ + {cardType === 'unlimited' ? '25+' : '12'} Amazing Attractions +
+
+ + Valid for 7 Days +
+
+ + {cardType === 'unlimited' ? 'Unlimited visits' : 'One visit per attraction'} +
+
+ + Digital & Physical Card +
+
+ + {/* Visual Decoration */} +
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+ ); +} \ No newline at end of file From e3ee51f70b98476b21a76c510b6bd86adbab3139 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Tue, 21 Apr 2026 19:15:57 +0530 Subject: [PATCH 44/91] replace all the files in imports folder from the design code --- src/imports/AfterLogin.tsx | 42 + src/imports/BeforeLogin.tsx | 21 + src/imports/MagicItinDay5.tsx | 916 +++++++++++++++++++ src/imports/MagicItinSummaryTab.tsx | 996 +++++++++++++++++++++ src/imports/NounRelax65970551-9919-186.tsx | 13 + src/imports/NounRelax65970551-9919-190.tsx | 32 + src/imports/NounRelax65970551-9919-366.tsx | 13 + src/imports/NounRelax65970551-9919-370.tsx | 13 + src/imports/NounRelax65970551-9919-374.tsx | 29 + src/imports/NounRelax65970551-9919-378.tsx | 13 + src/imports/NounRelax65970551-9919-382.tsx | 31 + src/imports/NounRelax65970551-9919-386.tsx | 553 ++++++++++++ src/imports/NounRelax65970551-9923-625.tsx | 15 + src/imports/NounRelax65970551-9923-629.tsx | 28 + src/imports/NounRelax65970551-9923-633.tsx | 34 + src/imports/NounRelax65970551-9923-637.tsx | 28 + src/imports/NounRelax65970551.tsx | 13 + src/imports/image-1.png | Bin 0 -> 10725 bytes src/imports/image-10.png | Bin 0 -> 133614 bytes src/imports/image-2.png | Bin 0 -> 26703 bytes src/imports/image-3.png | Bin 0 -> 15857 bytes src/imports/image-4.png | Bin 0 -> 20603 bytes src/imports/image-5.png | Bin 0 -> 35539 bytes src/imports/image-6.png | Bin 0 -> 5493 bytes src/imports/image-7.png | Bin 0 -> 15689 bytes src/imports/image-8.png | Bin 0 -> 4471 bytes src/imports/image-9.png | Bin 0 -> 34164 bytes src/imports/image.png | Bin 0 -> 28704 bytes src/imports/svg-3e945qfv3w.ts | 10 + src/imports/svg-5q6zbixxri.ts | 8 + src/imports/svg-70pmm871bv.ts | 14 + src/imports/svg-8l5dq4lsp8.ts | 107 +++ src/imports/svg-adqhdgpsh.ts | 105 +++ src/imports/svg-bfd6jik9me.ts | 4 + src/imports/svg-hgtc6d03x0.ts | 3 + src/imports/svg-jhl6jizeq8.ts | 8 + src/imports/svg-kj92221mds.ts | 3 + src/imports/svg-nvjqsh4m9x.ts | 3 + src/imports/svg-qafz9g9knb.ts | 11 + src/imports/svg-qnagtgq03x.ts | 37 + src/imports/svg-rf4f5wcll0.ts | 4 + src/imports/svg-rfrt8mx1lu.ts | 3 + src/imports/svg-rpecqp6li2.ts | 3 + src/imports/svg-s8leuc872s.ts | 3 + src/imports/svg-u2edxj8dia.ts | 9 + src/imports/svg-wjtpqfkmjn.ts | 3 + 46 files changed, 3128 insertions(+) create mode 100644 src/imports/AfterLogin.tsx create mode 100644 src/imports/BeforeLogin.tsx create mode 100644 src/imports/MagicItinDay5.tsx create mode 100644 src/imports/MagicItinSummaryTab.tsx create mode 100644 src/imports/NounRelax65970551-9919-186.tsx create mode 100644 src/imports/NounRelax65970551-9919-190.tsx create mode 100644 src/imports/NounRelax65970551-9919-366.tsx create mode 100644 src/imports/NounRelax65970551-9919-370.tsx create mode 100644 src/imports/NounRelax65970551-9919-374.tsx create mode 100644 src/imports/NounRelax65970551-9919-378.tsx create mode 100644 src/imports/NounRelax65970551-9919-382.tsx create mode 100644 src/imports/NounRelax65970551-9919-386.tsx create mode 100644 src/imports/NounRelax65970551-9923-625.tsx create mode 100644 src/imports/NounRelax65970551-9923-629.tsx create mode 100644 src/imports/NounRelax65970551-9923-633.tsx create mode 100644 src/imports/NounRelax65970551-9923-637.tsx create mode 100644 src/imports/NounRelax65970551.tsx create mode 100644 src/imports/image-1.png create mode 100644 src/imports/image-10.png create mode 100644 src/imports/image-2.png create mode 100644 src/imports/image-3.png create mode 100644 src/imports/image-4.png create mode 100644 src/imports/image-5.png create mode 100644 src/imports/image-6.png create mode 100644 src/imports/image-7.png create mode 100644 src/imports/image-8.png create mode 100644 src/imports/image-9.png create mode 100644 src/imports/image.png create mode 100644 src/imports/svg-3e945qfv3w.ts create mode 100644 src/imports/svg-5q6zbixxri.ts create mode 100644 src/imports/svg-70pmm871bv.ts create mode 100644 src/imports/svg-8l5dq4lsp8.ts create mode 100644 src/imports/svg-adqhdgpsh.ts create mode 100644 src/imports/svg-bfd6jik9me.ts create mode 100644 src/imports/svg-hgtc6d03x0.ts create mode 100644 src/imports/svg-jhl6jizeq8.ts create mode 100644 src/imports/svg-kj92221mds.ts create mode 100644 src/imports/svg-nvjqsh4m9x.ts create mode 100644 src/imports/svg-qafz9g9knb.ts create mode 100644 src/imports/svg-qnagtgq03x.ts create mode 100644 src/imports/svg-rf4f5wcll0.ts create mode 100644 src/imports/svg-rfrt8mx1lu.ts create mode 100644 src/imports/svg-rpecqp6li2.ts create mode 100644 src/imports/svg-s8leuc872s.ts create mode 100644 src/imports/svg-u2edxj8dia.ts create mode 100644 src/imports/svg-wjtpqfkmjn.ts diff --git a/src/imports/AfterLogin.tsx b/src/imports/AfterLogin.tsx new file mode 100644 index 0000000..9ab7400 --- /dev/null +++ b/src/imports/AfterLogin.tsx @@ -0,0 +1,42 @@ +function Text() { + return ( +
+
+
+

JD

+
+
+
+ ); +} + +function Container() { + return ( +
+ +
+ ); +} + +function Text1() { + return ( +
+
+

MY CITY CARD

+
+
+ ); +} + +export default function AfterLogin() { + return ( +
+
+
+ + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/imports/BeforeLogin.tsx b/src/imports/BeforeLogin.tsx new file mode 100644 index 0000000..0b3a144 --- /dev/null +++ b/src/imports/BeforeLogin.tsx @@ -0,0 +1,21 @@ +function Text() { + return ( +
+
+

GET A CITY CARD

+
+
+ ); +} + +export default function BeforeLogin() { + return ( +
+
+
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/src/imports/MagicItinDay5.tsx b/src/imports/MagicItinDay5.tsx new file mode 100644 index 0000000..c755882 --- /dev/null +++ b/src/imports/MagicItinDay5.tsx @@ -0,0 +1,916 @@ +import svgPaths from "./svg-adqhdgpsh"; +import imgPhoto from "figma:asset/895585e16a5ef99513fed52e650cc187c5d00f0a.png"; +import imgRectangle36 from "figma:asset/c878c3c798a222b8d2bc4e2bd140d905882d2175.png"; +import imgRectangle37 from "figma:asset/a125d02d1ff3e548286c149140a80da8c96f2b93.png"; + +function Confetti() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} + +function Icon() { + return ( +
+ + + + + + + + +
+ ); +} + +function CompletionScreen() { + return ( +
+ + ); +} + +function Frame() { + return ( +
+
+
+

Get My Trip Plan

+
+
+
+ ); +} + +function Container() { + return ( +
+ + +
+ ); +} + +function HeaderText() { + return ( +
+

+ Your + {` `} + Magic Itinerary + {` `} + is + {` `} + Ready + {` ✨`} +

+

{`We've got everything we need to plan your perfect trip`}

+
+ ); +} + +function Frame37() { + return ( +
+
+

{`Your `}

+
+
+

+ Melbourne + {` `} + Magic Itinerary +

+
+
+ ); +} + +function Photo() { + return ( +
+ +
+ ); +} + +function OuterFrame() { + return ( +
+ +
+ ); +} + +function Group1() { + return ( +
+
+ + + + + + + + + + + +
+
+ ); +} + +function Frame35() { + return ( +
+ +
+ ); +} + +function Frame30() { + return ( +
+ +

3 Days

+
+ ); +} + +function Frame36() { + return ( +
+ + + + + +
+ ); +} + +function Frame31() { + return ( +
+ +

12 stops

+
+ ); +} + +function Overview1() { + return ( +
+ + +
+ ); +} + +function Frame32() { + return ( +
+
+

TRIP DETAILS:

+
+ +
+ ); +} + +function Group() { + return ( +
+
+ + + + + + +
+
+ ); +} + +function LetsIconsDateFill() { + return ( +
+ +
+ ); +} + +function Adults() { + return ( +
+ +

22/02/2025

+
+ ); +} + +function RiParentFill() { + return ( +
+ + + + + +
+ ); +} + +function Adults1() { + return ( +
+ +

3 adults

+
+ ); +} + +function FaSolidChild() { + return ( +
+ + + + + + + + + + +
+ ); +} + +function Kids() { + return ( +
+ +

3 kids

+
+ ); +} + +function Frame21() { + return ( +
+ + + +
+ ); +} + +function Frame28() { + return ( +
+ + +
+ ); +} + +function Frame29() { + return ( +
+ + +
+ ); +} + +function MaterialSymbolsShare() { + return ( +
+ + + + + +
+ ); +} + +function Frame9() { + return ( +
+
+
+ +

Share

+
+
+ + ); +} + +function DownloadMinimalisticSvgrepoCom() { + return ( +
+ + + + + + +
+ ); +} + +function Frame10() { + return ( +
+
+
+ +

Download

+
+
+ + ); +} + +function Frame11() { + return ( +
+ + +
+ ); +} + +function Overview() { + return ( +
+ +
+
+ + + +
+
+ +
+ ); +} + +function Frame4() { + return ( +
+
+

Daily View

+
+
+

Summary

+
+
+ ); +} + +function MaterialSymbolsChevronRightRounded() { + return ( +
+ + + + + + + +
+ ); +} + +function Frame5() { + return ( +
+

Day 1

+

Day 2

+

Day 3

+

Day 4

+

D

+

Day 3

+

Day 4

+
+
+ + + +
+
+
+
+ + + +
+
+ +
+ ); +} + +function SelectionTabs() { + return ( +
+
+
+ + +
+
+
+ ); +} + +function Frame27() { + return ( +
+

09:00 AM

+
+ ); +} + +function Time() { + return ( +
+ +
+ ); +} + +function Frame2() { + return ( +
+

Melbourne Zoo

+

Elliott Avenue, Parkville, Victoria 3052

+
+ ); +} + +function Frame1() { + return
; +} + +function Cards() { + return ( +
+
+
+ +
+
+ + +
+ ); +} + +function Frame13() { + return ( +
+ + ); +} + +function Frame16() { + return ( +
+ + ); +} + +function Frame17() { + return ( +
+ + ); +} + +function Frame18() { + return ( +
+ + ); +} + +function Frame22() { + return ( +
+ + + + +
+ ); +} + +function MdiLocation() { + return ( +
+ + + + + +
+ ); +} + +function Frame6() { + return ( +
+ +
+

Get Directions

+
+
+ ); +} + +function Frame23() { + return ( +
+ + +
    +
  • + Discover various species of wildlife only present in this zoo! +
  • +
  • + {`Try the amazing food from our local produce `} +
  • +
  • + Shop for souvenirs that makes you trip a memorable one +
  • +
+ +
+ ); +} + +function Frame34() { + return ( +
+
+ ); +} + +function Frame26() { + return ( +
+

02:00 PM

+
+ ); +} + +function Frame3() { + return ( +
+

Melbourne Skydeck

+

South Bank, just across the Yarra River from Melbourne’s CBD

+
+ ); +} + +function Cards1() { + return ( +
+
+ +
+ +
+ ); +} + +function MdiLocation1() { + return ( +
+ + + + + +
+ ); +} + +function Frame7() { + return ( +
+ +
+

Get Directions

+
+
+ ); +} + +function Frame14() { + return ( +
+ + ); +} + +function Frame19() { + return ( +
+ + ); +} + +function Frame20() { + return ( +
+ + ); +} + +function Frame25() { + return ( +
+ + + +
+ ); +} + +function Frame24() { + return ( +
+ + + +
    +
  • + Take in the breathtaking views from the summit overlooking Melbourne. +
  • +
  • + Try out the infamous sky dining experience +
  • +
  • + Have a peek at the award winning voyager theatre +
  • +
+
+ ); +} + +function Frame33() { + return ( +
+ + +
+ ); +} + +function Frame8() { + return ( +
+ + +
+ ); +} + +function ItineraryDetails() { + return ( +
+ + +
+ ); +} + +function Content() { + return ( +
+ + +
+ ); +} + +function ArrowRightLine() { + return ( +
+ + + + + +
+ ); +} + +function Frame15() { + return ( +
+
+
+ +
+
+

Back

+
+ ); +} + +function Arrow() { + return ( +
+
+ + + + + + + +
+
+ ); +} + +function Logo() { + return ( +
+
+

C

+
+
+ + + +
+
+ + + +
+ +
+ ); +} + +function Frame12() { + return ( +
+ +
+ ); +} + +function Header() { + return ( +
+ + +
+ ); +} + +function DietQuestion() { + return ( +
+ + + + + +
+
+ ); +} + +export default function MagicItinDay() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/MagicItinSummaryTab.tsx b/src/imports/MagicItinSummaryTab.tsx new file mode 100644 index 0000000..aefe168 --- /dev/null +++ b/src/imports/MagicItinSummaryTab.tsx @@ -0,0 +1,996 @@ +import svgPaths from "./svg-8l5dq4lsp8"; +import imgPhoto from "figma:asset/895585e16a5ef99513fed52e650cc187c5d00f0a.png"; + +function Confetti() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} + +function Icon() { + return ( +
+ + + + + + + + +
+ ); +} + +function CompletionScreen() { + return ( +
+ + ); +} + +function Frame() { + return ( +
+
+
+

Get My Trip Plan

+
+
+
+ ); +} + +function Container() { + return ( +
+ + +
+ ); +} + +function HeaderText() { + return ( +
+

+ Your + {` `} + Magic Itinerary + {` `} + is + {` `} + Ready + {` ✨`} +

+

{`We've got everything we need to plan your perfect trip`}

+
+ ); +} + +function Frame35() { + return ( +
+
+

{`Your `}

+
+
+

+ Melbourne + {` `} + Magic Itinerary +

+
+
+ ); +} + +function Photo() { + return ( +
+ +
+ ); +} + +function OuterFrame() { + return ( +
+ +
+ ); +} + +function Group5() { + return ( +
+
+ + + + + + + + + + + +
+
+ ); +} + +function Frame31() { + return ( +
+ +
+ ); +} + +function Frame28() { + return ( +
+ +

3 Days

+
+ ); +} + +function Frame32() { + return ( +
+ + + + + +
+ ); +} + +function Frame29() { + return ( +
+ +

12 stops

+
+ ); +} + +function Overview1() { + return ( +
+ + +
+ ); +} + +function Frame30() { + return ( +
+
+

TRIP DETAILS:

+
+ +
+ ); +} + +function Group() { + return ( +
+
+ + + + + + +
+
+ ); +} + +function LetsIconsDateFill() { + return ( +
+ +
+ ); +} + +function Adults() { + return ( +
+ +

22/02/2025

+
+ ); +} + +function RiParentFill() { + return ( +
+ + + + + +
+ ); +} + +function Adults1() { + return ( +
+ +

3 adults

+
+ ); +} + +function FaSolidChild() { + return ( +
+ + + + + + + + + + +
+ ); +} + +function Kids() { + return ( +
+ +

3 kids

+
+ ); +} + +function Frame9() { + return ( +
+ + + +
+ ); +} + +function Frame26() { + return ( +
+ + +
+ ); +} + +function Frame27() { + return ( +
+ + +
+ ); +} + +function MaterialSymbolsShare() { + return ( +
+ + + + + +
+ ); +} + +function Frame3() { + return ( +
+
+
+ +

Share

+
+
+ + ); +} + +function DownloadMinimalisticSvgrepoCom() { + return ( +
+ + + + + + +
+ ); +} + +function Frame4() { + return ( +
+
+
+ +

Download

+
+
+ + ); +} + +function Frame5() { + return ( +
+ + +
+ ); +} + +function Overview() { + return ( +
+ +
+
+ + + +
+
+ +
+ ); +} + +function Frame1() { + return ( +
+
+

Summary

+
+
+

Daily View

+
+
+ ); +} + +function Frame33() { + return ( +
+

Day 1:

+
+ ); +} + +function Group1() { + return ( +
+
+ + + + + + +
+
+ ); +} + +function LetsIconsDateFill1() { + return ( +
+ +
+ ); +} + +function Adults2() { + return ( +
+ +

21/02/2025

+
+ ); +} + +function Frame10() { + return ( +
+ + +
+ ); +} + +function Frame11() { + return ( +
+
+
+

09:00 am: Melbourne Zoo

+
+
+
+
+ + + +
+
+
+
+
+
+
+ ); +} + +function Frame15() { + return ( +
+

01:00 pm: Melbourne Skydeck

+
+
+
+
+ + + +
+
+
+
+
+ ); +} + +function Group2() { + return ( +
+ + + + + + +
+ ); +} + +function MingcuteLocationLine() { + return ( +
+ +
+ ); +} + +function Frame7() { + return ( +
+ +

Get directions

+
+ ); +} + +function Frame14() { + return ( +
+
+
+ +
    +
  • + Take in the breathtaking views from the summit overlooking Melbourne. +
  • +
  • + Try out the infamous sky dining experience +
  • +
  • + Have a peek at the award winning voyager theatre +
  • +
+ +
+
+
+ ); +} + +function Frame13() { + return ( +
+ + +
+ ); +} + +function Frame12() { + return ( +
+ + ); +} + +function Frame34() { + return ( +
+

Day 2:

+
+ ); +} + +function Group3() { + return ( +
+
+ + + + + + +
+
+ ); +} + +function LetsIconsDateFill2() { + return ( +
+ +
+ ); +} + +function Adults3() { + return ( +
+ +

21/02/2025

+
+ ); +} + +function Frame17() { + return ( +
+ + +
+ ); +} + +function Frame19() { + return ( +
+
+
+

09:00 am: Royal Botanic Gardens Victoria

+
+
+
+
+ + + +
+
+
+
+
+
+
+ ); +} + +function Frame20() { + return ( +
+
+
+

01:00 pm: National Gallery of Victoria

+
+
+
+
+ + + +
+
+
+
+
+
+
+ ); +} + +function Frame18() { + return ( +
+ + +
+ ); +} + +function Frame16() { + return ( +
+ + ); +} + +function Frame36() { + return ( +
+

Day 3:

+
+ ); +} + +function Group4() { + return ( +
+
+ + + + + + +
+
+ ); +} + +function LetsIconsDateFill3() { + return ( +
+ +
+ ); +} + +function Adults4() { + return ( +
+ +

21/02/2025

+
+ ); +} + +function Frame22() { + return ( +
+ + +
+ ); +} + +function Frame24() { + return ( +
+
+
+

09:00 am: Queens Victoria Market

+
+
+
+
+ + + +
+
+
+
+
+
+
+ ); +} + +function Frame25() { + return ( +
+
+
+

{`04:30 pm: St Kilda Beach & Pier`}

+
+
+
+
+ + + +
+
+
+
+
+
+
+ ); +} + +function Frame23() { + return ( +
+ + +
+ ); +} + +function Frame21() { + return ( +
+ + ); +} + +function Frame2() { + return ( +
+ + + +
+ ); +} + +function ItineraryDetails() { + return ( +
+ + +
+ ); +} + +function Content() { + return ( +
+ + +
+ ); +} + +function ArrowRightLine() { + return ( +
+ + + + + +
+ ); +} + +function Frame8() { + return ( +
+
+
+ +
+
+

Back

+
+ ); +} + +function Arrow() { + return ( +
+
+ + + + + + + +
+
+ ); +} + +function Logo() { + return ( +
+
+

C

+
+
+ + + +
+
+ + + +
+ +
+ ); +} + +function Frame6() { + return ( +
+ +
+ ); +} + +function Header() { + return ( +
+ + +
+ ); +} + +function DietQuestion() { + return ( +
+ + + + + +
+
+ ); +} + +export default function MagicItinSummaryTab() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-186.tsx b/src/imports/NounRelax65970551-9919-186.tsx new file mode 100644 index 0000000..4711400 --- /dev/null +++ b/src/imports/NounRelax65970551-9919-186.tsx @@ -0,0 +1,13 @@ +import svgPaths from "./svg-wjtpqfkmjn"; + +export default function NounRelax() { + return ( +
+ + + + + +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-190.tsx b/src/imports/NounRelax65970551-9919-190.tsx new file mode 100644 index 0000000..c0103af --- /dev/null +++ b/src/imports/NounRelax65970551-9919-190.tsx @@ -0,0 +1,32 @@ +import svgPaths from "./svg-3e945qfv3w"; + +function Group() { + return ( +
+
+ + + + + + + + + + + + + + +
+
+ ); +} + +export default function NounRelax() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-366.tsx b/src/imports/NounRelax65970551-9919-366.tsx new file mode 100644 index 0000000..5f8e94f --- /dev/null +++ b/src/imports/NounRelax65970551-9919-366.tsx @@ -0,0 +1,13 @@ +import svgPaths from "./svg-nvjqsh4m9x"; + +export default function NounRelax() { + return ( +
+ + + + + +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-370.tsx b/src/imports/NounRelax65970551-9919-370.tsx new file mode 100644 index 0000000..1ead897 --- /dev/null +++ b/src/imports/NounRelax65970551-9919-370.tsx @@ -0,0 +1,13 @@ +import svgPaths from "./svg-rpecqp6li2"; + +export default function NounRelax() { + return ( +
+ + + + + +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-374.tsx b/src/imports/NounRelax65970551-9919-374.tsx new file mode 100644 index 0000000..afae28d --- /dev/null +++ b/src/imports/NounRelax65970551-9919-374.tsx @@ -0,0 +1,29 @@ +import svgPaths from "./svg-u2edxj8dia"; + +function Group() { + return ( +
+
+ + + + + + + + + + + +
+
+ ); +} + +export default function NounRelax() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-378.tsx b/src/imports/NounRelax65970551-9919-378.tsx new file mode 100644 index 0000000..35995e4 --- /dev/null +++ b/src/imports/NounRelax65970551-9919-378.tsx @@ -0,0 +1,13 @@ +import svgPaths from "./svg-kj92221mds"; + +export default function NounRelax() { + return ( +
+ + + + + +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-382.tsx b/src/imports/NounRelax65970551-9919-382.tsx new file mode 100644 index 0000000..c44ebee --- /dev/null +++ b/src/imports/NounRelax65970551-9919-382.tsx @@ -0,0 +1,31 @@ +import svgPaths from "./svg-qafz9g9knb"; + +function Group() { + return ( +
+
+ + + + + + + + + + + + + +
+
+ ); +} + +export default function NounRelax() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9919-386.tsx b/src/imports/NounRelax65970551-9919-386.tsx new file mode 100644 index 0000000..029cd75 --- /dev/null +++ b/src/imports/NounRelax65970551-9919-386.tsx @@ -0,0 +1,553 @@ +import svgPaths from "./svg-qnagtgq03x"; + +function Group1() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group2() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group3() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group4() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group5() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group6() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group7() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group9() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group10() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group11() { + return ( +
+
+ + + + + + + + +
+
+ ); +} + +function Group12() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group8() { + return ( +
+ + + + +
+ ); +} + +function Group14() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group15() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group16() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group17() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group18() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group19() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group20() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group21() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group22() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group23() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group24() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group25() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group13() { + return ( +
+ + + + + + + + + + + + +
+ ); +} + +function Group27() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group28() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group29() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group30() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group31() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group32() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group33() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group34() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group35() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group36() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group37() { + return ( +
+
+ + + + + +
+
+ ); +} + +function Group26() { + return ( +
+ + + + + + + + + + + +
+ ); +} + +function Group() { + return ( +
+ + + + + + + + + + +
+ ); +} + +export default function NounRelax() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9923-625.tsx b/src/imports/NounRelax65970551-9923-625.tsx new file mode 100644 index 0000000..43778d6 --- /dev/null +++ b/src/imports/NounRelax65970551-9923-625.tsx @@ -0,0 +1,15 @@ +import svgPaths from "./svg-bfd6jik9me"; + +export default function NounRelax() { + return ( +
+ + + + + + + +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9923-629.tsx b/src/imports/NounRelax65970551-9923-629.tsx new file mode 100644 index 0000000..a3da9f5 --- /dev/null +++ b/src/imports/NounRelax65970551-9923-629.tsx @@ -0,0 +1,28 @@ +import svgPaths from "./svg-jhl6jizeq8"; + +function Group() { + return ( +
+
+ + + + + + + + + + +
+
+ ); +} + +export default function NounRelax() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9923-633.tsx b/src/imports/NounRelax65970551-9923-633.tsx new file mode 100644 index 0000000..36112e0 --- /dev/null +++ b/src/imports/NounRelax65970551-9923-633.tsx @@ -0,0 +1,34 @@ +import svgPaths from "./svg-70pmm871bv"; + +function Group() { + return ( +
+
+ + + + + + + + + + + + + + + + +
+
+ ); +} + +export default function NounRelax() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551-9923-637.tsx b/src/imports/NounRelax65970551-9923-637.tsx new file mode 100644 index 0000000..6a8b1af --- /dev/null +++ b/src/imports/NounRelax65970551-9923-637.tsx @@ -0,0 +1,28 @@ +import svgPaths from "./svg-5q6zbixxri"; + +function Group() { + return ( +
+
+ + + + + + + + + + +
+
+ ); +} + +export default function NounRelax() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/imports/NounRelax65970551.tsx b/src/imports/NounRelax65970551.tsx new file mode 100644 index 0000000..6620d53 --- /dev/null +++ b/src/imports/NounRelax65970551.tsx @@ -0,0 +1,13 @@ +import svgPaths from "./svg-s8leuc872s"; + +export default function NounRelax() { + return ( +
+ + + + + +
+ ); +} \ No newline at end of file diff --git a/src/imports/image-1.png b/src/imports/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..def81b801f932e6efc263a04b0c05ada38f30120 GIT binary patch literal 10725 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 literal 0 HcmV?d00001 diff --git a/src/imports/image-2.png b/src/imports/image-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8209b24301c7f70530971730992727a68cfef6 GIT binary patch literal 26703 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 axTNdWlf|JjL%>IXa1`ZLUscMQ2K^i8EGeJ> literal 0 HcmV?d00001 diff --git a/src/imports/image-3.png b/src/imports/image-3.png new file mode 100644 index 0000000000000000000000000000000000000000..a92091f19327ccd37c0e0ddf379b1dd991bbd2d9 GIT binary patch literal 15857 zcmb`ubzB_Lwl3JXyF+ky2p-(s0>Oj3yQB&3E6~-V%$qsy z&Al`4{!zc~s`}O5t9GsZE&0}pR8x^fLncNB003z6a#9}w0H{F7L4gPlx$=={$_erV z<@Qll0#G&i?g(-MYbCBM4gl1~qdc3yLC%q!<#gQu0QA1U2h@;LsW|{3940R%uIX)f zy8hKy<5Q04g{n;+CDdI0E1l3w>TDwZs2pP*e(MM6LDCRXpVBKet)|~I160A?HM4)L z%T$F>nfJxX%smxkW%cli_)W{J8Vl6Y6K&KLqIKpz|KSGLn^DIquO@(>b`R+I==ms> z9j!-SI*krIgzmC{Q^NH0cR+G%;sHW4M1UEpc9ns+wl)DFDde{du@XZQXpNz9z}pi5Bwx%7JnBE;mlH4P;W}ri%->?b;vq zyN9(rT@U$D7<&7rml+O>E7_fncH_hrTOE1}O=0(i)!+*dr>?o)q}!S55)Rh|@|hi3 zhmC>aO#6x@`7c=mtYK!!$GfM$$_5&}k&zS&JUzY0@3Aij|I{awxzU*8oaPZiRZqIS ze>5gLd*~y429diZq5}xfcXAqXcdP^(O?`r_a;4VKy8>dey9Z|*(m8c>1_}EJy52C% z$-f6=`+EbZ4X1`W=67p+p9vWJ-l`AbIjpZ$)ta}V#yOyy-Eo&&=sE4CWLQX9?RSr7 zeb>O3?(bH32&gSaLp^P4!GWflZ3IX%o3Yudn~_*GJK(ysi|70g>Gm+3?rYpaov#Gx zmy+;O*#nbVoB5-5>n%$U*Q%WFk*%NZy>!}Ms10hMf*lEifeXT6Mk)(X+PNy?mwYcj zRzY*!&5Oq4+a0u*;GJ<(q&AO$MG zO>R*6_I`&NuU_OQIOqsN)se60R2N~8|5yMM2PgRO(0aS$)J&Zc0Sc*Q@`>0zhY%Ki z8Citl2(C^sckWc97bvhzh{)+O7^c#R~y*QWjT zci!`#&Gz8%y0OIT6S8O9_eO+-ox^SpReK0cDz{*Wa(DLG-YimtvU&X?xnahghPWfpW-0|R&v4KbIe=<0yn4K#UBsNce_X4W{Ui*DM-Q2z z<2_l?`ydqU^>ThS$mamhLZs8F^ZUkOY*Ai19n7-^th z%>ln8E?hKYZw&=cxs^HBT6LR670=&eApFB6~jaoc# ztvDyx4fz9Id1%XWA9@Y6p|8LLc5YN6{&=%K6iv&9j+68)6s&wk=JD*l8$-Ue=hNA+Lx|4(1ZAo49O)QdF?bI+CdM?^&4`_Rns7;6hOJx$&nIgvvH63r1jZ@h$ z-365o`5HQ+IG=yh88gdmd7w;2eiP6*$RL0ZR2<;V_Bj|wDRW~t*TT8&?P#sflqE*I zv-U2LAjv5MiM)^ZJ=g1O#O=Voz#@l<`@PXdJ~8WF;A zp1^?};t%B>TL(W;cJq;>wY}d(29NT)GQKECEdWt@>ireiHPjgNQE&*mg!i zd+?BIq3YPL=?UEot_vr%`a>0`kN8)o6c_Kyc2>oyTEr93!`PwDqN26`2~nMUu1UGv zb%IPIV>jW|Z1by-ox5^5p92yfl>NJ9Kp(e_cN=u%B>9Ig`a5>P>c|k&To2dcBhiJk zWvB2_6ddYDzvb`S?y2T51xpyB0xX)mG=3HqB)6f+VjU@#(9bCYZf5b^13hOo*VN?= z8E$>yDGnYQ`$vvdwi7>i%{zrZFwJV7(Ow&f;9)x|KCAeg)PsZ#IW0{8ydyVxmwhbv zG2Y?I2eGZ&96b4FM={9@f2{aQNU=k9ARF1ir>nJbduoVw;d1V<>(VgcMPbxRyNJ6O_jmk8|PvZ z^6^?hj7=iihN9gobTx@x#Ns`9^yU`{h#AaZPA7nHlTjV|D;H zJ47+Jz_WjsBw^&~{#h>i!3vrUDn>Q0=w zxe*M6LAmkeqzp*_umIPI)x{~Ut)N3NB_1mis$j_k1{bM9FsVQT0ul<^e=k$P!$C

+6SSXM=g-!Fe;* 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%0DR$fD?;d1ZhB7ZV1eqd=0-npMpG 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 literal 0 HcmV?d00001 diff --git a/src/imports/image-4.png b/src/imports/image-4.png new file mode 100644 index 0000000000000000000000000000000000000000..82b9593ad27575057095fe578cfd786ba687e9b7 GIT binary patch literal 20603 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�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 literal 0 HcmV?d00001 diff --git a/src/imports/image-5.png b/src/imports/image-5.png new file mode 100644 index 0000000000000000000000000000000000000000..91cc917c26825a1cc09fc9f4a990f3987bdaac06 GIT binary patch literal 35539 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

XU4FaID*c@nnqQXu0JmNA~PKR9B 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 literal 0 HcmV?d00001 diff --git a/src/imports/image-6.png b/src/imports/image-6.png new file mode 100644 index 0000000000000000000000000000000000000000..0657a9ef22c524863b2686cfa06216279d63fe41 GIT binary patch literal 5493 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 Ii5Ud_H%K@zHvj+t literal 0 HcmV?d00001 diff --git a/src/imports/image-8.png b/src/imports/image-8.png new file mode 100644 index 0000000000000000000000000000000000000000..edaa7998f14938f76e3bf17bafd307c41364dbd9 GIT binary patch literal 4471 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 JR;y|k{STwAd&~d; literal 0 HcmV?d00001 diff --git a/src/imports/image-9.png b/src/imports/image-9.png new file mode 100644 index 0000000000000000000000000000000000000000..e5bea226bd6edeb77e8dd5c3f39f37e6ff8b3dbe GIT binary patch literal 34164 zcmd43WmHvd6fR0gOC#M4(%ncmC`xxD-CfE?K)OpxN~Ig58znX&UDDFsb>ID+bAQ}B z#=U2pf9D4SHfybSy)omNb3SuNzE)SjL?=augM-6VQk2z%gM+UFKLx1B;6Jk4f33hT zcy~<&X}F3}@*VKunT?d16dYW29LBvF68MbfqNwK%2Zz-I`+*;D{$>dW7lx)JEA`ID z_+ZID;O)hO!+Q*+AZ01)I&`wS6cyYVk^E)b3egBW{@P^Na?9GlBo+6&(Zz505zyR~i)!jbIFw z1_F78ZVSPYmPSD01GmzAKp>@o#K*sakHL{vRLl#J|2b^R7pV|N5IVk58`zp~@#oKO zUjZr&7$ZTw^!t>B$L_P|>P;x6(_0Zt;gC#yarqKUQ*=qkvAGZ>6k;L$E782rY z5%{9bl(k<@Y8etJ1#g*5SHBjmDM4^>=VCkpwO$u`X81?PO};AEHrqIsJ)xiIIhd^{ z!XRQtg!?wd`c5Z^C8ub>;C7eH$NS6+u5%-Dz4{@v0_Bipay#$1R|&4uf;afX#ojUw zl=gd`V$^rut&`x~X-c_(Fa2he(u(0^toa9ZE3<{4z?Ibx(K}6^o!LJ3kzqm}^ct-~ zJNfch8W8=WXK=%rHy9@y@mz+57b{n&h*dVue0}%xMWP6{=HwCuiVoNc zEJt)PieRs{C}=4`up#1_uQ-K8ap@4!b8ke#`$wz8)JG*lH|0-0iG`S14X%yn8f#8F zxxJ3Fb!uW6cU`6%%RXlmhp}eg?*qDNgc(BbwiT$Nh?36bR(0;(oLg^VeQNM^?oLCy z2HCG4hO(E7&-jV1eG7{*JgtrM!QV}}8d(Q*Y7R}D;!&a|?ozG9SN&N>$7lDZTy84H zdOLM&WQG)?-jj18qVB^2t&J(Uk6>u5$wK-POBdK|YI2Qeb9ya0B&}`@Pw1JR?*Cal zUO{IJUHsLtC?)!z+Ig@Z|33B!9r1h|YTbQ9|llwdwIatE6VWVb0 zXnmyq*EHvsEBV;!7XPw8+*{ACq)zS~bWeXPhp+tO5d6bjSeug}84f)Np!Y*Hep@<# zNHSTyRgM{OXnWdwk}l>d*71C3oFj0`{bhAs_4j+XBgY#Qlhb%jaO>#O9XuSTct@w% zJ?ts>tDq7`Qem+Vxi+g`t>B&8jrFxZpzsu*m2U$r>nzLAOXuf}S~;pYtp!%0%dz%s z-zM$v(#S%-HcNIYN(jHRdH~#z-#a?6$Y}Bh9s%P7(6fSc2Ga(3*F{Vtp^S#of_&-}d8MNM3I@a=rd0SI0}L zgXK7@%JNTLw$k&n?}jro!hYcooDH~bS3IPPSmbOxR_bTMwFHSJ z%(sK(em%&-K-EvJvEP!flyi1mtczKZPuuqBe*Tzgu~;PK70fK=I$=TD`bKkL_J%Ya z1L#XpWqX&&Ubb-mTbtp{qlE4i)AyTTjof#UE0L+Y$ZM!GBo)g1hp6sr-Cv@(23lMv z1xjp#+qV$BgZ&64&Qjz z`&w)36XDpHtcH_?y6$#0^AlH6a><`1Zx=Q&N@uo?7rcO(3@0bVcXkda&}K2?BEGTV zHwO=y^--lMQXV1tH=G6^ozsT1h*|H8eV&_cQ9Dgn%S<1IHiDCRe3GtEp49wf_afLq zqK1=hb4iT~;qrzFBXd?|hneJ2`ZV3M_}xDY@KT51CyEkHtAH=a!p@Z&S5Iy1PcG@B z6~10MMHTsayd`FLcfp81AJdl(E**oPobS2W*h}ji&wi#P4%FAqd~LLQ26f8yb8DD% zE{Rd=o4j;qW%KlAz-(`s^UA&neJ3O8B{p~6jnCvb@DNH~@<8D960VhLR(mywGe{!q zN%CysZ0_EzdFkFyyAv@}f9g$2H(qPiPla7Z=DM{DhLDFTI2}Q8`EqUF)~@7K9Yt-E zYO=g?pM#$l8T#dJvy9)bA_HQyTu~9Ll6^Rxst$kbuN_R8!oAkDyi@ar3=A*%dUy^` z$WHZY>M|-4mo1t}RrWuQ8KaBlblZ{Y%%0C<#7=1pmt{=4!1g;URI(^W&D9^%QsN%R zRC08`pFZH*)5ICZB8Q}#EM73CXIRU@+fpqb2kU{0ZH~~1Is0*gZufUvUo)@4LBqx{ zaA_P8PsH}gK%SGRQ6OsHav}rAKp9xLZuG``n@2)DG~seaS$PP0x*j&5_=D95Ac#AZ zqraUw6(nl2hmKNNHu?ZG zL)I(i)@I2~IdfGqd;e8GU`hs!>v~x})b0&tneJg&AaRDM;O3Z2v(_C$VyU*j%c8#_ z-7Q$;^B>16xrl;(=W_q2MrwIy%SD_$eSnb@ zTYXIV_q$xtA8tZpy4u`p3a|b7Jr7CKfq_Zk^TrSqzR>a1Z>AlupMQ!)T;DO}rIVj^ zs_8a_yrc{F=4(m$eNnsE%;h~>r51Ga`KYsyUF*bPV)WB}CP*xv zn*xA2YX9*>%1JUT(KMg|aobdve1EiZra4>Ty=F$ZY?ja;8@&(b$>VXOH-!VbQto_PW)pM88!|SC0gK_Xy8V*Z&4U{E`^|q*{>dof(Kfi(y28iN;H-79Mrg(+eV$W zy321fp(VS0WUE7GgQVdRxk@z?b;lVYg5)YY4OrncK9nf_@%zs&%gS!|b!HzQSFRzW zZdD(GVhUdN7HR3+zxi>D;yn4|<^GqPY06C~%d?`ym`nfgW50(1lp~=cUhhyLOw#Ab z;T@rRt!??^?+@MpyNL4gu_;|cFpNpvd^g(HxFj$b&Gr@kR)o#S@JIb3+55a$J8T_n zt1tk&?qk>`obr5XRLbTfH*drCaJNV2YAN8D#a0bBskPshZkLYeP8D!5ZS3^Zu+{s~ zE;ax+g5!L|(3zEA+RW>W+E`ks zl=zzke~Uq1e+I1mx!)_#5U1AaUqYZBg+KoE`YCJK#YBA)iEb2J0QfLiUBf<3q<-+l zG}f0!lcZ&=H9lSU)vrA(ns#mJOk>~}x_LXYqkuhMyRH_0U78F7-{Op@bst_4<9=`d)|2M<-wLw`P~>$MF68DeH7AOlE7;4Fegay-oZ%6ny_D&wY%T&#Lkp{T$5G<{IAUSx5VUgwRslJL=KRhVXZiF zGC@c8jL}))7uKp_kPIR(^||`P!)vKzWIb!5ud01DGuleUFF;6oEZ%x(&X-vQKxdh+ zeW;~8*2e*OJ1ysv!jMy?SG>e(0pAsb*a9ywRYBMZ_GCSD?)Qv|m!B}FqXR2phbftk zzIG&t3C-4v9Rm&nz=G3x0EL{ zV&48T0oQtTrrH}fsb-trljV99I=Qr;Pn=O?{03n8ZzYXag@Dt1zxUncu(MG|3&C^9 zj>Bs0(DfOus?Gi~O)BHJW$Tg4IbnA8%HALK!uJ=yDU+%;XX`n{f+{9VGyer@n-za7 zdhvao>Ujp*>WLM&Hwes(f)rw@{HNhra?@V?sLPCAkq_7#4joND`BrpTyf4JgL|Lqw zyZ5J0#RgS$(_^NZ-MwJpou*%Zz6!}n=g$$d;FetkB>)c@54YrJFH)E)wyf3*e@dTv zwHN|}FzY$Ro-HO&f!bp5Q|`};l=v!pn$@Gn1 zeW)!liKN=)BPX*LTGX*8U5f=yahwa&hm0oe0XJ^0@n_oaeHkoyGT2L4NP!x?>X&(+ zei@~D|IpU)H&U3_)u5w&O-o3TEbH@twY3y-r-ML`gHzbtqFp7Sa+g7=NzWQlji^=% zo!6$FxOxsNJenSQTz7H(~3j04bY_`K#6Hj7jp*fk9lQ`|8i1Kd((f z3x_=xr#T6&tWqLAf9`Jbe;e<1Wed)-&y;U%!MVd*m#ILz^!WT4W!WIeFh zFU0B>|Hr**x`7ObBoLpHx>mgK*o_m+XD*=>Ge2wHuO#x4jv{f7+U~oh!zsBa2h%^v zD4bri4wBy4qwd?!*rg;M<)y}(dQS48o5e^mYLLerP&JJv;LXUFsJi?!W?o+YURsGp z777rP)KpIpEDYagBJ{hr3)3&^{UC0TeM>`6Kf6f4PzOv@?qqPJzOAQTK)}FDk|>kG z{u2wTD4UZ=*ei*Qzk6&+o?KRT)*5g1ab5%G409P@rYQgz38DJE1)d~0@J&u)QbZ0BWr(7*!Lb_DMfOTfMK(sV1p)G7Pq*Kbr3mM_bf|!a)F!@ zGkc}1RD!@?shs%N9&eHBOo4yowz?&US@>|Q?MS914$aajiYFb`e!#ZZub zumC`Z_=^iRkRQ|^Au5U*GVtsX#LsE7y&A{`n_=C%Is%$rGJ-M1!Kk=N)4n~GV-LY#tNdc^qhprT z$@u~-m}!8A6ZJai=^vr`oXQCCSvw1{=E}Sde-hl4C&gVHtjW3dqk5>0IUe`AHK)kl zj9TF%Rx=W*FnVxwPBn0RI@ATub3xK)V6~tK=rtRN@Q$K0kR+rdt^)AJ0Qv=nO$tDe zC$WNqo!mTHiPls5oVAbTCjMiX2}Gk$~tGs@0K$6DC4hVFpAnA{-pduT^Z+)N@q`=<<#HG8K^bJg81s;@v832D58Wxq>EY=Qk)9aD~ES6mJ zSL+`Snv}EYycc|dw;$T;H{~+}fgnh3NuB<5zwpO#sC8+6QOVf_^m0i%@W<5BifveY z&h94!eYNr&Z0#yZBB3gqmp`CEVfIAOzt`j9=@*KGlDR_hkswZc4hPf6Ac`rQ4rw5q z0T;uWjRJqia0duODE1nc;&W~e9LQ&DQ%oK~$O}u<+3jO5iQ0oDwWBiwU-BZ@FdB$s zlh?^}b^Ex}g+_o}e4K~8PS&tMx)-)Z-?Ws)c!LGprprNIeMhKV{4*>Ya#jvhAbk5} zPP@WXhC3`y5?*R0F*z)4gh;Jstc-32YcwrYQHidW!bu|+{Mu=f;16!_5kLVZ@V?sg zZujsfzQoKATrq5rGfwDOt}qe{1;dK44Ya3@wjVK;*%9Dd8!|WHPADy6>K@;vH5=SA z{g<@`LXE4j1@g8rxkn(UyZF(@WUD0b&2>soUE%~U))3FOJ%@|;bCpe4b_!GzX3XXT zcl7R0fu?z;GuFY9NX~61TcT@vU%pf}cS3W&Bz9$2HdE(>t?!>PlvoOtnFt+0OGdT^ zR&u#xKxWuOHwXV=T2k^>S8R^m8QKT_nl&Q}8rQ{ss(J*|>*Ci8|V!nOb@;nS>c+ z#3FIlq|#Jukwb9-8b;X{hW0@h^lg=Vtslw7)@d4_!+~5>Gh1Zu!29Fb;n*)CFU<%D z-oLSag4~0Isn2juRvK-%Vh@#L=i%mZvzBX1&B-qFq|`fVkkw zO&qNb?VA-dFYCPm*%_|UDEkUfMH$G|9n2j_%P|3a2b(@3X{kJXNJ&m|yA-%1zV7HkSLRxe>)C3eM){1m6ApmPTEz^pYR6aG-qg%c7H9SgdQ^PXxq)-BYf+ z!|nY8@5K&FnY!~5Z>qMhdU&XUP;snmA=V>b7%4Y3E86DuL4L}R1FSKj2Okbj?$UyN z*oQqp`{(K)EVfHC(T(_ppMB*BWE|#E+NFN|Avufpr>CmYY4)FIl#Zz7K;bhhZK-q3 zadrTPvlrVfIEj3RCJ)WMdtVRHUbtAhRBRbS^Ap#X*5SRt<#KKWlgcSyZq*FB3GT9L z8yb&Y{qG&aYYP)`TnSE*dnHOBldhr!*<&YXQHT+O+s5DO$`Ii4K)yOi!H$cV%yDSW z9uZV7PNA0|92ofb2MtzRnyt34oNQ2HVVj`6Qj}OZW&{h;=Ok`Z#eRdITdkC!m+1RtPR9)GK2+{P6=b z@iOXkQ_p1Q$7KB}*G0EwB0tiZ)KmumW;^%$rwm7EJ^+f0 z!r*OxcjvT0j_y&s7Un@KNfiU9V8C=y;3F->!#E8w^H}PNl=J7#N%3vbOGdN?ncaSx zhT5bB?)Pgxul|H|r2rHCWGWdCI}1S{=VeTHPY#5(%9BvOd#_q~(nApXVgl>mwD>q` zIuip_-}W6{QL#2uQpMtoQY7Fx%!c?e;a!?$oOvl+teQpo0-^l$#q%WtSu~FH&*C9? zwQ_CY4QcOvufQZ0_R?e4f1XJGdN1IX7f!Jo8LD9U=aH{%7wOar5_dBdCW@aPL`~b* z4!wI}xnm1Z==*sv+W>^;$T1bm@58bV$U=17--C$J3Az+(Xyh0?7cgQ#_6$07x-Y)Y>E2xS`>}OIONLq_16f*e8yp3ErwXU#necuXbpGcJ zE~92>TU;xMX=x-X=mZb#Ip}1rKKgwDZTsSKwer0oP66rfNA(8{Wc^}@vsD_s?`^@-Vw?}tlak2sX9j=ntPPl zimXxs6dD_`nkHGQBECZ{OS`poE+WV0ss#wP=@n%`aYyebZ%>HQr# z{Xca9AQWojGN${Nl3SjO;njX_pmBx@5tzI$+n1f z8LOe={AodQ(AD;BELvY1UE8jusK^2;0f5g&Tt>@-(S1Ne zk1Oj-$-S}sGvHSe7sT9rXeDE# zi!o_yBdu&GhHpz104k+Zp!dAFDy#|wh?Q7aY@9}yESj-hxaC-W%dSU(7`pBi@ZOhoOZ}f=_U@%vi=9C z5tHM*bvT-Iw|4w+(Jfa@AVvo}P|z?vt%-X{7u~#Ka6hutYH|(u_={7R0ZedtN)YA74!( z;%;j@zO3%o686oRiF#AYEL{v~wfd$4UjX_34!GdUhmtAQOWO=}81n)KDBfXJ^ z7*~cX7j<`jKnxY3Kr(tYxpy&USO2ZFG!(qbSvEO}-l)szaB6DmTUi-Ixky@B866KF zzpwVv2P~tnuaB991s;x`p8h=j3qP7uSz++yzMe!Al7$F*W=KDRo{S74gX|iSd;u<4 zfSjBhk|mGcYsSF}9AqA_$TtP@Zy4jRW5#VE>LnPzpPM(L@YT*m-`@wk)6$~h=EnX0 z{rfu#>HE(}4Qp%W%mnC`R#q3Y_Ue^0bex>n<>lpyYHEGo-W2rK;;a#McM`H)9Xes! z`n6GpV^e(sYt`2$O&L^tg@$hlrmgw*ZC~v(c5p7`+EIy#c=Sw6bPNn(%9e!+;Z z5&^`FNoXuAEQ;#tgit)LCBm^feRdBKio~R(gw#~V996~6ckkZiRaN1D&0HUd!@lk8 zbfN~6AeIagvwEiVdThr7Y~7Nd2DZ;D-mDR3X69F(p8Pz#ye!;_d8T}%)y^vtgO)XU z6(7sM**iILykmUaNxds5aC&CO z0-T+qs_K3NITuZihs_q3DLnhEGa-b_*Vh-E7{-siWF+3p*64WCX``#Vkc-Xq++3>T zY`Vgi6O)tq?^wYE+VlQt$87qrq$lKjtf!2Pj+O=U7>3_9W~YW%E1mk<-k$T3WQQ9} z3zvi>vb9wVDRvulAQ#wKt{Dp$nLHk0TEFY)7=*nL{fh!6F+~7K5rtWLXjqoxHtt6 zqOrY;wO>IcQ+D|?dkHBia^)mSaWBZoqLPydz#BSrR`2-pc05GdqiCf4Xk+9Qu*dWw{E$MRXm{_*kTKZp$o{7|&<-hxwhh_Gg7V$hfVnl@$XX z9$s$}DjErp9yBzxAeN#Vu{%tR@y;N&9L-QN2BHcN~jP_}I^<1pJR z;8+_RG5_27;af!oVO%?n1g0%`I+U2e#v362H=+@R9|A{^?T`^$~S0U63*(T&Cn#EsL~3?VFA=kViHW(*9( z?jBJ9RWDYMeK9!V|L@{~(QlJWi0P)IY*w0e-7k$pjA%FePQZ|}|E@%D?kNx`(^^dG<{Pk5| zL{VfF=y(FfXcH5uskq>_I6FT2UOAP>`FEVtZXn)@Ml-cndmkACzmn_OyIQ;7Jm*k+ z`$U;{^MK8qeiKqzN^W3a!1CacQ2!l`hh%I|rxr)p4RXe1SLoQp^x{ntQ^CxnhE%;Z zzj=-iLTc?wh`j^C{DRrzRmb?=&33+i+h;1;pxd`~kK2XUOp$Tl-m&Hu)8!)Z;cW#V@3_zIIgwIWOxGoBb0W&vT_H7bd+eDek_WG^=utD^peq5aFT>8;z03{_-E zINkk#q;zFTP}DI^sN-2f9d(&A8xC$4_Gx<~g4zhhP(!^hrQrj|iD<5tuwA|WpQ)+w zE9l3tsm~3c(I25zL5)&`MQ}5V-Em1*d-f`eg_8k+ZIvb+lzMu4f0Ub&nx?h++G;7M zogK9zTL0O8OYN}6P+hjQ4|P2mdR^g%STm>?R3|KnJza_!k#mDOwv09TW9n~(k-P3Y zHtQ|~$kVmL+PLh;%F;uYyfEgW&7r1tZ^@=DYhCqR`9Db=pVl7l`f3w6PA@Lh;mhqS zwzqrq-$tdIjNob1@NXRp^lYiUS{HJ0bi|5MN(c*oYw?ovMkH_i4YoEp%23get#AOb z8kLj6WJ}g{{$}uHXTUvgT}oO{z`YRZQw`RPy2Y0jo)RZY1?$j;Cnq_bpNdi z>9TfwxWDuXx04P!7D)G1VGL#CnOJ|-RdzR)fGwS>l4hoVgRI}+0H3LklaLIFxSP19 z0UKMULpF9RM>7wdc|}Nup`upaBT}ZOW*cDfVk2}7NBGiMHwy_0kBWx7>dmlz`ytd; z*av3|Dj{c}gfSl_dWz&Yj2YM;&A}pwj;1XyLMp zUb_T9LaL@sPF4ZiR;9NO&-p@e_>&ZL#TNd>-3c$8z>1xAEsx zgK(mJntL3mf4x=RGR9j+ZQdL}q899r(iZe2I_TV@CN@`I?7bp0dvFplIt+9$=clkxX`uyaFHKGa|dO$Q!&e8GISCO&@t)Ri?+MG>p6%z3NKtl(7leW zsNeGgt@eZcqxaKv2`Yb9*_}Ys0I&x z*x6)o3co!1(W{aO2ax!)vXK$n+ik48BBX_0hFRSI+cU@&HWtMl7<)j6cJ4xfbO& zk;$vs^2YA@*@(+T9>_%prr}%s?ym(Os<>q78Kf_t{-A28Le{pEa4(Lb)EcU?3q(k^ zb0@g-FImUE4$0^1M3@;h2Vb6DE2alUxRNpqCHl5F=q#X``Yol{}&iBjfhI|m6)mn>`SG%mQ)?x~%;WJV@OjP%W9jYDor zys4vu?A;Bi;Yv0BXSAKyV%K>-gliVYCcSd5;7gKW-- zf@xG%-%DjCZ-G$~#>eeB@+ixx(}#}=lc2(X_2)PDvtQ2w$HFcS!;Cc~kv4-lLr*)> zr0OM5R+Z3f{qCF-wGyfXQ6tHNm^MyaQTNn@mE7=AF+$DneZCn#(YenK0Xnq7^KQqJx2&eUl*vSqu zSMzGW?3=OtQ3hV3GD%_w%xZyl z6qO}8bO&)bq&g?YxELgq0qYy-X_)QJmfu+NZgCKw^4fY%s#7WTPCIobG9^B~U!Pro zZ}xFZs4iP1=D7D++Kyt`#opWaK3O_3SK>^!>4Jxaqu$zhY8m+QEIk8#k=u{>?<*fE zi>)fD#kk>dy%{5!7F@{nADaU)2y<`s^lYXcQ|I)O%!LZdm^DNCb8n+2^r7P|L%!kCkcjRrunM*IG+0cSx3PLuCl}*1~p5FDl$a zfx9|diaK8PmR_Eb;aAor{>rE>`=`=6-}Qo2H!HK(9S5&we@`G(*kKrq?|f4UeSk zgbRwXp;Lb%imwC^xw#__Wi?(T^c=}vr?;3&1Q~+LiMb7MPK))(C7*OtkL;;6$hSOM z;+|0=)xp_|UhorKt=QZ>U2W4GxtDsxYA}WdoZFrU-7x5~vYG{)Fz`M4B1Jzvpp%;T zW12M%6wK@oh-No^Em05K{4-Ob5(HTso?jTRS*MeYrabt=t_=jE%D6mSSQ5H9b~}}} ze6_3*puVQAeBW>Wp}u(fk|VkeUFL@rD%{|0FTx0W{E8QupZEj8JNp&cbLZ`Xnc9x< z-SYZ~oaDJ3Q)DboB*LWG50qotk z{hw`;2nmsWJA&e`_O_G9MC2G{u9v*$Br>EFBWg*bZGZpzP%m{%lD2H$+*S_hgb8ZQtFz5LMwW@^r9i{2gA}Umf=v~ zDXClPv9&}Kv%+P|k!L0l0L;BjFrhW?Jsw5kiIuT;t)Aqq+X{Zb*2kul{sU!Hd}KV~ zM7M>vEdTzY%vk|Hu%d{h#&`l=jWP5fJB`fJ(awz{@=ZP6&i69yx}c)4n_3Mcta6h; zw9+nSW6gQYXA~998NpuD#_sTrCTV#Ge`$Kf&iFPEkt1xF;9tSBzXn!{^B=B+EzXl5 z@G;&er+fph@k^}Y<-EhW!Lh00R8a~t+)m_dDJi2}vGJz;u2lg~;`7iip2Bqx+k8#d zk{$LeNm8yyZ4}T^VB>(tle@k?vAw%J$3#+|@C4@?woV;|8;B(VM>`Om@Z8W$nW2oG zokNmTS@Ct^kR!Zh*Q8Up6AMjP7!BK{wr*Bd-&@6yXP1Y{peaAOzY<#39*AJe5?K#$r>m{Ix@eMG0-E?@3_S) z_syNp$xU#Q0ygNExnZzTW@*Q6HK#%)7^daHt1d85Sqy1aNy+vp?#xH}qqe`OYUxZK zfZK57;d=vdJx$kECHW66tS5=>J+8KuLZQjI8xfMGw#nV^AZ z&O?edn<+MzY8qOERhjT^ea;{AOz@lAwdy`RB$k;%y7rtAB|^3OX64_*?!DeL z>XL5@Mf4k}G3s)d$nX71`kx_5_(_L}l)n_s*P0+2!=xBhWWBmQI}PcNu~X=0k+daO z9lfD5BbTB>c43=qawYloh0n@Og2IkviA++N;HBW%L%NStk9U_U8%Pa^^vv4)y`$^& z$L}k}xrPG~`nOF&PHu=CvR`oCITPmw!+)}=8NZ%)<8xmA*pO5bl1d0!!HqNScoO&H zG(rI34_a{dr}fVIx~9NX1;y7O`XQ?jzQ|{$Y$BAb=d05lORl9ODbso0ZEh}N6ztsW_Cl>xTk2wZUY%VbAo%}| zGskTC)|57oVb~YEdfb0*BG!J|9g!IlU45gn$NPNNg;#Z$@xG@iGpkH^|Myd?k&F#$wT|@dlruHbf1P-X5 z`<)(#Z?>^YF8q0Q)naVtAF=Clg+Bb-nfy|$f(1E$wR+-O#b+pE zpv3aDtXry$QBj0scIk{OA59X|Q0bT(Xx3H!u;6U=(DnB|D9g6$(e#!5DjH-mTrw0v zOZYZnbHa+RT#t?t6YlTs!2@4^?<+!lNBfDD#o;IR{^B8X(Pg#uT{7~=%hc<}He6wV zTqpxxi`^D)f>`bc`2%Df_@0jq-S}7qbd&uw<{PNtc8WtqDz=jTgdk{wp;LfLU#Va; zG0s5OE!)g-PR3*!qVunlczfwgbc8iuoiSNZJGQI`!QpJlVaTcU@WYXJ8V5&3 zHi$d#m2td#|A_~r1qsIPRli^@84Z!oBzW}=DWPF|cSx)yRw9yumAutWw+L*({#3Qx zMss8n?8L}zBsO?=Q6ETrF0g=8{7z(Ked-lj>bYgNcfXj?5KqQICN?$-Ev*=K&a?u; zr~h})>i;1nk^le3+W*HSZ=?XHF;21?N5v!%kVUQ)0WB5Ka{%3KO^H5Y%$N290Umrg zsE>gPwVYIfHYh!zq*Jt9u7RGn6Z%RLz+(e+5q)EpoDEA*UL6!qjPn+BR!}Q97Mpvy ze`R>^mJ6fT3z~B!s+!G>4eEPqN`l!k;c+mEx3Q7E!}2Q%K@p7)lSxM;?Ra?b2Vhvh zaT`u`p+`^$GXrF&o*EsUNG9Kdu~iFLx17!%=u-WUG7Iae8F=5D)TRkoS1>9y;9#vO zNtFX;0PGVe4+D0eMrzwnQZUMyPdO-{0U~eJ1(09INwTO(n}CAY=lFO$H~4ZuN{PvmB#85ZHTeR1N(AUa1O1hzfcFMt zTl9zlmQD}gN5Ng%Ai%1(pfqTxeUhB21-k>r$+(A6wqYbLEqnLtC#Dk1zmL)HVJ$mm zMo4n{k2hIewrjyhW2>=-^`P1aBTIX!l%rhkYMdN>&OImx4T8=ZfLBKuY@R=q=mdD* zhLkV8*hst=V0~_l3nNtrHfI(3S?g}b2>Xi%J_kJf^?slRX(E=X11OpkIx8+BjcfKd zV0&S7#W^SkZY2Vap~@QHv#y$K@uR~EB^}6n)m?onz=r$?Yi`a{+>6gK9KnvX@C0vg zSiH}lfugmkwRE5V9+kPI-B~}}%>m~g3FGP<72t^Kl**D&c;!H@-ZYFX=X5yr+zjfN z1oj;)wdjb6Q2*Bh3nNtlZju{}Lv^Uw6b`ysKm6CMy2$>J)C6|)7mQkEY2c*G`s59k zczpxwuMKK-!Fl`?|K|wS{dcpHaN7p!07MBLH#0sthQ>*33B|6D&KUj$l*8)_a3;rl z%KxLC^?JqXZg8ukC>XEt?_Ao=j%2RDf*BcPq0VelAgKMnjz*)VcERO<@O3AbmLtWc z0kan2aaSTr&Q&)Pf}qVR)x7IlKj^Pts~m>$?Kxsfk4gjFZJ^)rQ3TI?242)@|BLHa z_n}zMyQj)6tFv`5kD%+WP7QpMC%_aFQnOeP0Nsg?S7CcZCY4{p?KPX0Dw=*eIaROF zL9Q**T;ev4&?eykjjO9?z_2*fQi{~8sPH^`$bwyhkWCz|@%``fW~@C6!=g4$^p3UE z)*4MW6UdHIMD|%|^MH_gvQyszTmAB=kk>x3_kQ|;cK}Tx!aSLCdk@91_^!vAI1=%y z+KK7mn@0#5K6cj16cWS6;T4R#29qWe5VXo&`)lr*&fWuQa8-QuAF-b9`8@cvinT?# z=`7G~%G4?hauOtiHmri?X0QkfqSoX4 zMNoZMerp#M^4ssj6B?+Att%teNsOXI|WmY*6u)GSSzP7 zx`A;38zqq?c_B{&P`pjp%$1d)5!16>Q{tg9X+N22qQfjFkH0cV0%TI+_O)IM?`aG1 z8UM$&6Au=E`)f4L%|{%4{{;HP)&Or3)>lQ|AfpUS9pI88!fCg*_r7ld7h%H#GYJm} zKCMdv2VoAXIiM%>rI=*z_~hC4t8&dXScB)cM{{;+aJSGfcGpEAj8ymFOpMYM^RtFQfzhemjXgMYN-pfA!uMsUyz8 zUstRCzcWEAjK{EryN_h@M*N`r&xfD`6WOA`ClS9v z956*-GD}KbJHiyS%;mJNLH=0red=s)z8Nsz{LnT2!NJvE`cnGSW7ws@2=Fjwwmk$dXEaG%ZA!zn#X>j83A<{BxQGx0v%!eTO9uqXe2Y>@C+O)x?DoJRim-on{t z+QNvgF^j05anLyDYjal8Y+F6DWie3P0t#B73YtD*ee%z#OFg;E^n4aFH5D^H**B-f zT7Q1z8HDWVckD>C=YQ4b z`cHpMOj+*z!!ZpVt*qL>CYmX1nwA=#^eoW!HsoDf*^8d2Q7&;@X!h^u;pYg8(NS_B zd$x`#zq9GwOYhH)BKirm4ALGf=bCOD(*xcx0pT3a^?txM?5S|hIgo` zm7cB#HHmtQd85u*Ol9wkJl5!Qi+K*DoF;lt0(P3J6t`cKT0ALJXrNZaRgi1QZ}tp- z2YUc$24*}NA6dU`g7#LR?u&E{HiFV+KG5BVFkL5J;?f324b^bacKQBBuOurFaKfD{ z_E=yVEU_B7qQOI~rmhyKmt=Hl$OD?z0NpbZ&|=Ad@E8I?#I^I!ZWUY@;lV5WsjA2t zif1cdFkXW8rbu(iC57(n+rzx^CW@XND>f| zVg1Bl4*_?)b?E#wN48Sd?>!?bnpt$||3B{gd-xvW^f||SzTWTi z@qE5sQiy9WTLwVI%{fA0N4aS?>wx1wS})JC^m!V^fy`swO-Ur0 z?7Tmvq4B;0zVU&67ZG(lV5W8XQd0Ie3kie|vTuMS(*&Yj2wr(WQj&AfdiNq*r%($( zM`GKVNk0G>=O8RA(n|@{Jl(~6;T6=B(qI+dyKVqOf!dU}=NW^~F~IbAP=gRdf{f(Z zZRt&Ai64ZOAt9ImN-7}72jN|b z43Q~r9}NErdW!Ap@>$dV;x9Q97XTvErl!(-vwD8{?SZBK=V$&?^)Ch7&QDyoSz^b_ ziPCxVZR1D;Tgdas@^@dQzM31vGly@W4NTP2J?c z?nzH41wd=nb`t?bMO;>bB?AehFSy#50r6jbKBLmhX~g#?wX@B~KsUkZ1^(wR!l*_t z3Bwu;xYA%Vo~K^v@4w}8&KM+=xF?i!OtH1cy#68hq6qKaRQX;dugSb1LzRSzd`V0L z=f?N+!gE)*r+oAFNp-W&J1Gpk{GsKWnY$L_=tiic>j91iu+sML1oa5EYsCD{E-o-7 zd8Io|0eXc=Koj=k(K59oABdn4&3Rbt@Gp?QyYn+Tc<&7Opk_rWn zlK%<-aUKn;9&U0T`~a~5^n^zzp)0Wx@}IzrY@`s6(fuRr?Id7#=+u;sCmyNp^AV zOY_{l$i$$%N6>iy#*r%CrBG2+{Bw=66$t5;sz}Q?gyAJ-bkKVAsM(DFxW4Y%1(p>c zMmhJQ<&>1d;gIAzwLCxsw_gf{6BT~t;^86x=jOGwnQq-0%Hw?`AVmmXD5Q*7DVWc@jSZQjZKYl!FTI9$DSO%#qK;|Cx%6dp7#b|13p1q4X zBOf$UPeh*2$Hzy*RZlgnW@l%IA))8&VomickYYf7<|hU2SwStI9<0lom@v)a%ov_g z4Wj%4rbyn*j0M_H2RxpQUNL!ebhOmEZHYio70r+4h`mS0$HzXUHfCpZgD4CF0wfj{ zZ#V1T#2F#P+wcmX&zXCZcD#G`kX2k#Qb<4mT0tF~WQ=xUutBMUwzjs+_Xjd)?|{A3 z)+R3~EX*3IySPoy*pm7A^L4Q_g2QPyLm53Gk5{RwQSgYsF}|S!QZ3LN2c4{s=%XK| ztOn=Jo3gU9{?K$~Wr6X_%tQgM^16^sqPugAl9H0Fvors}`qUV6T_=->2zeiDQl3v< z^M9i*O}~H-_2zwgAo~xhCutO)LZse!G>@B@n8+Y0IlW0(`b9Z!7*5K>&D~%6^x3uV zWKcdB7#IM1-LtT;Xtuo#ei#f`HvDh7GCLl~y@yx}HbS%DzbC}TmIyQjcLVjTsHEgC zmqj!nr`SySFBlWR%I>~CJgc6ll_Yow7RzaDjBE@%MiXFXy9WkBHS^owDFLK6v3yLbn zWSY+IhXMYoU3eEdqlSdr#(^K^gI2SQOu_>j`tJfGV`Di`#y}B5_hj6rscCGatF5gC z;E!}%QKn2r8@8Ak_xw+X(YBRB{qWH>y3I=viCTHkMhd+~K@`T+zV01H3gsAX+ z?SqN6r&`dSWQsjx6}bu{1oQ{!>=^c9I0b&4Wz8SPRw3%*d-h8PX`k>kvaVZ-Tl{ZT zVPuelvq06Oo^}a@;!zUsjA>|Tk$p>-j4UYNfWZI{ki5XFg!d4(*F{k*7j6_FSSTnf zD=U-$30e$u8Itd-`+)G?ffHS7TEnyt5F~tEZp9P-?a!~OLh22^pwt0O4(%}u0N7YA ztNB+;;4$6_10RXy2TL4U2>kw*y}Z+Exi_WWa$92`K;)&pUqQs*umUX2~^OmO{45mpa|u z-LI0Ru@%TiYc2RLlfcMCk^^!5V=TE+w8{zJ+cW-mTmb*uX666gJWwunEp^4JN1zpYcm<|6c-flA^TxVSZ3M$Ixp1360iv83049 zyiz*>jX5-B7trZr!q$UIb)%zK6Lw2Ye0@@Ha9jE#z4?QP4k#Jtgudsg(?ht0xqel$ zBS1K_y!3s#q$fEPHgLp1dHdhX$#Q&pEm?O(zI1F?#0dou-`~=j*Z;yz0Qh+<^Ff0> zbI9t5fqsqNnq^x3XdMPE(gVUJR#sL_`)9ay$h~F#^Ty+9^u0EE8D+osg#c@60LKYU z44MbDNElKdNIZ$P6i#^nvjNc0C^B+#aR*(Vg$gh! zOmTnXT|cw9LyvrDbk$Vt)_(EQC|y zGcsbKVg4JiCT7|ehv64!;cheje*kU{JD_TTEv~GthH-=2%7Kez53V7_ECh(^``lbt zPqDwFet^FQ0|^e0J^bpy2o^Sb(r^*9;Qs;T{)+X=!Ca6Exh~MB$m5ENK9*2ve*Q$} zbUu>zsQu0V1#rvc4QBxdEgRpv*KQ?f0$nDq$LxPXxJ|X9puN9+`!?~qk_HiGxY0k{ zc2}eKDG{K_eSNANuj4aYzsEyKz(9nS9)m_T2vr6nY3S(aXlA2zTuQ=(UFTd|D6*K^ zIWcR2*}QzpxjD%Fd)nJJuy?_+c%RqZ+bjR{=~IoTd0cPGm(7E&RBY7EUM=G7Iy*b_ z+oWN98lRpX12`^nqq0Lnq`ljke9V%;a#=Dk8!$05$ET$99&Y@0M8&p(d1rrrAK|ot zSMOx&+-MJY4AT^b!1o*kowu-PwG)QnRz_li7bYTI+)vvJT@T@8_uN?S-GuoN%3-fB zYEO~lH4gBUUZI#5OJjbWGrPb}=Z;3b?|P8`NKsu~!O7{?ESniadAiG|Phe_?wQ@^W zn=MJ%mwY4>f53m() zA_@sWZvmc1Q133y{6{dikvixrN|S28@sET2<+7vt$h0 zR3%cfFoy5%{wdXbXNX4i`kNxVvXauA^zBvNwYK+gFe}V^rrWTJ7J`{IflYvxKN@qp zp1=Nb#SeNG4AVjUfh=a_n(w6b2u>w39|W*u*#RC7<1A_H0rtN_9?(XFA<-o%4hFE= zN4$lnuOJEoVE`r}9T(kwMMcmXg!Gv0sBCDKj>!XG{!io=6qE>4i%jX*Y5n97=!xtZ zfVwS!a{y!y&xCxOfQB7D-aTX`sKHJuRl2@qEd$+tUL-M2LkK1jU}wV>X3Og8#J=La zO6i1w+&MmdhYuNn=4YulHm~Pd^G^gf?ecM_jw#AqcuJ$OtlroPV}NSWpm%d&G(~ zmKF8aYE%|{xW_EpZ6F|iBw{o{tnzH%9$_FCB3^&Km~hH0zAwSH0t~zV=&1JgA07}; zJd)dGE*uJ5JwBcvLP4?Z$I!Lm4O3`yUc}LBI@6SRcNC|Yzqe9h1w1pvsJRtJX62dZ z&u{+j>G`w2JjO^bM!G~;lT%zoQ>NSQLINbO<;3Kq@=8~R8ULG0?~f11yq>%i{hUO; zZ8a~?@%n4tN;hl|Tw(iW;(yl{b;nrx-chsvpV#Mjt()gJ-_1^4>AgH>NKboCQZTnw z3a<^XrKd(!_t##i-N( zvg5}O6qHty^>g&EW^tEIm!V;ybaz(sGW>Haty$VD$w;#nw~X_e$=)Vnm1ND3$6Y~Q znvO1OhdLE2#4!*xD%7IX9n{Zk|p6%FaWfLMUrY$OA~L} zg@!W8IUsh!OU|PR=uLQ&Y#)5ric@;w_I;jEufFTg?)MYqm|92^zzcrYC;)97YB8?4 z&2p#Wm+1}d#riVMmkfnn_sLrj{ErK)&wAlbWXi_%ED|KNdK`un4HR27X{ew^2PN|5 z5;yo9idU}v#P01-AsEhPGnbRfY-+n56fBz5ZpPm(v7-`%onft4Y;}t(;s~{iXe%Dn4r9c%QGIkYjLF zY_Jr~rrzC)T2UKT+{*MLZ{^Y{LBq$7>*{#O#3Dj_?1%cN!K_@pT%rdDioSos7VMy4v2?0KQ%+f+4r|6agI=$PG80#H3!mdjye|pyr>HT1kw+A1zrn@v3&9K`RC#7Y#N;J?pH8HElr~O8UWcxPgjhy9@EZ43!fflQ z7y6fb!)mUsi{T??aw-lydM_?KpvHFgNoaTI_`xuX z5vuqdZ?VnSihtJ2h_jlGKYX7(=D3VLH1yf$?6bSW_h>Vk<$lV2RapLjAP%Otd8PLx zAQu2=jHJ^0~SU5TnUxeGn&t< zW5&gfMCwkFwl=N%^0lDS2%Yiuq1}=4em~|*vbDe8=yUD?an2CM>{IB9R>xfg&+zxL z=taomrH{i+3)>D}2$twY&!{BdmLRFtuMbP2rO!H~Cl`HBS=bV`dU@JZ=Ch06+BJi# zvX1erstQY;I`re|hD*^0xAKkZ&4R&`p3Cg9fIRUf^HnJi(w`$9cg}u0-1%_!`@?;< z^#6{Tw6xm#qec9LU_LWGaZxswQYIuPk?R(4#&w`5bbAQ!}n@4t7`bDPG zgm2Ee2G8%dknAy+0Y?4nd(fM@vvU|@sej}%dW~x!2vhgT&xp}_uL1`~R8y%P?AH0K zjDO1&j73lJ-_2Z515bJdK;9=G)K~+nay#OvB02&9TYsb7=)aUo6Liy) z*=Cfhk}OR|cUE_*j&q71i&kf=Q&v8g-a%bm z^0&5)^=F&tfgJ6KB$kfn1y`(EcQc(o`yL=Yf#3i(avZB_au%CqyF>Brl?G3QefGp- z>iiiTcFT=%C;d@S?DglL7AWwJNOXy38Iw%}8?X?Fbi%{K_u|zligZewJyvi?34g|RCz9Uz=}Iv; z8j(a;oxT2BNw)>nS(HmlD@;*&9$mM$dOfV37k{Z$PJgzBaC8zExy;b;Cq(Q(#1krd zi1k~V3hk~92h&5JfURq7E$3V4dNY?O>skn9=?DB)epAGj_{JaILuofA4oTXj(#C*e zBc7rV`pnO~_(KnU918DZ;|3n<(lKqS$Y1x4*4Km(0p(x2NKZkn5cZ55S1*=6)N7F8 zPSkbO$9JxnIlt`6)X3a##}1l($%bIDRlg#_@9jDI;CGxK%1S+BFq@kzQL$(=D$iW! zqnDiM%hy=i$YUk)L`iV0FAY74}Y?I%0dlaWV*&tsozHnO}@lTO~Ou6IV5F_6N1{ zs^3+~??9{Ziz)>mwef-x)6;RPd*vKmJI^{P%*ObD&PRjKgqYeZt2laG+ zRJmsSXz>yxG1@^dTGh$PLFeCCTpc&&Z^}H!D;lF} z9+{L<7+&q5V0g&h?lLV1N~ec1t1N|N#g^YP*CXX%ObNT_cYJU7z@MA>#d*cR;K^oS z*k?B`Qt4iqH_D4*=O9oi{wTA`rr@7sakyHoH{^VTHMz4xv^|_52L!~=(v;gy|!sq2lW3sOB|{rH?fjxI_ir)OJA76*b-KObSslrFl!t zCn8Pvfd1atxna}W5ovXKA_zhQ**#uM2G!yh^v`}f--)^IKQka1`B8!XZf{H)&)Bqq zRx}W}dlw7N2zEQL%Ib3$wO^-5TVL9T=EDsYaUuAJgu5Q@y*mtl=Q3oEJC(bP7jgCs zw%NK(PW^1H%3jml9C~F$1pM&j1(Xq&&T7X)RFvZ2yBbl{tB)4u9_U_g^%cCLuOd*? zA488}KG}FdHS{n~qpL$U0PP*ZhtiWS5B``*ktHV~dDJ3HPKo_iZtnJ-yRs!i3^oUL zx)G6SQpW0vHLrR=`(kf62VHYoSo(}6{8~K{4q~QI5G7jBV9#AX2FlD>QTNcXJ;dZsylzxvdPgcUlCI&LOOjuDzRIhYeSEl0igN*;(v62=qb_!#sz&|%05I=7{=|D?uudq7ZwSH+wzfD>iydN1{ zby46hh~fv5Lj8I4y7!(MGP{h>4Rmd6jjgSIed(Rk)3aO9$Ac+==gTNI%Qw4w!{Vz$ zl}q=#=F;}9W_F~gk{i%gYnF*5ErqL|vB>s#Xk|NU#-O{czjL>vP<;O&23?Ou+2Q>Z zoR};UV<`YlkjE2)`-ybr{yoR?Unl;)IZhLtJfW)!v6u>+3UB*H-xcO|l=ocJEDv5R zCezZ=UH(y!TzE@gn_sEp6$mjDMJy(SWH47%rb%+9&sQBpI1-Uh=}1hnt+F;E4F=Q% z@o|3LJqbknyGqr|)}T!Id}we-E&aE1m?GVJh7X0f5;f1q*}>kylEco>phl$3M)D=`*zBdBFQwRg$rt0BJTH!& zE5(t+wEk0L)7l0xtKu(qR%C$Cp8WFJVcru)-J4u}$GN7$-$sb=S^znR)q}7iy6t(@ zua9&$?qq^2Y$}=FjK3KK4f(?|&jms92T}hc+k~qKPi~qD1cg2afUa<3p)dMHj zC#??ZXcQyQEHSY<6)0B))c&#Y!-RTT542N?l56t)2}*J0dP6>S*LTD>E6*p!vDAD~ zA2glan7lA8wW!p=ulDi&>hxG0KyzE$YsQz^0gHdNo{g0-+I+KngNtjw8x$-nWv9D5 zcK-}|9^qpus=*g0&+{-<)`K_j?daaEx{Q_Pm|vo1W}(LCIL>Tl#Q!p@eNMR}OI!M? zQs2#P`r@b4@v4z;@zVC7auJb^l|HyOcqeD4@6IWOD!+;#Nr~eJa!G9eQB8o zmkEUKh%AgaJFF-+M6h``T#*0m5!}>(<#=_Tu@;q~6wx?5XPN2!XJA+sbu9Pc4hzZ*E~d(! zfHvaZkDn7^U*9PsPij(?eZD#z_W9IdYL*;#av-fj>)KZ{EOp{X7+)8$)YU?2Gnkexm2(O@!HhwT{ z4(C0g4(VoMzP9_jbm+8$!mj^dy^nBo?Y``p z`$jNeRBz@_D>C8Wx@;IrbKuNT;WN>B5ZN1g-!KS>%Nzu$7Ss36ZOYc_0J$f&3SanM zyNqP!&QTRbN1sWQRHlh8JbK-8X>TZ!ZF=PDYVohrn$d)Q==W8aS{bg64L;d-TMmr%wl>XIE9#P2?@sKBFk>!3xlj59fCRn z4qg%Gx%MUy4<2MBR5!J?5=q&;S#~99%Jw6-%QiK#w_dRt<)tao&NFD@o=umB1{1Qq znEN?BgRmsGV|0Bq8k4b*Y%~P(7pBKewsuDdaA5e|v|N2vu&;{oJ5bD^#Da9;J53?x zCSBm@Jbm;gj2t%3alVsJ9uvmgGaPrAy#^3d7p|K>WQ}5Bxz=8&vImQT23hbcaE)Y<{Lq za$J+`4j%og+?_xS{Kbv2;x&A5G%}r5a+~yEsU7NLS>dPbsuitB%ltPnU&IBeY_O9; zFa^&SOMk(J37hOFCuY2W1;gK#t2C#NDw|YBwI766^EL(LzHgsnPW?141p`iN{h32T zRW61;EL%;ohgNHs8R*|TDffwpL&Ur~hP=iihn*{T;&>yW>(9J5ecJn8(r7DYb@$B%kk2Q`pCUOZ65zZuUTb{fwy)jC@U)~^GZnEJB}5Q@J2$4!1?vp17nSw z+MGt^ezuMZPZl5R?o$}$JEDv|>tCdBdx}jhi1lD)CC(P}#i=buOZV8AI7X$~{B5|a zR?TC4h{uTD#`}K^r6V0MH?7LHK9z168AIo1@EA3XJKW?=FGTOkItEF%-b38N3p6JF z@7L1a-lTjF&E0C^LLFkYUnt0u^>CGy0N!G3J}$2IUue#-;8m~T;_B1JNmOiaKSVCc z^GVlk>|>s4vLr17SKp~^UBk3+Y2J*JuGp@H!F=-=YJZ!SjE5k3A`_F{{oRiK-D$kA zuq~-MlJ8G{I}fzr9aIiZd~0rNYrxguN_#25yUod4as^(VupIp#WK#Nnd57}F76nz?VnaV>EOThlnl;pytj%K;>+(6>yFCK%s z065Uqp`z2CP{;D-pg+N7R@-!&)6rz?l7?9Q?*loWOn}hWfKdT})d-yV;GZ?%U||bj z5jc-QJ|fn1(jD#6{uc1+qX~EkpdO&?4L8xfENLWmC<*9}@s=Bl$<^o0FO5Y%U6$!f zh-Ee&A9$LD$yvS}>+f7BUNpp2&sY@ZY69c%e-4|`nUX{z4?wW%W_3MVW z4L)`x5ngu0y141{!c7M%NVVlVd?N}Eek8-mUD*655f8X_JOubbe8zx5M{pr9`i!t- zlhlxnPm*rBGiiyTclNU1Ta1S~ly@)F-IF!W!sPvF*5e(!IBV0h37Wn86h}(dEF9V~uBPY8HkP4W9iz{Mo z-sF?-+H9azXJb#$#BKLdXMEE`yeZDTY2p)bTxzGSW!}WR%y;W~OJX>ge^RLL5+ABY z-@m=rUc&g3Uokq?qd(blo%rUz%qWe(?8U-@t4T#ANa3~(9JJ%(8-$TTK7&T>bx_HIU|A%_$u}CU$u+lpX^0055+uh?)|KpHEnU}MSe*zVn)IH zw8e1DcW}ji0?tn^QS)=rCAXurJ{(S(ETNW8Q@MF{iZ%b-d^NdX^mJgwnakZl^rF(E zq0QZKlry-vRG>@fdax?kzDHI2-p%C$yJ@fyL<~(U%d4*tpa6l2^-5Wl1 zbBBWPg?Y>{g=;8XxOTY}w{k*FKQx^D*+omU;!&trZVKb3zrc+KX9_!;*4oX2?V)u2 zzPFbFZT%j-qtm)I#?)$L$>{u<3tX6^-9^$l) zclme#RBnv)qpe2zH6|d$!ef%Vx1xz}T`^ z{4SklMIPsOQJM$oXN@n5_pc{N(4fFk$DOI2a_=wFKlfN!rOz063>qV(i(jM}uu7iA z^)9eUd`l}gUv+>=>hildFPkgvJzhA{ujWqpve@Rk-PDn8xlT;;WIS+wIk;N&YmNXb zdiFlfzyN1t1w7nBnSrCbSjoBLDlW>OY4J(p+6{7k#A1^XiVsFS4Lu)ngidv!eU@i7 za@`gu9R@^5U2+9*^0HYjm(k)%9d&JG%!F@<@iB1bg$tW~coM?H2X1rNQ*}VUA@+kP zNHQRT+-?NMLh8_0z|K>&l5v+1G!U{l5FS?7tY>*tNd-9Yei3cHrmH#2|w+Exp0!$IgDzTQfU> zrezATPNi6vv2M);`d+n8vbSl5dc@XIdGoh`P(G4h_%D1C8$6Bw#BLI)FU3xXwjA_T zT9O8}guVWz%O@lxyggD88sqi1vUIsok}zzPy15aHvqpB6=eA|%s}ag0Pb4Dpv|Z0$xPjp!ytAGknvT%AKb^tKZeQEIh>M-khPA(8 zFMhFB+vB(-6`(_IY1#+wM=;KEPhA9yHhEu*G<=!RG$A59x#YU9ue35>a~3X?c#TkV z;7>c!NN)ACLBY+>u82QxCm+-;TjA2_N};7rIKM8pMa?De4AX{}!N)*ogi@L1rUahh zdJ>9~fw<&AHpR!s1BJg-;YUtMIZ=!n{hFv<))rhh)o$=;i#d(_@dFA)`Ibp5^-G%VJX1?j;9$NE!m3K2Db?Z5}cU|Yn?5Z<5jO{%Ovb%J}9x_Xf}vbsII z-Sqn^xt+e2s8WNMH~hZQ-*2ns5*cwrnz*`#(5H?#+82WLE*?+udG-Xp#%XUX*V(KU zf3X(ATk>~}i~La+3t?CC@ujn#}6ue9WkDb244Cd#dJXjG~206)mrF{%z>Bg5TeeK4#C}tb(NUwFd{pzW0YB%#N z?v2(s=5zU5;Wt|2X!u6;g9ENj(c&x^*UzjhaS~{(S$sxPEWQ*0YkuirlMy$&+MmoB zVi=KWUk*jjrXK?=ENAc7$K>$ck?$P~^-D7#%R!PghyENi7>K9>+>l|)|6b3_L zu`1yrNRcFj^8j)j-7*^Z5~N*PC8YM&Zh%j#vq& zB?t~&Zix!C750Tl18J1OdgryWtGreW{d&0&H~nB!M)4y?Dux1K5|aVDAgNCxTJSsi zkc%S%{rcy@j&=4nb|IhK@Q~>w{V5*>%Cn6xRLHzD;n3Mi?$TH5SeQm7plB>|F|a-m z5v04KsGMUpqjZq6Uc1@oHc39JnzkM*UgXpbf%IB6{c;b<^i|oLFitLHq?~(C@q}8# za97_jbAYxxNI$*77me{_A-FE4lRbOZvg>KRfxFekCjK_$pBkLu{W!T%01z|#>+eEh zPZ^QdU+S&Z`aE6v5A*n*|Iuh~SJV+XN`RaiGv}dBi^`Iq90**voqAeLwdrs{RGZ-y zfe6!@;`)<8`t#@6#uP{1%UOdV}WYymD@CK-W2QEjmm|yCC zwxTT2FTQ%`l;6Z1?O;QCtcJQN%}P5a*5lESqC z+fN}Oq3gFyg4|!}jGnm)P^G*pUsC6t@2QP7+G!&c!|TFz{p`NNu@N@5mCH`v4IzaM zAt_B`X?|PX{u8IQ3MQ0hmx*0I=n^s$Unr2UH1%}DGciLnbf&>GYpqYzZnl|*ok znV`8KouWzy%zt*d;qwAV^)jIlt7guwopTopoV(IkxAeH!1#@56W80 zbBMM6xU62fjFbDxw+T&&%^Eb3E!(bc?S>Q1=jG?1qGV9mIBk5{C3uU1qH*V5_S_^P zd+F`a-6~gPDxc*TN^_a@j)es)!IW60uOZFJZ-GRu)CCorJhkMxfkKfjd|f+k5^?2@ zHFtPeiEm?nZ}|F-$2xYEtK&Kq97RdG_iDUYq8Tlojo@|7Lw(z4P05&VPe!K$Gx}G~ z#`0uL&$(am>f1k|VZ8Jwh`mT&?F$!&p*T-1t##UMcD>@w91O>FbTNQhwYRrt`d(gu zNhk$bZZo7Ls-|`=raR6cLyYSGor4I{3*fhf5X>!S2s%lW800IoV5ha!LklS7K1CPj8Wdgk#>HC00E`=TEv%1t*mSYVVXhQfjgQKFv>;ADYt748GIX#S+@A)j)^hv-?9-U$-X; z(Y4!nGUQLXdm?Y$eOW{ld{@k83etlxf+DKg_t&`It96x`JPd+Wk(4Lfu>3ZKw4PhL zb>fzY_4qs{{v9yK4)uHSN0AQBN)w}yiO|UP^)x_kOL@jvlMa?UzM%&FIeac3JdSndXf)nH(f9_N<5A-%^;uKm7|5Wi(|fN(4BtCshYAQ z;6qCorP8q+EQT~#n$t?642r+c)-QdUA(-FRKOi}~e>C&sixGq)$#o`)I;m~&r|>OM z?pk=ZK zKC6D7MvW|^C4XMPoq-zzhQPLld^cGO-f8&ElH*CSz5N^M!(;+U)6Y0oWsW4ac&!2T zY?`tr(3-EG-)nT(vAleH#sUAq!;fS zd3YR3%^LN08S~nQ1x9Ef`pkcui)$M@TZBw?UPIDS7t(^(rP+vYGD+*^af(B9gR4>f zuUg^-YpSWFc;;7js|&Z0WGs-m!xwg|K#f{xPeIIss3SqvimcxdyL)H~1Zz$kO^8bX z$Zi@FSNokH<=LJ3hIfP0)!1YGdR|FMI&c+ZkmiJ%6VghB968uwJpNBD&9V+h-B&wd z)7~U*FuD!6w;(3Zv^bwz2#YM7#0Jx&0=8SQEoN9}JYvwwdI1xBhsdnf0M(?&p}0<@@#vD4DWMs z#&C27?bY$ZUqMZa{TJT5>xZyxcP`)Hd?Vbe?R@fVI7MwZw`@ILkACg6Go~K~C!X5N zs4w0mrptL?RSIKEY40xcZ-*yO&kwfcxG`re3SVtR@HQR+RE6LD)!AY3rxsYmg0U_; z7gu|Ny420|I{{Zb+0+XtFF-4YY;GV+r)pn@>AMuD|AS;_j1uF!Bt*wokp+DZp>&uI zxr)w8!nfl;Ik9nxi9tZ0ZolW*eVjvta-H7{3y9r4kLA!~mfJ;-ZBNnsKcga=Y9v|o zulZ>a6H@@Dfun8-e7gMMi_JeSwl5r<6zgX5hpYcKvU$2MH?#mjo(*XDaMiW+BSAzr z3lb9m`@`Ad8OrDPJNz0Viy--C8EkCDLAG^J3#OIgyyj@QmI914fVp^--?t@3b-+~{ z%!t(~TNzwn+u^K&-N}_^<=wx;K8RS4Z5qsV1yQa`xbp${KV{#4819)MAb@NMFv1EC zHVS5@>mi@_W+?bTfR6UI&zk8r(;cuB{?3~#FrKpUFof^uY z)j4OjRs;mc3(cw>XJf!`Ib$@Mc-9pE(GQLr^9xsN?JH&NMp!@))s-sh;&rkSMdV2! z>3Lw6QI*NU@&^2{8Kk9Wc~`oZZwUU&&pYe=`#TchS13m{AN-7nQyd0QY%4)2^&pT9 zRVSsuRS~b@AQ;jC);YOB3vR`zGN3e2IN;X&XIJ~NCfIs|RW){+THWSdIS-CBwdI=clxJjvM!dNX zvRSe+|5GQVtn@ES6(KI>Ae%uf z%)`UK(MulOXo9-?47xlbu+{$gQ~#^=E4sS?qg7RngNU|0)-{`7u7TE8ww*N8P}erIiS1{_j70nBSUf`&e4zT>SW6qQ% z`T?HsGLbn!inpku5gZ;o`|lhKYsL6 z%UhV;#~v-9Bi4f=gMy=?qB?q|rq0|)ibyKX79HgvorsVS8K}XC2Z%MMLBZr6S^w$N ztII2ri?_q2fi?pV?rdPrsiHq9y#A_>I9P*^x+*IPhA=S^R~!h_kg5kleOjA?1Si6; z6AL}%AM^Z(S?MuZxeU++fq(~^I@nYpq7B0*SwSN&%9_bPeoO4>ZvjppP7eAV*_0UI zN^WtLt^5PHAvzzVS=!mzY0yd#*TV%7p$7;hU`c=|I?w=c2X#Rvj}2d#cW)&>mxlHWAT^NR zVA=||BM*mihCoDe4RlE&(^cU04yW2aKb!^4N*f%{(#TZLkb*^hqE8r-`XHgFosf$b zpHAYlf*EF@R3`S@ehWBT4k(i#kOFz!4`~+EwR5_A_wMbyO#@8@ra8eU@$%#X&DIPa&k77WZi_r3SNu6@=1UB8KWsjh;LLyZH0K=7ZcDr!L>C_Lb|6AJ@e z883`{2>zhBYpKXX%0_7af;Z?kaxdf{kjf<78}kR?J+`Z=zB>d$(2e{>>38{N1%bHK zK2?;{_A%LO4K^axZM(mJhKh~;RQuy=Vnt`ePj?|x@-D=>MYhGxrcU=_c z+mi+dT=TczCMJ!YzUw$mo0d-P*M9U?G7Jt@YI#t~tS9fSD@?R#yq3gDf|WdUo@CXR z`Gc^FpY6|WfaC^>*yd2Ckj+TTM&Q!s5EXW}03H^cF#z&iG=vc=zgQlwL=-+M`~Ugt zdVx_}0F`0AbMN|Kdaowxj7Po8GKESbn~)GG6%`dEWWL^og_jp!OiT=6g$^5K>O9uu zGi{5Xt+rX4ZojJ)eI~1{jA1>RyU5ik9&{u6^XE@Ulv$1_3{|(xh?s*V+MfVBE$P+E zmmzEYNpWE)5HQtx_@>EAaHZ6+J~j+Hznigh8>6A>BXZc~yR&+D#R%f&^5o*QJUF4J zN3o3iDNzmz7-YQKMgzH6hv_o%@XbGe8ctp4WP)hz?CiECiz)q1wq&Ws26!{kG*y8-@^XFC;78coOV&40-NLeu;?=mt5SlQX#uCpb)6V0KKzU!&F z=xEp> zJ!u@%ikbWI-@n1M4Ow+fO><8xkdJ0$KtpYZvP6hDeHUfd!#of;HnoD!dO&7TN-7 zz^xli?mQxh`oR=wGpt>&n6UW^42s=r)-t^Xu<7J}j-cU@i{E=tu8Mn`YI zl<$g7;npOHv$nAifI`L^jT_w_#Kgp8HxU14piefVxq5YunJSgBF)^#*NG*$ky-%c* zhy+Uiv$=`14}`I3ozpx!5$n`!4%oBxK?7GFq{K0#9LX6O(ZD?1`Zo+E9Q`WUCMken zJb(<0jBJb~1P3XK$S$a`2B5VO4w70hQ0#1ism;@P4g0KYY=i^_1)l@C)nRo*jvs!!<8W`+?`hZ91CI(>t`?S;m2D(uW@i52F|3QHdTjsx z-Du*Wv1&!Y`#Ky7V4dpf1e>f;-JjaL_6+!zQq3w^ylw(72)z233=qP=HBU2uiN1JQ zcZNl=#>p=eT$iXP$R0q0ZP~sR&fs=;;|p|L{W^%fP9hzcRwCk%eHrXEZuSlxzM*=M zNXB8HY6TYjkZRzs`hUXL`sObO?r?rN_x?(!@IaHq)|FAHuVCp zc(gf^V+ppQ57@3oi$mOhjMwjM_Xn^!*Wh_^%Gex(v8mgbeKdW&pr2EvhLz5X;=qvz zz;oS|mi?~#3u60$UGAGB$Sqz#4c+y+K6Bz2RCBxp(Zg)9$#Ya(`rXzi9AXKy#^3eioCCK$nc_^XGqbY>-xQE`#gfRH-)o`O6nU5NC$KMrP|s z6B){Yom|-Ul14fu5C0QWFD;v(AZf}G^*f+W4x5~qB)JO?EAz{To1=M@&+n{EX*b?w zX2yW+M!NsOdM*03^rzzV1efKu1k?MgX|S?Qp5~LyQOmu#TD@j3-bX@0Fr+*zP%uRo z2&}f`ui##Wx_hf`GQ#!^6&wQQmTl17fzB0JLF} zSv^}cRM*5eV!piKr}Bj~t6tDEYio9(x+o9_adixd_{H!j2m7LRtyYi$3P@=V)C6~Z zk~4$p1&jmfy+{$ez&1QoWs$~MZBI74e7LLiC`sxJ3SvbvaR0)*pgB9@b`TALMbLx1 zk|E+kZzDIHD@B8R^XN@1qZF;$G#MG0+1c(aCnsmeT&=^=zj2MVv%Pts>K@A^sXkAX z^ZiBcB|2aa-R~d1YA8bhMfN_$l8IPi`{#~y`d0t*e6X+3$M$4EIVcbfnOk8HiyKqA zz$b3T{m94;lqUei1FqNy#*EzFw(pD^N~bH%HEDE9o?HK6p^E?Gjxe zp1_`ffv==gkvWXugdbA-J?o-Q>>iD$K;9M&3--N z+nHqskd@^%lva_pNxJU2Q zZ-(nJ!i*qmHXg{8mjBLnYT?Cn$z;BM0qk!WqR^)IcTsz&bppn)K`Bcry4D*3N557x zQ__^Z+_3P^iq$*7$CXkP62C}I-D{Fof_>+trx;?Kc@?d|=2B4U)@_djgK z_0bK#U>tv^!t&zDwz)i_rEa^zX&52>6pb~Yk{GhrL_f?CM6ia;D2L|Z?$Ufyz|&< zWXE}sGw(y_#l`+;AFcNw7we_=(u;XvXuhKKM18wvoAq% zglthzI4+Bk0)-9-Gd4EL_V%x>E|E8r^Gb>&#GRMkdPBf60~$%c6^F61qNA{=$Ug}X zWi>OK{U_!)M=j?!n6&w;!i&z;c=QV)RE&f~!1ksNGAxrz`kB&la!0fN5oO&od{$y& zEFWuH)Lbger;4Jkx8mD68~OSk&vnt`X@BIzdB_Uu5=_}_#C|n+%z?yZc3X?+I- zFbg&s=>>W{-Tu@hjdyD(tZ{Lq;cA~lD?W^LcomY>UG2a{`;NT@hIyw!HkX|OrXYN zcClt8wxDkVVT_5E9XOEwGm;{~9uj#IaJ_ucULPlzb@qh{Yh*xn3vo^?I(auquXbl* zPFYe$094QXuln?*%Q8;L>h^1CPaJI;=~n+CnUXr(FIj$XMN1S<&q}vaZp(~0QG{b} zl5Y5devys69YeuE{}+fG@5p7lV>K5g|1SQl&G@`@DcpJ5S=Nr&B^T>mbt@f zu$_5PqQSIQ%F@>P{3DfdOj|qxCc|CA<3mfp%K^NkGFZF%(&nkBS{= zYoY8y&=Z-?j5~}S8EMQ{_iT=Ro)so{WOc!}SbZPSKG5_wlY#)26!5v5W4(f6<3ph!|k&QhmX9rB;=?`RlNkILQwGA5!3peZR03MqjJRY6 z&yvkNrDG?w8ClV%p5fcP(LdfZCe^?<>{_bfOAfDh=6m;kdY!C0;~+Y$i3~p0%59*> z{aBrb!;yYuoaVy#Bn``|RJI>2vettQxR(b@EbVZDtO6Y>voiC?dxlQoQxxiarlh3@ zy$UX})N_Q%9z8sb`J=x-t-0j9H2<(gFnEWZ)#*Mctn4#6PzR*P! z2jd2L3aOCm<;A;m(uXd;zq^?{nV7F{T9h3Am@clE3wuQgk``X@=c)%YnorN z^K2g)VNqtPqA>OlCJZ7C>Za?;nzu?R^>L2O_0mgit6=5DWJ?s6#mB|}P! z8~i<*^p%sI*%y_G0lM!TOZ}v_p9F_C4VyM(r}vR;eba6GGFVvaLZzDeY~<2e%=c|p zE(sAO|FehTjRj$+Q%`1`okI4~FwCH;s0?sc0iEpkt|&k)vPIf%I%#{c6mO%koZC_} zIvV7>UBX{vX_~$au`ZnovJ9$yNAuSrg)0@yXM?IkQ0b%d38j%ASQd}z9?54)me*Wj z#UGF6QH2BUTg~pjy5O3XPKaK@7CH?cJ?a1RG@X>w@adr%KMFzRYM$vkj5R9s zwJc?06vv4bF~L;av@uEX_ipM&ocA`1eHsc%qS35zyrT8IZzbCxZ?wJJ_rGqb)oI)0 z^qSzN9oI7m|BE~Dt|9OD3Q96MJ{c>M5zF9@A3umON%p#n+EM<7pkPHOg=v>!(5B(B zq{x!cqg)Q8!2hBFv-%x$O9W*gwDW0L+=e}0sL32o4(DVF++yO)&B9t&6Y3Bak;~tY z3AykYxH^kq6(Bke4kmdU?JAHg%S;&l?^6`f#YDS;*ydxs`#bNM8Us~KypVv4HM8yE zkVoh!M`1)nPLwj26`zuO`@>K|h}c+}o()9eD;y5;%cY3Jxr?D^Mrcto7*EYU25Q5s zxEvv$Z?9md9m0>XM>GRQEF3rd%32^qM0CUJxV|fk;#4QXa3RysA&l7n-AW_3io_k#R~^PzQZD5&y&c!j`q=tA4T4Vle*$TJG01!s4nPc&vJh zSZbQY)EX3_V^bmDK`FpYTh-5?@=Iv+7ye`?FnFmCBX`kYM+&`3V@ATz;~25>LId>B zK(V4#vE4QoW8E+Bejc&Z zO8n?Rii8(_D8y?2_;credXd*GTa9?z9c;P5m-KmHnCN@P=zaBq&GHA0WIT=axGA0_ zRUEk?HM$xw0Xd>Ys+gX?LY@{zUf9@h#wKPyULH7ObQ#uv%lH51D=6scp1o5>>oX$M z_o$gJ&Ncz)2ZV@}6zy=SDp^@Yp-8*S`iZ-#!`C;tw=^U?GTl~>Rxgg$AR&Ey%JDQJ z1a6JA9O~H}4Y0keVBPacbpZq3k9eW4i zJKL)x71ckX3sDBEM1#m-YHMq;@bM$$KXv>aFC3eh!TO>VQz6i-#Ln=9ETKP<$@Rij z*ulZ<`g)nT>7U5U_~)LP{Hrp_goC5WgX;}`r(BSartLvc=>Sm<$-wKg2qV6JfS53* zsQ#*VF@2w&UQkqogIw6rT0d-W?(x69c}f5-b^^4oG2qKHHjrZ6+MWEQKL2bs6?&5S z{NnEVfS8&(wxU8H;Qsc!0k($WcfOC`XfzU&3N1dv`85<=cIKa-9CcSPW9PAu zmX?<5S|2_*Lt^$PF+}~aLX_kL-CnJNgB=zjArdGe0s}HBM6Q$v-*R`5Hh>S!7aCyS zii+U97Q_sw8*o%rMmfgOWskF6eaWL9QgFbQd;T0Rl8_GC?ZKY)UgmWG&Df}u3(^SDSrx?`Y5@9KfVM3PT0<5`LJ+drCW{X-H#c9fWu*0$Iv!wIaPc0<$NYHN&oG8OkQGO~@P82c?}0;m zgfjLm-W27Rmz*5}ctD>>aR4;528Kleq-%H}_XzpiUZNIyf=@fWIv0|deXtUcjG|I6pkE1P-2ec=9-v^4gaY0+Sm_wE~v zjLt+u5B$x6mf~meE`>%JZ5Q<943JyO+ybYgqLmJ45RGNrrcb2=`^Mf8w<~AKB+W6@qz(xPwg}0W9gWj zVF77BtcJ`*-~)KqX(r6%?Md%<9!MtPy&3mz(cNo*#HEr)sh2I|a@#*cn3oiz;3@4Q zlcb0z1-NU%lCCc87Bh)a@FAW1CU0loutd)o`WSBtYR7`FT5^Wu)E@q0I|Fu-cl}L) zZ`-po*J1aGk>nwXW?L(wiYiLXkJ+f~Uw;#A8mzLid&Jz#(a*HvEyB>ZMrG~g}|DytrT7VH?+UY8#I;#Ocn0Du@U(-&$5roG7n%YYK@HT$p zy%kJY&cpCCBw4&`X^WdrCw5KKqrJiVWpczBg5aof=25ki!ouCmvQpv`u8}zW(ThPzA+}?4?L|!RxyGz4u&M$p~oC$dWKdVj?6W`L88S@OGk^TsCLJ{zo5DFGUE@kJNpx>_5_p7H9@Lv9QD*DV zxE5CrR<4-*WHrWvo#|nYemksq{8Ux-na!QsN(H0T+NYto;A%Lx(3-7E>s60Xu$XJc z;C0UKIn~#QtLwqgZuphu`0bZpjXYq?i)o|y;**{AZ-hs8jx+}Cb~L();h+CeoLsHH z&vY(7-K zp+99KmO#Kv+;tg2)4*HacggQZ*6)#e2CLZkk8(u$7La3dXxw%fao)!aCMD@rTv((w zizlgZv~@UMTGBtYo^o0EnflP%Ggr!J;+M(KA;j@Yp39VfTxN!xhFibKbO@EnZS&6p z-8>)UK12Ip1i=p_c~rTBq7TiJZaaUIBe!+DR_}nwsgFrdFf7-jiDE~@X>BAcn4rWb zx?IR`BVDMvp=Q@J-j_Ag*Ljw>cGFGmyOv~WqFFJiDcbEr5_gg6v^&HV+a^#dagiTm+FgDW>)EY=;A8vNMG{He|~Ew zpm%dnwCn-*&F+iT!|+4v_3m7e>kg7-Z413hbETM8Ys5cC8h3B^=Aw3_opXxd8nRce z4|Gid8*UnO=-eMIN4q;+XE-=>LgPp*JGM|-GS=tQo?)0M3y&aoePVh>4?8v6=!rik z@=WI+kF6Vjy}DukBESm|@-btYpU>lhm_4z+|Amj2@K1gn*sXmX;ceH+yT(906CY^> zTJ&0j2<*|sjqJV>1)0ZenG(`@Ti;Y$#B9EbHoUNU!>{Zcfe}YxWj=Pp1FIpmul@NZ z)B1TH>fueGBi(wbF`sIGm1~erTtSi}Juc-Cxe7|6B;@18KPuRJ6)&*>UYFrawnVr= zDWWW8hNC-|C9j^&cS1Bk%rVp0*aqTb-Xs+;Ez;G}`}gv6vnbbSl0ibX282L4QUA8G zpM)vxkHxvPX!l@5YZ03qxIa6uYL~Kw#^0E@jAlNli#UFKw4?A6S7`go`$GujXEkoAW z&0(G=othXB0q6k)@{@ZPemlFdr+#VuhQH4yYxk9zy?xn{8*C)c)4I8dYE^VUxibvi zT>#Dnc@6`D2kS{~h6?XEV_7#9N}h%re~(iWeZw$X{YWovZNkp~ zK^_-h=daGNY`(Ac(JHb=olBg1pIW+>8njJfUpfdtcSR~VTEv`HvJ1I^7VYiJ8y8lH z=ITsjAOh3}qU(mQ{PC5?=|Cd0{HE&I1Eq87n8!q?_3YIrZ%Hw!VN~9&#EVRu&#AX{ z@KE0zaYpV6{e{I$V{pLgVyy(jm}W|L>ei&x@7SgjPjq;%0X9ff*}gyOY4x~E4p#(K z(#vA2o94QHF`aQJL_{&^XlQV{=-;hgM<>Siy#3NR^Kd)ACY?!PSLAb{xrGkx0x=yO zc39_D9gG@J+1A06cj?Arf{T2@o*ZQMZJ7IX#4$Rzo3BH<#Crd7TCi=s@B;DrK>xeb zt)e@2QTp8CsS-?x<3bDFSR!`Ee)P6Wy+>{B{ydq3U_HA3oy$n(UyqR+r~Wj_qcT)r zlkZ4PoDv8M)$@p-6I&#`0$IXwo<{tlEY)5B>ho~_H}U!SZO_w+iK3UZqCR91m`M#a zxq963r~VcAg}iulw1mK#!P79q6vr?}Li^X8$oc~~;?S@O;%LK`mnFAKgl{UC*?Mz7 zpnkKj%S)k0nu_8KAI*D_-Md8~u&M)x_@wi9s*m$FPm;wB!C6z>ttk(Ph=&Uk`p!wi zT^lTCo|O&7GE>VvS0TtiV9euP(bWPwAxJ00tTX(J@95IKXtfPWsFlX=)eCKOU0qig zx~2L_Njmer38(sSZ;dKtI22SJC+{jTWIgUxL(4M>cZB}E&Nd0ElbCue>UkCaQDUG= zy7NiU9h(iTHYx(Q3bY9Y?F_ztgr)0hBfz*uCaiVWHTNOssSI@FF@gSd@})SvL%Pcj z<1e;jsm2Q##kolGoR&ftCVk<@&NDUmYH1rdznc+zV%0?8f!7XGEYoAQt6Kyhn{^jG z-XW$Ve`q_f)UhFPGI@^PWg+n45Gdio@r2-?cJad1h@>DaKs=IwJ{&wLvG|_mi4*cE z%~$@Vy=R?M%VmrHhQ`4zZFi3#W*fx^DD*ecJodFXAi7|K-F)}8m046r6Nb(HV(?#+ zfA7X?P>&I&m3jPh`0?8)ig4zV9?^Z72;3;Iaz=G!nFX;n6mV(`3|y~d}K;;+|z z`UUMdgCu-3;I{SEQ3aDk{JfelM;xKVWXGgHiw`0PdX&uDEwDhFVUp-8-kl5W#%HTu zUnT6WQdr&HaK_S=EDc@7H}1#tdn+LWqu;GGUbWY|z;OxEEtftTs^I8z^?ctfK3W`8 zPnMba`@HvN$xywyh$w<7g-$XVpj85 z+NG}B4I5;?>_|1U#zU2G^O?ew`M@4#}NlPdrOoaS>CB!Z&g%4rmDq_%5 zk&MA)z@h{h;`SBzpD_Z}Rg%gyI~N5TqRI+=!b-p|DMJ;kml_7{ih4#KJMo_5Xh5M7 z5~4z%*c&%4^ieCqLh%`i@@Lk@JwB;J*@lliU|Q%SAENyHt4@nbv#n$w0W);pnP3hU zJ0Ccwhy+fA(Mx)e-|9Dpn>m>%}!(XrHVm~P$DsQ^aD{bY{7)>$oa-q2^XDz*_ zJ^b!@m|f;}j`F_`(K~C`*2)MBirS5vPk@b)Ba|}yPSh@Ffvlt7>Y`WPE3|$VM!FV z^cxP70O{_Xx^eOp!1IYl!_MbE0zm=zD_&7?5Ru1h&0}#^_9QU;XN___aCng37%_ym z)DF%ILl7FGmlaqD6L5@RVtPo&Kk6lAr?UeUi%X34IOeaE9!<;MGp6(E_{zpWD+gCv zu*olA7G!La0Xdi)Pqaf&RN!RN8$~3)#(voE+a%X>+C09*V=54S5EFle=s8+QyqP+g z_a#6Wb}#shhA9=Z`E{g=|92rc#^w0uJX?5evB?WcnVNU&>uMD)=sq6~pDjcL=qaX~ zgE&aLQu^YthpHr~W4hny+TC}uh`JtPQH-=pWFN%w=r@sI6kz*0=tdV{QU14I{xUro zi5UJDH~i1*r*8DYNr_-|IU>5J&FF(>!mI1E?t-qr-hl(=E80EpT^S#AP&Bqu93U6g z(GYx4L0M_2U~#MmH0F7!EFOZOR0OUK`-6> zBrS&vIC%C!& zQd^-wT^t0#aV@pnhj;MCnR*-UdSz{gDJ~W)7h-*4d za4zbcwm-k}G{gsV*fhBPbo0@y0J6U>g_g5!) zRf9p`3D}>UGxCGYZQ6?#Nq@fjft-es*`1!C+ADC}0O$O)`J~oJ#PY6vX6{cj)1TA6 zQWqk0+_qIacch9cUDy;3h~PS3%t(Tm{&{z6i@tw&*<8|LnwEv1E<7HBqNdACSiV%p z{PWt$88WztF;lUquv!izi{eG^yAUR|(TuzW$Dti%P=kd=oGi=PKO^zlTZ#h%V277} z?Q2Vx$&wZ?${Qc<1TJH)eWhJuP)(1Pf4#ORCUkU`oe63sv;7t}=wq*ofbdssbP9;soiwbaH)bzB*DBz}yFM@=g&sFmC|2TTj?CO@3&flq_}ZgByx z5C+BTT1`>WEgG?I<1)zg6;`t$?eA${FKFkP1hN0G|2OqIzvYbIJJ_Vs8*TPs+|?&j=l)&eb@@E+ubeP zysY5nkCl<%-Zr}AHmzcSct-fVeg!DM=NtZ@wjVq=<0O?sZIs^xzBW^M`D0spNFze?7{;rY?xD?q%8^ zf-_LgwnN{)hYNFyxnD`5*Ffk>srPCeTz}p222ovbl%HOV!efxU{wKPgu*A{*ij|yp zir0Tp4_B}$qI{Z2(Qp+V7t-f{5jlrW2wQS3Y9O<(jdfT+B-~olnpRBMr;aD^M{-{a zmC+5@FNy44v@v^MRxNU)9jxV-M%*{DNo(F-qtYMeu5#Ldc+xp-!Jeq$ZD8`{vCkD& zA=KMcPOJDeRGf9`JH5?FZd}iwN~E38h#Yjp|D{@>jK#_?AQoMe3Y3btZE`deguYlv zmoaiGYui};QDw0z-SgcmFYPw@VepI$*H1qBoY2B5AB)SVxXLcUJSSj*s?X_ney=WO z`jAkoyZY*U1PRx+pQLy4wG5-n9!`=kk)nSxoC6P$!Y7@JXkls!W}V16)YQ<4mrPB% z75&P;pbD~E1VG4K5x?kp?)R8SR>A2$74bO-F0n({BJOp{cofmZ7Qpb(XOZzNEWYfJ zY!hE05)a;K_UDEMk+5eU-A*u0Qc~VCE^zgI+y=7b>!k#6H-Lfd2laZZN-hPhk!SOZ zg#-L7U}Iw~k1j#NL4DBB5ELZ$*Lz-hcM$YdLsh1$*s@|@RRp1tAKLtDOLIB|K>uJ( zM3`bOJ5s9gm_rCV?y{OXkA2XV1#EkSJ2jB~h~-H7tyTaZ5ojC1+}e+H~= z&@G6}8z4czZ?8WgD^Fxt;(&tlD5wH)0bU7Bl_p0zCrGT)dQBt+zY9?liCgPB?(uF1 zt2f==FoMw;wNz7D$ROaIXpv&aYu}$9KFBR>bPHg?gzKJEj?NdJ z0V766n@+2xVnTvkfkhwbN#Fg}^f~-?OMR@Yqo4O@X!fj}kW|s88#^s<%a7YyGB5O1 z;iwsi9?12nvT6a4l3anFE*u;%zPcqkn?o4yRzw_k4@T6+v9`WeojIHdT;?4|9w6FFN7cQe}XUX zI;ulktH)#O=tzc1dLHuY*Zy@T-@EUD3>9p1{jJW1IqZ7kIRxo^#&DDJ{sbBk#`M8Y zZYM`t`R;<$3E(M3Jv}Hh3rpkh^sm1j$e*24@Pll-phU)f=8pKW?vsJXSdst@D8r#qyibwM#e(rrzhl#|ULS=z% zx>==0dr=WrJX8?1va%Av8cz69Uq9yeZ!IvGr|p_O_nS9wIJvnMEG(EK@oCr-*#poE z#-hO!w!+k`Y-~(?eCpYsCu{U8;+0tlXhlPS%;56a_-Ma*UaVg$Jt_P12L34uhwmzi ziZ8RamBHcwFVtfIt?~u@%k++>o?f(|W#7f;lQdVt9sZ{2d~gx=XMmWMmDOY5UB;Fl zkOT4ii`t&OVJQVqf^t|@Rh1Xr`>nYOgrN0MhW{foxAG*F1(|1RYM;hzlT%X0*l%qo zdo){3G%VIJ!=s`sZ!V5RfpQ8*-7T6!!EzWYkI~+~eJkKNBS1z$(PdE?U0~Sb(1{S? zAt~NZdiJFYv~uScDq2EMo#Ls4BIn*Sq$DSY%*^P~O8IHiPBNR|>d48VkdTmkGruHW zU0scii|Y;aLb<>$b^eo5r^Tig5FJ#=GUh$e#0{>i@=>1n3Cb*dMh(CA znVh@oH95&tU%coAyWXSeY^PZP1W$SYUeQ=iM)`}D`LB<1bk=X|gg>YUZ^j?u&)8{- z=cv=JlO)042vaxevS8h_GclpOe*Jo{u8M~OxAvjDtd^1jneUH+Ku0K+rUv2s%xXU0BK z=Lc%#(+Xd-#@;2bM90U6kJ&o9*Z;B=MvUZ02q%QPGV}2f=$4z1V@j;*RCtKf0bA!F zV86)*+N+!W`FrPd;wx4#y)HdcjX z=xkiI_D<$T=~-G@HlLk8b$l{$z#o3pPSN#mj4Q)UM!tKjV1)S(5%)=*)62FyYO?m5 zFSq8G{hk6Y^X8Og&WX>y*dGlVI6oL<_;zj2@dtK<<@;9&u%U$Qgs}nwL@D{*Jz|`! zg~+~tN3sp@FCW-WO&z)&$rwDEUj#h+0E#U9jr&UqfvitgoRps!c$ByDBPxvBL$A8z zLv0`5-;xZ?*D?KBY=ofc-5pa3-=CHz7bc;|zyEfh=aQo|LU?4@`G}HCR?v+VN$4{l zwi#t&6n~bi4rl??bc=G|wPKRR$~%u2y@Oorh)v9DyRO{H;f3lbsAwqP$*}Okk7d5* zA02A?ixA76EZ-5Fr14_;dh-D~qCoJ`gZI@o3c1qM!Eoc?JFW>B8!qMn&dMAG*r}ZViN4nx7Xc% z#)LbQ4&Uyt9Gdl{4k1I!6pSmCiUU`tN{7{>T?U3>8{30enU^FVMsrkN`8JxyrJ3TS ztv4SKXA9~RSx?$CB_&aYR|+sYJfol|_#470>`;Whir%S`uMPiRzRB~DAQHuW4a16f zwZgt!_VUUh`SfoX=%#mO3}fXApd_n8GVy*+n<(8*o1)=`C3`O`b+_FsoqVYq4%;EP z$T8DD^@EVW1WJH#&R<~-RW0zogs}BpeZXgNRek*_IXvRi-AZS(x_dGChSVii01t8U zGvbSjH82etkjqxmjjZ#P(5}V0>{KBkD!rQGZT)3(k^HBC+s6|Ja}TmQPizgmd+*WJ z4AFWAv|$3!YAP+tt{w}atOxCYkYQFv8BQDyi9u)LZ^fEFrD>?PVB4Mwj+Aha!Fc7O zd|2~6L>ni@h#;#ox=BMuX<&gzwfAI#l>}Yp1n&djlRPOPu96P?m?4afPT+_Om!iOR{Kt~prjHOjslhL`&i_5*ezRo*-- zUqB$myu{zQ35Ya@Zj5{#?bSr@7V!1;MKG4z?gSZs*s$*V*L>eULro3++L&oxq7zv; zyPH)n{8-R?%EfFb_!75U`0;FaiOyH&^Sn$6!}{5i^@z;&OZT1Qb7Ff3hs^FM!nm*p z7dfD)qKj2TMd#K$zn=Uy-$3P==OlldcaM1*e8-@dNEfkwAt-Fz5b`w^N7%IKkE0Tb ztSki3o(TZ^sXLe#8FRkP-?6chFj{R4hCIg*z~f>2QZYF-b88yFJ)8s>8PR8qsrmi> z?!-594p<)^QH8R+Vv36kbL@b~GCzQR)PEJRk;i3zhtRO)Dks`B<6wmRw0kwyEl5g_ ze~NXNWS3n&=yyuZbAR0qg4&$%eL4f8-DZgZNl|-a*S}Ft@UlzJjL|CaT6U_Q|BphH zth6KN9}RYelr)UqaSfJ>OH(HB`>DU{UcS36u!0H?LA$H^CHd5s=y$Zh0E60}63(64 zU{|5l9A)BLJd%x z6dcAJh_@f`&;R;ZkomKeALE}^Z>F7-kGJc8N84q8xwo@cx~=HKCtqr#+xegaJtqQs zc^3$YPTM0ty1K`Fss^NWcm6!=#GOE2C5}Nq=EzeVSnxKxL*QO(3Ee!d`mE(&KU(=a zj7J;?eD=?fqZ!&x!s7tGo6yg&7Br}m7`}de@W8Hx&Ex3WR@{F{S|*awAWRWezdh*e zi?#DYOS3Y?eU3sg`4g`%m?Yc;;9(>IGgSd?4Wm=X=FI+k277|?ifuVRXUL0Sy0n9K zZycNY$o%{#`mW)5L{O~tn(u&aN;g%MH>T}-o|U9?i_fU{cbWxWc33=z6;BhsQN4-I zOd`pK2Am1*VF8$m)Ec>PNzcz_xIad`aMoO^4zZkhdEu@x+Bmaegz|IE^^7xqw@tTS z{Hw~)FH+4=LJ*lSxbsKt@8PV>Lu*=sfUx}%qo8u@^I+*}^FekOb)0(s(VwTCIA76M zAD?s-(_2eB%bmGL*pvy9EVPGWCU=BVVO?x?@CPb8-vRd=w)hi}^P4Ng!8!JZe zb%|tOJrp?Of_bY}Sjb)1qzkqT84u)TJPo&=pf;ekOFtsVck<`}@Ra5Fa>(bXKu-(= zA4oM?Uw+&5{sR19+p-dQz(@Y&ai%iibcZ@jjSrZ}tFYpGd&>0O_A#5z=qHxdon9vx zpPeb*|8wYZQK-J?w#WZk%MceP9^Z6>`t`dO3&B1`jpt-U-To$FM*GsRaGLH+u&{_w z-|}sHGq=bEc8!4oE@v*)wB4fYo4!93w-)HDBw534(IN>%;;Yl}UN5xP%&18N@TDMB zgdK+Dm>Ml32?`D``m-4KG4rh&tM)|6_c5rTQ0JI zD0}@r+PM#Wn=7`Yga_stSK}!Y{4wZU1Pdw&4OPG>IFc7Dp~i>j-KUD`*DDu}%N2~7 z4P^)-I0@R*T>*jL&#E0aW2f;i79{&Cr_UTJ0>Ow+*xuaUNH0~jyq9L7w1Bp~1EFT} zh*`#^kn?zKOOWP&)223{Re$Nee`1QiOjl)SZ1THga?W&->JADBw!*JvCr<(uFqNoW60pYoHgmb_XklJRd8O!|f>!cV?LRjz3;bemNezR2|v6T(GedxkDU zi0wB36hY#~3_QjU)d`#u)Lq+nNb~5zL^gfu?rsu5+q7caD(GlNCXUZ|60iBi`- z|A=mU!*HzK!?te?=zuckKgqtTdcai<8lSj9C-W}>3_sr5B{O}Evli(zUl$WL_h0@H zpfDl%J`sVZr}fW~O+|7i(2&GCNk@yy%uspTSPGat*6Rl{tG_uUQ$||e-AbQd{|_B$ zv#z&YzjMzWbP%5cepGJO6%KgPUCD6pfANi={gqO5JMxzrMm}I@BNITFa<}W@xf{k| zxBm5R;j#v_(g7E#R5TXJ?AqHj7kC8dOaEC0XoFyloUhO78(krpWXK7i{f);bft#)8 zjSY#+{G%pGrC&;~YcXKW7PP0`?Or<~&g2ts0PzcOs4%8YdiG9Z>(an;l)K$^m}jEc z8lQ!*pZ-e9plE-FOzI;3hVF0$RewHcJcL1P4TDN;VX4F@}_X?%*71|Vmh zQvHMDzZHPth=leicn7+M9b}OFK)HHA6l8MQb0Z^9H|yTmyRh}72c!gw;ZZkVo~a`9 zq{pC>4ag&|ZGVWIO|G$#U4i4+XC~O$R7ct*fO&yzMsNSsg=wOJ&L(J?M;8cKUXiu5 zo0WA)ia?(m`64F+JsGL1+8eqljs^fbw%u9t1Jv`Y6!0#!w7_txaiN!Boyg(&)khC! zoUBW$fl(ngYV#_9MK(JTBKtr9RFhwtTL;dDBqfGSTk8)V00AIKLM0?B!sM0zu;mRv zZYvPo=Z#NBmlSd{1f|dbwE?@N05m`aE&U=H>GJ9~hvY%yGL2`r7r28_V>9Zxc7^pw z5G7DP6d<2u^pdgU3~fmM189XHJ6CtJf}G{w6hYrTk{~e*a9@maM$K4jTQigb;FGfG6%lWVU#C=BSN}Zyo?j$B)z~se|LVGM5h{%Aa0FhqW;O zqYru(2%7yvIrZp(ihv4P3RqlPoIQPk0x?^?;VHYL93GYT2=-r$HJ|V9x;$V6=qW@1 za1NHTEh%NC6)*`&YBE2CVXo#EIP})(KS=_JD*&~7Y6rW*R2l9T!uj@$qhyb zB`s=~i>l+YQ9#LmFkmkS!bFTtm328Iq^(##AC+C2BR4|J24NHgp_mVI4uE5&-hvBy zB!=sxwh0ZMPuv=fXeZXqcvH8F7zB=H$3RPq8ZS|E0*qI8bxS~MHPL)%`>rr{)U|(X%EL~MY7YfBwcARN3ri}nBQzq{D%a&$TfHiWZo^*H8 z{BaX|&VHcOQ~*8rwgVg$kBYY6Scn3o9iTLLpx%rFht~_Aak@29I=Yxx9CI3r=2BP5 zWWZt&tG)jp0t|rFzkMf8(=-B99w{4&4gq9PKsJqwQ9b}ZucnD6b}iTYoiwi}eywdv z+zX{<5m8az&(=VLNbhc5DLWXOfEY;<0FEi@o{?qv$HLZk^~M`XzHvV@LIxVp8_y8C zmXf2cJ7~33qX(@9LGL9Jpld)q;tIw~q zDa@~)@qa*-06H8q4Zcxoc{=vb9wFllAYKi8sLzl{0zGfNs$CXEm2=92-)t3nJWl&0 z%8H6B0CYpFsE3k=0b-Hak18WD0+O&5|MwLzZ3~dS`R>-AH@l3J10Pj=@w5-HbC9&~ zGAR%?%SFGdnD_)e0(1c+7yKu`eFb1bKmTxr(`McL4Y%s0&mrd%$EC#MIBL)v!3T9i z<&pcf)G_GnX#$S4E%y>mj6rEvmb*2gdRU_2FA~LV*dP-FvLXF+{1Mo?=5H6@agf}IprW!!fZ4YP0k)yZm_DJL?tl8W zh4zz+4kISPqGf|avj-M4zkK3-wy|Lpw4f&{i0t|xyXR*WwsJdVqd?=}9}1*d=hkL#XX}`qPk4{&x{C||g#h-RltF9* zh3`WiGV5T`U*yDyOf`p_LzQWtc z=m886BqXJ~%Z-GfASoy@G>9|^1_FxGUD738=YID-=Y08pI%mmpv6y+|>35#rbzSo? zM*N-r)X{~Hpyl6|EKW_1>oDhVJW;zcH^2%B6rEkqxlMd%J}8zBwoFU(8VohEEdY`^Y2(emaBEW%t^GjE*&=Jx4 zX&4z@_$N_D%HD)aRFodxHH~SF2ReiJkgTk&JM^?Y&lh#6*Du~OpwIfbNPYf%|1{R+ zwr)CCI|4;6f0n&ca8a6+9tS|h^CXo?s07$irz5H%d905jvoq`HkkBb{SAnf=9p&uu zavDe;dg5Lk9SJ+yaJNQAFU6xaZWvpewJ^8f1@z^pLDl`q=+5H&K&hH@jzP%OreH1=c!hL$NGMn4<209uGXy zF9}<<69bfRe`!nE-Vp3dUG1Ln)-Z^mGr|(EQ&dz`yPmRG9<Nbvf;fy4PkCU6Uqj=g_u@YrW^pVMcu5++_|Ftg)HO7MH1fEX z$8<0q{1Os%TC#dIrSqQCv!4?a)Oq05$J^0Z<$-p5ne zax2>kOv~mwRXx3P)6>(EKIbEAJb!*bN(=kv=)sRrLVnVPZyU+Eg&a)x3d zcOI$ygEuoN)t!W%g@9i`pbe6)0DAO4)Q_*-!z$+W*-*2y$6L0Axm^gv6c^{_@{qHL zW52$L-k_|0a?j9^o0BuE%{6NboL(YK5^~C(p5kx=Ys-mgPO%+Ufk678KkAy9jm?Eb zQB_@@04OvG%n8s17_%smd;R#tEfrIS4Q=!}xL#t>6xZ9U3v3Bkhk{T_O|3jbpEDE$ zendn?TWv&OJR!!r>(^;c4tJF7?d`)w^S|dpSAs+#WZHnntSUT;>D$a22RqfD9WRHW zHvmDPJ6Hc?6J!-aTLDD$sKAO*Ij>_JZR$+pPEU?%M#6jPCTlL^h?tzp0$wByRSbmN zSaW;-J^v>GI4`qv5by=o#v_vdX=?l*e`%9>8UEn@$>CoOsUlI|X#`(ucRt}wjFh@uXX@9Z9fNK2D;}~cYqk;L5)pY}viLLQVMDqm zFM^7In`VptQo)P>m{hj5=5B3mtsQtO`ThwI(0c|3iaCAqT+cBO)5Ut2N0)7lz*9h| zHX`66jEIk4$BHdV1>a5)$^z_36B*)7R9-Qz&pk|ebf-ZzClD&`{{8!JKNgL12HpD? zQvT2u;OUcq`hzYswe;(~nS(9IYwd7uwK(1MEj{Qc$Pk2f;)Y({CRpN5VxV^QyUHj# z^ePxkZ*(t7RytP^_@!%TX$Hr08D~6O(H+!LBAS+#Hf(Egk8|zHij`ksVc}j! zcHg4wXo}ZbCr!8Vg7enwEl4t}8~bWea|^4Xp#i-omV}nKa(PmDpzRMjTO2SOOj*-^ zv~!>^$gJQI%nKF={4$vjeUDqLI{3M{gH<1WxLjo8_Ts_>xr>vpIr+8G}AV&vZYh- z=RrjQJB~3Ks>rz}DT`4YlRx8CbV%Nip?L;U}F^@==J^(Sv;umDu~yLayjw9di1T45IHXhGm5jBQ1V zuRRFU)X-48bt_W*ofgc|chb3V!U-k-E0z*@NRvWmnw5=E-xq^BC@3j$sJR+lHCU*1 zP7o@Xl^gw+hi4zAo1(Es!QJg`R7>mOwT8_H&(1@?4Tn($0d;bDH+2*}Y(&zIwuY(t zsxAQD6f*n3L+RdHj9GM*R905*eI*d2l%*@5cc*ITz(Is5>rSCf+l8@oSn5B?)B3%vyorTJhoy{!)gy$dXUB2{Bb67l9`)eGp#H%UtG9AB z_lv#Rynk*<^oc5L{EwBGxuU?{dZn>u=|7Yi;iS|SNh|Lw<0W{26ICg4>BkT1t>5Xy zUQ-19j^m@ng2lVC?Zfr{DeaF{PEHm3*T={JFI}>DO<}7^UNmqLpb~WTu@19gLI1Y!6>|m=MC*q7M9!3V&%ZMhDBxiHI`7RjuG*XbCG+8N} z`tX#CgF~M2vv9#kHU3ua6fui5nsK4c=Wy|D*OxCeL^bLrd&^%2V|XEahi;ZzRi2(T zG;E!!#lR%GxszR~`Hh0jZyS!)U(DS%jYZbva8N|tlT+ciINc0F^1B;t2`HlIiXBZS z;rrM6h&66Q-hy*cPpcoxga7tDYv_~ZemG5|mVWz^+rpcI37=Knd@V&pg41<>dIfkH zE`Cm*&s>yv*dIy}v9^x~E~p2ZVIqR$^H-}mgk{-e<{u#3!f2vVH-?E|nL?%)qwwdQ zX@TLK;=!=JdYhM0)h<=SPJGDLj^VlM3pZ1kaV}Y;cb`x|ij1N;2(#PX_?`JRRrIQ3 zSwtY}>(e?FCxi<@GjOm=w!gnJTV>eNKM-9p1ADyZMpJr@+sPwbYO5OU;lfbpG9rm*TW&S|r3*=w3loH~# z!YkFN1~qvZQ|6i<3Xf{pm#puXq$}e=wJ|n|AL9C5MgR6c{b^K$VD5?dL&wvVr*@6) z>CXk8BfPZWXjUIxdeY{QeS_RSU#eha^CBKCEvGlfw1ZdcUfEEuE|y9mkuM8+Yf%1u zgb8sZDh%fk@wBuQ9P#vwvqeyLtP{Mi+u}pTsh^9uH}GY%4eoN9rayMzy_vK?j~ zs<*XKU*CSvMI`s-$&X2l2wkRXSL<0&kq*1FD2_FI1Bu`2y-O7n!AoruT%N6-H18eM z^^*v<`p=7;?sK2F{`tD3%xYF0xx!YJq2+iv!4K?s!9-&G{OuG>gS(b6(btD1;X9dU z<>B>%_R?ns@at@A_gMwej|iuMV3{$-CI-QSoXv!g@Rt4bJmJ#;MRg)&2_u#6ly|`8 z$U;6!4dkJXN>A|TuQmpV6p3*p4He&%vr|6}*@>dZrIJCVSJRghu~VxlK?N7xtiot| zaOm;(nY!bahqDJAM9XFQ4LFF<(*g0wmvQ!$VTz9G_588(Y4l^u+=%BpMhb!>U7(M| zG0`rM-<}2l49LB6$$y7k*LUBfz^{q41=h`5MK4O52yGpiC{}g{?cMo4+3rcav(wgP4s-b~(md z*wM*Y^qA3(H>znr`>SVmdYf>-e;UQ=ohx+g6)jppo zJjHPze1)c05eZ@w0kN;qD;qhjj|mtFzjZScAI>SGPM&gk9ec4cnq8SKo?9y*{l!5)sYUI|B@NXEl(c&;iEK4D-rG zYsOT_fBwhmNlX7r&S>xUZL3&vYky{|;q&TTMi4V|#{z@h-1_i)5kVpPiM+{2Pxf>#Y^#HDkueQ`9+_8G{dBTW||Y zkkEwUl}9)Y78&&WZe3YgT~urGV3 zigc@N5vGOk$rN*x%M5SYRg1b2ccD|1dO$*og<@B_3-#7Ki^85ZsBZ4E&kc{T*j=t0 z%zdXDB4iSUGp;4L$okOYVOV#K{|n!9x8$1rQDpA^ie1d5_0+{gt2z?m$rJ~fj+_)! zO7Zbe`#krtW3wLA8@)}OPWRvWO59g7)ZLv7PLO*kxM6V_9=*ix3xmeM>4;{G>>!~< zUR_uakZL?}hE({6*mTPVFN&B`3*v}4ce@>tEh5R#JuW%^RU% zg%9f+``2P7io_q^c-btjx_qBXIsj6&kf}Auzr(wsh0}nBq;`M}9$A-UPa!0(F(Sa< zMS70$)2Wc5CnMBXn#cLGH^lU!lH#bTarUrHWC(#f5|y` zt06MGuA+2mjy`iUv$2)nU5V@<#mVKTg9U?fJM+}lLs^eYq4&m2@A1sDCKoRnE?8YM zyhs&hGGUA)+K9WN6cTwAPWzj0ZKfoP0U~OPB(A3^r1i>0d%p^sqC6}Qxvv`KjbI04H+!$HFqc(d; zhYjHF3MNjpqD_?iTE_4tj`Ne-)Wqf9jXhdo-;c%AwQo+lAaQ^n_I*>VI=H+iao=QR zz*D`l4b z;JX*5(IMSU8*(k>L%KBwWT~>ob5ARd{mQmyNKR(AgU{_s;rs<C_e_Wq-@?c)Et4@@Q-XKJTBJ^YIZX+Je<&K%+ z!?H4*ZYX;(hvxhN?@>IqSeJvc$b9{d+U-ua02J{GWvTSDzzI#3Cm-&{9)6U@39v`w zDPCV)`0bg+LIIiOccgxDKf1s~=|i-LKSc~#Hr>Bc`mlBk@Uf9&HU0lAHofjT@xtovhcD7sQA12MeKs-v(2*%YL#t`m_*gWotp!n3I45OPy)S(ENLd>>?z$-n;FZ z_}19uUll@=18zNwrW)sS*Y|YtlX)1o(i@Eo>O8vx7mx22MTl}GNj5$GnNge`nN+jC zU_^_WO8kG%p8fxiz;V6R!p|=hSgi`m-QimR_$PM8!4E7Lsa*l5q(K7%N0Y!kbrOSeE0Ak(x zac~{zzWWE!@#+>35&Rk3(_8acZ;a>is5+@nS_2%}4)F3y^@U{M9N?T0pj?A6g~z&n zdZ4Ru8uV@*@%p1Ksf>lo3IkU`oF~qAqkSqRsSpI`rv?lGkiOun35m?$VgC(cV7SVg zi#PTU(;EPrrA_A30~kY&6f{bU20~#CRt*HSh#RF?gUb#n7-8^pGH;jff{4{dLDFKr zqI-m3-~qhv(n@>yXK>G1fvIQTCKgsz3!ja2I&`^+A)p@rL&mL1{IxZwmB9iqX&ZCBw|RNOZO{!uVTQ3B(u^XV#E?Y(FAK~mIPYpC)V z01^a9u-TUejH!+O-eVV!0TO5G13a0WFh@TbNX7a6feV4WM6siTKRiz?<@Qxx;JQvP?7*WuTWl5x+}iniX|Lq>aH*zY zyHqJh#A81D1G~_)xqa1AB&~M)5wrYM3%4m-ri7pvc+n$oEh5f8aLhPw0;O4KPwMu7 z#@9Yzicu9h)9<)g`^N@b@4hgz?6`{;M<`)CEHHWs@fZxinZ}~hOIxZrWtqkNf$4=4 zSdO>O@60dXfUZz>79h-C%}Ngte){JlMC}3<`gHSVl_A0h1ABd;3nOO%Iu~T;Ad-fK z+XF*CFP|t3JyR*fZwtQH4uD&=4)#D1$q8r1ybD!{f^*Cw*t?EDSdL8O+P*|wM~vjV z)oqR@%yMTmIiIv$Xc~_c>Is%_sNrXd%d&zBp}E9ymsIEr07bxnt&wd9gJl=vE3{$Y zb^^K*o-X7=0ss(|!m610)Gj{Gf4L=}ggUhdJ7Y<4$QB+s2Z1}A9)c6TJb}^dX1mzT z>4^iQ>K_BM0DOps8kpLnnIOKA|7fy($_KGPA=--UX&NC4?^Eby&I^vhjCEeYIhx?B z4FdH89?rK{G7OLhfT$smD}(xhoRy|0kLc}LMQoC7^yN%|5NUcMF3HUW7hPK|$s-R(cOMJjo}G1zfhnua5Q9d0{=QUrm0 z5D|iip!OKPbwF~6Fc_ne3<-qQ?QVy(VA@T9gMz{Xsm3Dv`lK((bN`lyr87yTnAGj~ z9?4c60}KeHJ;7lJQ$=0$9oH{@70DKr@fxxIyK8UX=Hzf8R~vU9)xEMg{r7TE$$ZJ! z0W_E@fcU)^)>;+@nh2%aP z!Jt!wDRA^>bPrk2Bd4|c zuezLhrE{A}7E3?> zaD5Zw?`*`boh)^1$Vwq_oiNAOHKu{SNM&IyE%M5*&7Qax(CHwvy5|Nll$*yB1A4!p zWfHZcb$e5pH*0D}!0r(92s*%|#fmY%<5QKLN8?!9W!d0+ae7P}FT_9i=O$KJJBbf= z=uqlFIuI`+PjHYayq5~Y*Ga?x2YotaRnj*Pv>R!xyeVs8#;j?xS0CL3sK=VF!os*Q z|LSE>B`dD?DQyPpl|SW;AovKp_lZyPOJfi2^St&wit39N*TBZBWa6#mq`x})x<^K9 z4C4OYJhnFE0GbdR8w*kbgm5IF^T+-2PQ#-XonBe+h}9ZeZX+z0)4f3*ZPJ4|TA1ox$;!7ZG`x8>Mp z;~#hR!^u)V-w#sEq9!795Yo;`UQlSThWN$_xswbzrA^rN7#>UniUIYL*OqxkP~xD#xR8o&P!6ehkhjdQu?SAAP5jKPz)gW?sdtN>^@^q z_Dl|&m9%k=(+`@X{9o+D6!6`!5JKWsoj~Svzq=y-omSdzl)j-BsMO$=-y4jWQ5`e; zP5B(%d{p`fgr3O54c}fcA4q}p{Pfx`phh=gJzBDyUrBz;Rwr;fbmp{I()3cv@I7x~ zrdUYBWFR5~6ZPzD1pbt+RK-w?tnXn&4vvF{A{`W`HJEBtCc?N_QLC6zL4g$FgCM&D z4+1^1AVUh#hGjgyDLa8>ikD^~Lvo%d2hQ@;I&|)Na&VE~YNK^ta=i>v8fW^ux(Th% zA0_($4-`o*oNjLi741xNp;n4C@>OLX-uqJd#uV@v6K}S&v0+c?dz1VloS*c$O9*erua(t zu;K!UjqnM{snx1TP7fk3z@cDkd?jHL)^t+LRPjhlEkQAEDxQzS){_f)Oo{c_n0BpK z;dgKmgeP7FtYX}Q+w)|t?9VRIKl1+=P*9*Qy`@{!z=c47OQn}`*q6pOq^bckP7O%BdGja#tvS}{GYPKRAE`xckqe+=eW|u(mds$|AEBd3EQfE;a&J04&(bj zK0t)U;mSkcstD7bA8WRYr}uY3O`nG%Nc0Jk!qKdtqxk-pWoM==Jzv9HFu1mNNW?c* zhk={|=x-!IKDC@a&tKKjqz3l(g74nH?`Tox%Q1MLP~#BlTfUen`w4OsoE!gQ6aDAR zLCp{~IJkQt2r>gFV8rm{5S`G3qjfGs&!2zydvp!_huxFru`ASyNPY^)2gMjx{q6vC z?&|6i^&m1jPf9>Y$)cVt)uIQd%H>&~r}6?10YWkL^qz~SZg3;o3$SLs8ohQ}0fGd$ z$LCk01AyT|1Zu+)Wh-+_R7{LA0L8BL$xe8cQ&zTd>^EIB@Lr&>dd83a17B}gAes)p zV^3$Si7|3|ZS62HiaK*$?mGc+4%xL^!}s@+Lqbph-y=sU{4{UfB7yxclbdgQ1X}L= z=M)75YW#{s%k_U#?}X=5W6QF|0Q)((x$#w0RQmIe6A!mi)>&28M8`0Gcau3Z(-GtxgrTR7__Jp#kfYGv+qnUXTUAz2s;SUHl*f zCkzb@g@W#S&E|81G+jvRS*% zfR!ID2(1B{C*a^=0Hi@l0$mZ@;p=uDZS0n6IHfZ9`1wwDi~;^JO&`% z0kuepj9dTDbQ{){E&Y{{r@O_egM)+Gb|$a6&{kkRuc4&T3a{ORdCs+-IlV!zKx<46 zPJfsGm&{FNuqB*BDY&AF)5JBXQO Date: Wed, 22 Apr 2026 16:51:15 +0530 Subject: [PATCH 45/91] Implement stripe and add success and cancel page --- package-lock.json | 54 ++++- package.json | 3 + src/AppRouter.tsx | 28 +++ src/Redux/services/cards.service.ts | 29 ++- src/pages/PaymentCancelPage.tsx | 89 ++++++++ src/pages/PaymentDetailsPage.tsx | 338 +++++++++++++++------------- src/pages/PaymentSuccessPage.tsx | 153 +++++++++++++ src/vite-env.d.ts | 1 + 8 files changed, 523 insertions(+), 172 deletions(-) create mode 100644 src/pages/PaymentCancelPage.tsx create mode 100644 src/pages/PaymentSuccessPage.tsx diff --git a/package-lock.json b/package-lock.json index 071ee2a..abfa862 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,12 +35,15 @@ "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", "@reduxjs/toolkit": "^2.11.2", + "@stripe/react-stripe-js": "^6.2.0", + "@stripe/stripe-js": "^9.2.0", "@tailwindcss/postcss": "^4.1.13", "@tailwindcss/vite": "^4.1.14", "class-variance-authority": "^0.7.1", "clsx": "*", "cmdk": "^1.1.1", "embla-carousel-react": "^8.6.0", + "i18n-iso-countries": "^7.14.0", "input-otp": "^1.4.2", "lucide-react": "^0.487.0", "motion": "*", @@ -2237,6 +2240,27 @@ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, + "node_modules/@stripe/react-stripe-js": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-6.2.0.tgz", + "integrity": "sha512-GSCErjljZEQv9LaxP30xGOwstcMyyUzb5JyihXwvjOU95yrfhbiPG4K2KkwxYxn+WY0/AyHsRhPPoGRw7urBzg==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "@stripe/stripe-js": ">=9.2.0 <10.0.0", + "react": ">=16.8.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@stripe/stripe-js": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-9.2.0.tgz", + "integrity": "sha512-YSzLC0t6VS9MDdPTynSMqU8IxrItFUjkDORALFT6sSMR/XZ5Vgm3RDp/Gk7z727MC4A9s4MFVel0gF0c7+kdrg==", + "engines": { + "node": ">=12.16" + } + }, "node_modules/@swc/core": { "version": "1.13.5", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.5.tgz", @@ -3073,7 +3097,6 @@ "integrity": "sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -3084,7 +3107,6 @@ "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -3095,7 +3117,6 @@ "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.0.0" } @@ -3346,6 +3367,11 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, + "node_modules/diacritics": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz", + "integrity": "sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==" + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -3360,8 +3386,7 @@ "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/embla-carousel-react": { "version": "8.6.0", @@ -3527,6 +3552,17 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/i18n-iso-countries": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.14.0.tgz", + "integrity": "sha512-nXHJZYtNrfsi1UQbyRqm3Gou431elgLjKl//CYlnBGt5aTWdRPH1PiS2T/p/n8Q8LnqYqzQJik3Q7mkwvLokeg==", + "dependencies": { + "diacritics": "1.3.0" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/immer": { "version": "11.1.4", "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", @@ -3945,7 +3981,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -4003,7 +4038,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -4030,7 +4064,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -4066,7 +4099,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", - "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -4269,8 +4301,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -4533,7 +4564,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", diff --git a/package.json b/package.json index 078328a..544a147 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,15 @@ "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", "@reduxjs/toolkit": "^2.11.2", + "@stripe/react-stripe-js": "^6.2.0", + "@stripe/stripe-js": "^9.2.0", "@tailwindcss/postcss": "^4.1.13", "@tailwindcss/vite": "^4.1.14", "class-variance-authority": "^0.7.1", "clsx": "*", "cmdk": "^1.1.1", "embla-carousel-react": "^8.6.0", + "i18n-iso-countries": "^7.14.0", "input-otp": "^1.4.2", "lucide-react": "^0.487.0", "motion": "*", diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index 0b5fb55..eba004f 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -37,6 +37,8 @@ import { PaymentDetailsPage } from './pages/PaymentDetailsPage'; import { CartPageDesign } from './pages/CartPageDesign'; import { CheckoutPage2 } from './pages/CheckoutPage2'; import { SuperSavingsDetailsPage } from './pages/SuperSavingsDetailsPage'; +import { PaymentSuccessPage } from './pages/PaymentSuccessPage'; +import { PaymentCancelPage } from './pages/PaymentCancelPage'; // User type definition interface User { @@ -302,6 +304,32 @@ export function AppRouter({ onBackClick={() => navigate(-1)} /> } /> + + + + + + } /> + + + + } /> diff --git a/src/Redux/services/cards.service.ts b/src/Redux/services/cards.service.ts index fbc43e3..efac3eb 100644 --- a/src/Redux/services/cards.service.ts +++ b/src/Redux/services/cards.service.ts @@ -41,7 +41,29 @@ export const cardsApi = createApi({ body: cardBookingDetails }), }), - }) + + payForCard: builder.mutation({ + query: (id) => ({ + url: `/website/passes/${id}/pay`, + method: "POST", + body: {}, + }), + }), + + confirmCardPayment: builder.mutation({ + query: (id) => ({ + url: `/website/passes/${id}/confirm-payment`, + method: "POST", + // body: id, + }), + }), + + + + + + + }), }); export const { @@ -49,5 +71,8 @@ export const { useGetCheckoutPageDataQuery, useGetCardBookingDetailsQuery, useStoreRecipientDetailsMutation, - useAddCardToCartMutation + useAddCardToCartMutation, + usePayForCardMutation, + useConfirmCardPaymentMutation + } = cardsApi; \ No newline at end of file diff --git a/src/pages/PaymentCancelPage.tsx b/src/pages/PaymentCancelPage.tsx new file mode 100644 index 0000000..108cf7b --- /dev/null +++ b/src/pages/PaymentCancelPage.tsx @@ -0,0 +1,89 @@ +import React, { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { XCircle } from 'lucide-react'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; + +interface PaymentCancelPageProps { + onHomeClick: () => void; + onPassesClick: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + currentPage?: string; + user?: { email: string; name: string } | null; +} + +export function PaymentCancelPage({ + onHomeClick, + onPassesClick, + onSignInClick, + onSignOutClick, + currentPage, + user, +}: PaymentCancelPageProps) { + const navigate = useNavigate(); + + // ✅ Clear pending booking ID when user cancels + useEffect(() => { + localStorage.removeItem('pendingBookingId'); + }, []); + + return ( +

+ {}} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onHomeClick={onHomeClick} + onPassesClick={onPassesClick} + onCheckoutClick={() => {}} + onAttractionsClick={() => {}} + onBlogsClick={() => {}} + onHowItWorksClick={() => {}} + onFAQClick={() => {}} + onPrivacyPolicyClick={() => {}} + onAboutUsClick={() => {}} + onProfileClick={() => {}} + onCityCardsClick={() => {}} + onMagicItineraryClick={() => {}} + onPostCardsClick={() => {}} + onOffersClick={() => {}} + onSuperSavingsClick={() => {}} + onEsimsClick={() => {}} + onHotelDiscountsClick={() => {}} + onCartClick={() => {}} + currentPage={currentPage as any} + user={user} + /> + +
+
+ +

Payment Cancelled

+

+ You cancelled the payment process. No charges have been made. +

+ +
+
+ +
{}} + onBlogsClick={() => {}} + onHowItWorksClick={() => {}} + onFAQClick={() => {}} + onPrivacyPolicyClick={() => {}} + onAboutUsClick={() => {}} + onContactUsClick={() => {}} + /> +
+ ); +} \ No newline at end of file diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx index 08b5ad3..ed315a6 100644 --- a/src/pages/PaymentDetailsPage.tsx +++ b/src/pages/PaymentDetailsPage.tsx @@ -1,8 +1,7 @@ import React, { useEffect, useState } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { - ArrowLeft, User, MapPin, Lock, Shield, ChevronDown, - Check, AlertCircle, Pencil, UserCheck, Gift + ArrowLeft, User, Lock, Shield, Pencil, UserCheck, Gift, AlertCircle } from 'lucide-react'; import Navbar from '../components/Navbar'; import { Footer } from '../components/Footer'; @@ -11,9 +10,16 @@ import { Separator } from '../components/ui/separator'; import { useGetUserProfileDetailsQuery } from '../Redux/services/profile.service'; import LoadingSpinner from '../components/LoadingSpinner'; import { useNavigate, useParams } from 'react-router-dom'; -import { useGetCardBookingDetailsQuery, useStoreRecipientDetailsMutation } from '../Redux/services/cards.service'; +import { + useGetCardBookingDetailsQuery, + useStoreRecipientDetailsMutation, + usePayForCardMutation, +} from '../Redux/services/cards.service'; import { toast } from 'sonner'; +import countries from 'i18n-iso-countries'; +import enLocale from 'i18n-iso-countries/langs/en.json'; + export interface CheckoutOrderItem { city: string; cardType: 'Flexi' | 'Unlimited'; @@ -53,7 +59,20 @@ interface PaymentDetailsPageProps { user?: { email: string; name: string } | null; } -/* ─── Editable field ─── */ +// Register English locale for country codes +countries.registerLocale(enLocale); + +const getCountryCode = (countryName: string): string => { + const code = countries.getAlpha2Code(countryName, 'en'); + if (code) return code; + if (countryName.length === 2 && /^[A-Z]{2}$/i.test(countryName)) { + return countryName.toUpperCase(); + } + console.warn(`Unknown country name: ${countryName}, defaulting to 'AU'`); + return 'AU'; +}; + +/* ─── Editable field component ─── */ function Field({ label, value, @@ -64,7 +83,7 @@ function Field({ maxLength, inputMode, prefilled, - disabled = false, // ← New prop + disabled = false, }: { label: string; value: string; @@ -75,7 +94,7 @@ function Field({ maxLength?: number; inputMode?: React.HTMLAttributes['inputMode']; prefilled?: boolean; - disabled?: boolean; // ← Added + disabled?: boolean; }) { const [focused, setFocused] = useState(false); @@ -94,7 +113,7 @@ function Field({ placeholder={placeholder} maxLength={maxLength} inputMode={inputMode} - disabled={disabled} // ← Applied + disabled={disabled} className={`w-full border rounded-xl px-4 py-3 pr-10 font-poppins text-base font-normal text-[#2a2a2a] outline-none transition-all duration-200 placeholder:text-[#ccc] ${disabled ? 'bg-gray-100 text-gray-500 cursor-not-allowed border-gray-300' @@ -107,13 +126,10 @@ function Field({ : 'border-gray-200' }`} /> - - {/* Pencil icon only when prefilled AND not disabled AND not focused */} {prefilled && !focused && !disabled && ( )}
- {error && ( {error} @@ -135,11 +151,8 @@ function CardTypeBadge({ cardType }: { cardType: 'Flexi' | 'Unlimited' }) { ); } -/* ─── Main component ─── */ +/* ─── Main Component ─── */ export function PaymentDetailsPage({ - checkoutOrder, - onBackClick, - onPaymentComplete, onHomeClick, onPassesClick, onAttractionsClick, @@ -164,21 +177,19 @@ export function PaymentDetailsPage({ currentPage, user, }: PaymentDetailsPageProps) { - - /* ── Purchase type ── */ const [selectedTab, setSelectedTab] = useState<'myself' | 'gift'>('myself'); - /* ── Gift Recipient Details (Only editable fields) ── */ + // Gift fields const [giftFirstName, setGiftFirstName] = useState(''); const [giftLastName, setGiftLastName] = useState(''); const [giftEmail, setGiftEmail] = useState(''); const [giftPhone, setGiftPhone] = useState(''); const [giftCity, setGiftCity] = useState(''); const [giftCountry, setGiftCountry] = useState(''); - const [giftIsd, setGiftIsd] = useState("") - const [giftMessage, setGiftMessage] = useState("") + const [giftIsd, setGiftIsd] = useState(''); + const [giftMessage, setGiftMessage] = useState(''); - /* ── Profile Data (Same as ProfilePage) ── */ + // Profile data const [formData, setFormData] = useState({ firstName: '', lastName: '', @@ -188,19 +199,19 @@ export function PaymentDetailsPage({ address1: '', address2: '', city: '', - postalCode: '' + postalCode: '', }); - const navigate = useNavigate() - const userId = localStorage.getItem("userId"); - const { bookingId } = useParams() + const navigate = useNavigate(); + const userId = localStorage.getItem('userId'); + const { bookingId } = useParams(); const { data: userDetails, isLoading } = useGetUserProfileDetailsQuery(userId); const { data } = useGetCardBookingDetailsQuery(bookingId); - const [storeRecipientDetails, { isLoading: savingChanges }] = useStoreRecipientDetailsMutation(); + const [storeRecipientDetails] = useStoreRecipientDetailsMutation(); + const [payForCard, { isLoading: isCreatingPayment }] = usePayForCardMutation(); - const bookingDetails = data?.bookingDetails ?? null + const bookingDetails = data?.bookingDetails ?? null; - // Populate formData from API (exactly like ProfilePage) useEffect(() => { if (userDetails) { setFormData({ @@ -217,80 +228,83 @@ export function PaymentDetailsPage({ } }, [userDetails]); - /* ── Validation ── */ const [errors, setErrors] = useState>({}); - const [submitting, setSubmitting] = useState(false); - - const order = checkoutOrder || { - city: 'Melbourne', cardType: 'Flexi' as const, - days: 3, adults: 2, children: 0, quantity: 1, pricePerUnit: 49.50, - }; - - const subtotal = order.pricePerUnit * order.quantity; - const tax = subtotal * 0.1; - const total = subtotal + tax; const validate = () => { const e: Record = {}; - if (selectedTab === 'gift') { if (!giftFirstName.trim()) e.giftFirstName = 'Required'; if (!giftLastName.trim()) e.giftLastName = 'Required'; if (!giftIsd.trim()) e.giftIsd = 'Required'; if (!giftMessage.trim()) e.giftMessage = 'Required'; - if (!giftEmail.trim() || !/\S+@\S+\.\S+/.test(giftEmail)) { e.giftEmail = 'Valid email required'; } - if (!giftPhone.trim() || !/^\+?[0-9]{7,15}$/.test(giftPhone)) { e.giftPhone = 'Valid phone required'; } - if (!giftCity.trim()) e.giftCity = 'Required'; if (!giftCountry.trim()) e.giftCountry = 'Required'; } - return e; }; - const recipientDetails = { - isForSelf: true, - recipientFirstName: giftFirstName, - recipientLastName: giftLastName, - recipientEmail: giftEmail, - recipientIsdCode: `+${giftIsd}`, - recipientPhone: giftPhone, - recipientCity: giftCity, - recipientCountry: giftCountry, - giftMessage: giftMessage, - }; + const [isRedirecting, setIsRedirecting] = useState(false); - - const handleSaveProfile = async () => { - try { - console.log("Saving profile...", recipientDetails); - const response = await storeRecipientDetails({ recipientDetails, bookingId }); - console.log(response) - toast.success("gift details saved successfully!"); - } catch (error) { - console.error("Error saving profile:", error); - toast.error("Failed to update profile. Please try again."); + const handlePayment = async () => { + const validationErrors = validate(); + setErrors(validationErrors); + if (Object.keys(validationErrors).length > 0) { + toast.error('Please fill all required fields'); + return; } - }; - const handleSubmit = async () => { - const e = validate(); - setErrors(e); - if (Object.keys(e).length > 0) return; + if (selectedTab === 'gift') { + const recipientDetails = { + isForSelf: true, + recipientFirstName: giftFirstName, + recipientLastName: giftLastName, + recipientEmail: giftEmail, + recipientIsdCode: `+${giftIsd}`, + recipientPhone: giftPhone, + recipientCity: giftCity, + recipientCountry: giftCountry, + giftMessage: giftMessage, + }; + try { + await storeRecipientDetails({ recipientDetails, bookingId }).unwrap(); + toast.success('Gift details saved!'); + } catch (err) { + console.error('Failed to save gift details:', err); + toast.error('Failed to save gift details. Please try again.'); + return; + } + } + + setIsRedirecting(true); + try { - console.log("Saving profile...", recipientDetails); - const response = await storeRecipientDetails({ recipientDetails, bookingId }); - console.log(response) - toast.success("gift details saved successfully!"); - } catch (error) { - console.error("Error saving profile:", error); - toast.error("Failed to update profile. Please try again."); + const payResponse = await payForCard(bookingId).unwrap(); + console.log('payForCard response:', payResponse); + + const { checkoutPageUrl } = payResponse; + + localStorage.setItem('pendingBookingId', bookingId); + + if (!checkoutPageUrl || typeof checkoutPageUrl !== 'string') { + throw new Error('Invalid checkout URL received from server'); + } + + if (!checkoutPageUrl.startsWith('http://') && !checkoutPageUrl.startsWith('https://')) { + throw new Error('Checkout URL must start with http:// or https://'); + } + + window.location.href = checkoutPageUrl; + } catch (err: any) { + console.error('Payment initiation error:', err); + const errorMsg = err?.data?.message || err?.message || 'Failed to initiate payment. Please try again.'; + toast.error(errorMsg); + setIsRedirecting(false); } }; @@ -301,19 +315,33 @@ export function PaymentDetailsPage({ return (
{ }} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} - onPassesClick={onPassesClick} onCheckoutClick={onCheckoutClick} onHomeClick={onHomeClick} - onAttractionsClick={onAttractionsClick} onBlogsClick={onBlogsClick} onHowItWorksClick={onHowItWorksClick} - onFAQClick={onFAQClick} onPrivacyPolicyClick={onPrivacyPolicyClick} onAboutUsClick={onAboutUsClick} - onProfileClick={onProfileClick} onCityCardsClick={onCityCardsClick} onMagicItineraryClick={onMagicItineraryClick} - onPostCardsClick={onPostCardsClick} onOffersClick={onOffersClick} onSuperSavingsClick={onSuperSavingsClick} - onEsimsClick={onEsimsClick} onHotelDiscountsClick={onHotelDiscountsClick} onCartClick={onCartClick} - currentPage={currentPage as any} user={user} + activeCity="Melbourne" + onCityChange={() => {}} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onPassesClick={onPassesClick} + onCheckoutClick={onCheckoutClick} + onHomeClick={onHomeClick} + onAttractionsClick={onAttractionsClick} + onBlogsClick={onBlogsClick} + onHowItWorksClick={onHowItWorksClick} + onFAQClick={onFAQClick} + onPrivacyPolicyClick={onPrivacyPolicyClick} + onAboutUsClick={onAboutUsClick} + onProfileClick={onProfileClick} + onCityCardsClick={onCityCardsClick} + onMagicItineraryClick={onMagicItineraryClick} + onPostCardsClick={onPostCardsClick} + onOffersClick={onOffersClick} + onSuperSavingsClick={onSuperSavingsClick} + onEsimsClick={onEsimsClick} + onHotelDiscountsClick={onHotelDiscountsClick} + onCartClick={onCartClick} + currentPage={currentPage as any} + user={user} />
- - {/* Back Button */} - {/* Page heading */}

- Review & - {' '} + Review & Pay

@@ -335,35 +361,33 @@ export function PaymentDetailsPage({

- Complete your purchase securely. Your payment information is protected. + Complete your purchase securely. You will be redirected to Stripe to enter your card details.

- - {/* LEFT: Forms */} - - {/* Purchase type tabs */}

- { }} prefilled disabled={true} /> - { }} prefilled disabled={true} /> + {}} prefilled disabled /> + {}} prefilled disabled />
- { }} type="email" prefilled disabled={true} /> - { }} type="tel" prefilled disabled={true} /> + {}} type="email" prefilled disabled /> + {}} type="tel" prefilled disabled />
@@ -426,7 +448,6 @@ export function PaymentDetailsPage({

Gift Recipient Details

- - - - - - -
@@ -496,6 +511,7 @@ export function PaymentDetailsPage({ )} + {/* Billing Address */} @@ -507,28 +523,23 @@ export function PaymentDetailsPage({

Billing Address

- { }} prefilled disabled={true} /> - { }} prefilled disabled={true} /> + {}} prefilled disabled /> + {}} prefilled disabled />
- { }} prefilled disabled={true} /> - { }} prefilled disabled={true} /> + {}} prefilled disabled /> + {}} prefilled disabled />
- { }} inputMode="numeric" prefilled disabled={true} /> -
-
- { }} prefilled disabled={true} /> -
-
+ {}} inputMode="numeric" prefilled disabled /> + {}} prefilled disabled />
- - {/* RIGHT: Order Summary (unchanged) */} + {/* Right Column: Order Summary & Payment Button */}
@@ -538,10 +549,13 @@ export function PaymentDetailsPage({
-
+
{bookingDetails?.cardMode}
@@ -550,21 +564,21 @@ export function PaymentDetailsPage({

- {bookingDetails?.cardMode.toLowerCase() === 'flexi' ? `${bookingDetails?.noOfAttractions} Attractions` : `${bookingDetails?.noOfDays} Days`} + {bookingDetails?.cardMode?.toLowerCase() === 'flexi' + ? `${bookingDetails?.noOfAttractions} Attractions` + : `${bookingDetails?.noOfDays} Days`}

- {[ - { label: 'Adults', value: bookingDetails?.totalAdult }, - { label: 'Children', value: bookingDetails?.totalChild }, - // { label: 'Qty', value: order.quantity }, - ].map(({ label, value }) => ( -
- {label} - {value} -
- ))} +
+ Adults + {bookingDetails?.totalAdult} +
+
+ Children + {bookingDetails?.totalChild} +
@@ -593,39 +607,47 @@ export function PaymentDetailsPage({ - {submitting ? ( + {isRedirecting ? ( <> - - Processing… + + Redirecting to Stripe... ) : ( <> - Complete Payment · ${bookingDetails?.totalAmount} + Proceed to Payment · ${bookingDetails?.totalAmount} )}

- By completing your purchase you agree to our Terms of Service and Privacy Policy + You will be redirected to Stripe’s secure checkout page to enter your card details. + By completing your purchase you agree to our Terms of Service and Privacy Policy.

-
); -} +} \ No newline at end of file diff --git a/src/pages/PaymentSuccessPage.tsx b/src/pages/PaymentSuccessPage.tsx new file mode 100644 index 0000000..b3c4361 --- /dev/null +++ b/src/pages/PaymentSuccessPage.tsx @@ -0,0 +1,153 @@ +import React, { useEffect, useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { CheckCircle, XCircle, Loader2 } from 'lucide-react'; +import { useConfirmCardPaymentMutation } from '../Redux/services/cards.service'; +import { toast } from 'sonner'; +import Navbar from '../components/Navbar'; +import { Footer } from '../components/Footer'; + +interface PaymentSuccessPageProps { + onHomeClick: () => void; + onPassesClick: () => void; + onSignInClick: () => void; + onSignOutClick?: () => void; + currentPage?: string; + user?: { email: string; name: string } | null; + // Add other handlers if needed (optional) +} + +export function PaymentSuccessPage({ + onHomeClick, + onPassesClick, + onSignInClick, + onSignOutClick, + currentPage, + user, +}: PaymentSuccessPageProps) { + const [searchParams] = useSearchParams(); + const sessionId = searchParams.get('session_id'); + const [confirmPayment, { isLoading }] = useConfirmCardPaymentMutation(); + const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); + const [errorMsg, setErrorMsg] = useState(''); + const navigate = useNavigate(); + + useEffect(() => { + const confirm = async () => { + // Retrieve bookingId from localStorage (set before redirect) + const bookingId = localStorage.getItem('pendingBookingId'); + + if (!bookingId) { + setStatus('error'); + setErrorMsg('Missing booking information. Please contact support.'); + return; + } + + if (!sessionId) { + setStatus('error'); + setErrorMsg('Missing session ID. Please contact support.'); + return; + } + + try { + // ✅ Send both bookingId and sessionId to backend + await confirmPayment({ bookingId, sessionId }).unwrap(); + setStatus('success'); + toast.success('Payment confirmed! Your order is complete.'); + // Clear the stored bookingId + localStorage.removeItem('pendingBookingId'); + } catch (err: any) { + console.error('Payment confirmation error:', err); + setStatus('error'); + setErrorMsg(err?.data?.message || 'Payment could not be confirmed. Please contact support.'); + toast.error('Payment confirmation failed'); + // Optionally clear pending booking on error to avoid infinite loops + localStorage.removeItem('pendingBookingId'); + } + }; + + confirm(); + }, [sessionId, confirmPayment]); + + return ( +
+ {}} + onSignInClick={onSignInClick} + onSignOutClick={onSignOutClick} + onHomeClick={onHomeClick} + onPassesClick={onPassesClick} + onCheckoutClick={() => {}} + onAttractionsClick={() => {}} + onBlogsClick={() => {}} + onHowItWorksClick={() => {}} + onFAQClick={() => {}} + onPrivacyPolicyClick={() => {}} + onAboutUsClick={() => {}} + onProfileClick={() => {}} + onCityCardsClick={() => {}} + onMagicItineraryClick={() => {}} + onPostCardsClick={() => {}} + onOffersClick={() => {}} + onSuperSavingsClick={() => {}} + onEsimsClick={() => {}} + onHotelDiscountsClick={() => {}} + onCartClick={() => {}} + currentPage={currentPage as any} + user={user} + /> + +
+
+ {status === 'loading' && ( + <> + +

Confirming your payment...

+

Please wait while we verify your transaction.

+ + )} + + {status === 'success' && ( + <> + +

Payment Successful!

+

Thank you for your purchase. Your order is now confirmed.

+ + + )} + + {status === 'error' && ( + <> + +

Payment Confirmation Failed

+

{errorMsg}

+ + + )} +
+
+ +
{}} + onBlogsClick={() => {}} + onHowItWorksClick={() => {}} + onFAQClick={() => {}} + onPrivacyPolicyClick={() => {}} + onAboutUsClick={() => {}} + onContactUsClick={() => {}} + /> +
+ ); +} \ No newline at end of file diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 8abf8d3..602f7ff 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,6 +1,7 @@ interface ImportMetaEnv { readonly VITE_BASE_URL: string readonly VITE_GOOGLE_MAP: string + readonly VITE_STRIPE_PUBLISHABLE_KEY: string } interface ImportMeta { From adbf30a0c288c66e7daac8d84eccc296a63140fb Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 22 Apr 2026 17:04:34 +0530 Subject: [PATCH 46/91] show the created itinerary summary on the summary page --- src/AppRouter.tsx | 9 +- src/Redux/services/itinerary.service.ts | 13 +- src/pages/CreateMagicIternaryPageDesign.tsx | 4 + src/pages/ItinerarySummaryPage.tsx | 331 ++++++++++++++++++++ 4 files changed, 352 insertions(+), 5 deletions(-) create mode 100644 src/pages/ItinerarySummaryPage.tsx diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index e076e54..e345acc 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -39,6 +39,8 @@ import { CheckoutPage2 } from './pages/CheckoutPage2'; import { SuperSavingsDetailsPage } from './pages/SuperSavingsDetailsPage'; import { ViewCardDetailsPage } from './pages/ViewCardDetailsPageDesign'; import { CreateMagicItineraryPageDesign } from './pages/CreateMagicIternaryPageDesign'; +import { ItineraryViewPageDesign } from './pages/ItineraryViewPageDesign'; +import ItinerarySummaryPage from './pages/ItinerarySummaryPage'; // User type definition interface User { @@ -222,7 +224,12 @@ export function AppRouter({ } /> - + + + } /> + + } /> diff --git a/src/Redux/services/itinerary.service.ts b/src/Redux/services/itinerary.service.ts index f19723e..7934c46 100644 --- a/src/Redux/services/itinerary.service.ts +++ b/src/Redux/services/itinerary.service.ts @@ -1,5 +1,5 @@ -import { createApi} from "@reduxjs/toolkit/query/react"; +import { createApi } from "@reduxjs/toolkit/query/react"; import { baseQuery } from "../baseQuery"; export const itineraryApi = createApi({ @@ -8,7 +8,7 @@ export const itineraryApi = createApi({ endpoints: (builder) => ({ - + createMagicItinerary: builder.mutation({ query: (itineraryDetails) => ({ // keep the name of the variables being passed here same as when calling the mutation hook @@ -16,13 +16,18 @@ export const itineraryApi = createApi({ method: "POST", body: itineraryDetails }), - + }), - + getItineraryDetailsById: builder.query({ + query: (itineraryId: number) => `/website/itinerary/${itineraryId}`, + }), + + }) }); export const { useCreateMagicItineraryMutation, + useGetItineraryDetailsByIdQuery, } = itineraryApi; \ No newline at end of file diff --git a/src/pages/CreateMagicIternaryPageDesign.tsx b/src/pages/CreateMagicIternaryPageDesign.tsx index 7ae60d8..214a1f6 100644 --- a/src/pages/CreateMagicIternaryPageDesign.tsx +++ b/src/pages/CreateMagicIternaryPageDesign.tsx @@ -48,6 +48,7 @@ import MuseumSoundsGoodIcon from '../imports/NounRelax65970551-9923-633'; import MuseumLoveItIcon from '../imports/NounRelax65970551-9923-637'; import { useCreateMagicItineraryMutation } from '../Redux/services/itinerary.service'; import { toast } from 'sonner'; +import { useNavigate } from 'react-router-dom'; interface User { @@ -190,6 +191,8 @@ export function CreateMagicItineraryPageDesign({ const [selectedActivity, setSelectedActivity] = useState(null); const [createMagicItinerary] = useCreateMagicItineraryMutation(); + const navigate= useNavigate() + const toggleFavorite = (activityKey: string) => { setFavorites(prev => { const newSet = new Set(prev); @@ -259,6 +262,7 @@ export function CreateMagicItineraryPageDesign({ setGeneratedItinerary(response); setShowResults(true); toast.success("Itinerary created successfully!"); + navigate(`/itinerary-summary/${response?.data?.id}`) } catch (error) { console.error("Error creating itinerary:", error); toast.error("Failed to create itinerary. Please try again."); diff --git a/src/pages/ItinerarySummaryPage.tsx b/src/pages/ItinerarySummaryPage.tsx new file mode 100644 index 0000000..db4609c --- /dev/null +++ b/src/pages/ItinerarySummaryPage.tsx @@ -0,0 +1,331 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { + MapPin, + Calendar, + ChevronDown, + Share2, + Download, + ChevronRight, +} from 'lucide-react'; +import { Button } from '../components/ui/button'; +import { Card, CardContent } from '../components/ui/card'; +import { ImageWithFallback } from '../components/figma/ImageWithFallback'; +import { useCreateMagicItineraryMutation, useGetItineraryDetailsByIdQuery } from '../Redux/services/itinerary.service'; +import { toast } from 'sonner'; +import { useNavigate, useParams } from 'react-router-dom'; + +const ItinerarySummaryPage = () => { + const [viewMode, setViewMode] = useState<'daily' | 'summary'>('daily'); + const [selectedDayTab, setSelectedDayTab] = useState(1); + const [selectedActivity, setSelectedActivity] = useState(null); + + const navigate = useNavigate(); + + const { itineraryId } = useParams() + const { data: itineraryDetails, isLoading: itineraryDetailsLoading } = useGetItineraryDetailsByIdQuery(itineraryId); + + const generatedItinerary = itineraryDetails ?? null; + const days = generatedItinerary?.days ?? []; + const summaries = generatedItinerary?.summary ?? []; + + const selectedDayPlan = days?.find((d: any) => d.dayNumber === selectedDayTab); + + + return ( + + {/* Title */} +
+

+ Your +

+

+ {generatedItinerary?.title} +

+
+ + {/* Trip Details Card */} +
+ {/* Background Image */} +
+ +
+
+

Your Trip

+

{generatedItinerary?.city}

+
+
+ {/* Stats Row */} +
+
+ {generatedItinerary?.totalDays} + Days +
+
+ {generatedItinerary?.totalStops} + Stops +
+
+ {generatedItinerary?.days[0]?.date} + Start Date +
+
+
+ + {/* Share & Download Buttons */} +
+ + +
+ + {/* View Toggle */} +
+
+ + +
+
+ + {/* Daily View */} + {viewMode === 'daily' && ( +
+ {/* Day Tabs */} +
+ {days?.map((day: any) => ( + + ))} + {days?.length > 4 && ( + + )} +
+ + {/* Activities for selected day */} + {selectedDayPlan && ( + + + {selectedDayPlan?.items?.map((activity: any, actIndex: number) => { + const activityKey = `day${selectedDayPlan.day}-act${actIndex}`; + + return ( + + {/* Time Label */} +

+ {activity.timeSlot} +

+ + {/* Activity Card */} + + + {/* Image */} +
+ + + {/* TODO: Get Directions Badge redirect it to lat,long */} +
+ +
+
+ + {/* Content */} +
+

+ {activity.title} +

+

+ {activity.locationName} +

+ + {/* Category Tags */} +
+ {activity.categories?.map((cat: string, ci: number) => ( + + {cat} + + ))} +
+ + {/* Bullet Points */} +
+ +
+ + {activity.description} +
+ +
+
+
+
+
+ ); + })} +
+
+ )} +
+ )} + + {/* Summary View */} + {viewMode === 'summary' && ( +
+ {days?.map((day: any, dayIndex: number) => { + const dayDate = days[0]?.date + ? new Date( + new Date(days[0].date).setDate( + new Date(days[0].date).getDate() + dayIndex + ) + ).toLocaleDateString('en-AU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + }) + : ''; + + // ✅ Find the matching summary for this day + const daySummary = summaries.find((s: any) => s.dayNumber === day.dayNumber); + + return ( +
+ {/* Day Header */} +
+

+ Day {day.dayNumber}: +

+
+ + {dayDate} +
+
+ + {/* Activity List */} +
+ {daySummary?.items?.map((item: any, actIndex: number) => { + const activityKey = `summary-day${day.dayNumber}-act${actIndex}`; + const isExpanded = selectedActivity === activityKey; + + return ( +
+
+ setSelectedActivity(isExpanded ? null : activityKey) + } + > +

+ {item.timeSlot}: {item.title} +

+ +
+ + + {isExpanded && ( + +
+
+ + + {item.description} + +
+ +
+
+ )} +
+
+ ); + })} +
+
+ ); + })} +
+ )} + + {/* Bottom Action */} +
+ +
+ + ); +} + +export default ItinerarySummaryPage \ No newline at end of file From 7455f8afb5262516f590f46d6265b940aec9c264 Mon Sep 17 00:00:00 2001 From: Hemant Vishwakarma Date: Wed, 22 Apr 2026 17:15:55 +0530 Subject: [PATCH 47/91] change stripe success page --- src/pages/PaymentDetailsPage.tsx | 1 + src/pages/PaymentSuccessPage.tsx | 32 +++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx index ed315a6..2d6950b 100644 --- a/src/pages/PaymentDetailsPage.tsx +++ b/src/pages/PaymentDetailsPage.tsx @@ -290,6 +290,7 @@ export function PaymentDetailsPage({ const { checkoutPageUrl } = payResponse; localStorage.setItem('pendingBookingId', bookingId); + sessionStorage.setItem('pendingBookingId', bookingId); if (!checkoutPageUrl || typeof checkoutPageUrl !== 'string') { throw new Error('Invalid checkout URL received from server'); diff --git a/src/pages/PaymentSuccessPage.tsx b/src/pages/PaymentSuccessPage.tsx index b3c4361..83a2056 100644 --- a/src/pages/PaymentSuccessPage.tsx +++ b/src/pages/PaymentSuccessPage.tsx @@ -13,7 +13,6 @@ interface PaymentSuccessPageProps { onSignOutClick?: () => void; currentPage?: string; user?: { email: string; name: string } | null; - // Add other handlers if needed (optional) } export function PaymentSuccessPage({ @@ -33,12 +32,26 @@ export function PaymentSuccessPage({ useEffect(() => { const confirm = async () => { - // Retrieve bookingId from localStorage (set before redirect) - const bookingId = localStorage.getItem('pendingBookingId'); + // Try multiple sources for bookingId + let bookingId = localStorage.getItem('pendingBookingId'); + if (!bookingId) { + bookingId = sessionStorage.getItem('pendingBookingId'); + } + // Optional: if you have bookingId in URL query param (e.g., ?bookingId=123) + const urlBookingId = searchParams.get('bookingId'); + if (!bookingId && urlBookingId) { + bookingId = urlBookingId; + } + + console.log('Retrieved bookingId:', bookingId); + console.log('SessionId from URL:', sessionId); if (!bookingId) { setStatus('error'); - setErrorMsg('Missing booking information. Please contact support.'); + setErrorMsg( + 'Missing booking information. Please contact support with your order reference. ' + + 'If you just completed payment, your order may still be processing.' + ); return; } @@ -49,24 +62,25 @@ export function PaymentSuccessPage({ } try { - // ✅ Send both bookingId and sessionId to backend await confirmPayment({ bookingId, sessionId }).unwrap(); setStatus('success'); toast.success('Payment confirmed! Your order is complete.'); - // Clear the stored bookingId + // Clean up storage localStorage.removeItem('pendingBookingId'); + sessionStorage.removeItem('pendingBookingId'); } catch (err: any) { console.error('Payment confirmation error:', err); setStatus('error'); setErrorMsg(err?.data?.message || 'Payment could not be confirmed. Please contact support.'); toast.error('Payment confirmation failed'); - // Optionally clear pending booking on error to avoid infinite loops + // Clean up storage to avoid infinite loops localStorage.removeItem('pendingBookingId'); + sessionStorage.removeItem('pendingBookingId'); } }; confirm(); - }, [sessionId, confirmPayment]); + }, [sessionId, confirmPayment, searchParams]); return (
@@ -113,7 +127,7 @@ export function PaymentSuccessPage({

Payment Successful!

Thank you for your purchase. Your order is now confirmed.

+
+ + +
From b7767053e70339dc605f7a0cf6ca0d84139e24cb Mon Sep 17 00:00:00 2001 From: Hemant Vishwakarma Date: Wed, 22 Apr 2026 17:50:30 +0530 Subject: [PATCH 50/91] Stripe again changes --- src/pages/PaymentCancelPage.tsx | 1 + src/pages/PaymentDetailsPage.tsx | 44 +++++++------ src/pages/PaymentSuccessPage.tsx | 103 +++++++++++++++++++++++++------ 3 files changed, 109 insertions(+), 39 deletions(-) diff --git a/src/pages/PaymentCancelPage.tsx b/src/pages/PaymentCancelPage.tsx index 8c37f8b..99dd51e 100644 --- a/src/pages/PaymentCancelPage.tsx +++ b/src/pages/PaymentCancelPage.tsx @@ -27,6 +27,7 @@ export function PaymentCancelPage({ useEffect(() => { localStorage.removeItem('pendingBookingId'); sessionStorage.removeItem('pendingBookingId'); + document.cookie = 'pendingBookingId=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; }, []); return ( diff --git a/src/pages/PaymentDetailsPage.tsx b/src/pages/PaymentDetailsPage.tsx index 2d6950b..59961d3 100644 --- a/src/pages/PaymentDetailsPage.tsx +++ b/src/pages/PaymentDetailsPage.tsx @@ -289,6 +289,13 @@ export function PaymentDetailsPage({ const { checkoutPageUrl } = payResponse; + + const setCookie = (name: string, value: string, days = 1) => { + const expires = new Date(); + expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000); + document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;SameSite=Lax`; + }; + setCookie('pendingBookingId', bookingId); localStorage.setItem('pendingBookingId', bookingId); sessionStorage.setItem('pendingBookingId', bookingId); @@ -317,7 +324,7 @@ export function PaymentDetailsPage({
{}} + onCityChange={() => { }} onSignInClick={onSignInClick} onSignOutClick={onSignOutClick} onPassesClick={onPassesClick} @@ -373,22 +380,20 @@ export function PaymentDetailsPage({
- {}} prefilled disabled /> - {}} prefilled disabled /> + { }} prefilled disabled /> + { }} prefilled disabled />
- {}} type="email" prefilled disabled /> - {}} type="tel" prefilled disabled /> + { }} type="email" prefilled disabled /> + { }} type="tel" prefilled disabled />
@@ -524,15 +529,15 @@ export function PaymentDetailsPage({

Billing Address

- {}} prefilled disabled /> - {}} prefilled disabled /> + { }} prefilled disabled /> + { }} prefilled disabled />
- {}} prefilled disabled /> - {}} prefilled disabled /> + { }} prefilled disabled /> + { }} prefilled disabled />
- {}} inputMode="numeric" prefilled disabled /> - {}} prefilled disabled /> + { }} inputMode="numeric" prefilled disabled /> + { }} prefilled disabled />
@@ -551,11 +556,10 @@ export function PaymentDetailsPage({
{bookingDetails?.cardMode}
diff --git a/src/pages/PaymentSuccessPage.tsx b/src/pages/PaymentSuccessPage.tsx index bf1967f..97acade 100644 --- a/src/pages/PaymentSuccessPage.tsx +++ b/src/pages/PaymentSuccessPage.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; -import { CheckCircle, XCircle, Loader2 } from 'lucide-react'; +import { CheckCircle, XCircle, Loader2, AlertCircle } from 'lucide-react'; import { useConfirmCardPaymentMutation } from '../Redux/services/cards.service'; import { toast } from 'sonner'; import Navbar from '../components/Navbar'; @@ -15,6 +15,14 @@ interface PaymentSuccessPageProps { user?: { email: string; name: string } | null; } +// Helper to get cookie value +const getCookie = (name: string): string | null => { + const value = `; ${document.cookie}`; + const parts = value.split(`; ${name}=`); + if (parts.length === 2) return parts.pop()?.split(';').shift() || null; + return null; +}; + export function PaymentSuccessPage({ onHomeClick, onPassesClick, @@ -25,34 +33,38 @@ export function PaymentSuccessPage({ }: PaymentSuccessPageProps) { const [searchParams] = useSearchParams(); const [confirmPayment, { isLoading }] = useConfirmCardPaymentMutation(); - const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); + const [status, setStatus] = useState<'loading' | 'success' | 'error' | 'manual'>('loading'); const [errorMsg, setErrorMsg] = useState(''); + const [manualBookingId, setManualBookingId] = useState(''); const navigate = useNavigate(); useEffect(() => { - const confirm = async () => { - // Try multiple sources to get bookingId - let bookingId = localStorage.getItem('pendingBookingId'); + const retrieveBookingId = async () => { + // Try all possible sources + let bookingId = getCookie('pendingBookingId'); + if (!bookingId) bookingId = localStorage.getItem('pendingBookingId'); if (!bookingId) bookingId = sessionStorage.getItem('pendingBookingId'); - if (!bookingId) bookingId = searchParams.get('bookingId'); // URL query param - - console.log('Retrieved bookingId:', bookingId); + if (!bookingId) bookingId = searchParams.get('bookingId'); + + console.log('Retrieved bookingId from sources:', { + cookie: getCookie('pendingBookingId'), + localStorage: localStorage.getItem('pendingBookingId'), + sessionStorage: sessionStorage.getItem('pendingBookingId'), + queryParam: searchParams.get('bookingId'), + final: bookingId, + }); if (!bookingId) { - setStatus('error'); - setErrorMsg( - 'Booking ID not found. Please contact support with your order details. ' + - 'If you just completed payment, your order may still be processing.' - ); + setStatus('manual'); // show manual entry form return; } try { - // ✅ Call confirm API with only bookingId await confirmPayment(bookingId).unwrap(); setStatus('success'); toast.success('Payment confirmed! Your order is complete.'); - // Clean up storage + // Clean up + document.cookie = 'pendingBookingId=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; localStorage.removeItem('pendingBookingId'); sessionStorage.removeItem('pendingBookingId'); } catch (err: any) { @@ -60,15 +72,34 @@ export function PaymentSuccessPage({ setStatus('error'); setErrorMsg(err?.data?.message || 'Failed to confirm payment. Please contact support.'); toast.error('Confirmation failed'); - // Clean up to avoid retry loops - localStorage.removeItem('pendingBookingId'); - sessionStorage.removeItem('pendingBookingId'); } }; - confirm(); + retrieveBookingId(); }, [confirmPayment, searchParams]); + const handleManualConfirm = async () => { + if (!manualBookingId.trim()) { + toast.error('Please enter your Booking ID'); + return; + } + setStatus('loading'); + try { + await confirmPayment(manualBookingId).unwrap(); + setStatus('success'); + toast.success('Payment confirmed! Your order is complete.'); + // Clean up + document.cookie = 'pendingBookingId=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; + localStorage.removeItem('pendingBookingId'); + sessionStorage.removeItem('pendingBookingId'); + } catch (err: any) { + console.error('Manual confirmation error:', err); + setStatus('error'); + setErrorMsg(err?.data?.message || 'Failed to confirm payment. Please contact support.'); + toast.error('Confirmation failed'); + } + }; + return (
)} + + {status === 'manual' && ( + <> + +

Booking ID Not Found

+

+ We couldn't automatically retrieve your booking ID. Please enter it below to confirm your payment. +
+ (Check your email or order history for the Booking ID) +

+
+ setManualBookingId(e.target.value)} + placeholder="Enter Booking ID" + className="w-full border rounded-xl px-4 py-3 font-poppins text-base outline-none focus:border-[#F95F62]" + /> + +
+ + + )}
From 03dabde97943412faedacef10bfeded2edde555f Mon Sep 17 00:00:00 2001 From: Hemant Vishwakarma Date: Wed, 22 Apr 2026 18:00:33 +0530 Subject: [PATCH 51/91] New changes in paymentsuccesspage --- src/pages/PaymentSuccessPage.tsx | 81 +++++++------------------------- 1 file changed, 16 insertions(+), 65 deletions(-) diff --git a/src/pages/PaymentSuccessPage.tsx b/src/pages/PaymentSuccessPage.tsx index 97acade..0f6fb1e 100644 --- a/src/pages/PaymentSuccessPage.tsx +++ b/src/pages/PaymentSuccessPage.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; -import { CheckCircle, XCircle, Loader2, AlertCircle } from 'lucide-react'; +import { CheckCircle, XCircle, Loader2 } from 'lucide-react'; import { useConfirmCardPaymentMutation } from '../Redux/services/cards.service'; import { toast } from 'sonner'; import Navbar from '../components/Navbar'; @@ -33,13 +33,12 @@ export function PaymentSuccessPage({ }: PaymentSuccessPageProps) { const [searchParams] = useSearchParams(); const [confirmPayment, { isLoading }] = useConfirmCardPaymentMutation(); - const [status, setStatus] = useState<'loading' | 'success' | 'error' | 'manual'>('loading'); + const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); const [errorMsg, setErrorMsg] = useState(''); - const [manualBookingId, setManualBookingId] = useState(''); const navigate = useNavigate(); useEffect(() => { - const retrieveBookingId = async () => { + const confirm = async () => { // Try all possible sources let bookingId = getCookie('pendingBookingId'); if (!bookingId) bookingId = localStorage.getItem('pendingBookingId'); @@ -55,7 +54,11 @@ export function PaymentSuccessPage({ }); if (!bookingId) { - setStatus('manual'); // show manual entry form + setStatus('error'); + setErrorMsg( + 'Booking ID not found. Please contact support with your order details. ' + + 'If you just completed payment, your order may still be processing.' + ); return; } @@ -63,7 +66,7 @@ export function PaymentSuccessPage({ await confirmPayment(bookingId).unwrap(); setStatus('success'); toast.success('Payment confirmed! Your order is complete.'); - // Clean up + // Clean up all storage document.cookie = 'pendingBookingId=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; localStorage.removeItem('pendingBookingId'); sessionStorage.removeItem('pendingBookingId'); @@ -72,34 +75,16 @@ export function PaymentSuccessPage({ setStatus('error'); setErrorMsg(err?.data?.message || 'Failed to confirm payment. Please contact support.'); toast.error('Confirmation failed'); + // Clean up to avoid retry loops + document.cookie = 'pendingBookingId=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; + localStorage.removeItem('pendingBookingId'); + sessionStorage.removeItem('pendingBookingId'); } }; - retrieveBookingId(); + confirm(); }, [confirmPayment, searchParams]); - const handleManualConfirm = async () => { - if (!manualBookingId.trim()) { - toast.error('Please enter your Booking ID'); - return; - } - setStatus('loading'); - try { - await confirmPayment(manualBookingId).unwrap(); - setStatus('success'); - toast.success('Payment confirmed! Your order is complete.'); - // Clean up - document.cookie = 'pendingBookingId=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; - localStorage.removeItem('pendingBookingId'); - sessionStorage.removeItem('pendingBookingId'); - } catch (err: any) { - console.error('Manual confirmation error:', err); - setStatus('error'); - setErrorMsg(err?.data?.message || 'Failed to confirm payment. Please contact support.'); - toast.error('Confirmation failed'); - } - }; - return (
Payment Successful!

Thank you for your purchase. Your order is now confirmed.

)} @@ -166,40 +151,6 @@ export function PaymentSuccessPage({ )} - - {status === 'manual' && ( - <> - -

Booking ID Not Found

-

- We couldn't automatically retrieve your booking ID. Please enter it below to confirm your payment. -
- (Check your email or order history for the Booking ID) -

-
- setManualBookingId(e.target.value)} - placeholder="Enter Booking ID" - className="w-full border rounded-xl px-4 py-3 font-poppins text-base outline-none focus:border-[#F95F62]" - /> - -
- - - )} From beae316bc0b5b4ba26591e90849f11a2570e02f3 Mon Sep 17 00:00:00 2001 From: aryabenade Date: Wed, 22 Apr 2026 18:33:09 +0530 Subject: [PATCH 52/91] integrate api in viewIternary page --- src/AppRouter.tsx | 2 +- src/Redux/services/itinerary.service.ts | 4 + src/pages/ItineraryViewPageDesign.tsx | 579 +++++++----------------- src/pages/ProfilePage.tsx | 53 ++- 4 files changed, 200 insertions(+), 438 deletions(-) diff --git a/src/AppRouter.tsx b/src/AppRouter.tsx index e345acc..10b48f8 100644 --- a/src/AppRouter.tsx +++ b/src/AppRouter.tsx @@ -222,7 +222,7 @@ export function AppRouter({ } /> - diff --git a/src/Redux/services/itinerary.service.ts b/src/Redux/services/itinerary.service.ts index 7934c46..ece4428 100644 --- a/src/Redux/services/itinerary.service.ts +++ b/src/Redux/services/itinerary.service.ts @@ -23,6 +23,9 @@ export const itineraryApi = createApi({ query: (itineraryId: number) => `/website/itinerary/${itineraryId}`, }), + getUserItineraries: builder.query({ + query: () => `/website/itinerary/all-initineraries`, + }), }) }); @@ -30,4 +33,5 @@ export const itineraryApi = createApi({ export const { useCreateMagicItineraryMutation, useGetItineraryDetailsByIdQuery, + useGetUserItinerariesQuery } = itineraryApi; \ No newline at end of file diff --git a/src/pages/ItineraryViewPageDesign.tsx b/src/pages/ItineraryViewPageDesign.tsx index bb78d02..6ce81a9 100644 --- a/src/pages/ItineraryViewPageDesign.tsx +++ b/src/pages/ItineraryViewPageDesign.tsx @@ -7,6 +7,9 @@ import { Badge } from '../components/ui/badge'; 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 LoadingSpinner from '../components/LoadingSpinner'; interface ItineraryViewPageDesignProps { onBackClick: () => void; @@ -35,18 +38,6 @@ interface ItineraryViewPageDesignProps { user?: { email: string; name: string; } | null; } -// Enhanced activity type with more details -interface Activity { - time: string; - activity: string; - location: string; - address: string; - image: string; - categories: string[]; - description: string[]; - isFavorite?: boolean; -} - export function ItineraryViewPageDesign({ onBackClick, onHomeClick, @@ -74,304 +65,36 @@ export function ItineraryViewPageDesign({ user }: ItineraryViewPageDesignProps) { const [viewMode, setViewMode] = useState<'daily' | 'summary'>('daily'); - const [favorites, setFavorites] = useState>(new Set()); + // const [favorites, setFavorites] = useState>(new Set()); - const toggleFavorite = (activityKey: string) => { - setFavorites(prev => { - const newSet = new Set(prev); - if (newSet.has(activityKey)) { - newSet.delete(activityKey); - } else { - newSet.add(activityKey); - } - return newSet; - }); - }; + // ── API Integration ────────────────────────────────────────────────────────── + const { itineraryId } = useParams(); + const { data: itineraryDetails, isLoading } = useGetItineraryDetailsByIdQuery(itineraryId); - // Enhanced itinerary data with images, addresses, and detailed info - const generatedItinerary = { - destination: { - name: 'Melbourne', - country: 'Australia', - weather: '18°C, Sunny', - image: 'https://images.unsplash.com/photo-1514395462725-fb4566210144?w=400&h=300&fit=crop' - }, - totalDays: 3, - estimatedCost: '$450 AUD', - includedActivities: 18, - dailyPlans: [ - { - day: 1, - title: "City Center & Culture", - activities: [ - { - time: '8:00 am', - activity: 'The Langham Melbourne', - location: 'The Langham Melbourne', - address: '1 Southgate Avenue, Southbank VIC 3006', - image: 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800&h=600&fit=crop', - categories: ['Accommodation', 'Luxury'], - description: [ - 'Check-in at luxury riverside hotel', - 'Enjoy complimentary breakfast', - 'Relax at the spa facilities', - 'Explore the surrounding Southbank area' - ] - }, - { - time: '10:00 am', - activity: 'Federation Square', - location: 'Federation Square', - address: 'Corner Swanston & Flinders Streets, Melbourne VIC 3000', - image: 'https://images.unsplash.com/photo-1514395462725-fb4566210144?w=800&h=600&fit=crop', - categories: ['Culture', 'Landmark'], - description: [ - 'Explore Melbourne\'s cultural precinct', - 'Visit the ACMI museum', - 'Enjoy street performances', - 'Take photos at iconic locations' - ] - }, - { - time: '12:00 pm', - activity: 'Degrave Street Café', - location: 'Degrave Street Espresso Bar', - address: '23-25 Degraves Street, Melbourne VIC 3000', - image: 'https://images.unsplash.com/photo-1554118811-1e0d58224f24?w=800&h=600&fit=crop', - categories: ['Food', 'Drinks', 'Culture'], - description: [ - 'Coffee at Pellegrini\'s Espresso Bar (iconic old-school cafe)', - 'Try the famous jam doughnuts', - 'Shop for fresh produce in the Deli Hall', - 'Pick up unique souvenirs in the General Merchandise section' - ] - }, - { - time: '2:00 pm', - activity: 'Royal Botanic Gardens', - location: 'Royal Botanic Gardens Victoria', - address: 'Birdwood Avenue, South Yarra VIC 3141', - image: 'https://images.unsplash.com/photo-1585320806297-9794b3e4eeae?w=800&h=600&fit=crop', - categories: ['Nature', 'Culture'], - description: [ - 'Stroll through stunning landscaped gardens', - 'Visit the Australian Forest Walk', - 'Relax by the Ornamental Lake', - 'Join a free guided walking tour' - ] - }, - { - time: '4:00 pm', - activity: 'National Gallery of Victoria', - location: 'NGV International', - address: '180 St Kilda Road, Melbourne VIC 3006', - image: 'https://images.unsplash.com/photo-1564399577149-749794d74eee?w=800&h=600&fit=crop', - categories: ['Culture', 'Art'], - description: [ - 'Explore Australia\'s oldest art museum', - 'View international and Australian art collections', - 'Visit the stunning water wall entrance', - 'Browse the NGV design store' - ] - }, - { - time: '7:00 pm', - activity: 'Dinner at Chin Chin', - location: 'Chin Chin Restaurant', - address: '125 Flinders Lane, Melbourne VIC 3000', - image: 'https://images.unsplash.com/photo-1552566626-52f8b828add9?w=800&h=600&fit=crop', - categories: ['Food', 'Drinks'], - description: [ - 'Experience modern Thai cuisine', - 'Try signature dishes like the Betel Leaf', - 'Enjoy the vibrant atmosphere', - 'Book ahead or walk-in for bar seating' - ] - } - ] - }, - { - day: 2, - title: "Markets & Neighborhoods", - activities: [ - { - time: '8:00 am', - activity: 'Queen Victoria Market', - location: 'Queen Victoria Market', - address: 'Queen Street, Melbourne VIC 3000', - image: 'https://images.unsplash.com/photo-1555939594-58d7cb561ad1?w=800&h=600&fit=crop', - categories: ['Food', 'Shopping', 'Culture'], - description: [ - 'Explore Melbourne\'s historic market (since 1878)', - 'Sample fresh local produce', - 'Shop for artisan goods and souvenirs', - 'Grab breakfast at the Deli Hall' - ] - }, - { - time: '10:30 am', - activity: 'Fitzroy Street Art Tour', - location: 'Fitzroy Arts Precinct', - address: 'Gertrude Street, Fitzroy VIC 3065', - image: 'https://images.unsplash.com/photo-1499781350541-7783f6c6a0c8?w=800&h=600&fit=crop', - categories: ['Culture', 'Art'], - description: [ - 'Walk through famous street art laneways', - 'Discover works by renowned artists', - 'Visit independent galleries', - 'Explore vintage and record stores' - ] - }, - { - time: '12:30 pm', - activity: 'Brunswick Street Lunch', - location: 'Brunswick Street Precinct', - address: 'Brunswick Street, Fitzroy VIC 3065', - image: 'https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=800&h=600&fit=crop', - categories: ['Food', 'Drinks'], - description: [ - 'Choose from diverse dining options', - 'Try local cafes and restaurants', - 'Explore bookshops and boutiques', - 'Enjoy the vibrant neighborhood atmosphere' - ] - }, - { - time: '2:30 pm', - activity: 'Carlton Gardens', - location: 'Carlton Gardens', - address: 'Carlton Gardens, Carlton VIC 3053', - image: 'https://images.unsplash.com/photo-1519331379826-f10be5486c6f?w=800&h=600&fit=crop', - categories: ['Nature', 'Culture', 'Landmark'], - description: [ - 'Visit the UNESCO World Heritage site', - 'See the Royal Exhibition Building', - 'Stroll through Victorian-era gardens', - 'Relax by the ornamental fountains' - ] - }, - { - time: '4:00 pm', - activity: 'Melbourne Museum', - location: 'Melbourne Museum', - address: '11 Nicholson Street, Carlton VIC 3053', - image: 'https://images.unsplash.com/photo-1566127992631-137a642a90f4?w=800&h=600&fit=crop', - categories: ['Culture', 'Museum'], - description: [ - 'Explore natural and cultural history', - 'Visit the Bunjilaka Aboriginal Centre', - 'See the Forest Gallery living ecosystem', - 'Discover Melbourne\'s story exhibition' - ] - }, - { - time: '7:00 pm', - activity: 'Rooftop Bar Experience', - location: 'Naked for Satan', - address: '285 Brunswick Street, Fitzroy VIC 3065', - image: 'https://images.unsplash.com/photo-1514933651103-005eec06c04b?w=800&h=600&fit=crop', - categories: ['Drinks', 'Food'], - description: [ - 'Enjoy sunset views from the rooftop', - 'Try Spanish-style pintxos', - 'Sample craft cocktails and local beers', - 'Experience Melbourne\'s bar culture' - ] - } - ] - }, - { - day: 3, - title: "Coastal Adventure", - activities: [ - { - time: '8:00 am', - activity: 'St. Kilda Beach', - location: 'St. Kilda Beach', - address: 'Jacka Boulevard, St Kilda VIC 3182', - image: 'https://images.unsplash.com/photo-1505142468610-359e7d316be0?w=800&h=600&fit=crop', - categories: ['Nature', 'Beach'], - description: [ - 'Morning walk along the iconic beach', - 'Visit the historic St Kilda Pier', - 'See the little penguins at sunset', - 'Explore the Sunday Esplanade Market (weekends)' - ] - }, - { - time: '10:00 am', - activity: 'Acland Street Cafes', - location: 'Acland Street', - address: 'Acland Street, St Kilda VIC 3182', - image: 'https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=800&h=600&fit=crop', - categories: ['Food', 'Drinks'], - description: [ - 'Brunch at famous cake shops', - 'Try traditional European pastries', - 'Visit Lentil as Anything (pay-as-you-feel)', - 'Browse vintage shops and bookstores' - ] - }, - { - time: '12:00 pm', - activity: 'Luna Park Melbourne', - location: 'Luna Park Melbourne', - address: '18 Lower Esplanade, St Kilda VIC 3182', - image: 'https://images.unsplash.com/photo-1513026705753-bc3fffca8bf4?w=800&h=600&fit=crop', - categories: ['Entertainment', 'Landmark'], - description: [ - 'Visit Melbourne\'s iconic amusement park', - 'Ride the historic Scenic Railway (1912)', - 'Take photos at Mr Moon entrance', - 'Enjoy carnival games and rides' - ] - }, - { - time: '2:00 pm', - activity: 'Brighton Beach Boxes', - location: 'Brighton Beach', - address: 'Esplanade, Brighton VIC 3186', - image: 'https://images.unsplash.com/photo-1520208422220-d12a3c588e6c?w=800&h=600&fit=crop', - categories: ['Culture', 'Landmark'], - description: [ - 'Photograph the famous colorful bathing boxes', - 'Walk along the pristine beach', - 'Learn about the heritage structures', - 'Relax in the beachside atmosphere' - ] - }, - { - time: '4:00 pm', - activity: 'Southbank Promenade', - location: 'Southbank', - address: 'Southbank Promenade, Southbank VIC 3006', - image: 'https://images.unsplash.com/photo-1559827260-dc66d52bef19?w=800&h=600&fit=crop', - categories: ['Culture', 'Shopping'], - description: [ - 'Stroll along the Yarra River', - 'Visit arts and craft markets', - 'Explore restaurants and cafes', - 'Enjoy river views and street performers' - ] - }, - { - time: '7:00 pm', - activity: 'Farewell Dinner at Vue de Monde', - location: 'Vue de Monde', - address: 'Level 55, Rialto, 525 Collins Street, Melbourne VIC 3000', - image: 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=800&h=600&fit=crop', - categories: ['Food', 'Drinks', 'Luxury'], - description: [ - 'Experience fine dining at 55th floor', - 'Enjoy panoramic Melbourne views', - 'Taste modern Australian cuisine', - 'Celebrate the end of your journey' - ] - } - ] - } - ] - }; + const generatedItinerary = itineraryDetails ?? null; + const days = generatedItinerary?.days ?? []; + 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) { + return ( + + ); + } + // ───────────────────────────────────────────────────────────────────────────── return (
@@ -422,12 +145,14 @@ export function ItineraryViewPageDesign({

Your{' '} - Magic Itinerary + + {generatedItinerary?.title ?? 'Magic Itinerary'} +

- Here's your personalized {generatedItinerary.totalDays}-day adventure in {generatedItinerary.destination.name}! + Here's your personalized {generatedItinerary?.totalDays}-day adventure in {generatedItinerary?.city}!

@@ -437,6 +162,7 @@ export function ItineraryViewPageDesign({
+ {/* View Toggle */}
@@ -459,31 +185,46 @@ export function ItineraryViewPageDesign({
- {/* Itinerary Overview */} + {/* Itinerary Overview Card */} - -
-
-
{generatedItinerary.totalDays}
-
Days
+ {/* Banner Image */} + +
+ +
+
+

Your Trip

+

{generatedItinerary?.city}

-
-
{generatedItinerary.includedActivities}
-
Activities
+
+ + {/* Stats Row */} +
+
+ {generatedItinerary?.totalDays} + Days
-
-
{generatedItinerary.estimatedCost}
-
Estimated Cost
+
+ {generatedItinerary?.totalStops} + Stops +
+
+ {days[0]?.date} + Start Date
- {/* Daily Plans - Enhanced View */} + {/* ── Daily View ──────────────────────────────────────────────────── */} {viewMode === 'daily' && ( - {generatedItinerary.dailyPlans.map((day, dayIndex) => ( + {days.map((day: any, dayIndex: number) => (
- {/* Location Header with Weather - Only show for first day or when city actually changes */} - {(() => { - // Get current day's destination (fallback to main destination if not specified) - const currentDestination = (day as any).destination || generatedItinerary.destination; - - // Check if this is the first day - if (dayIndex === 0) return true; - - // Check if destination changed from previous day - if (dayIndex > 0) { - const previousDay = generatedItinerary.dailyPlans[dayIndex - 1]; - const previousDestination = (previousDay as any).destination || generatedItinerary.destination; - - // Only show if city name is different - return currentDestination.name !== previousDestination.name; - } - - return false; - })() && ( + + {/* City / Weather header — only on first day */} + {dayIndex === 0 && (

- {((day as any).destination || generatedItinerary.destination).name}, {((day as any).destination || generatedItinerary.destination).country} + {generatedItinerary?.city}, Australia

-

{((day as any).destination || generatedItinerary.destination).weather}

-
-
-
+
)} @@ -540,24 +262,28 @@ export function ItineraryViewPageDesign({ className="flex items-center gap-4 pl-2" >
- {day.day} + {day.dayNumber}
-

Day {day.day}

+

+ Day {day.dayNumber} +

{day.title}

- {/* GMT Label */} + {/* Time-zone label */}
-

GMT

+

+ {day.date} +

- {/* Activity Cards - Desktop Grid Layout */} + {/* Activity Cards */}
- {day.activities.map((activity, actIndex) => { - const activityKey = `day${day.day}-act${actIndex}`; - const isFavorite = favorites.has(activityKey); + {day.items?.map((activity: any, actIndex: number) => { + const activityKey = `day${day.dayNumber}-act${actIndex}`; + // const isFavorite = favorites.has(activityKey); return ( {/* Time Column */}
-
{activity.time}
+
+ {activity.timeSlot} +
{/* Activity Card */}
- {/* Hero Image with Overlay Buttons */} + {/* Hero Image */}
- - {/* Favorite Heart Button - Top Right */} -
+ + {/* Favourite Button */} + {/*
-
+
*/} - {/* Get Directions Button - Bottom Left */} + {/* Get Directions — links to Google Maps via lat/lng */}
-
- {/* Content Section */} + {/* Content */}
- {/* Location Name & Address */}

- {activity.activity} + {activity.title}

- {activity.address} + + {activity.locationName} +
{/* Category Badges */}
- {activity.categories.map((category, catIndex) => ( - ( + - {category} + {cat} ))}
- {/* Activity Details - Bullet Points */} + {/* Description */}
- {activity.description.map((detail, detailIndex) => ( -
- - {detail} -
- ))} +
+ + + {activity.description} + +
@@ -655,7 +390,7 @@ export function ItineraryViewPageDesign({ )} - {/* Summary View */} + {/* ── Summary View ─────────────────────────────────────────────────── */} {viewMode === 'summary' && ( -

Trip Summary

+

+ Trip Summary +

- {generatedItinerary.dailyPlans.map((day, index) => ( -
-
- -

Day {day.day}: {day.title}

-
-
- {day.activities.map((activity, actIndex) => ( -
- -
- {activity.activity} -
- {activity.time} - - {activity.location} + {days.map((day: any, dayIndex: number) => { + // ✅ Match summary to the correct day by dayNumber + const daySummary = summaries.find((s: any) => s.dayNumber === day.dayNumber); + + const dayDate = days[0]?.date + ? new Date( + new Date(days[0].date).setDate( + new Date(days[0].date).getDate() + dayIndex + ) + ).toLocaleDateString('en-AU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + }) + : ''; + + return ( +
+
+
+ +

+ Day {day.dayNumber}: {daySummary?.title ?? day.title} +

+
+ {dayDate} +
+ +
+ {daySummary?.items?.map((item: any, actIndex: number) => ( +
+ +
+ {item.title} +
+ {item.timeSlot} + + {item.locationName} +
-
- ))} + ))} +
-
- ))} + ); + })}
@@ -709,16 +469,11 @@ export function ItineraryViewPageDesign({ Create Another - - @@ -728,7 +483,7 @@ export function ItineraryViewPageDesign({
{/* Footer */} -