payaza-storefront-layouts 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -0
- package/dist/components/learning/CertificateTemplates.d.ts +25 -0
- package/dist/components/learning/CertificateTemplates.d.ts.map +1 -0
- package/dist/components/learning/CertificateTemplates.js +31 -0
- package/dist/components/learning/CertificateViewer.d.ts +11 -0
- package/dist/components/learning/CertificateViewer.d.ts.map +1 -0
- package/dist/components/learning/CertificateViewer.js +114 -0
- package/dist/components/learning/MentorshipProgress.d.ts +18 -0
- package/dist/components/learning/MentorshipProgress.d.ts.map +1 -0
- package/dist/components/learning/MentorshipProgress.js +19 -0
- package/dist/components/ui/address-selector.d.ts +11 -0
- package/dist/components/ui/address-selector.d.ts.map +1 -0
- package/dist/components/ui/address-selector.js +21 -0
- package/dist/components/ui/avatar-image.d.ts +11 -0
- package/dist/components/ui/avatar-image.d.ts.map +1 -0
- package/dist/components/ui/avatar-image.js +39 -0
- package/dist/components/ui/background-patterns.d.ts +27 -0
- package/dist/components/ui/background-patterns.d.ts.map +1 -0
- package/dist/components/ui/background-patterns.js +5 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +20 -0
- package/dist/components/ui/breadcrumbs.d.ts +11 -0
- package/dist/components/ui/breadcrumbs.d.ts.map +1 -0
- package/dist/components/ui/breadcrumbs.js +8 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +33 -0
- package/dist/components/ui/card.d.ts +10 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +24 -0
- package/dist/components/ui/category-tree.d.ts +16 -0
- package/dist/components/ui/category-tree.d.ts.map +1 -0
- package/dist/components/ui/category-tree.js +74 -0
- package/dist/components/ui/checkout-button.d.ts +11 -0
- package/dist/components/ui/checkout-button.d.ts.map +1 -0
- package/dist/components/ui/checkout-button.js +174 -0
- package/dist/components/ui/guest-checkout-modal.d.ts +19 -0
- package/dist/components/ui/guest-checkout-modal.d.ts.map +1 -0
- package/dist/components/ui/guest-checkout-modal.js +92 -0
- package/dist/components/ui/image-skeleton.d.ts +7 -0
- package/dist/components/ui/image-skeleton.d.ts.map +1 -0
- package/dist/components/ui/image-skeleton.js +15 -0
- package/dist/components/ui/image-with-fallback.d.ts +9 -0
- package/dist/components/ui/image-with-fallback.d.ts.map +1 -0
- package/dist/components/ui/image-with-fallback.js +203 -0
- package/dist/components/ui/input.d.ts +6 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +8 -0
- package/dist/components/ui/loading-skeleton-wrapper.d.ts +6 -0
- package/dist/components/ui/loading-skeleton-wrapper.d.ts.map +1 -0
- package/dist/components/ui/loading-skeleton-wrapper.js +10 -0
- package/dist/components/ui/modal.d.ts +11 -0
- package/dist/components/ui/modal.d.ts.map +1 -0
- package/dist/components/ui/modal.js +26 -0
- package/dist/components/ui/otp-input.d.ts +10 -0
- package/dist/components/ui/otp-input.d.ts.map +1 -0
- package/dist/components/ui/otp-input.js +57 -0
- package/dist/components/ui/out-of-stock-overlay.d.ts +8 -0
- package/dist/components/ui/out-of-stock-overlay.d.ts.map +1 -0
- package/dist/components/ui/out-of-stock-overlay.js +12 -0
- package/dist/components/ui/page-animate-wrapper.d.ts +7 -0
- package/dist/components/ui/page-animate-wrapper.d.ts.map +1 -0
- package/dist/components/ui/page-animate-wrapper.js +16 -0
- package/dist/components/ui/page-content-loader.d.ts +13 -0
- package/dist/components/ui/page-content-loader.d.ts.map +1 -0
- package/dist/components/ui/page-content-loader.js +12 -0
- package/dist/components/ui/page-loader.d.ts +20 -0
- package/dist/components/ui/page-loader.d.ts.map +1 -0
- package/dist/components/ui/page-loader.js +31 -0
- package/dist/components/ui/product-card.d.ts +11 -0
- package/dist/components/ui/product-card.d.ts.map +1 -0
- package/dist/components/ui/product-card.js +95 -0
- package/dist/components/ui/product-rating.d.ts +17 -0
- package/dist/components/ui/product-rating.d.ts.map +1 -0
- package/dist/components/ui/product-rating.js +54 -0
- package/dist/components/ui/review-form.d.ts +9 -0
- package/dist/components/ui/review-form.d.ts.map +1 -0
- package/dist/components/ui/review-form.js +28 -0
- package/dist/components/ui/route-skeleton-loader.d.ts +7 -0
- package/dist/components/ui/route-skeleton-loader.d.ts.map +1 -0
- package/dist/components/ui/route-skeleton-loader.js +75 -0
- package/dist/components/ui/sheet.d.ts +12 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sheet.js +29 -0
- package/dist/components/ui/skeleton.d.ts +3 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +6 -0
- package/dist/components/ui/skeletons/category-grid-skeleton.d.ts +6 -0
- package/dist/components/ui/skeletons/category-grid-skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeletons/category-grid-skeleton.js +16 -0
- package/dist/components/ui/skeletons/checkout-skeleton.d.ts +2 -0
- package/dist/components/ui/skeletons/checkout-skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeletons/checkout-skeleton.js +4 -0
- package/dist/components/ui/skeletons/index.d.ts +6 -0
- package/dist/components/ui/skeletons/index.d.ts.map +1 -0
- package/dist/components/ui/skeletons/index.js +5 -0
- package/dist/components/ui/skeletons/page-skeleton.d.ts +2 -0
- package/dist/components/ui/skeletons/page-skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeletons/page-skeleton.js +4 -0
- package/dist/components/ui/skeletons/product-card-skeleton.d.ts +2 -0
- package/dist/components/ui/skeletons/product-card-skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeletons/product-card-skeleton.js +4 -0
- package/dist/components/ui/skeletons/product-detail-skeleton.d.ts +2 -0
- package/dist/components/ui/skeletons/product-detail-skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeletons/product-detail-skeleton.js +4 -0
- package/dist/components/ui/skeletons/product-grid-skeleton.d.ts +7 -0
- package/dist/components/ui/skeletons/product-grid-skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeletons/product-grid-skeleton.js +12 -0
- package/dist/components/ui/store-logos.d.ts +43 -0
- package/dist/components/ui/store-logos.d.ts.map +1 -0
- package/dist/components/ui/store-logos.js +83 -0
- package/dist/components/ui/toast.d.ts +19 -0
- package/dist/components/ui/toast.d.ts.map +1 -0
- package/dist/components/ui/toast.js +33 -0
- package/dist/components/ui/video-player.d.ts +48 -0
- package/dist/components/ui/video-player.d.ts.map +1 -0
- package/dist/components/ui/video-player.js +96 -0
- package/dist/hooks/use-analytics.d.ts +14 -0
- package/dist/hooks/use-analytics.d.ts.map +1 -0
- package/dist/hooks/use-analytics.js +66 -0
- package/dist/hooks/use-api.d.ts +17 -0
- package/dist/hooks/use-api.d.ts.map +1 -0
- package/dist/hooks/use-api.js +53 -0
- package/dist/hooks/use-cart-api.d.ts +17 -0
- package/dist/hooks/use-cart-api.d.ts.map +1 -0
- package/dist/hooks/use-cart-api.js +134 -0
- package/dist/hooks/use-content-ready.d.ts +17 -0
- package/dist/hooks/use-content-ready.d.ts.map +1 -0
- package/dist/hooks/use-content-ready.js +197 -0
- package/dist/hooks/use-navigation-loading.d.ts +4 -0
- package/dist/hooks/use-navigation-loading.d.ts.map +1 -0
- package/dist/hooks/use-navigation-loading.js +14 -0
- package/dist/hooks/use-payaza-checkout.d.ts +14 -0
- package/dist/hooks/use-payaza-checkout.d.ts.map +1 -0
- package/dist/hooks/use-payaza-checkout.js +56 -0
- package/dist/hooks/use-products-api.d.ts +19 -0
- package/dist/hooks/use-products-api.d.ts.map +1 -0
- package/dist/hooks/use-products-api.js +84 -0
- package/dist/hooks/use-store-api.d.ts +12 -0
- package/dist/hooks/use-store-api.d.ts.map +1 -0
- package/dist/hooks/use-store-api.js +73 -0
- package/dist/index.d.ts +116 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +126 -0
- package/dist/json/booking-agenda.json +18 -0
- package/dist/json/booking.json +71 -0
- package/dist/json/clothing-minimal.json +26 -0
- package/dist/json/clothing.json +169 -0
- package/dist/json/electronics-grid.json +18 -0
- package/dist/json/electronics.json +50 -0
- package/dist/json/food-modern.json +38 -0
- package/dist/json/food.json +85 -0
- package/dist/json/json-map.d.ts +7 -0
- package/dist/json/json-map.d.ts.map +1 -0
- package/dist/json/json-map.js +36 -0
- package/dist/json/motivational-speaker.json +96 -0
- package/dist/layouts/booking/components/BookingHomePage.d.ts +7 -0
- package/dist/layouts/booking/components/BookingHomePage.d.ts.map +1 -0
- package/dist/layouts/booking/components/BookingHomePage.js +49 -0
- package/dist/layouts/booking/index.d.ts +9 -0
- package/dist/layouts/booking/index.d.ts.map +1 -0
- package/dist/layouts/booking/index.js +9 -0
- package/dist/layouts/booking/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/booking/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/booking/pages/AboutPage.js +45 -0
- package/dist/layouts/booking/pages/BookPage.d.ts +8 -0
- package/dist/layouts/booking/pages/BookPage.d.ts.map +1 -0
- package/dist/layouts/booking/pages/BookPage.js +441 -0
- package/dist/layouts/booking/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/booking/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/booking/pages/CategoriesPage.js +162 -0
- package/dist/layouts/booking/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/booking/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/booking/pages/CategoryPage.js +67 -0
- package/dist/layouts/booking/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/booking/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/booking/pages/ContactPage.js +20 -0
- package/dist/layouts/booking/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/booking/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/booking/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/booking/pages/ServicesPage.d.ts +9 -0
- package/dist/layouts/booking/pages/ServicesPage.d.ts.map +1 -0
- package/dist/layouts/booking/pages/ServicesPage.js +31 -0
- package/dist/layouts/booking-agenda/components/BookingHomePageAgenda.d.ts +7 -0
- package/dist/layouts/booking-agenda/components/BookingHomePageAgenda.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/components/BookingHomePageAgenda.js +186 -0
- package/dist/layouts/booking-agenda/index.d.ts +9 -0
- package/dist/layouts/booking-agenda/index.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/index.js +9 -0
- package/dist/layouts/booking-agenda/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/booking-agenda/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/pages/AboutPage.js +45 -0
- package/dist/layouts/booking-agenda/pages/BookPage.d.ts +8 -0
- package/dist/layouts/booking-agenda/pages/BookPage.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/pages/BookPage.js +441 -0
- package/dist/layouts/booking-agenda/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/booking-agenda/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/pages/CategoriesPage.js +162 -0
- package/dist/layouts/booking-agenda/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/booking-agenda/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/pages/CategoryPage.js +67 -0
- package/dist/layouts/booking-agenda/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/booking-agenda/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/pages/ContactPage.js +20 -0
- package/dist/layouts/booking-agenda/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/booking-agenda/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/booking-agenda/pages/ServicesPage.d.ts +9 -0
- package/dist/layouts/booking-agenda/pages/ServicesPage.d.ts.map +1 -0
- package/dist/layouts/booking-agenda/pages/ServicesPage.js +31 -0
- package/dist/layouts/clothing/components/ClothingHomePage.d.ts +7 -0
- package/dist/layouts/clothing/components/ClothingHomePage.d.ts.map +1 -0
- package/dist/layouts/clothing/components/ClothingHomePage.js +295 -0
- package/dist/layouts/clothing/index.d.ts +8 -0
- package/dist/layouts/clothing/index.d.ts.map +1 -0
- package/dist/layouts/clothing/index.js +8 -0
- package/dist/layouts/clothing/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/clothing/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/clothing/pages/AboutPage.js +45 -0
- package/dist/layouts/clothing/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/clothing/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/clothing/pages/CategoriesPage.js +162 -0
- package/dist/layouts/clothing/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/clothing/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/clothing/pages/CategoryPage.js +67 -0
- package/dist/layouts/clothing/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/clothing/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/clothing/pages/ContactPage.js +20 -0
- package/dist/layouts/clothing/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/clothing/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/clothing/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/clothing/pages/ProductsPage.d.ts +7 -0
- package/dist/layouts/clothing/pages/ProductsPage.d.ts.map +1 -0
- package/dist/layouts/clothing/pages/ProductsPage.js +297 -0
- package/dist/layouts/clothing-minimal/components/ClothingHomePageMinimal.d.ts +7 -0
- package/dist/layouts/clothing-minimal/components/ClothingHomePageMinimal.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/components/ClothingHomePageMinimal.js +48 -0
- package/dist/layouts/clothing-minimal/index.d.ts +8 -0
- package/dist/layouts/clothing-minimal/index.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/index.js +8 -0
- package/dist/layouts/clothing-minimal/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/clothing-minimal/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/pages/AboutPage.js +45 -0
- package/dist/layouts/clothing-minimal/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/clothing-minimal/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/pages/CategoriesPage.js +162 -0
- package/dist/layouts/clothing-minimal/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/clothing-minimal/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/pages/CategoryPage.js +67 -0
- package/dist/layouts/clothing-minimal/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/clothing-minimal/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/pages/ContactPage.js +20 -0
- package/dist/layouts/clothing-minimal/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/clothing-minimal/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/clothing-minimal/pages/ProductsPage.d.ts +7 -0
- package/dist/layouts/clothing-minimal/pages/ProductsPage.d.ts.map +1 -0
- package/dist/layouts/clothing-minimal/pages/ProductsPage.js +297 -0
- package/dist/layouts/electronics/components/ElectronicsCategoriesPage.d.ts +7 -0
- package/dist/layouts/electronics/components/ElectronicsCategoriesPage.d.ts.map +1 -0
- package/dist/layouts/electronics/components/ElectronicsCategoriesPage.js +34 -0
- package/dist/layouts/electronics/components/ElectronicsGridProductCard.d.ts +10 -0
- package/dist/layouts/electronics/components/ElectronicsGridProductCard.d.ts.map +1 -0
- package/dist/layouts/electronics/components/ElectronicsGridProductCard.js +107 -0
- package/dist/layouts/electronics/components/ElectronicsHomePage.d.ts +7 -0
- package/dist/layouts/electronics/components/ElectronicsHomePage.d.ts.map +1 -0
- package/dist/layouts/electronics/components/ElectronicsHomePage.js +78 -0
- package/dist/layouts/electronics/components/ElectronicsPageWrapper.d.ts +8 -0
- package/dist/layouts/electronics/components/ElectronicsPageWrapper.d.ts.map +1 -0
- package/dist/layouts/electronics/components/ElectronicsPageWrapper.js +10 -0
- package/dist/layouts/electronics/components/ElectronicsProductsPage.d.ts +7 -0
- package/dist/layouts/electronics/components/ElectronicsProductsPage.d.ts.map +1 -0
- package/dist/layouts/electronics/components/ElectronicsProductsPage.js +100 -0
- package/dist/layouts/electronics/components/ElectronicsStoreFooter.d.ts +7 -0
- package/dist/layouts/electronics/components/ElectronicsStoreFooter.d.ts.map +1 -0
- package/dist/layouts/electronics/components/ElectronicsStoreFooter.js +10 -0
- package/dist/layouts/electronics/components/ElectronicsStoreHeader.d.ts +7 -0
- package/dist/layouts/electronics/components/ElectronicsStoreHeader.d.ts.map +1 -0
- package/dist/layouts/electronics/components/ElectronicsStoreHeader.js +27 -0
- package/dist/layouts/electronics/index.d.ts +19 -0
- package/dist/layouts/electronics/index.d.ts.map +1 -0
- package/dist/layouts/electronics/index.js +19 -0
- package/dist/layouts/electronics/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/AboutPage.js +45 -0
- package/dist/layouts/electronics/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/CategoriesPage.js +6 -0
- package/dist/layouts/electronics/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/electronics/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/CategoryPage.js +67 -0
- package/dist/layouts/electronics/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/ContactPage.js +20 -0
- package/dist/layouts/electronics/pages/HelpCenterPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/HelpCenterPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/HelpCenterPage.js +55 -0
- package/dist/layouts/electronics/pages/PrivacyPolicyPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/PrivacyPolicyPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/PrivacyPolicyPage.js +8 -0
- package/dist/layouts/electronics/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/electronics/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/electronics/pages/ProductsPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/ProductsPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/ProductsPage.js +297 -0
- package/dist/layouts/electronics/pages/ShippingReturnsPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/ShippingReturnsPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/ShippingReturnsPage.js +7 -0
- package/dist/layouts/electronics/pages/TermsPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/TermsPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/TermsPage.js +8 -0
- package/dist/layouts/electronics/pages/TrackOrderPage.d.ts +7 -0
- package/dist/layouts/electronics/pages/TrackOrderPage.d.ts.map +1 -0
- package/dist/layouts/electronics/pages/TrackOrderPage.js +371 -0
- package/dist/layouts/electronics-grid/components/ElectronicsGridProductCard.d.ts +10 -0
- package/dist/layouts/electronics-grid/components/ElectronicsGridProductCard.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/components/ElectronicsGridProductCard.js +107 -0
- package/dist/layouts/electronics-grid/components/ElectronicsHomePageGrid.d.ts +7 -0
- package/dist/layouts/electronics-grid/components/ElectronicsHomePageGrid.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/components/ElectronicsHomePageGrid.js +89 -0
- package/dist/layouts/electronics-grid/index.d.ts +15 -0
- package/dist/layouts/electronics-grid/index.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/index.js +15 -0
- package/dist/layouts/electronics-grid/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/AboutPage.js +45 -0
- package/dist/layouts/electronics-grid/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/CategoriesPage.js +6 -0
- package/dist/layouts/electronics-grid/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/electronics-grid/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/CategoryPage.js +67 -0
- package/dist/layouts/electronics-grid/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/ContactPage.js +20 -0
- package/dist/layouts/electronics-grid/pages/ElectronicsGridCategoriesPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/ElectronicsGridCategoriesPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/ElectronicsGridCategoriesPage.js +15 -0
- package/dist/layouts/electronics-grid/pages/HelpCenterPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/HelpCenterPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/HelpCenterPage.js +55 -0
- package/dist/layouts/electronics-grid/pages/PrivacyPolicyPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/PrivacyPolicyPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/PrivacyPolicyPage.js +8 -0
- package/dist/layouts/electronics-grid/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/electronics-grid/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/electronics-grid/pages/ProductsPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/ProductsPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/ProductsPage.js +297 -0
- package/dist/layouts/electronics-grid/pages/ShippingReturnsPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/ShippingReturnsPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/ShippingReturnsPage.js +7 -0
- package/dist/layouts/electronics-grid/pages/TermsPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/TermsPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/TermsPage.js +8 -0
- package/dist/layouts/electronics-grid/pages/TrackOrderPage.d.ts +7 -0
- package/dist/layouts/electronics-grid/pages/TrackOrderPage.d.ts.map +1 -0
- package/dist/layouts/electronics-grid/pages/TrackOrderPage.js +371 -0
- package/dist/layouts/food/components/FoodHomePage.d.ts +7 -0
- package/dist/layouts/food/components/FoodHomePage.d.ts.map +1 -0
- package/dist/layouts/food/components/FoodHomePage.js +304 -0
- package/dist/layouts/food/index.d.ts +9 -0
- package/dist/layouts/food/index.d.ts.map +1 -0
- package/dist/layouts/food/index.js +9 -0
- package/dist/layouts/food/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/food/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/food/pages/AboutPage.js +45 -0
- package/dist/layouts/food/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/food/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/food/pages/CategoriesPage.js +162 -0
- package/dist/layouts/food/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/food/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/food/pages/CategoryPage.js +67 -0
- package/dist/layouts/food/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/food/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/food/pages/ContactPage.js +20 -0
- package/dist/layouts/food/pages/MenuPage.d.ts +8 -0
- package/dist/layouts/food/pages/MenuPage.d.ts.map +1 -0
- package/dist/layouts/food/pages/MenuPage.js +75 -0
- package/dist/layouts/food/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/food/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/food/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/food/pages/ProductsPage.d.ts +7 -0
- package/dist/layouts/food/pages/ProductsPage.d.ts.map +1 -0
- package/dist/layouts/food/pages/ProductsPage.js +297 -0
- package/dist/layouts/food-modern/components/FoodHomePageModern.d.ts +7 -0
- package/dist/layouts/food-modern/components/FoodHomePageModern.d.ts.map +1 -0
- package/dist/layouts/food-modern/components/FoodHomePageModern.js +118 -0
- package/dist/layouts/food-modern/index.d.ts +9 -0
- package/dist/layouts/food-modern/index.d.ts.map +1 -0
- package/dist/layouts/food-modern/index.js +9 -0
- package/dist/layouts/food-modern/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/food-modern/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/food-modern/pages/AboutPage.js +45 -0
- package/dist/layouts/food-modern/pages/CategoriesPage.d.ts +7 -0
- package/dist/layouts/food-modern/pages/CategoriesPage.d.ts.map +1 -0
- package/dist/layouts/food-modern/pages/CategoriesPage.js +162 -0
- package/dist/layouts/food-modern/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/food-modern/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/food-modern/pages/CategoryPage.js +67 -0
- package/dist/layouts/food-modern/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/food-modern/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/food-modern/pages/ContactPage.js +20 -0
- package/dist/layouts/food-modern/pages/MenuPage.d.ts +8 -0
- package/dist/layouts/food-modern/pages/MenuPage.d.ts.map +1 -0
- package/dist/layouts/food-modern/pages/MenuPage.js +75 -0
- package/dist/layouts/food-modern/pages/ProductDetailPage.d.ts +8 -0
- package/dist/layouts/food-modern/pages/ProductDetailPage.d.ts.map +1 -0
- package/dist/layouts/food-modern/pages/ProductDetailPage.js +502 -0
- package/dist/layouts/food-modern/pages/ProductsPage.d.ts +7 -0
- package/dist/layouts/food-modern/pages/ProductsPage.d.ts.map +1 -0
- package/dist/layouts/food-modern/pages/ProductsPage.js +297 -0
- package/dist/layouts/motivational-speaker/components/MotivationalHomePage.d.ts +7 -0
- package/dist/layouts/motivational-speaker/components/MotivationalHomePage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/components/MotivationalHomePage.js +115 -0
- package/dist/layouts/motivational-speaker/components/MotivationalPageWrapper.d.ts +8 -0
- package/dist/layouts/motivational-speaker/components/MotivationalPageWrapper.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/components/MotivationalPageWrapper.js +10 -0
- package/dist/layouts/motivational-speaker/index.d.ts +10 -0
- package/dist/layouts/motivational-speaker/index.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/index.js +10 -0
- package/dist/layouts/motivational-speaker/pages/AboutPage.d.ts +7 -0
- package/dist/layouts/motivational-speaker/pages/AboutPage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/pages/AboutPage.js +45 -0
- package/dist/layouts/motivational-speaker/pages/CategoryPage.d.ts +8 -0
- package/dist/layouts/motivational-speaker/pages/CategoryPage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/pages/CategoryPage.js +67 -0
- package/dist/layouts/motivational-speaker/pages/ContactPage.d.ts +7 -0
- package/dist/layouts/motivational-speaker/pages/ContactPage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/pages/ContactPage.js +20 -0
- package/dist/layouts/motivational-speaker/pages/ProductsPage.d.ts +7 -0
- package/dist/layouts/motivational-speaker/pages/ProductsPage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/pages/ProductsPage.js +297 -0
- package/dist/layouts/motivational-speaker/pages/ServiceDetailPage.d.ts +8 -0
- package/dist/layouts/motivational-speaker/pages/ServiceDetailPage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/pages/ServiceDetailPage.js +144 -0
- package/dist/layouts/motivational-speaker/pages/ServicesPage.d.ts +9 -0
- package/dist/layouts/motivational-speaker/pages/ServicesPage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/pages/ServicesPage.js +31 -0
- package/dist/layouts/motivational-speaker/pages/SubscriptionPage.d.ts +7 -0
- package/dist/layouts/motivational-speaker/pages/SubscriptionPage.d.ts.map +1 -0
- package/dist/layouts/motivational-speaker/pages/SubscriptionPage.js +136 -0
- package/dist/layouts/shared/components/BaseStoreLayout.d.ts +8 -0
- package/dist/layouts/shared/components/BaseStoreLayout.d.ts.map +1 -0
- package/dist/layouts/shared/components/BaseStoreLayout.js +59 -0
- package/dist/layouts/shared/components/GenericPageWrapper.d.ts +8 -0
- package/dist/layouts/shared/components/GenericPageWrapper.d.ts.map +1 -0
- package/dist/layouts/shared/components/GenericPageWrapper.js +19 -0
- package/dist/layouts/shared/components/PromoBanner.d.ts +9 -0
- package/dist/layouts/shared/components/PromoBanner.d.ts.map +1 -0
- package/dist/layouts/shared/components/PromoBanner.js +14 -0
- package/dist/layouts/shared/components/StoreFooter.d.ts +7 -0
- package/dist/layouts/shared/components/StoreFooter.d.ts.map +1 -0
- package/dist/layouts/shared/components/StoreFooter.js +147 -0
- package/dist/layouts/shared/components/StoreHeader.d.ts +8 -0
- package/dist/layouts/shared/components/StoreHeader.d.ts.map +1 -0
- package/dist/layouts/shared/components/StoreHeader.js +87 -0
- package/dist/layouts/shared/components/TestimonialCard.d.ts +8 -0
- package/dist/layouts/shared/components/TestimonialCard.d.ts.map +1 -0
- package/dist/layouts/shared/components/TestimonialCard.js +10 -0
- package/dist/layouts/shared/index.d.ts +23 -0
- package/dist/layouts/shared/index.d.ts.map +1 -0
- package/dist/layouts/shared/index.js +23 -0
- package/dist/layouts/shared/pages/AccountPage.d.ts +7 -0
- package/dist/layouts/shared/pages/AccountPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/AccountPage.js +605 -0
- package/dist/layouts/shared/pages/CartPage.d.ts +7 -0
- package/dist/layouts/shared/pages/CartPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/CartPage.js +83 -0
- package/dist/layouts/shared/pages/CheckoutPage.d.ts +7 -0
- package/dist/layouts/shared/pages/CheckoutPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/CheckoutPage.js +860 -0
- package/dist/layouts/shared/pages/CookiePolicyPage.d.ts +7 -0
- package/dist/layouts/shared/pages/CookiePolicyPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/CookiePolicyPage.js +8 -0
- package/dist/layouts/shared/pages/FeatureDisabledPage.d.ts +9 -0
- package/dist/layouts/shared/pages/FeatureDisabledPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/FeatureDisabledPage.js +8 -0
- package/dist/layouts/shared/pages/HelpCenterPage.d.ts +7 -0
- package/dist/layouts/shared/pages/HelpCenterPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/HelpCenterPage.js +55 -0
- package/dist/layouts/shared/pages/MaintenancePage.d.ts +7 -0
- package/dist/layouts/shared/pages/MaintenancePage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/MaintenancePage.js +44 -0
- package/dist/layouts/shared/pages/PortfolioPage.d.ts +7 -0
- package/dist/layouts/shared/pages/PortfolioPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/PortfolioPage.js +130 -0
- package/dist/layouts/shared/pages/PrivacyPolicyPage.d.ts +7 -0
- package/dist/layouts/shared/pages/PrivacyPolicyPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/PrivacyPolicyPage.js +8 -0
- package/dist/layouts/shared/pages/ShippingReturnsPage.d.ts +7 -0
- package/dist/layouts/shared/pages/ShippingReturnsPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/ShippingReturnsPage.js +7 -0
- package/dist/layouts/shared/pages/SizeGuidePage.d.ts +7 -0
- package/dist/layouts/shared/pages/SizeGuidePage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/SizeGuidePage.js +10 -0
- package/dist/layouts/shared/pages/StyleGuidePage.d.ts +7 -0
- package/dist/layouts/shared/pages/StyleGuidePage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/StyleGuidePage.js +126 -0
- package/dist/layouts/shared/pages/TeamPage.d.ts +7 -0
- package/dist/layouts/shared/pages/TeamPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/TeamPage.js +39 -0
- package/dist/layouts/shared/pages/TermsPage.d.ts +7 -0
- package/dist/layouts/shared/pages/TermsPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/TermsPage.js +8 -0
- package/dist/layouts/shared/pages/TrackOrderPage.d.ts +7 -0
- package/dist/layouts/shared/pages/TrackOrderPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/TrackOrderPage.js +371 -0
- package/dist/layouts/shared/pages/WishlistPage.d.ts +7 -0
- package/dist/layouts/shared/pages/WishlistPage.d.ts.map +1 -0
- package/dist/layouts/shared/pages/WishlistPage.js +162 -0
- package/dist/lib/api.d.ts +8 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +109 -0
- package/dist/lib/auth-context.d.ts +30 -0
- package/dist/lib/auth-context.d.ts.map +1 -0
- package/dist/lib/auth-context.js +207 -0
- package/dist/lib/content-selectors.d.ts +21 -0
- package/dist/lib/content-selectors.d.ts.map +1 -0
- package/dist/lib/content-selectors.js +75 -0
- package/dist/lib/countries.d.ts +11 -0
- package/dist/lib/countries.d.ts.map +1 -0
- package/dist/lib/countries.js +252 -0
- package/dist/lib/currency-symbols.d.ts +36 -0
- package/dist/lib/currency-symbols.d.ts.map +1 -0
- package/dist/lib/currency-symbols.js +153 -0
- package/dist/lib/guest-user.d.ts +27 -0
- package/dist/lib/guest-user.d.ts.map +1 -0
- package/dist/lib/guest-user.js +71 -0
- package/dist/lib/loading-context.d.ts +19 -0
- package/dist/lib/loading-context.d.ts.map +1 -0
- package/dist/lib/loading-context.js +197 -0
- package/dist/lib/mock-stores.d.ts +22 -0
- package/dist/lib/mock-stores.d.ts.map +1 -0
- package/dist/lib/mock-stores.js +2099 -0
- package/dist/lib/payaza-checkout.d.ts +167 -0
- package/dist/lib/payaza-checkout.d.ts.map +1 -0
- package/dist/lib/payaza-checkout.js +455 -0
- package/dist/lib/services/analytics.service.d.ts +58 -0
- package/dist/lib/services/analytics.service.d.ts.map +1 -0
- package/dist/lib/services/analytics.service.js +182 -0
- package/dist/lib/services/auth.service.d.ts +63 -0
- package/dist/lib/services/auth.service.d.ts.map +1 -0
- package/dist/lib/services/auth.service.js +101 -0
- package/dist/lib/services/booking.service.d.ts +53 -0
- package/dist/lib/services/booking.service.d.ts.map +1 -0
- package/dist/lib/services/booking.service.js +52 -0
- package/dist/lib/services/cart.service.d.ts +37 -0
- package/dist/lib/services/cart.service.d.ts.map +1 -0
- package/dist/lib/services/cart.service.js +55 -0
- package/dist/lib/services/category.service.d.ts +21 -0
- package/dist/lib/services/category.service.d.ts.map +1 -0
- package/dist/lib/services/category.service.js +41 -0
- package/dist/lib/services/checkout.service.d.ts +79 -0
- package/dist/lib/services/checkout.service.d.ts.map +1 -0
- package/dist/lib/services/checkout.service.js +37 -0
- package/dist/lib/services/customer.service.d.ts +52 -0
- package/dist/lib/services/customer.service.d.ts.map +1 -0
- package/dist/lib/services/customer.service.js +64 -0
- package/dist/lib/services/fees.service.d.ts +23 -0
- package/dist/lib/services/fees.service.d.ts.map +1 -0
- package/dist/lib/services/fees.service.js +13 -0
- package/dist/lib/services/index.d.ts +19 -0
- package/dist/lib/services/index.d.ts.map +1 -0
- package/dist/lib/services/index.js +18 -0
- package/dist/lib/services/order.service.d.ts +107 -0
- package/dist/lib/services/order.service.d.ts.map +1 -0
- package/dist/lib/services/order.service.js +82 -0
- package/dist/lib/services/payment.service.d.ts +51 -0
- package/dist/lib/services/payment.service.d.ts.map +1 -0
- package/dist/lib/services/payment.service.js +105 -0
- package/dist/lib/services/product.service.d.ts +90 -0
- package/dist/lib/services/product.service.d.ts.map +1 -0
- package/dist/lib/services/product.service.js +86 -0
- package/dist/lib/services/promo.service.d.ts +31 -0
- package/dist/lib/services/promo.service.d.ts.map +1 -0
- package/dist/lib/services/promo.service.js +29 -0
- package/dist/lib/services/review.service.d.ts +47 -0
- package/dist/lib/services/review.service.d.ts.map +1 -0
- package/dist/lib/services/review.service.js +54 -0
- package/dist/lib/services/service.service.d.ts +55 -0
- package/dist/lib/services/service.service.d.ts.map +1 -0
- package/dist/lib/services/service.service.js +37 -0
- package/dist/lib/services/shipping.service.d.ts +44 -0
- package/dist/lib/services/shipping.service.d.ts.map +1 -0
- package/dist/lib/services/shipping.service.js +23 -0
- package/dist/lib/services/store.service.d.ts +87 -0
- package/dist/lib/services/store.service.d.ts.map +1 -0
- package/dist/lib/services/store.service.js +41 -0
- package/dist/lib/services/wishlist.service.d.ts +30 -0
- package/dist/lib/services/wishlist.service.d.ts.map +1 -0
- package/dist/lib/services/wishlist.service.js +53 -0
- package/dist/lib/store-config-utils.d.ts +41 -0
- package/dist/lib/store-config-utils.d.ts.map +1 -0
- package/dist/lib/store-config-utils.js +1535 -0
- package/dist/lib/store-config.d.ts +3 -0
- package/dist/lib/store-config.d.ts.map +1 -0
- package/dist/lib/store-config.js +2 -0
- package/dist/lib/store-context.d.ts +39 -0
- package/dist/lib/store-context.d.ts.map +1 -0
- package/dist/lib/store-context.js +803 -0
- package/dist/lib/store-types.d.ts +663 -0
- package/dist/lib/store-types.d.ts.map +1 -0
- package/dist/lib/store-types.js +1 -0
- package/dist/lib/utils/asset-helpers.d.ts +102 -0
- package/dist/lib/utils/asset-helpers.d.ts.map +1 -0
- package/dist/lib/utils/asset-helpers.js +395 -0
- package/dist/lib/utils/category-tree.d.ts +25 -0
- package/dist/lib/utils/category-tree.d.ts.map +1 -0
- package/dist/lib/utils/category-tree.js +85 -0
- package/dist/lib/utils/demo-detection.d.ts +23 -0
- package/dist/lib/utils/demo-detection.d.ts.map +1 -0
- package/dist/lib/utils/demo-detection.js +36 -0
- package/dist/lib/utils/fee-calculations.d.ts +35 -0
- package/dist/lib/utils/fee-calculations.d.ts.map +1 -0
- package/dist/lib/utils/fee-calculations.js +64 -0
- package/dist/lib/utils/index.d.ts +37 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +160 -0
- package/dist/lib/utils/url-helpers.d.ts +30 -0
- package/dist/lib/utils/url-helpers.d.ts.map +1 -0
- package/dist/lib/utils/url-helpers.js +56 -0
- package/dist/lib/utils/video-helpers.d.ts +32 -0
- package/dist/lib/utils/video-helpers.d.ts.map +1 -0
- package/dist/lib/utils/video-helpers.js +210 -0
- package/package.json +92 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import { Clock, Check, ChevronRight, ChevronLeft, ArrowLeft, ShieldCheck, CheckCircle2, Lock } from 'lucide-react';
|
|
5
|
+
import { Button } from '../../../components/ui/button';
|
|
6
|
+
import { cn, formatCurrency } from '../../../lib/utils';
|
|
7
|
+
import Link from 'next/link';
|
|
8
|
+
import { ImageWithFallback } from '../../../components/ui/image-with-fallback';
|
|
9
|
+
import { usePayazaCheckout } from '../../../hooks/use-payaza-checkout';
|
|
10
|
+
import { generateCheckoutConfig } from '../../../lib/payaza-checkout';
|
|
11
|
+
import { checkoutService } from '../../../lib/services/checkout.service';
|
|
12
|
+
import { paymentService } from '../../../lib/services/payment.service';
|
|
13
|
+
import { useToast } from '../../../components/ui/toast';
|
|
14
|
+
import { useRouter, useSearchParams } from 'next/navigation';
|
|
15
|
+
import { useAuth } from '../../../lib/auth-context';
|
|
16
|
+
export function BookPage({ storeConfig, serviceSlug }) {
|
|
17
|
+
const primaryColor = storeConfig.branding.primaryColor;
|
|
18
|
+
const { addToast } = useToast();
|
|
19
|
+
const router = useRouter();
|
|
20
|
+
const searchParams = useSearchParams();
|
|
21
|
+
const { user, isAuthenticated } = useAuth();
|
|
22
|
+
// Get service slug from query params or prop
|
|
23
|
+
const serviceSlugFromQuery = searchParams?.get('service') || null;
|
|
24
|
+
const effectiveServiceSlug = serviceSlug || serviceSlugFromQuery;
|
|
25
|
+
// State
|
|
26
|
+
const [currentStep, setCurrentStep] = useState(effectiveServiceSlug ? 'datetime' : 'service');
|
|
27
|
+
const [selectedService, setSelectedService] = useState(null);
|
|
28
|
+
const [selectedDate, setSelectedDate] = useState(null);
|
|
29
|
+
const [currentMonth, setCurrentMonth] = useState(new Date());
|
|
30
|
+
const [selectedTime, setSelectedTime] = useState(null);
|
|
31
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
32
|
+
const [guestInfo, setGuestInfo] = useState({
|
|
33
|
+
firstName: '',
|
|
34
|
+
lastName: '',
|
|
35
|
+
email: '',
|
|
36
|
+
phone: '',
|
|
37
|
+
notes: '',
|
|
38
|
+
address: '',
|
|
39
|
+
city: '',
|
|
40
|
+
state: '',
|
|
41
|
+
zipCode: '',
|
|
42
|
+
country: ''
|
|
43
|
+
});
|
|
44
|
+
// Pre-fill form data for authenticated users
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (isAuthenticated && user) {
|
|
47
|
+
setGuestInfo(prev => ({
|
|
48
|
+
firstName: user.firstName || prev.firstName,
|
|
49
|
+
lastName: user.lastName || prev.lastName,
|
|
50
|
+
email: user.email || prev.email,
|
|
51
|
+
phone: user.phone || prev.phone,
|
|
52
|
+
notes: prev.notes,
|
|
53
|
+
address: user.address || prev.address,
|
|
54
|
+
city: user.city || prev.city,
|
|
55
|
+
state: user.state || prev.state,
|
|
56
|
+
zipCode: user.zipCode || prev.zipCode,
|
|
57
|
+
country: user.country || prev.country,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
}, [isAuthenticated, user]);
|
|
61
|
+
// Payaza Configuration
|
|
62
|
+
// Do not hardcode a live key in code; require configuration via storeConfig/env.
|
|
63
|
+
const payazaPublicKey = storeConfig.payment?.payazaPublicKey || process.env.NEXT_PUBLIC_PAYAZA_PUBLIC_KEY || '';
|
|
64
|
+
const { checkout: initiateCheckout, isLoading: isPayazaLoading } = usePayazaCheckout({
|
|
65
|
+
publicKey: payazaPublicKey,
|
|
66
|
+
onSuccess: async (response) => {
|
|
67
|
+
try {
|
|
68
|
+
setIsProcessing(true);
|
|
69
|
+
const transactionRef = response.transactionRef || response.callbackData?.data?.transaction_reference;
|
|
70
|
+
if (!transactionRef) {
|
|
71
|
+
addToast('Payment successful but no transaction reference. Please contact support.', 'info');
|
|
72
|
+
setIsProcessing(false);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
console.log('[Booking] SDK callback received, verifying payment...');
|
|
76
|
+
addToast('Verifying payment...', 'info');
|
|
77
|
+
// Step 1: Immediate check if webhook already processed payment (no delay)
|
|
78
|
+
let immediateVerification;
|
|
79
|
+
try {
|
|
80
|
+
immediateVerification = await paymentService.verifyPayment(transactionRef, storeConfig.id);
|
|
81
|
+
if (immediateVerification.verified && immediateVerification.paymentStatus === 'completed') {
|
|
82
|
+
console.log('[Booking] Payment already completed by webhook, proceeding to success page');
|
|
83
|
+
const orderId = immediateVerification.orderId || transactionRef;
|
|
84
|
+
const orderNumber = immediateVerification.orderNumber || '';
|
|
85
|
+
router.push(`/${storeConfig.slug}/order/success?orderId=${orderId}&ref=${transactionRef}${orderNumber ? `&orderNumber=${orderNumber}` : ''}`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.log('[Booking] Immediate verification failed, proceeding with confirmation');
|
|
91
|
+
}
|
|
92
|
+
// Step 2: If webhook hasn't processed yet, immediately confirm from callback data
|
|
93
|
+
// We have the callback data from Payaza, so we can confirm immediately instead of waiting
|
|
94
|
+
if (response.callbackData) {
|
|
95
|
+
console.log('[Booking] Processing Payaza callback confirmation immediately');
|
|
96
|
+
// Retry logic for payment confirmation
|
|
97
|
+
const MAX_RETRIES = 3;
|
|
98
|
+
const RETRY_DELAY = 1000; // 1 second
|
|
99
|
+
let confirmation;
|
|
100
|
+
let lastError;
|
|
101
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
102
|
+
try {
|
|
103
|
+
// Confirm payment with backend and trigger order processing
|
|
104
|
+
confirmation = await paymentService.confirmPaymentFromCallback(response.callbackData);
|
|
105
|
+
if (confirmation.alreadyProcessed) {
|
|
106
|
+
console.log('[Booking] Payment already processed');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.log('[Booking] Payment confirmed, order processing initiated');
|
|
110
|
+
}
|
|
111
|
+
// Success - break out of retry loop
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
lastError = error;
|
|
116
|
+
console.error(`[Booking] Payment confirmation attempt ${attempt} failed:`, error);
|
|
117
|
+
// If this is not the last attempt, wait before retrying
|
|
118
|
+
if (attempt < MAX_RETRIES) {
|
|
119
|
+
console.log(`[Booking] Retrying payment confirmation in ${RETRY_DELAY}ms...`);
|
|
120
|
+
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY * attempt)); // Exponential backoff
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// If all retries failed, do a short poll to catch webhook processing (max 3 seconds)
|
|
125
|
+
if (!confirmation) {
|
|
126
|
+
console.log('[Booking] Confirmation failed, doing short poll for webhook processing...');
|
|
127
|
+
try {
|
|
128
|
+
const polledVerification = await paymentService.pollPaymentStatus(transactionRef, storeConfig.id, {
|
|
129
|
+
maxAttempts: 3, // Poll for max 3 seconds (3 * 1s)
|
|
130
|
+
intervalMs: 1000, // Poll every 1 second
|
|
131
|
+
onProgress: (attempt, maxAttempts) => {
|
|
132
|
+
console.log(`[Booking] Polling for webhook (${attempt}/${maxAttempts})...`);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
if (polledVerification && polledVerification.verified && polledVerification.paymentStatus === 'completed') {
|
|
136
|
+
console.log('[Booking] Payment completed by webhook, proceeding to success page');
|
|
137
|
+
const orderId = polledVerification.orderId || transactionRef;
|
|
138
|
+
const orderNumber = polledVerification.orderNumber || '';
|
|
139
|
+
router.push(`/${storeConfig.slug}/order/success?orderId=${orderId}&ref=${transactionRef}${orderNumber ? `&orderNumber=${orderNumber}` : ''}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (pollError) {
|
|
144
|
+
console.error('[Booking] Polling also failed:', pollError);
|
|
145
|
+
}
|
|
146
|
+
// Final fallback: Redirect to callback page for manual verification
|
|
147
|
+
console.log('[Booking] Redirecting to callback page for verification');
|
|
148
|
+
addToast('Payment successful. Verifying transaction...', 'info');
|
|
149
|
+
router.push(`/${storeConfig.slug}/payment/callback?reference=${transactionRef}&storeId=${storeConfig.id}`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Success - redirect to success page
|
|
153
|
+
const orderId = confirmation.orderId;
|
|
154
|
+
const orderNumber = confirmation.orderNumber || '';
|
|
155
|
+
// Redirect to success page with order details
|
|
156
|
+
router.push(`/${storeConfig.slug}/order/success?orderId=${orderId}&ref=${transactionRef}${orderNumber ? `&orderNumber=${orderNumber}` : ''}`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Fallback: Use transaction reference to verify payment
|
|
160
|
+
console.log('[Booking] No callback data, verifying payment with transaction reference:', response.transactionRef);
|
|
161
|
+
if (response.transactionRef) {
|
|
162
|
+
// Redirect to callback page for verification and confirmation
|
|
163
|
+
router.push(`/${storeConfig.slug}/payment/callback?reference=${response.transactionRef}&storeId=${storeConfig.id}`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
addToast('Payment successful but unable to process. Please contact support.', 'info');
|
|
167
|
+
setIsProcessing(false);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error('[Booking] Error processing payment callback:', error);
|
|
173
|
+
// Fallback: Try to redirect to callback page for verification
|
|
174
|
+
const transactionRef = response.transactionRef || response.callbackData?.data?.transaction_reference;
|
|
175
|
+
if (transactionRef) {
|
|
176
|
+
addToast('Payment successful. Verifying transaction...', 'info');
|
|
177
|
+
router.push(`/${storeConfig.slug}/payment/callback?reference=${transactionRef}&storeId=${storeConfig.id}`);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
addToast('Payment successful but verification failed. Please contact support with your transaction details.', 'error');
|
|
181
|
+
setIsProcessing(false);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
onError: (error) => {
|
|
186
|
+
addToast(`Payment error: ${error}`, 'error');
|
|
187
|
+
setIsProcessing(false);
|
|
188
|
+
},
|
|
189
|
+
onClose: () => {
|
|
190
|
+
// onClose is only called when payment was not successful (user canceled)
|
|
191
|
+
// This is now handled correctly by payaza-checkout.ts tracking payment success state
|
|
192
|
+
addToast('Payment canceled', 'info');
|
|
193
|
+
setIsProcessing(false);
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
// Initialize selected service if slug provided (from prop or query param)
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
if (effectiveServiceSlug) {
|
|
199
|
+
const service = storeConfig.services?.find(s => s.slug === effectiveServiceSlug);
|
|
200
|
+
if (service) {
|
|
201
|
+
if (service.id !== selectedService?.id) {
|
|
202
|
+
setSelectedService(service);
|
|
203
|
+
// If service is pre-selected, ensure we're on the datetime step
|
|
204
|
+
setCurrentStep('datetime');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// Service slug not found - show error and fallback to service selection
|
|
209
|
+
addToast(`Service not found. Please select a service.`, 'error');
|
|
210
|
+
setCurrentStep('service');
|
|
211
|
+
setSelectedService(null);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else if (selectedService && !effectiveServiceSlug) {
|
|
215
|
+
// If no service slug but we have a selected service, keep it
|
|
216
|
+
// This handles the case where user navigates back
|
|
217
|
+
}
|
|
218
|
+
else if (!selectedService && !effectiveServiceSlug) {
|
|
219
|
+
// No service selected and no slug - show service selection
|
|
220
|
+
setCurrentStep('service');
|
|
221
|
+
}
|
|
222
|
+
}, [effectiveServiceSlug, storeConfig.services, addToast]);
|
|
223
|
+
// Mock Data Generators
|
|
224
|
+
const generateDates = () => {
|
|
225
|
+
const dates = [];
|
|
226
|
+
const year = currentMonth.getFullYear();
|
|
227
|
+
const month = currentMonth.getMonth();
|
|
228
|
+
// Get first day of the month
|
|
229
|
+
const firstDay = new Date(year, month, 1);
|
|
230
|
+
const lastDay = new Date(year, month + 1, 0);
|
|
231
|
+
// Calculate start date (Sunday before or on first day)
|
|
232
|
+
const startDate = new Date(firstDay);
|
|
233
|
+
startDate.setDate(1 - firstDay.getDay());
|
|
234
|
+
// Calculate end date (Saturday after or on last day) to complete the grid
|
|
235
|
+
const endDate = new Date(lastDay);
|
|
236
|
+
if (endDate.getDay() < 6) {
|
|
237
|
+
endDate.setDate(lastDay.getDate() + (6 - lastDay.getDay()));
|
|
238
|
+
}
|
|
239
|
+
// Generate dates
|
|
240
|
+
const currentDate = new Date(startDate);
|
|
241
|
+
while (currentDate <= endDate) {
|
|
242
|
+
dates.push(new Date(currentDate));
|
|
243
|
+
currentDate.setDate(currentDate.getDate() + 1);
|
|
244
|
+
}
|
|
245
|
+
return dates;
|
|
246
|
+
};
|
|
247
|
+
const nextMonth = () => {
|
|
248
|
+
setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1));
|
|
249
|
+
};
|
|
250
|
+
const prevMonth = () => {
|
|
251
|
+
setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1));
|
|
252
|
+
};
|
|
253
|
+
const timeSlots = [
|
|
254
|
+
'09:00', '10:00', '11:00', '13:00', '14:00', '15:00', '16:00', '17:00'
|
|
255
|
+
];
|
|
256
|
+
// Helper function to get customer data (user data if authenticated, otherwise guestInfo)
|
|
257
|
+
const getCustomerData = () => {
|
|
258
|
+
if (isAuthenticated && user) {
|
|
259
|
+
return {
|
|
260
|
+
firstName: user.firstName || '',
|
|
261
|
+
lastName: user.lastName || '',
|
|
262
|
+
email: user.email || '',
|
|
263
|
+
phone: user.phone || '',
|
|
264
|
+
notes: guestInfo.notes, // Notes are still editable
|
|
265
|
+
address: user.address || '',
|
|
266
|
+
city: user.city || '',
|
|
267
|
+
state: user.state || '',
|
|
268
|
+
zipCode: user.zipCode || '',
|
|
269
|
+
country: user.country || '',
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
return guestInfo;
|
|
273
|
+
};
|
|
274
|
+
// Helper function to calculate endTime from startTime and duration
|
|
275
|
+
const calculateEndTime = (startTime, durationMinutes) => {
|
|
276
|
+
const [hours, minutes] = startTime.split(':').map(Number);
|
|
277
|
+
const startDate = new Date();
|
|
278
|
+
startDate.setHours(hours, minutes, 0, 0);
|
|
279
|
+
startDate.setMinutes(startDate.getMinutes() + durationMinutes);
|
|
280
|
+
const endHours = String(startDate.getHours()).padStart(2, '0');
|
|
281
|
+
const endMinutes = String(startDate.getMinutes()).padStart(2, '0');
|
|
282
|
+
return `${endHours}:${endMinutes}`;
|
|
283
|
+
};
|
|
284
|
+
// Payaza SDK Integration
|
|
285
|
+
const handlePayment = async () => {
|
|
286
|
+
const customerData = getCustomerData();
|
|
287
|
+
if (!selectedService || !customerData.email) {
|
|
288
|
+
addToast('Missing booking information', 'error');
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
// Validate booking date and time are selected
|
|
292
|
+
if (!selectedDate || !selectedTime) {
|
|
293
|
+
addToast('Please select a date and time for your booking', 'error');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
setIsProcessing(true);
|
|
297
|
+
try {
|
|
298
|
+
// Calculate endTime from service duration if not already set
|
|
299
|
+
const endTime = selectedService.duration
|
|
300
|
+
? calculateEndTime(selectedTime, selectedService.duration)
|
|
301
|
+
: null;
|
|
302
|
+
// Format booking date as YYYY-MM-DD
|
|
303
|
+
const bookingDateStr = selectedDate.toISOString().split('T')[0];
|
|
304
|
+
// Step 1: Create order via API before payment
|
|
305
|
+
// For services, use serviceId instead of productId
|
|
306
|
+
const checkoutResponse = await checkoutService.processCheckout({
|
|
307
|
+
storeId: storeConfig.id,
|
|
308
|
+
items: selectedService.id ? [{
|
|
309
|
+
serviceId: selectedService.id, // Use serviceId for services
|
|
310
|
+
quantity: 1,
|
|
311
|
+
price: selectedService.price,
|
|
312
|
+
options: {
|
|
313
|
+
bookingDate: bookingDateStr,
|
|
314
|
+
startTime: selectedTime,
|
|
315
|
+
endTime: endTime || undefined,
|
|
316
|
+
customerNotes: guestInfo.notes || undefined,
|
|
317
|
+
},
|
|
318
|
+
}] : [],
|
|
319
|
+
customerInfo: {
|
|
320
|
+
email: customerData.email,
|
|
321
|
+
firstName: customerData.firstName,
|
|
322
|
+
lastName: customerData.lastName,
|
|
323
|
+
phone: customerData.phone,
|
|
324
|
+
},
|
|
325
|
+
shippingAddress: {
|
|
326
|
+
firstName: customerData.firstName,
|
|
327
|
+
lastName: customerData.lastName,
|
|
328
|
+
address1: customerData.address || 'Address to be provided',
|
|
329
|
+
city: customerData.city || 'City',
|
|
330
|
+
state: customerData.state || 'State',
|
|
331
|
+
zipCode: customerData.zipCode || '00000',
|
|
332
|
+
country: customerData.country || 'Country',
|
|
333
|
+
phone: customerData.phone,
|
|
334
|
+
},
|
|
335
|
+
paymentMethod: 'payaza',
|
|
336
|
+
customerId: isAuthenticated && user ? user.id : undefined, // Pass customerId for authenticated users
|
|
337
|
+
});
|
|
338
|
+
// Step 2: Convert to checkout format for Payaza
|
|
339
|
+
const checkoutItems = [{
|
|
340
|
+
product: {
|
|
341
|
+
name: selectedService.name,
|
|
342
|
+
price: selectedService.price,
|
|
343
|
+
},
|
|
344
|
+
quantity: 1,
|
|
345
|
+
price: selectedService.price,
|
|
346
|
+
}];
|
|
347
|
+
// Step 3: Generate Payaza checkout config with order details
|
|
348
|
+
const checkoutConfig = generateCheckoutConfig(checkoutItems, customerData.email, payazaPublicKey, {
|
|
349
|
+
firstName: customerData.firstName,
|
|
350
|
+
lastName: customerData.lastName,
|
|
351
|
+
phone: customerData.phone,
|
|
352
|
+
callbackUrl: `${typeof window !== 'undefined' ? window.location.origin : ''}/${storeConfig.slug}/payment/callback?storeId=${storeConfig.id}`,
|
|
353
|
+
currency: checkoutResponse.currency || storeConfig.settings?.currency || 'USD',
|
|
354
|
+
storeId: storeConfig.id,
|
|
355
|
+
orderId: checkoutResponse.orderId,
|
|
356
|
+
orderNumber: checkoutResponse.orderNumber,
|
|
357
|
+
shippingAddress: {
|
|
358
|
+
firstName: customerData.firstName,
|
|
359
|
+
lastName: customerData.lastName,
|
|
360
|
+
address: customerData.address,
|
|
361
|
+
city: customerData.city,
|
|
362
|
+
state: customerData.state,
|
|
363
|
+
country: customerData.country,
|
|
364
|
+
zipCode: customerData.zipCode,
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
// Step 4: Use transaction reference from order
|
|
368
|
+
checkoutConfig.reference = checkoutResponse.transactionReference;
|
|
369
|
+
await initiateCheckout(checkoutConfig);
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
console.error("Payment init error:", error);
|
|
373
|
+
setIsProcessing(false);
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
// Steps Configuration
|
|
377
|
+
const steps = [
|
|
378
|
+
{ id: 'service', label: 'Service' },
|
|
379
|
+
{ id: 'datetime', label: 'Date & Time' },
|
|
380
|
+
{ id: 'details', label: 'Details' },
|
|
381
|
+
{ id: 'payment', label: 'Payment' },
|
|
382
|
+
{ id: 'success', label: 'Confirmation' },
|
|
383
|
+
];
|
|
384
|
+
const currentStepIndex = steps.findIndex(s => s.id === currentStep);
|
|
385
|
+
return (_jsx("div", { className: "min-h-screen bg-gray-50 pt-20 pb-20", children: _jsxs("div", { className: "container mx-auto px-4 max-w-6xl", children: [_jsxs("div", { className: "mb-8", children: [_jsxs(Link, { href: `/${storeConfig.slug}`, className: "inline-flex items-center text-sm text-gray-500 hover:text-black mb-6 transition-colors", children: [_jsx(ArrowLeft, { className: "w-4 h-4 mr-1" }), " Back to Store"] }), _jsxs("div", { className: "flex items-center justify-between relative", children: [_jsx("div", { className: "absolute top-1/2 left-0 w-full h-0.5 bg-gray-200 -z-10" }), steps.filter(s => s.id !== 'success').map((step, idx) => (_jsxs("div", { className: "flex flex-col items-center gap-2 bg-gray-50 px-2", children: [_jsx("div", { className: cn("w-8 h-8 rounded-full flex items-center justify-center text-xs font-bold transition-all duration-500 border-2", idx <= currentStepIndex
|
|
386
|
+
? "bg-black border-black text-white"
|
|
387
|
+
: "bg-white border-gray-300 text-gray-400"), style: idx <= currentStepIndex ? { backgroundColor: primaryColor, borderColor: primaryColor } : {}, children: idx < currentStepIndex ? _jsx(Check, { className: "w-4 h-4" }) : idx + 1 }), _jsx("span", { className: cn("text-xs font-medium uppercase tracking-wider hidden md:block", idx <= currentStepIndex ? "text-black" : "text-gray-400"), children: step.label })] }, step.id)))] })] }), _jsxs("div", { className: "bg-white rounded-2xl shadow-xl min-h-[500px] flex flex-col md:flex-row", children: [currentStep !== 'success' && (_jsxs("div", { className: "hidden md:block w-80 bg-gray-50 p-8 border-r border-gray-100 flex-shrink-0 md:rounded-l-2xl", children: [_jsx("h3", { className: "text-lg font-bold mb-6", children: "Booking Summary" }), selectedService ? (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx("span", { className: "text-xs text-gray-400 uppercase tracking-wider font-bold block mb-1", children: "Service" }), _jsx("p", { className: "font-semibold text-gray-900", children: selectedService.name }), _jsxs("p", { className: "text-sm text-gray-500", children: [selectedService.duration, " mins \u2022 ", formatCurrency(selectedService.price, selectedService.currency || storeConfig.settings?.currency || 'USD')] })] }), selectedDate && (_jsxs("div", { children: [_jsx("span", { className: "text-xs text-gray-400 uppercase tracking-wider font-bold block mb-1", children: "Date" }), _jsx("p", { className: "font-medium text-gray-900", children: selectedDate.toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' }) })] })), selectedTime && (_jsxs("div", { children: [_jsx("span", { className: "text-xs text-gray-400 uppercase tracking-wider font-bold block mb-1", children: "Time" }), _jsx("p", { className: "font-medium text-gray-900", children: selectedTime })] })), _jsxs("div", { className: "pt-6 border-t border-gray-200 mt-auto", children: [_jsxs("div", { className: "flex justify-between items-center mb-2", children: [_jsx("span", { className: "text-gray-500", children: "Total" }), _jsx("span", { className: "text-xl font-bold", children: formatCurrency(selectedService.price, selectedService.currency || storeConfig.settings?.currency || 'USD') })] }), _jsxs("div", { className: "flex justify-between items-center text-xs text-green-600 font-medium mt-2", children: [_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(ShieldCheck, { className: "w-3 h-3" }), " Secure Payment"] }), _jsx("span", { children: "Payaza" })] })] })] })) : (_jsx("p", { className: "text-gray-400 text-sm italic", children: "Select a service to begin..." }))] })), _jsxs("div", { className: "flex-1 p-6 md:p-10 flex flex-col md:rounded-r-2xl", children: [currentStep === 'service' && (_jsxs("div", { className: "animate-fade-in w-full", children: [_jsx("h2", { className: "text-2xl font-light mb-6", children: "Select a Service" }), _jsx("div", { className: "grid gap-4", children: storeConfig.services?.map((service) => (_jsxs("div", { onClick: () => {
|
|
388
|
+
setSelectedService(service);
|
|
389
|
+
setCurrentStep('datetime');
|
|
390
|
+
}, className: "group flex items-center p-4 rounded-xl border border-gray-100 hover:border-black hover:shadow-md cursor-pointer transition-all", children: [_jsx("div", { className: "h-16 w-16 rounded-lg bg-gray-100 overflow-hidden mr-4 flex-shrink-0 relative", children: _jsx(ImageWithFallback, { src: service.image, alt: service.name, className: "w-full h-full object-cover", skeletonAspectRatio: "square" }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex justify-between items-center mb-1", children: [_jsx("h3", { className: "font-bold text-gray-900 group-hover:text-black transition-colors truncate", children: service.name }), _jsx("span", { className: "font-semibold flex-shrink-0 ml-2", children: formatCurrency(service.price, service.currency || storeConfig.settings?.currency || 'USD') })] }), _jsx("p", { className: "text-sm text-gray-500 line-clamp-1", children: service.description }), _jsxs("div", { className: "flex items-center gap-2 mt-2 text-xs text-gray-400", children: [_jsx(Clock, { className: "w-3 h-3" }), " ", service.duration, " mins"] })] }), _jsx(ChevronRight, { className: "w-5 h-5 text-gray-300 group-hover:text-black ml-4 flex-shrink-0" })] }, service.id))) })] })), currentStep === 'datetime' && (_jsxs("div", { className: "w-full", children: [_jsx("h2", { className: "text-2xl font-light mb-8", children: "When would you like to come?" }), _jsx("div", { className: "mb-10", children: _jsxs("div", { className: "mb-6", children: [_jsxs("div", { className: "flex items-center justify-between mb-6", children: [_jsx("h3", { className: "text-lg font-bold text-gray-900", children: currentMonth.toLocaleString('default', { month: 'long', year: 'numeric' }) }), _jsxs("div", { className: "flex gap-1", children: [_jsx(Button, { variant: "outline", size: "icon", className: "h-8 w-8 rounded-full", onClick: prevMonth, children: _jsx(ChevronLeft, { className: "w-4 h-4" }) }), _jsx(Button, { variant: "outline", size: "icon", className: "h-8 w-8 rounded-full", onClick: nextMonth, children: _jsx(ChevronRight, { className: "w-4 h-4" }) })] })] }), _jsx("div", { className: "grid grid-cols-7 mb-3", children: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map((day) => (_jsx("div", { className: "text-center text-xs font-bold text-gray-400 uppercase tracking-wider", children: day }, day))) }), _jsx("div", { className: "grid grid-cols-7 gap-y-3", children: generateDates().map((date, i) => {
|
|
391
|
+
const isSelected = selectedDate?.toDateString() === date.toDateString();
|
|
392
|
+
const isToday = date.toDateString() === new Date().toDateString();
|
|
393
|
+
const isCurrentMonth = date.getMonth() === currentMonth.getMonth();
|
|
394
|
+
return (_jsx("div", { className: "flex justify-center", children: _jsxs("button", { onClick: () => setSelectedDate(date), className: cn("h-10 w-10 rounded-full flex items-center justify-center text-sm font-medium transition-all relative", isSelected
|
|
395
|
+
? "bg-black text-white shadow-md scale-110"
|
|
396
|
+
: isToday
|
|
397
|
+
? "text-black font-bold bg-gray-100"
|
|
398
|
+
: !isCurrentMonth
|
|
399
|
+
? "text-gray-300 hover:text-gray-500"
|
|
400
|
+
: "text-gray-600 hover:bg-gray-50 hover:text-black"), style: isSelected ? { backgroundColor: primaryColor } : {}, children: [date.getDate(), isToday && !isSelected && (_jsx("div", { className: "absolute bottom-1.5 left-1/2 -translate-x-1/2 w-1 h-1 rounded-full bg-gray-400" }))] }) }, i));
|
|
401
|
+
}) })] }) }), selectedDate && (_jsxs("div", { className: "mb-8 animate-fade-in", children: [_jsxs("h3", { className: "text-sm font-bold uppercase tracking-wider text-gray-400 mb-4", children: ["Available Time Slots for ", selectedDate.toLocaleDateString(undefined, { weekday: 'long', month: 'short', day: 'numeric' })] }), _jsx("div", { className: "grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 gap-3", children: timeSlots.map((time) => (_jsx("button", { onClick: () => setSelectedTime(time), className: cn("py-3 px-2 rounded-xl text-sm font-medium border transition-all text-center hover:shadow-sm", selectedTime === time
|
|
402
|
+
? "bg-black text-white border-black shadow-md transform scale-[1.02]"
|
|
403
|
+
: "bg-white border-gray-100 text-gray-700 hover:border-gray-300 hover:text-black"), style: selectedTime === time ? { backgroundColor: primaryColor, borderColor: primaryColor } : {}, children: time }, time))) })] })), _jsx("div", { className: "mt-10 pt-6 border-t border-gray-100 flex justify-end", children: _jsxs(Button, { disabled: !selectedDate || !selectedTime, onClick: () => {
|
|
404
|
+
// Skip details step for authenticated users, go directly to payment
|
|
405
|
+
if (isAuthenticated && user) {
|
|
406
|
+
setCurrentStep('payment');
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
setCurrentStep('details');
|
|
410
|
+
}
|
|
411
|
+
}, className: "w-full sm:w-auto shadow-lg min-w-[140px] rounded-full", style: { backgroundColor: primaryColor }, children: ["Continue ", _jsx(ChevronRight, { className: "w-4 h-4 ml-2" })] }) })] })), currentStep === 'details' && (_jsxs("div", { className: "animate-fade-in w-full", children: [_jsx("h2", { className: "text-2xl font-light mb-6", children: "Your Details" }), isAuthenticated && user ? (
|
|
412
|
+
// Authenticated user - show read-only account info
|
|
413
|
+
_jsxs("div", { className: "space-y-4 max-w-md", children: [_jsx("div", { className: "bg-blue-50 border border-blue-200 rounded-lg p-4 mb-6", children: _jsxs("p", { className: "text-sm text-blue-900", children: [_jsx("strong", { children: "Using your account information." }), " Your details are pre-filled from your account."] }) }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "First Name" }), _jsx("input", { type: "text", className: "w-full p-3 bg-gray-100 border border-gray-200 rounded-lg text-gray-700 cursor-not-allowed", value: user.firstName || '', disabled: true, readOnly: true })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Last Name" }), _jsx("input", { type: "text", className: "w-full p-3 bg-gray-100 border border-gray-200 rounded-lg text-gray-700 cursor-not-allowed", value: user.lastName || '', disabled: true, readOnly: true })] })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Email" }), _jsx("input", { type: "email", className: "w-full p-3 bg-gray-100 border border-gray-200 rounded-lg text-gray-700 cursor-not-allowed", value: user.email || '', disabled: true, readOnly: true })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Phone" }), _jsx("input", { type: "tel", className: "w-full p-3 bg-gray-100 border border-gray-200 rounded-lg text-gray-700 cursor-not-allowed", value: user.phone || '', disabled: true, readOnly: true })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Notes (Optional)" }), _jsx("textarea", { className: "w-full p-3 bg-gray-50 border border-gray-200 rounded-lg focus:outline-none focus:border-black transition-colors h-24 resize-none", placeholder: "Any special requests or allergies?", value: guestInfo.notes, onChange: (e) => setGuestInfo({ ...guestInfo, notes: e.target.value }) })] })] })) : (
|
|
414
|
+
// Guest user - show editable form
|
|
415
|
+
_jsxs("form", { className: "space-y-4 max-w-md", children: [_jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "First Name" }), _jsx("input", { type: "text", className: "w-full p-3 bg-gray-50 border border-gray-200 rounded-lg focus:outline-none focus:border-black transition-colors", placeholder: "John", value: guestInfo.firstName, onChange: (e) => setGuestInfo({ ...guestInfo, firstName: e.target.value }), required: true })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Last Name" }), _jsx("input", { type: "text", className: "w-full p-3 bg-gray-50 border border-gray-200 rounded-lg focus:outline-none focus:border-black transition-colors", placeholder: "Doe", value: guestInfo.lastName, onChange: (e) => setGuestInfo({ ...guestInfo, lastName: e.target.value }), required: true })] })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Email" }), _jsx("input", { type: "email", className: "w-full p-3 bg-gray-50 border border-gray-200 rounded-lg focus:outline-none focus:border-black transition-colors", placeholder: "john@example.com", value: guestInfo.email, onChange: (e) => setGuestInfo({ ...guestInfo, email: e.target.value }), required: true })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Phone" }), _jsx("input", { type: "tel", className: "w-full p-3 bg-gray-50 border border-gray-200 rounded-lg focus:outline-none focus:border-black transition-colors", placeholder: "+1 (555) 000-0000", value: guestInfo.phone, onChange: (e) => setGuestInfo({ ...guestInfo, phone: e.target.value }), required: true })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs font-bold uppercase tracking-wider text-gray-500 mb-1", children: "Notes (Optional)" }), _jsx("textarea", { className: "w-full p-3 bg-gray-50 border border-gray-200 rounded-lg focus:outline-none focus:border-black transition-colors h-24 resize-none", placeholder: "Any special requests or allergies?", value: guestInfo.notes, onChange: (e) => setGuestInfo({ ...guestInfo, notes: e.target.value }) })] })] })), _jsxs("div", { className: "mt-10 flex justify-between items-center", children: [_jsxs(Button, { variant: "ghost", onClick: () => {
|
|
416
|
+
// Go back to details for guests, datetime for authenticated users (since they skip details)
|
|
417
|
+
if (isAuthenticated && user) {
|
|
418
|
+
setCurrentStep('datetime');
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
setCurrentStep('details');
|
|
422
|
+
}
|
|
423
|
+
}, children: [_jsx(ChevronLeft, { className: "w-4 h-4 mr-2" }), " Back"] }), _jsxs(Button, { onClick: () => {
|
|
424
|
+
// Validate guest info if not authenticated
|
|
425
|
+
if (!isAuthenticated) {
|
|
426
|
+
if (!guestInfo.firstName || !guestInfo.lastName || !guestInfo.email || !guestInfo.phone) {
|
|
427
|
+
addToast('Please fill in all required fields', 'error');
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
setCurrentStep('payment');
|
|
432
|
+
}, className: "w-full sm:w-auto", style: { backgroundColor: primaryColor }, children: ["Continue to Payment ", _jsx(ChevronRight, { className: "w-4 h-4 ml-2" })] })] })] })), currentStep === 'payment' && (_jsxs("div", { className: "animate-fade-in w-full", children: [_jsx("h2", { className: "text-2xl font-light mb-6", children: "Review & Pay" }), isAuthenticated && user && (_jsxs("div", { className: "bg-gray-50 p-6 rounded-2xl border border-gray-200 mb-6", children: [_jsx("h3", { className: "text-sm font-bold uppercase tracking-wider text-gray-500 mb-4", children: "Booking Information" }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm", children: [_jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Name:" }), _jsxs("p", { className: "font-medium text-gray-900", children: [user.firstName, " ", user.lastName] })] }), _jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Email:" }), _jsx("p", { className: "font-medium text-gray-900", children: user.email })] }), user.phone && (_jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Phone:" }), _jsx("p", { className: "font-medium text-gray-900", children: user.phone })] })), selectedDate && (_jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Date:" }), _jsx("p", { className: "font-medium text-gray-900", children: selectedDate.toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' }) })] })), selectedTime && (_jsxs("div", { children: [_jsx("span", { className: "text-gray-500", children: "Time:" }), _jsx("p", { className: "font-medium text-gray-900", children: selectedTime })] }))] }), guestInfo.notes && (_jsxs("div", { className: "mt-4 pt-4 border-t border-gray-200", children: [_jsx("span", { className: "text-gray-500 text-sm", children: "Special Notes:" }), _jsx("p", { className: "text-gray-900 mt-1", children: guestInfo.notes })] }))] })), _jsx("div", { className: "bg-blue-50/50 p-6 rounded-2xl border border-blue-100 mb-6", children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx(Lock, { className: "w-5 h-5 text-blue-600 mt-1" }), _jsxs("div", { children: [_jsx("h4", { className: "font-bold text-blue-900 mb-1", children: "Encrypted Transaction" }), _jsx("p", { className: "text-sm text-blue-700/80 leading-relaxed", children: "Your payment is processed securely by Payaza. We do not store your card details." })] })] }) }), _jsxs("div", { className: "flex items-center justify-center gap-2 text-xs font-bold text-gray-400 uppercase tracking-widest", children: [_jsx(Lock, { className: "w-3 h-3" }), "256-bit SSL Secure Payment"] }), _jsxs("div", { className: "mt-10 flex justify-between items-center", children: [_jsxs(Button, { variant: "ghost", onClick: () => {
|
|
433
|
+
// Go back to details for guests, datetime for authenticated users (since they skip details)
|
|
434
|
+
if (isAuthenticated && user) {
|
|
435
|
+
setCurrentStep('datetime');
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
setCurrentStep('details');
|
|
439
|
+
}
|
|
440
|
+
}, disabled: isProcessing || isPayazaLoading, children: [_jsx(ChevronLeft, { className: "w-4 h-4 mr-2" }), " Back"] }), _jsx(Button, { onClick: handlePayment, disabled: isProcessing || isPayazaLoading, className: "w-full sm:w-auto min-w-[200px] h-14 text-lg shadow-xl hover:shadow-2xl transition-all", style: { backgroundColor: primaryColor }, children: isProcessing || isPayazaLoading ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin" }), _jsx("span", { children: "Processing..." })] })) : (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Lock, { className: "w-4 h-4" }), _jsxs("span", { children: ["Pay ", formatCurrency(selectedService?.price || 0, selectedService?.currency || storeConfig.settings?.currency || 'USD'), " Now"] })] })) })] })] })), currentStep === 'success' && (_jsxs("div", { className: "animate-fade-in flex-1 flex flex-col items-center justify-center py-12 px-4", children: [_jsxs("div", { className: "mb-8 relative", children: [_jsx("div", { className: "w-24 h-24 bg-green-100 rounded-full flex items-center justify-center animate-scale-in relative z-10", children: _jsx(CheckCircle2, { className: "w-12 h-12 text-green-600" }) }), _jsx("div", { className: "absolute inset-0 bg-green-100 rounded-full animate-ping opacity-20" })] }), _jsx("h2", { className: "text-3xl md:text-4xl font-bold mb-3 text-gray-900 text-center tracking-tight", children: "Booking Confirmed!" }), _jsx("p", { className: "text-gray-500 mb-10 text-center max-w-md text-lg", children: "You're all set. A confirmation email has been sent to you." }), _jsxs("div", { className: "bg-gray-50 border border-gray-100 rounded-2xl p-6 mb-10 w-full max-w-md relative overflow-hidden", children: [_jsx("div", { className: "absolute top-0 left-0 w-1 h-full", style: { backgroundColor: primaryColor } }), _jsxs("div", { className: "grid grid-cols-2 gap-6", children: [_jsxs("div", { children: [_jsx("p", { className: "text-xs font-bold text-gray-400 uppercase tracking-wider mb-1", children: "Service" }), _jsx("p", { className: "font-bold text-gray-900", children: selectedService?.name })] }), _jsxs("div", { children: [_jsx("p", { className: "text-xs font-bold text-gray-400 uppercase tracking-wider mb-1", children: "Total Paid" }), _jsx("p", { className: "font-bold text-gray-900", children: formatCurrency(selectedService?.price || 0, selectedService?.currency || storeConfig.settings?.currency || 'USD') })] }), _jsxs("div", { children: [_jsx("p", { className: "text-xs font-bold text-gray-400 uppercase tracking-wider mb-1", children: "Date" }), _jsx("p", { className: "font-medium text-gray-900", children: selectedDate?.toLocaleDateString(undefined, { weekday: 'short', month: 'short', day: 'numeric' }) })] }), _jsxs("div", { children: [_jsx("p", { className: "text-xs font-bold text-gray-400 uppercase tracking-wider mb-1", children: "Time" }), _jsx("p", { className: "font-medium text-gray-900", children: selectedTime })] })] })] }), _jsxs("div", { className: "flex flex-col sm:flex-row gap-4 w-full max-w-md", children: [_jsx(Link, { href: `/${storeConfig.slug}/account?tab=bookings`, className: "flex-1", children: _jsx(Button, { size: "lg", className: "w-full rounded-xl h-14 text-base shadow-xl shadow-black/5 transition-all hover:shadow-2xl hover:-translate-y-0.5", style: { backgroundColor: primaryColor }, children: "View My Bookings" }) }), _jsx(Link, { href: `/${storeConfig.slug}`, className: "flex-1", children: _jsx(Button, { variant: "outline", size: "lg", className: "w-full rounded-xl h-14 text-base border-gray-200 hover:bg-gray-50 hover:text-black hover:border-gray-300", children: "Return to Home" }) })] })] }))] })] })] }) }));
|
|
441
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { StoreConfig } from '../../../lib/store-types';
|
|
2
|
+
interface CategoriesPageProps {
|
|
3
|
+
storeConfig: StoreConfig;
|
|
4
|
+
}
|
|
5
|
+
export declare function CategoriesPage({ storeConfig }: CategoriesPageProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=CategoriesPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoriesPage.d.ts","sourceRoot":"","sources":["../../../../src/layouts/booking-agenda/pages/CategoriesPage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD,UAAU,mBAAmB;IAC3B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAmGD,wBAAgB,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE,mBAAmB,2CAwHlE"}
|