@alphasquad/saleor-template-advance 0.1.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/.env.example +57 -0
- package/APPLE_PAY_QUICK_START.md +165 -0
- package/APPLE_PAY_SETUP.md +331 -0
- package/README.md +46 -0
- package/SEO_AUDIT_CHECKLIST_STATUS.md +244 -0
- package/SEO_AUDIT_REPORT.md +66 -0
- package/eslint.config.mjs +16 -0
- package/next-env.d.ts +5 -0
- package/next.config.ts +109 -0
- package/package.json +47 -0
- package/postcss.config.mjs +5 -0
- package/public/.well-known/apple-developer-merchantid-domain-association +1 -0
- package/public/Logo.png +0 -0
- package/public/brand-video.mp4 +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +1 -0
- package/public/footer/facebook.tsx +34 -0
- package/public/footer/instagram.tsx +27 -0
- package/public/footer/mail.tsx +5 -0
- package/public/footer/x.tsx +35 -0
- package/public/globe.svg +1 -0
- package/public/icons/Authorize.net.webp +0 -0
- package/public/icons/amex.gif +0 -0
- package/public/icons/appIcon.png +0 -0
- package/public/icons/discover.gif +0 -0
- package/public/icons/master.gif +0 -0
- package/public/icons/paypal.png +0 -0
- package/public/icons/stripe.png +0 -0
- package/public/icons/visa.gif +0 -0
- package/public/images/BackgroundNoise.png +0 -0
- package/public/images/footer-background.png +0 -0
- package/public/next.svg +1 -0
- package/public/no-image-avail-large.png +0 -0
- package/public/random-car-1.jpeg +0 -0
- package/public/random-car-2.png +0 -0
- package/public/random-car-3.jpg +0 -0
- package/public/random-car-4.jpg +0 -0
- package/public/random-car-5.jpg +0 -0
- package/public/star.svg +3 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/scripts/seo-audit/generate-checklist.mjs +156 -0
- package/src/app/(auth)/account/forgot-password/layout.tsx +16 -0
- package/src/app/(auth)/account/forgot-password/page.tsx +135 -0
- package/src/app/(auth)/account/login/layout.tsx +16 -0
- package/src/app/(auth)/account/login/page.tsx +288 -0
- package/src/app/(auth)/account/otp/layout.tsx +16 -0
- package/src/app/(auth)/account/otp/page.tsx +108 -0
- package/src/app/(auth)/account/register/layout.tsx +16 -0
- package/src/app/(auth)/account/register/page.tsx +431 -0
- package/src/app/(auth)/account/reset-password/layout.tsx +16 -0
- package/src/app/(auth)/account/reset-password/page.tsx +222 -0
- package/src/app/[slug]/page.tsx +43 -0
- package/src/app/about/loading.tsx +17 -0
- package/src/app/about/page.tsx +61 -0
- package/src/app/account/address/layout.tsx +15 -0
- package/src/app/account/address/page.tsx +166 -0
- package/src/app/account/head.tsx +4 -0
- package/src/app/account/layout.tsx +62 -0
- package/src/app/account/orders/[id]/layout.tsx +17 -0
- package/src/app/account/orders/[id]/page.tsx +115 -0
- package/src/app/account/orders/components/orderDetailsModal.tsx +410 -0
- package/src/app/account/orders/layout.tsx +15 -0
- package/src/app/account/orders/page.tsx +146 -0
- package/src/app/account/page.tsx +39 -0
- package/src/app/account/settings/components/editProfileSuccessModal.tsx +28 -0
- package/src/app/account/settings/layout.tsx +15 -0
- package/src/app/account/settings/page.tsx +260 -0
- package/src/app/api/affirm/check-status/route.ts +94 -0
- package/src/app/api/affirm/create-checkout/route.ts +109 -0
- package/src/app/api/affirm/get-config/route.ts +108 -0
- package/src/app/api/affirm/process-payment/route.ts +244 -0
- package/src/app/api/affirm/test-connection/route.ts +45 -0
- package/src/app/api/auth/clear/route.ts +16 -0
- package/src/app/api/auth/clear-cookies/route.ts +42 -0
- package/src/app/api/auth/set/route.ts +47 -0
- package/src/app/api/configuration/route.ts +18 -0
- package/src/app/api/dynamic-page/[slug]/route.ts +24 -0
- package/src/app/api/form-submission/route.ts +237 -0
- package/src/app/api/paypal/capture-order/route.ts +303 -0
- package/src/app/api/paypal/create-order/route.ts +211 -0
- package/src/app/api/paypal/get-config/route.ts +240 -0
- package/src/app/api/search-proxy/route.ts +52 -0
- package/src/app/authorize-net-success/layout.tsx +19 -0
- package/src/app/authorize-net-success/page.tsx +12 -0
- package/src/app/authorize-net-success/summary.tsx +486 -0
- package/src/app/blog/[slug]/blogContentRenderer.tsx +369 -0
- package/src/app/blog/[slug]/layout.tsx +17 -0
- package/src/app/blog/[slug]/page.tsx +151 -0
- package/src/app/blog/constant.tsx +147 -0
- package/src/app/blog/layout.tsx +31 -0
- package/src/app/blog/page.tsx +81 -0
- package/src/app/brand/[id]/BrandPageClient.tsx +188 -0
- package/src/app/brand/[id]/layout.tsx +17 -0
- package/src/app/brand/[id]/page.tsx +176 -0
- package/src/app/brands/components/brandsListingClient.tsx +97 -0
- package/src/app/brands/layout.tsx +31 -0
- package/src/app/brands/page.tsx +40 -0
- package/src/app/cancellation-policy/page.tsx +53 -0
- package/src/app/cart/layout.tsx +19 -0
- package/src/app/cart/page.tsx +752 -0
- package/src/app/category/[slug]/CategoryPageClient.tsx +377 -0
- package/src/app/category/[slug]/layout.tsx +17 -0
- package/src/app/category/[slug]/page.tsx +224 -0
- package/src/app/category/page.tsx +114 -0
- package/src/app/checkout/components/addNewAddressModal.tsx +474 -0
- package/src/app/checkout/layout.tsx +19 -0
- package/src/app/checkout/page.tsx +3312 -0
- package/src/app/components/account/AccountTabs.tsx +40 -0
- package/src/app/components/ads/GoogleAdSense.tsx +74 -0
- package/src/app/components/analytics/AnalyticsScripts.tsx +78 -0
- package/src/app/components/analytics/ConditionalGTMNoscript.tsx +24 -0
- package/src/app/components/analytics/ConditionalGoogleAnalytics.tsx +16 -0
- package/src/app/components/ancillary/AncillaryContent.tsx +7 -0
- package/src/app/components/auth/TokenExpirationHandler.tsx +8 -0
- package/src/app/components/blog/BlogList.tsx +112 -0
- package/src/app/components/checkout/AddressInformationSection.tsx +34 -0
- package/src/app/components/checkout/AddressManagement.tsx +571 -0
- package/src/app/components/checkout/CheckoutHeader.tsx +51 -0
- package/src/app/components/checkout/CheckoutQuestions.tsx +454 -0
- package/src/app/components/checkout/CheckoutTermsModal.tsx +81 -0
- package/src/app/components/checkout/ContactDetailsSection.tsx +52 -0
- package/src/app/components/checkout/DealerShippingSection.tsx +359 -0
- package/src/app/components/checkout/DeliveryMethodSection.tsx +249 -0
- package/src/app/components/checkout/OrderSummary.tsx +386 -0
- package/src/app/components/checkout/TermsContentRenderer.tsx +147 -0
- package/src/app/components/checkout/WillCallSection.tsx +133 -0
- package/src/app/components/checkout/affirmPayment.tsx +383 -0
- package/src/app/components/checkout/checkoutProcessingModal.tsx +96 -0
- package/src/app/components/checkout/googlePayButton.tsx +334 -0
- package/src/app/components/checkout/paymentStep.tsx +180 -0
- package/src/app/components/checkout/paypalPayment.tsx +1083 -0
- package/src/app/components/checkout/saleorNativePayment.tsx +1758 -0
- package/src/app/components/dynamicPage/DynamicPageRenderer.tsx +13 -0
- package/src/app/components/dynamicPage/HtmlWidgetRenderer.tsx +144 -0
- package/src/app/components/filtersCollapsible/index.tsx +365 -0
- package/src/app/components/globalSearch/index.tsx +423 -0
- package/src/app/components/layout/cartDropDown.tsx +628 -0
- package/src/app/components/layout/components/FooterNewsletter.tsx +21 -0
- package/src/app/components/layout/footer.tsx +283 -0
- package/src/app/components/layout/header/accountMenuDropdown.tsx +53 -0
- package/src/app/components/layout/header/components/CartBadge.tsx +18 -0
- package/src/app/components/layout/header/components/LoadingState.tsx +17 -0
- package/src/app/components/layout/header/components/MenuItemDropdown.tsx +124 -0
- package/src/app/components/layout/header/components/MobileNavbar.tsx +123 -0
- package/src/app/components/layout/header/components/NavbarActions.tsx +125 -0
- package/src/app/components/layout/header/components/NavbarBrand.tsx +29 -0
- package/src/app/components/layout/header/components/NavigationLinks.tsx +131 -0
- package/src/app/components/layout/header/hamMenuSlide.tsx +318 -0
- package/src/app/components/layout/header/header.tsx +44 -0
- package/src/app/components/layout/header/hooks/useDropdown.ts +45 -0
- package/src/app/components/layout/header/hooks/useNavbarData.ts +138 -0
- package/src/app/components/layout/header/hooks/useNavbarState.ts +66 -0
- package/src/app/components/layout/header/megaMenuDropdown.tsx +116 -0
- package/src/app/components/layout/header/navBar.tsx +121 -0
- package/src/app/components/layout/header/search.tsx +418 -0
- package/src/app/components/layout/header/styles/navbarStyles.ts +27 -0
- package/src/app/components/layout/header/topBar.tsx +214 -0
- package/src/app/components/layout/joinNewsletterForm/index.tsx +72 -0
- package/src/app/components/layout/mobileAccordian/index.tsx +92 -0
- package/src/app/components/layout/paymentMethods.tsx +75 -0
- package/src/app/components/layout/rootLayout.tsx +23 -0
- package/src/app/components/layout/siteInfo.tsx +103 -0
- package/src/app/components/layout/socialLinks.tsx +65 -0
- package/src/app/components/newsletterSection/emailListSection.tsx +224 -0
- package/src/app/components/newsletterSection/emailSectionServer.tsx +8 -0
- package/src/app/components/providers/ApolloWrapper.tsx +12 -0
- package/src/app/components/providers/AppConfigurationProvider.tsx +108 -0
- package/src/app/components/providers/GoogleAnalyticsProvider.tsx +149 -0
- package/src/app/components/providers/GoogleTagManagerProvider.tsx +31 -0
- package/src/app/components/providers/RecaptchaProvider.tsx +18 -0
- package/src/app/components/providers/ServerAppConfigurationProvider.tsx +133 -0
- package/src/app/components/providers/YMMStatusProvider.tsx +15 -0
- package/src/app/components/reuseableUI/AboutUs.tsx +115 -0
- package/src/app/components/reuseableUI/AddToCartClient.tsx +125 -0
- package/src/app/components/reuseableUI/EditorJsRenderer.tsx +219 -0
- package/src/app/components/reuseableUI/HeroSectionsearchByVehicle.tsx +188 -0
- package/src/app/components/reuseableUI/ImageWithFallback.tsx +41 -0
- package/src/app/components/reuseableUI/Toast.tsx +101 -0
- package/src/app/components/reuseableUI/blogCard.tsx +52 -0
- package/src/app/components/reuseableUI/brandCard.tsx +68 -0
- package/src/app/components/reuseableUI/breadcrumb.tsx +38 -0
- package/src/app/components/reuseableUI/categoryCard.tsx +37 -0
- package/src/app/components/reuseableUI/categorySkeleton.tsx +31 -0
- package/src/app/components/reuseableUI/commonButton.tsx +48 -0
- package/src/app/components/reuseableUI/defaultInputField/index.tsx +84 -0
- package/src/app/components/reuseableUI/emptyState.tsx +29 -0
- package/src/app/components/reuseableUI/errorTag.tsx +15 -0
- package/src/app/components/reuseableUI/heading/index.tsx +20 -0
- package/src/app/components/reuseableUI/input.tsx +117 -0
- package/src/app/components/reuseableUI/listCard.tsx +137 -0
- package/src/app/components/reuseableUI/loadingUI.tsx +12 -0
- package/src/app/components/reuseableUI/modalLayout.tsx +76 -0
- package/src/app/components/reuseableUI/newsletter/newsletterClient.tsx +622 -0
- package/src/app/components/reuseableUI/newsletter/newslettersHomeModal.tsx +68 -0
- package/src/app/components/reuseableUI/offerCard.tsx +42 -0
- package/src/app/components/reuseableUI/passwordRules/passwordRules.tsx +56 -0
- package/src/app/components/reuseableUI/primaryButton/index.tsx +34 -0
- package/src/app/components/reuseableUI/productCard.tsx +118 -0
- package/src/app/components/reuseableUI/productSkeleton.tsx +34 -0
- package/src/app/components/reuseableUI/searchByVehicle.tsx +187 -0
- package/src/app/components/reuseableUI/secondaryButton/index.tsx +34 -0
- package/src/app/components/reuseableUI/section.tsx +20 -0
- package/src/app/components/reuseableUI/select/index.tsx +98 -0
- package/src/app/components/reuseableUI/skeletonLoader.tsx +117 -0
- package/src/app/components/reuseableUI/statusTag.tsx +24 -0
- package/src/app/components/reuseableUI/tags/saleTag.tsx +19 -0
- package/src/app/components/reuseableUI/testimonialCard.tsx +93 -0
- package/src/app/components/richText/EditorRenderer.tsx +318 -0
- package/src/app/components/search/HierarchicalCategoryFilter.tsx +155 -0
- package/src/app/components/search/SearchFilters.tsx +155 -0
- package/src/app/components/search/YMMSearchSidebar.tsx +187 -0
- package/src/app/components/seo/ServerProductCard.tsx +91 -0
- package/src/app/components/seo/ServerProductGrid.tsx +45 -0
- package/src/app/components/shop/CategoryFilter.tsx +184 -0
- package/src/app/components/shop/ItemsPerPageSelect.tsx +69 -0
- package/src/app/components/shop/ItemsPerPageSelectClient.tsx +58 -0
- package/src/app/components/shop/MobileFilters.tsx +103 -0
- package/src/app/components/shop/ProductGridSkeleton.tsx +16 -0
- package/src/app/components/shop/ProductsGrid.tsx +230 -0
- package/src/app/components/shop/SearchFilter.tsx +218 -0
- package/src/app/components/shop/SearchFilterClient.tsx +122 -0
- package/src/app/components/shop/SearchLoadingOverlay.tsx +32 -0
- package/src/app/components/shop/ShopMobileFilters.tsx +205 -0
- package/src/app/components/showroom/VehicleSearchDropdowns.tsx +187 -0
- package/src/app/components/showroom/brandsSwiper.tsx +49 -0
- package/src/app/components/showroom/brandsSwiperClient copy.tsx +93 -0
- package/src/app/components/showroom/brandsSwiperClient.tsx +122 -0
- package/src/app/components/showroom/brandsSwiperServer.tsx +42 -0
- package/src/app/components/showroom/bundleProducts.tsx +120 -0
- package/src/app/components/showroom/categoryGrid.tsx +51 -0
- package/src/app/components/showroom/categoryGridServer.tsx +45 -0
- package/src/app/components/showroom/categorySwiper.tsx +115 -0
- package/src/app/components/showroom/featureStrip.tsx +139 -0
- package/src/app/components/showroom/offersSwiper.tsx +181 -0
- package/src/app/components/showroom/productGrid.tsx +56 -0
- package/src/app/components/showroom/productSwiper.tsx +119 -0
- package/src/app/components/showroom/promotion-slider.tsx +138 -0
- package/src/app/components/showroom/promotion.tsx +207 -0
- package/src/app/components/showroom/promotionsSwiper.tsx +174 -0
- package/src/app/components/showroom/showroomHeroCarousel.tsx +141 -0
- package/src/app/components/showroom/testimonialsGrid.tsx +106 -0
- package/src/app/components/skeletons/ContentSkeleton.tsx +14 -0
- package/src/app/components/sortDropdown/index.tsx +116 -0
- package/src/app/components/tertiaryButton/index.tsx +25 -0
- package/src/app/components/theme/theme-provider.tsx +82 -0
- package/src/app/contact/layout.tsx +32 -0
- package/src/app/contact/page.tsx +591 -0
- package/src/app/content/[slug]/layout.tsx +17 -0
- package/src/app/content/[slug]/page.tsx +159 -0
- package/src/app/content/layout.tsx +31 -0
- package/src/app/content/page.tsx +88 -0
- package/src/app/core-policies/page.tsx +55 -0
- package/src/app/discounts/page.tsx +54 -0
- package/src/app/frequently-asked-questions/page.tsx +57 -0
- package/src/app/globals.css +440 -0
- package/src/app/hooks/useDealerLocations.ts +259 -0
- package/src/app/hooks/useGTMEngagement.ts +71 -0
- package/src/app/hooks/useGoogleAnalytics.ts +145 -0
- package/src/app/layout.tsx +149 -0
- package/src/app/not-found.tsx +31 -0
- package/src/app/order-confirmation/layout.tsx +19 -0
- package/src/app/order-confirmation/page.tsx +12 -0
- package/src/app/order-confirmation/summary.tsx +1775 -0
- package/src/app/page.tsx +194 -0
- package/src/app/privacy-policy/loading.tsx +17 -0
- package/src/app/privacy-policy/page.tsx +56 -0
- package/src/app/product/[id]/ProductDetailClient.tsx +2448 -0
- package/src/app/product/[id]/components/itemInquiryModal.tsx +461 -0
- package/src/app/product/[id]/layout.tsx +116 -0
- package/src/app/product/[id]/page.tsx +200 -0
- package/src/app/product/layout.tsx +15 -0
- package/src/app/products/all/AllProductsClient.tsx +743 -0
- package/src/app/products/all/page.tsx +176 -0
- package/src/app/products/components/shopEmptyState.tsx +29 -0
- package/src/app/request-return/layout.tsx +36 -0
- package/src/app/request-return/page.tsx +597 -0
- package/src/app/robots.txt/route.ts +27 -0
- package/src/app/search/layout.tsx +16 -0
- package/src/app/search/page.tsx +736 -0
- package/src/app/shipping-returns/page.tsx +60 -0
- package/src/app/site-map/layout.tsx +33 -0
- package/src/app/site-map/page.tsx +113 -0
- package/src/app/sitemap-index.xml/route.ts +20 -0
- package/src/app/sitemap.ts +10 -0
- package/src/app/terms-and-conditions/loading.tsx +17 -0
- package/src/app/terms-and-conditions/page.tsx +56 -0
- package/src/app/utils/appConfiguration.ts +327 -0
- package/src/app/utils/branding.ts +52 -0
- package/src/app/utils/configurationService.ts +202 -0
- package/src/app/utils/constant.tsx +242 -0
- package/src/app/utils/editorJsUtils.tsx +249 -0
- package/src/app/utils/functions.ts +146 -0
- package/src/app/utils/googleAnalytics.ts +168 -0
- package/src/app/utils/googleTagManager.ts +475 -0
- package/src/app/utils/ipDetection.ts +270 -0
- package/src/app/utils/serverConfigurationService.ts +209 -0
- package/src/app/utils/svgs/GridIcon.tsx +45 -0
- package/src/app/utils/svgs/account/myAccount/listDotIcon.tsx +3 -0
- package/src/app/utils/svgs/account/myAccount/tickIcon.tsx +10 -0
- package/src/app/utils/svgs/account/orderHistory/InfoIcon.tsx +49 -0
- package/src/app/utils/svgs/arrowDownIcon.tsx +17 -0
- package/src/app/utils/svgs/arrowIcon.tsx +25 -0
- package/src/app/utils/svgs/arrowUpIcon.tsx +16 -0
- package/src/app/utils/svgs/brandsSearchIcon.tsx +25 -0
- package/src/app/utils/svgs/cart/cartIcon.tsx +31 -0
- package/src/app/utils/svgs/cart/plusIcon.tsx +13 -0
- package/src/app/utils/svgs/cart/subtractIcon.tsx +13 -0
- package/src/app/utils/svgs/cart/successTickIcon.tsx +14 -0
- package/src/app/utils/svgs/chevronDownIcon.tsx +21 -0
- package/src/app/utils/svgs/closeEyeIcon.tsx +47 -0
- package/src/app/utils/svgs/crossIcon.tsx +25 -0
- package/src/app/utils/svgs/eyeIcon.tsx +29 -0
- package/src/app/utils/svgs/featureTag.tsx +20 -0
- package/src/app/utils/svgs/filterIcon.tsx +3 -0
- package/src/app/utils/svgs/globleIcon.tsx +41 -0
- package/src/app/utils/svgs/infoIcon.tsx +34 -0
- package/src/app/utils/svgs/listIcon.tsx +50 -0
- package/src/app/utils/svgs/logOutIcon.tsx +35 -0
- package/src/app/utils/svgs/menuIcon.tsx +8 -0
- package/src/app/utils/svgs/minusIcon.tsx +18 -0
- package/src/app/utils/svgs/newsletterIcon.tsx +19 -0
- package/src/app/utils/svgs/noDataFoundIcon-.tsx +26 -0
- package/src/app/utils/svgs/noProductFoundIcon.tsx +43 -0
- package/src/app/utils/svgs/passwordIcons/errorIcon.tsx +31 -0
- package/src/app/utils/svgs/passwordIcons/successIcon.tsx +24 -0
- package/src/app/utils/svgs/paymentProcessingIcons/hourglassIcon.tsx +43 -0
- package/src/app/utils/svgs/paymentProcessingIcons/modalCrossIcon.tsx +23 -0
- package/src/app/utils/svgs/paymentProcessingIcons/paymentFailedIcon.tsx +47 -0
- package/src/app/utils/svgs/pencilIcon.tsx +11 -0
- package/src/app/utils/svgs/plusIcon.tsx +25 -0
- package/src/app/utils/svgs/productInquiryIcon.tsx +40 -0
- package/src/app/utils/svgs/searchIcon.tsx +31 -0
- package/src/app/utils/svgs/shoppingCart.tsx +32 -0
- package/src/app/utils/svgs/spinnerIcon.tsx +22 -0
- package/src/app/utils/svgs/spinnerLoadingIcon.tsx +26 -0
- package/src/app/utils/svgs/successTickIcon.tsx +40 -0
- package/src/app/utils/svgs/swiperArrowIconLeft.tsx +18 -0
- package/src/app/utils/svgs/swiperArrowIconRight.tsx +18 -0
- package/src/app/utils/svgs/userProfileIcon.tsx +31 -0
- package/src/app/utils/svgs/warningCircleIcon.tsx +15 -0
- package/src/app/warranty/constant.tsx +63 -0
- package/src/app/warranty/loading.tsx +17 -0
- package/src/app/warranty/page.tsx +56 -0
- package/src/graphql/client.ts +288 -0
- package/src/graphql/mutations/accountAddressCreate.ts +56 -0
- package/src/graphql/mutations/accountAddressDelete.ts +23 -0
- package/src/graphql/mutations/accountAddressUpdate.ts +55 -0
- package/src/graphql/mutations/accountSetDefaultAddress.ts +32 -0
- package/src/graphql/mutations/accountUpdate.ts +34 -0
- package/src/graphql/mutations/changePassword.ts +25 -0
- package/src/graphql/mutations/checkout.ts +117 -0
- package/src/graphql/mutations/checkoutAddVoucher.ts +63 -0
- package/src/graphql/mutations/checkoutComplete.ts +79 -0
- package/src/graphql/mutations/checkoutCreate.ts +131 -0
- package/src/graphql/mutations/checkoutCustomerAttach.ts +50 -0
- package/src/graphql/mutations/checkoutEmailUpdate.ts +15 -0
- package/src/graphql/mutations/checkoutLineMetadataUpdate.ts +52 -0
- package/src/graphql/mutations/checkoutPaymentCreate.ts +82 -0
- package/src/graphql/mutations/paymentGatewayInitialize.ts +58 -0
- package/src/graphql/mutations/registerAccount.ts +65 -0
- package/src/graphql/mutations/requestPasswordReset.ts +32 -0
- package/src/graphql/mutations/setPassword.ts +49 -0
- package/src/graphql/mutations/signIn.ts +50 -0
- package/src/graphql/mutations/tokenRefresh.ts +19 -0
- package/src/graphql/mutations/updateCheckoutMetadata.ts +49 -0
- package/src/graphql/mutations/updateProfile.ts +18 -0
- package/src/graphql/mutations/willCallDeliveryMethod.ts +81 -0
- package/src/graphql/queries/checkout.ts +168 -0
- package/src/graphql/queries/findProductByOldSlug.ts +58 -0
- package/src/graphql/queries/getAboutPage.ts +24 -0
- package/src/graphql/queries/getAboutPageId.ts +9 -0
- package/src/graphql/queries/getAboutUs.ts +38 -0
- package/src/graphql/queries/getAddressInformation.ts +38 -0
- package/src/graphql/queries/getAllCategories.ts +41 -0
- package/src/graphql/queries/getAllCategoriesTree.ts +67 -0
- package/src/graphql/queries/getAllCategoriesWithProducts.ts +29 -0
- package/src/graphql/queries/getAllCollectionsWithProducts.ts +16 -0
- package/src/graphql/queries/getBlogs.ts +222 -0
- package/src/graphql/queries/getBrands.ts +17 -0
- package/src/graphql/queries/getBundles.ts +43 -0
- package/src/graphql/queries/getCategories.ts +20 -0
- package/src/graphql/queries/getChannels.ts +77 -0
- package/src/graphql/queries/getCheckoutQuestions.ts +115 -0
- package/src/graphql/queries/getCheckoutTermsAndConditions.ts +37 -0
- package/src/graphql/queries/getContactPage.ts +117 -0
- package/src/graphql/queries/getContentPage.ts +191 -0
- package/src/graphql/queries/getDiscountOffers.ts +18 -0
- package/src/graphql/queries/getDynamicPageBySlug.ts +251 -0
- package/src/graphql/queries/getFeaturedProducts.ts +48 -0
- package/src/graphql/queries/getHeroMetadata.ts +23 -0
- package/src/graphql/queries/getMenuBySlug.ts +84 -0
- package/src/graphql/queries/getMyProfile.ts +23 -0
- package/src/graphql/queries/getNewsletter.ts +122 -0
- package/src/graphql/queries/getNewsletterPage.ts +111 -0
- package/src/graphql/queries/getPageBySlug.ts +52 -0
- package/src/graphql/queries/getPageTypeId.ts +27 -0
- package/src/graphql/queries/getPaymentMethods.ts +61 -0
- package/src/graphql/queries/getProducts.ts +78 -0
- package/src/graphql/queries/getPromotions.ts +24 -0
- package/src/graphql/queries/getRequestReturnPage.ts +121 -0
- package/src/graphql/queries/getSiteInfo.ts +54 -0
- package/src/graphql/queries/getSocialLinks.ts +52 -0
- package/src/graphql/queries/getTestimonials.ts +25 -0
- package/src/graphql/queries/getUserWithCheckout.ts +27 -0
- package/src/graphql/queries/getVehicleMakes.ts +21 -0
- package/src/graphql/queries/getVehicleModels.ts +21 -0
- package/src/graphql/queries/getVehicleYears.ts +21 -0
- package/src/graphql/queries/meAddresses.ts +56 -0
- package/src/graphql/queries/myOrders.ts +37 -0
- package/src/graphql/queries/orderDetail.ts +231 -0
- package/src/graphql/queries/productDetailsById.ts +197 -0
- package/src/graphql/queries/productInquiry.ts +115 -0
- package/src/graphql/queries/productsByCategoriesAndCollections.ts +39 -0
- package/src/graphql/queries/willCallCollectionPoints.ts +55 -0
- package/src/graphql/server-client.ts +54 -0
- package/src/graphql/types/categories.ts +9 -0
- package/src/graphql/types/checkout.ts +168 -0
- package/src/graphql/types/offer.ts +12 -0
- package/src/graphql/types/product.ts +44 -0
- package/src/hooks/scrollPageTop.ts +9 -0
- package/src/hooks/serverNavbarData.ts +79 -0
- package/src/hooks/useCartSync.ts +24 -0
- package/src/hooks/useRecaptcha.ts +33 -0
- package/src/hooks/useTokenExpiration.ts +81 -0
- package/src/hooks/useVehicleData.ts +346 -0
- package/src/lib/api/kount.ts +165 -0
- package/src/lib/api/shop.ts +1445 -0
- package/src/lib/saleor/getSaleorApiUrl.ts +25 -0
- package/src/lib/schema.ts +303 -0
- package/src/lib/seo/extractTextFromEditorJs.ts +58 -0
- package/src/lib/seo/site.ts +10 -0
- package/src/lib/urls/normalizeInternalUrl.ts +53 -0
- package/src/middleware.ts +134 -0
- package/src/sitemaps/README.md +105 -0
- package/src/sitemaps/dynamic-pages-sitemap.ts +247 -0
- package/src/sitemaps/sitemap-index.ts +21 -0
- package/src/sitemaps/static-pages-sitemap.ts +36 -0
- package/src/store/useGlobalStore.tsx +1656 -0
- package/src/types/global.d.ts +148 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import BlogEditorRenderer from "@/app/blog/[slug]/blogContentRenderer";
|
|
2
|
+
import Breadcrumb from "@/app/components/reuseableUI/breadcrumb";
|
|
3
|
+
import Heading from "@/app/components/reuseableUI/heading";
|
|
4
|
+
import { getStoreName } from "@/app/utils/branding";
|
|
5
|
+
import { fetchBlogBySlug } from "@/graphql/queries/getBlogs";
|
|
6
|
+
import {
|
|
7
|
+
generateBlogPostingSchema,
|
|
8
|
+
generateBreadcrumbSchema,
|
|
9
|
+
} from "@/lib/schema";
|
|
10
|
+
import type { Metadata } from "next";
|
|
11
|
+
import Link from "next/link";
|
|
12
|
+
import { notFound } from "next/navigation";
|
|
13
|
+
import { extractTextFromEditorJs } from "@/lib/seo/extractTextFromEditorJs";
|
|
14
|
+
|
|
15
|
+
function truncate(input: string, maxLen: number): string {
|
|
16
|
+
const v = input.trim();
|
|
17
|
+
if (v.length <= maxLen) return v;
|
|
18
|
+
return v.slice(0, Math.max(0, maxLen - 1)).trimEnd() + "…";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function generateMetadata({
|
|
22
|
+
params,
|
|
23
|
+
}: {
|
|
24
|
+
params: Promise<{ slug: string }>;
|
|
25
|
+
}): Promise<Metadata> {
|
|
26
|
+
const { slug } = await params;
|
|
27
|
+
const post = await fetchBlogBySlug(slug);
|
|
28
|
+
|
|
29
|
+
if (!post || !post.title) {
|
|
30
|
+
return {
|
|
31
|
+
title: `Content Page Not Found - ${getStoreName()}`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const desc =
|
|
36
|
+
truncate(extractTextFromEditorJs(post.content), 160) ||
|
|
37
|
+
`${post.title} - ${getStoreName()}`;
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
title: `${post.title} - ${getStoreName()}`,
|
|
41
|
+
description: desc,
|
|
42
|
+
alternates: {
|
|
43
|
+
canonical: `/content/${slug}`,
|
|
44
|
+
},
|
|
45
|
+
openGraph: {
|
|
46
|
+
title: `${post.title} - ${getStoreName()}`,
|
|
47
|
+
description: desc,
|
|
48
|
+
type: "article",
|
|
49
|
+
url: `/content/${slug}`,
|
|
50
|
+
images: [{ url: "/Logo.png" }],
|
|
51
|
+
},
|
|
52
|
+
twitter: {
|
|
53
|
+
card: "summary_large_image",
|
|
54
|
+
title: `${post.title} - ${getStoreName()}`,
|
|
55
|
+
description: desc,
|
|
56
|
+
images: ["/Logo.png"],
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default async function BlogPostPage({
|
|
62
|
+
params,
|
|
63
|
+
}: {
|
|
64
|
+
params: Promise<{ slug: string }>;
|
|
65
|
+
}) {
|
|
66
|
+
const { slug } = await params;
|
|
67
|
+
const post = await fetchBlogBySlug(slug);
|
|
68
|
+
|
|
69
|
+
if (!post || !post.title) {
|
|
70
|
+
notFound();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Format date if available
|
|
74
|
+
const formattedDate = post.created
|
|
75
|
+
? new Date(post.created).toLocaleDateString("en-US", {
|
|
76
|
+
year: "numeric",
|
|
77
|
+
month: "long",
|
|
78
|
+
day: "numeric",
|
|
79
|
+
})
|
|
80
|
+
: "";
|
|
81
|
+
|
|
82
|
+
// Generate schema.org structured data
|
|
83
|
+
const desc =
|
|
84
|
+
truncate(extractTextFromEditorJs(post.content), 200) ||
|
|
85
|
+
`${post.title} - ${getStoreName()}`;
|
|
86
|
+
|
|
87
|
+
const blogSchema = generateBlogPostingSchema(
|
|
88
|
+
post.title,
|
|
89
|
+
desc,
|
|
90
|
+
`/content/${slug}`,
|
|
91
|
+
post.created || new Date().toISOString(),
|
|
92
|
+
post.created || new Date().toISOString()
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const breadcrumbSchema = generateBreadcrumbSchema([
|
|
96
|
+
{ name: "Home", url: "/" },
|
|
97
|
+
{ name: "Content", url: "/content" },
|
|
98
|
+
{ name: post.title, url: `/content/${slug}` },
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<main className="h-full w-full">
|
|
103
|
+
{/* Schema.org structured data */}
|
|
104
|
+
<script
|
|
105
|
+
type="application/ld+json"
|
|
106
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(blogSchema) }}
|
|
107
|
+
/>
|
|
108
|
+
<script
|
|
109
|
+
type="application/ld+json"
|
|
110
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbSchema) }}
|
|
111
|
+
/>
|
|
112
|
+
<div className="container mx-auto max-w-[1276px]">
|
|
113
|
+
<div className="flex flex-col items-start w-full gap-8 px-4 md:px-6 py-12 md:py-16 lg:py-24">
|
|
114
|
+
<div className="flex flex-col items-start gap-5 w-full">
|
|
115
|
+
<Breadcrumb
|
|
116
|
+
items={[
|
|
117
|
+
{ text: "Home", link: "/" },
|
|
118
|
+
{ text: "CONTENT", link: "/content" },
|
|
119
|
+
{ text: post.title, link: `/content/${post.slug}` },
|
|
120
|
+
]}
|
|
121
|
+
/>
|
|
122
|
+
<Heading as="h1" content={post.title} />
|
|
123
|
+
{post?.metadata?.filter((item) => item?.key === "topic")[0]
|
|
124
|
+
?.value && (
|
|
125
|
+
<span className="w-fit text-xs font-medium text-[var(--color-primary-600)] bg-[var(--color-primary-100)] px-2 py-1 rounded-full">
|
|
126
|
+
{
|
|
127
|
+
post?.metadata?.filter((item) => item?.key === "topic")[0]
|
|
128
|
+
?.value
|
|
129
|
+
}
|
|
130
|
+
</span>
|
|
131
|
+
)}
|
|
132
|
+
{formattedDate && (
|
|
133
|
+
<p className="text-sm text-[var(--color-secondary-500)]">
|
|
134
|
+
Published on {formattedDate}
|
|
135
|
+
</p>
|
|
136
|
+
)}
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<div className="w-full flex flex-col items-start gap-6">
|
|
140
|
+
{/* Blog Content */}
|
|
141
|
+
<div className="w-full">
|
|
142
|
+
<BlogEditorRenderer content={post.content} />
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
{/* Back to Blog Link */}
|
|
146
|
+
<div className="w-full pt-8 border-t border-[var(--color-secondary-200)]">
|
|
147
|
+
<Link
|
|
148
|
+
href="/content"
|
|
149
|
+
className="text-[var(--color-primary-600)] hover:underline inline-flex items-center gap-2"
|
|
150
|
+
>
|
|
151
|
+
← Back to all content
|
|
152
|
+
</Link>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</main>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Metadata } from "next"
|
|
2
|
+
import { getStoreName } from "@/app/utils/branding"
|
|
3
|
+
|
|
4
|
+
export const metadata: Metadata = {
|
|
5
|
+
title: `Content - ${getStoreName()}`,
|
|
6
|
+
description: `Check out our latest content and articles to stay updated with the newest trends and insights.`,
|
|
7
|
+
alternates: {
|
|
8
|
+
canonical: "/content",
|
|
9
|
+
},
|
|
10
|
+
openGraph: {
|
|
11
|
+
title: `Content - ${getStoreName()}`,
|
|
12
|
+
description: `Check out our latest content and articles to stay updated with the newest trends and insights.`,
|
|
13
|
+
type: "website",
|
|
14
|
+
url: "/content",
|
|
15
|
+
images: [{ url: "/Logo.png" }],
|
|
16
|
+
},
|
|
17
|
+
twitter: {
|
|
18
|
+
card: "summary_large_image",
|
|
19
|
+
title: `Content - ${getStoreName()}`,
|
|
20
|
+
description: `Check out our latest content and articles to stay updated with the newest trends and insights.`,
|
|
21
|
+
images: ["/Logo.png"],
|
|
22
|
+
},
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default function BlogLayout({
|
|
26
|
+
children,
|
|
27
|
+
}: {
|
|
28
|
+
children: React.ReactNode
|
|
29
|
+
}) {
|
|
30
|
+
return children
|
|
31
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { getStoreName } from "@/app/utils/branding";
|
|
2
|
+
import { fetchContentPages } from "@/graphql/queries/getContentPage";
|
|
3
|
+
import {
|
|
4
|
+
generateBreadcrumbSchema,
|
|
5
|
+
generateCollectionPageSchema,
|
|
6
|
+
} from "@/lib/schema";
|
|
7
|
+
import type { Metadata } from "next";
|
|
8
|
+
import { Suspense } from "react";
|
|
9
|
+
import BlogList from "../components/blog/BlogList";
|
|
10
|
+
import Breadcrumb from "../components/reuseableUI/breadcrumb";
|
|
11
|
+
import Heading from "../components/reuseableUI/heading";
|
|
12
|
+
|
|
13
|
+
export const metadata: Metadata = {
|
|
14
|
+
title: `Content - ${getStoreName()}`,
|
|
15
|
+
description:
|
|
16
|
+
"Read our latest articles, news, and insights about our products and services.",
|
|
17
|
+
alternates: {
|
|
18
|
+
canonical: "/content",
|
|
19
|
+
},
|
|
20
|
+
openGraph: {
|
|
21
|
+
title: `Content - ${getStoreName()}`,
|
|
22
|
+
description:
|
|
23
|
+
"Read our latest articles, news, and insights about our products and services.",
|
|
24
|
+
type: "website",
|
|
25
|
+
url: "/content",
|
|
26
|
+
images: [{ url: "/Logo.png" }],
|
|
27
|
+
},
|
|
28
|
+
twitter: {
|
|
29
|
+
card: "summary_large_image",
|
|
30
|
+
title: `Content - ${getStoreName()}`,
|
|
31
|
+
description:
|
|
32
|
+
"Read our latest articles, news, and insights about our products and services.",
|
|
33
|
+
images: ["/Logo.png"],
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export default async function BlogPage() {
|
|
38
|
+
// Fetch blog posts from CMS
|
|
39
|
+
const content = await fetchContentPages();
|
|
40
|
+
|
|
41
|
+
// Generate schema.org structured data
|
|
42
|
+
const collectionSchema = generateCollectionPageSchema(
|
|
43
|
+
"Content",
|
|
44
|
+
"Read our latest articles, news, and insights about our products and services.",
|
|
45
|
+
"/content"
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const breadcrumbSchema = generateBreadcrumbSchema([
|
|
49
|
+
{ name: "Home", url: "/" },
|
|
50
|
+
{ name: "Content", url: "/content" },
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<main className="h-full w-full">
|
|
55
|
+
{/* Schema.org structured data */}
|
|
56
|
+
<script
|
|
57
|
+
type="application/ld+json"
|
|
58
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(collectionSchema) }}
|
|
59
|
+
/>
|
|
60
|
+
<script
|
|
61
|
+
type="application/ld+json"
|
|
62
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbSchema) }}
|
|
63
|
+
/>
|
|
64
|
+
<div className="container mx-auto max-w-[1276px]">
|
|
65
|
+
<div className="flex flex-col items-start w-full gap-16 px-4 md:px-6 py-12 md:py-16 lg:py-24">
|
|
66
|
+
<div className="flex flex-col items-start gap-5 w-full">
|
|
67
|
+
<Breadcrumb
|
|
68
|
+
items={[
|
|
69
|
+
{ text: "Home", link: "/" },
|
|
70
|
+
{ text: "CONTENT", link: "/content" },
|
|
71
|
+
]}
|
|
72
|
+
/>
|
|
73
|
+
|
|
74
|
+
<Heading
|
|
75
|
+
as="h1"
|
|
76
|
+
content="Content"
|
|
77
|
+
className="!text-[var(--color-primary-600)]"
|
|
78
|
+
/>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<Suspense fallback={<div>Loading contents...</div>}>
|
|
82
|
+
<BlogList blogs={content} pageRoute={"content"} pageSize={9} />
|
|
83
|
+
</Suspense>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
</main>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import AncillaryContent from "@/app/components/ancillary/AncillaryContent";
|
|
2
|
+
import ContentSkeleton from "@/app/components/skeletons/ContentSkeleton";
|
|
3
|
+
import { getStoreName } from "@/app/utils/branding";
|
|
4
|
+
import type { Metadata } from "next";
|
|
5
|
+
import { Suspense } from "react";
|
|
6
|
+
import Breadcrumb from "../components/reuseableUI/breadcrumb";
|
|
7
|
+
import Heading from "../components/reuseableUI/heading";
|
|
8
|
+
|
|
9
|
+
export const metadata: Metadata = {
|
|
10
|
+
title: `Core Policies - ${getStoreName()}`,
|
|
11
|
+
description: `Core policies of ${getStoreName()} including terms, privacy, and more.`,
|
|
12
|
+
alternates: {
|
|
13
|
+
canonical: "/core-policies",
|
|
14
|
+
},
|
|
15
|
+
openGraph: {
|
|
16
|
+
title: `Core Policies - ${getStoreName()}`,
|
|
17
|
+
description: `Core policies of ${getStoreName()} including terms, privacy, and more.`,
|
|
18
|
+
type: "website",
|
|
19
|
+
url: "/core-policies",
|
|
20
|
+
images: [{ url: "/Logo.png" }],
|
|
21
|
+
},
|
|
22
|
+
twitter: {
|
|
23
|
+
card: "summary_large_image",
|
|
24
|
+
title: `Core Policies - ${getStoreName()}`,
|
|
25
|
+
description: `Core policies of ${getStoreName()} including terms, privacy, and more.`,
|
|
26
|
+
images: ["/Logo.png"],
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default function CorePoliciesPage() {
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<main className="h-full w-full">
|
|
34
|
+
<div className="container mx-auto max-w-[1276px]">
|
|
35
|
+
<div className="flex flex-col items-start w-full px-4 md:px-6 py-12 md:py-16 lg:py-24">
|
|
36
|
+
<div className="flex flex-col items-start gap-5 mb-6 w-full">
|
|
37
|
+
<Breadcrumb
|
|
38
|
+
items={[
|
|
39
|
+
{ text: "Home", link: "/" },
|
|
40
|
+
{ text: "Core Policies", link: "/core-policies" },
|
|
41
|
+
]}
|
|
42
|
+
/>
|
|
43
|
+
<Heading as="h1" content="Core Policies" />
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<section className="w-full">
|
|
47
|
+
<Suspense fallback={<ContentSkeleton />}>
|
|
48
|
+
<AncillaryContent slug="core-policies" />
|
|
49
|
+
</Suspense>
|
|
50
|
+
</section>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</main>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import AncillaryContent from "@/app/components/ancillary/AncillaryContent";
|
|
2
|
+
import ContentSkeleton from "@/app/components/skeletons/ContentSkeleton";
|
|
3
|
+
import { getStoreName } from "@/app/utils/branding";
|
|
4
|
+
import type { Metadata } from "next";
|
|
5
|
+
import { Suspense } from "react";
|
|
6
|
+
import Breadcrumb from "../components/reuseableUI/breadcrumb";
|
|
7
|
+
import Heading from "../components/reuseableUI/heading";
|
|
8
|
+
|
|
9
|
+
export const metadata: Metadata = {
|
|
10
|
+
title: `Discount - ${getStoreName()}`,
|
|
11
|
+
description: `Discount ${getStoreName()} products and special offers. Save on top-quality items with exclusive deals and promotions.`,
|
|
12
|
+
alternates: {
|
|
13
|
+
canonical: "/discounts",
|
|
14
|
+
},
|
|
15
|
+
openGraph: {
|
|
16
|
+
title: `Discount - ${getStoreName()}`,
|
|
17
|
+
description: `Discount ${getStoreName()} products and special offers. Save on top-quality items with exclusive deals and promotions.`,
|
|
18
|
+
type: "website",
|
|
19
|
+
url: "/discounts",
|
|
20
|
+
images: [{ url: "/Logo.png" }],
|
|
21
|
+
},
|
|
22
|
+
twitter: {
|
|
23
|
+
card: "summary_large_image",
|
|
24
|
+
title: `Discount - ${getStoreName()}`,
|
|
25
|
+
description: `Discount ${getStoreName()} products and special offers. Save on top-quality items with exclusive deals and promotions.`,
|
|
26
|
+
images: ["/Logo.png"],
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default function DiscountsPage() {
|
|
31
|
+
return (
|
|
32
|
+
<main className="h-full w-full">
|
|
33
|
+
<div className="container mx-auto max-w-[1276px]">
|
|
34
|
+
<div className="flex flex-col items-start w-full px-4 md:px-6 py-12 md:py-16 lg:py-24">
|
|
35
|
+
<div className="flex flex-col items-start gap-5 mb-6 w-full">
|
|
36
|
+
<Breadcrumb
|
|
37
|
+
items={[
|
|
38
|
+
{ text: "Home", link: "/" },
|
|
39
|
+
{ text: "Discounts", link: "/discounts" },
|
|
40
|
+
]}
|
|
41
|
+
/>
|
|
42
|
+
<Heading as="h1" content="Discounts" />
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<section className="w-full">
|
|
46
|
+
<Suspense fallback={<ContentSkeleton />}>
|
|
47
|
+
<AncillaryContent slug="discounts" />
|
|
48
|
+
</Suspense>
|
|
49
|
+
</section>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</main>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Suspense } from "react";
|
|
2
|
+
import type { Metadata } from "next";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import AncillaryContent from "@/app/components/ancillary/AncillaryContent";
|
|
5
|
+
import ContentSkeleton from "@/app/components/skeletons/ContentSkeleton";
|
|
6
|
+
import { getStoreName } from "@/app/utils/branding";
|
|
7
|
+
import Breadcrumb from "../components/reuseableUI/breadcrumb";
|
|
8
|
+
import Heading from "../components/reuseableUI/heading";
|
|
9
|
+
|
|
10
|
+
export const metadata: Metadata = {
|
|
11
|
+
title: `FAQ - ${getStoreName()}`,
|
|
12
|
+
description: `Find answers to frequently asked questions about ordering, shipping, returns, and product compatibility at ${getStoreName()}.`,
|
|
13
|
+
alternates: {
|
|
14
|
+
canonical: "/frequently-asked-questions",
|
|
15
|
+
},
|
|
16
|
+
openGraph: {
|
|
17
|
+
title: `FAQ - ${getStoreName()}`,
|
|
18
|
+
description: `Find answers to frequently asked questions about ordering, shipping, returns, and product compatibility at ${getStoreName()}.`,
|
|
19
|
+
type: "website",
|
|
20
|
+
url: "/frequently-asked-questions",
|
|
21
|
+
images: [{ url: "/Logo.png" }],
|
|
22
|
+
},
|
|
23
|
+
twitter: {
|
|
24
|
+
card: "summary_large_image",
|
|
25
|
+
title: `FAQ - ${getStoreName()}`,
|
|
26
|
+
description: `Find answers to frequently asked questions about ordering, shipping, returns, and product compatibility at ${getStoreName()}.`,
|
|
27
|
+
images: ["/Logo.png"],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default function FAQPage() {
|
|
32
|
+
const derivedTitle = "FAQS";
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<main className="h-full w-full">
|
|
36
|
+
<div className="container mx-auto max-w-[1276px]">
|
|
37
|
+
<div className="flex flex-col items-start w-full px-4 md:px-6 py-12 md:py-16 lg:py-24">
|
|
38
|
+
<div className="flex flex-col items-start gap-5 mb-6 w-full">
|
|
39
|
+
<Breadcrumb
|
|
40
|
+
items={[
|
|
41
|
+
{ text: "Home", link: "/" },
|
|
42
|
+
{ text: "FAQS", link: "/frequently-asked-questions" },
|
|
43
|
+
]}
|
|
44
|
+
/>
|
|
45
|
+
<Heading as="h1" content={derivedTitle} />
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<section className="w-full">
|
|
49
|
+
<Suspense fallback={<ContentSkeleton />}>
|
|
50
|
+
<AncillaryContent slug="frequently-asked-questions" />
|
|
51
|
+
</Suspense>
|
|
52
|
+
</section>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</main>
|
|
56
|
+
);
|
|
57
|
+
}
|