@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.
Files changed (441) hide show
  1. package/.env.example +57 -0
  2. package/APPLE_PAY_QUICK_START.md +165 -0
  3. package/APPLE_PAY_SETUP.md +331 -0
  4. package/README.md +46 -0
  5. package/SEO_AUDIT_CHECKLIST_STATUS.md +244 -0
  6. package/SEO_AUDIT_REPORT.md +66 -0
  7. package/eslint.config.mjs +16 -0
  8. package/next-env.d.ts +5 -0
  9. package/next.config.ts +109 -0
  10. package/package.json +47 -0
  11. package/postcss.config.mjs +5 -0
  12. package/public/.well-known/apple-developer-merchantid-domain-association +1 -0
  13. package/public/Logo.png +0 -0
  14. package/public/brand-video.mp4 +0 -0
  15. package/public/favicon.ico +0 -0
  16. package/public/file.svg +1 -0
  17. package/public/footer/facebook.tsx +34 -0
  18. package/public/footer/instagram.tsx +27 -0
  19. package/public/footer/mail.tsx +5 -0
  20. package/public/footer/x.tsx +35 -0
  21. package/public/globe.svg +1 -0
  22. package/public/icons/Authorize.net.webp +0 -0
  23. package/public/icons/amex.gif +0 -0
  24. package/public/icons/appIcon.png +0 -0
  25. package/public/icons/discover.gif +0 -0
  26. package/public/icons/master.gif +0 -0
  27. package/public/icons/paypal.png +0 -0
  28. package/public/icons/stripe.png +0 -0
  29. package/public/icons/visa.gif +0 -0
  30. package/public/images/BackgroundNoise.png +0 -0
  31. package/public/images/footer-background.png +0 -0
  32. package/public/next.svg +1 -0
  33. package/public/no-image-avail-large.png +0 -0
  34. package/public/random-car-1.jpeg +0 -0
  35. package/public/random-car-2.png +0 -0
  36. package/public/random-car-3.jpg +0 -0
  37. package/public/random-car-4.jpg +0 -0
  38. package/public/random-car-5.jpg +0 -0
  39. package/public/star.svg +3 -0
  40. package/public/vercel.svg +1 -0
  41. package/public/window.svg +1 -0
  42. package/scripts/seo-audit/generate-checklist.mjs +156 -0
  43. package/src/app/(auth)/account/forgot-password/layout.tsx +16 -0
  44. package/src/app/(auth)/account/forgot-password/page.tsx +135 -0
  45. package/src/app/(auth)/account/login/layout.tsx +16 -0
  46. package/src/app/(auth)/account/login/page.tsx +288 -0
  47. package/src/app/(auth)/account/otp/layout.tsx +16 -0
  48. package/src/app/(auth)/account/otp/page.tsx +108 -0
  49. package/src/app/(auth)/account/register/layout.tsx +16 -0
  50. package/src/app/(auth)/account/register/page.tsx +431 -0
  51. package/src/app/(auth)/account/reset-password/layout.tsx +16 -0
  52. package/src/app/(auth)/account/reset-password/page.tsx +222 -0
  53. package/src/app/[slug]/page.tsx +43 -0
  54. package/src/app/about/loading.tsx +17 -0
  55. package/src/app/about/page.tsx +61 -0
  56. package/src/app/account/address/layout.tsx +15 -0
  57. package/src/app/account/address/page.tsx +166 -0
  58. package/src/app/account/head.tsx +4 -0
  59. package/src/app/account/layout.tsx +62 -0
  60. package/src/app/account/orders/[id]/layout.tsx +17 -0
  61. package/src/app/account/orders/[id]/page.tsx +115 -0
  62. package/src/app/account/orders/components/orderDetailsModal.tsx +410 -0
  63. package/src/app/account/orders/layout.tsx +15 -0
  64. package/src/app/account/orders/page.tsx +146 -0
  65. package/src/app/account/page.tsx +39 -0
  66. package/src/app/account/settings/components/editProfileSuccessModal.tsx +28 -0
  67. package/src/app/account/settings/layout.tsx +15 -0
  68. package/src/app/account/settings/page.tsx +260 -0
  69. package/src/app/api/affirm/check-status/route.ts +94 -0
  70. package/src/app/api/affirm/create-checkout/route.ts +109 -0
  71. package/src/app/api/affirm/get-config/route.ts +108 -0
  72. package/src/app/api/affirm/process-payment/route.ts +244 -0
  73. package/src/app/api/affirm/test-connection/route.ts +45 -0
  74. package/src/app/api/auth/clear/route.ts +16 -0
  75. package/src/app/api/auth/clear-cookies/route.ts +42 -0
  76. package/src/app/api/auth/set/route.ts +47 -0
  77. package/src/app/api/configuration/route.ts +18 -0
  78. package/src/app/api/dynamic-page/[slug]/route.ts +24 -0
  79. package/src/app/api/form-submission/route.ts +237 -0
  80. package/src/app/api/paypal/capture-order/route.ts +303 -0
  81. package/src/app/api/paypal/create-order/route.ts +211 -0
  82. package/src/app/api/paypal/get-config/route.ts +240 -0
  83. package/src/app/api/search-proxy/route.ts +52 -0
  84. package/src/app/authorize-net-success/layout.tsx +19 -0
  85. package/src/app/authorize-net-success/page.tsx +12 -0
  86. package/src/app/authorize-net-success/summary.tsx +486 -0
  87. package/src/app/blog/[slug]/blogContentRenderer.tsx +369 -0
  88. package/src/app/blog/[slug]/layout.tsx +17 -0
  89. package/src/app/blog/[slug]/page.tsx +151 -0
  90. package/src/app/blog/constant.tsx +147 -0
  91. package/src/app/blog/layout.tsx +31 -0
  92. package/src/app/blog/page.tsx +81 -0
  93. package/src/app/brand/[id]/BrandPageClient.tsx +188 -0
  94. package/src/app/brand/[id]/layout.tsx +17 -0
  95. package/src/app/brand/[id]/page.tsx +176 -0
  96. package/src/app/brands/components/brandsListingClient.tsx +97 -0
  97. package/src/app/brands/layout.tsx +31 -0
  98. package/src/app/brands/page.tsx +40 -0
  99. package/src/app/cancellation-policy/page.tsx +53 -0
  100. package/src/app/cart/layout.tsx +19 -0
  101. package/src/app/cart/page.tsx +752 -0
  102. package/src/app/category/[slug]/CategoryPageClient.tsx +377 -0
  103. package/src/app/category/[slug]/layout.tsx +17 -0
  104. package/src/app/category/[slug]/page.tsx +224 -0
  105. package/src/app/category/page.tsx +114 -0
  106. package/src/app/checkout/components/addNewAddressModal.tsx +474 -0
  107. package/src/app/checkout/layout.tsx +19 -0
  108. package/src/app/checkout/page.tsx +3312 -0
  109. package/src/app/components/account/AccountTabs.tsx +40 -0
  110. package/src/app/components/ads/GoogleAdSense.tsx +74 -0
  111. package/src/app/components/analytics/AnalyticsScripts.tsx +78 -0
  112. package/src/app/components/analytics/ConditionalGTMNoscript.tsx +24 -0
  113. package/src/app/components/analytics/ConditionalGoogleAnalytics.tsx +16 -0
  114. package/src/app/components/ancillary/AncillaryContent.tsx +7 -0
  115. package/src/app/components/auth/TokenExpirationHandler.tsx +8 -0
  116. package/src/app/components/blog/BlogList.tsx +112 -0
  117. package/src/app/components/checkout/AddressInformationSection.tsx +34 -0
  118. package/src/app/components/checkout/AddressManagement.tsx +571 -0
  119. package/src/app/components/checkout/CheckoutHeader.tsx +51 -0
  120. package/src/app/components/checkout/CheckoutQuestions.tsx +454 -0
  121. package/src/app/components/checkout/CheckoutTermsModal.tsx +81 -0
  122. package/src/app/components/checkout/ContactDetailsSection.tsx +52 -0
  123. package/src/app/components/checkout/DealerShippingSection.tsx +359 -0
  124. package/src/app/components/checkout/DeliveryMethodSection.tsx +249 -0
  125. package/src/app/components/checkout/OrderSummary.tsx +386 -0
  126. package/src/app/components/checkout/TermsContentRenderer.tsx +147 -0
  127. package/src/app/components/checkout/WillCallSection.tsx +133 -0
  128. package/src/app/components/checkout/affirmPayment.tsx +383 -0
  129. package/src/app/components/checkout/checkoutProcessingModal.tsx +96 -0
  130. package/src/app/components/checkout/googlePayButton.tsx +334 -0
  131. package/src/app/components/checkout/paymentStep.tsx +180 -0
  132. package/src/app/components/checkout/paypalPayment.tsx +1083 -0
  133. package/src/app/components/checkout/saleorNativePayment.tsx +1758 -0
  134. package/src/app/components/dynamicPage/DynamicPageRenderer.tsx +13 -0
  135. package/src/app/components/dynamicPage/HtmlWidgetRenderer.tsx +144 -0
  136. package/src/app/components/filtersCollapsible/index.tsx +365 -0
  137. package/src/app/components/globalSearch/index.tsx +423 -0
  138. package/src/app/components/layout/cartDropDown.tsx +628 -0
  139. package/src/app/components/layout/components/FooterNewsletter.tsx +21 -0
  140. package/src/app/components/layout/footer.tsx +283 -0
  141. package/src/app/components/layout/header/accountMenuDropdown.tsx +53 -0
  142. package/src/app/components/layout/header/components/CartBadge.tsx +18 -0
  143. package/src/app/components/layout/header/components/LoadingState.tsx +17 -0
  144. package/src/app/components/layout/header/components/MenuItemDropdown.tsx +124 -0
  145. package/src/app/components/layout/header/components/MobileNavbar.tsx +123 -0
  146. package/src/app/components/layout/header/components/NavbarActions.tsx +125 -0
  147. package/src/app/components/layout/header/components/NavbarBrand.tsx +29 -0
  148. package/src/app/components/layout/header/components/NavigationLinks.tsx +131 -0
  149. package/src/app/components/layout/header/hamMenuSlide.tsx +318 -0
  150. package/src/app/components/layout/header/header.tsx +44 -0
  151. package/src/app/components/layout/header/hooks/useDropdown.ts +45 -0
  152. package/src/app/components/layout/header/hooks/useNavbarData.ts +138 -0
  153. package/src/app/components/layout/header/hooks/useNavbarState.ts +66 -0
  154. package/src/app/components/layout/header/megaMenuDropdown.tsx +116 -0
  155. package/src/app/components/layout/header/navBar.tsx +121 -0
  156. package/src/app/components/layout/header/search.tsx +418 -0
  157. package/src/app/components/layout/header/styles/navbarStyles.ts +27 -0
  158. package/src/app/components/layout/header/topBar.tsx +214 -0
  159. package/src/app/components/layout/joinNewsletterForm/index.tsx +72 -0
  160. package/src/app/components/layout/mobileAccordian/index.tsx +92 -0
  161. package/src/app/components/layout/paymentMethods.tsx +75 -0
  162. package/src/app/components/layout/rootLayout.tsx +23 -0
  163. package/src/app/components/layout/siteInfo.tsx +103 -0
  164. package/src/app/components/layout/socialLinks.tsx +65 -0
  165. package/src/app/components/newsletterSection/emailListSection.tsx +224 -0
  166. package/src/app/components/newsletterSection/emailSectionServer.tsx +8 -0
  167. package/src/app/components/providers/ApolloWrapper.tsx +12 -0
  168. package/src/app/components/providers/AppConfigurationProvider.tsx +108 -0
  169. package/src/app/components/providers/GoogleAnalyticsProvider.tsx +149 -0
  170. package/src/app/components/providers/GoogleTagManagerProvider.tsx +31 -0
  171. package/src/app/components/providers/RecaptchaProvider.tsx +18 -0
  172. package/src/app/components/providers/ServerAppConfigurationProvider.tsx +133 -0
  173. package/src/app/components/providers/YMMStatusProvider.tsx +15 -0
  174. package/src/app/components/reuseableUI/AboutUs.tsx +115 -0
  175. package/src/app/components/reuseableUI/AddToCartClient.tsx +125 -0
  176. package/src/app/components/reuseableUI/EditorJsRenderer.tsx +219 -0
  177. package/src/app/components/reuseableUI/HeroSectionsearchByVehicle.tsx +188 -0
  178. package/src/app/components/reuseableUI/ImageWithFallback.tsx +41 -0
  179. package/src/app/components/reuseableUI/Toast.tsx +101 -0
  180. package/src/app/components/reuseableUI/blogCard.tsx +52 -0
  181. package/src/app/components/reuseableUI/brandCard.tsx +68 -0
  182. package/src/app/components/reuseableUI/breadcrumb.tsx +38 -0
  183. package/src/app/components/reuseableUI/categoryCard.tsx +37 -0
  184. package/src/app/components/reuseableUI/categorySkeleton.tsx +31 -0
  185. package/src/app/components/reuseableUI/commonButton.tsx +48 -0
  186. package/src/app/components/reuseableUI/defaultInputField/index.tsx +84 -0
  187. package/src/app/components/reuseableUI/emptyState.tsx +29 -0
  188. package/src/app/components/reuseableUI/errorTag.tsx +15 -0
  189. package/src/app/components/reuseableUI/heading/index.tsx +20 -0
  190. package/src/app/components/reuseableUI/input.tsx +117 -0
  191. package/src/app/components/reuseableUI/listCard.tsx +137 -0
  192. package/src/app/components/reuseableUI/loadingUI.tsx +12 -0
  193. package/src/app/components/reuseableUI/modalLayout.tsx +76 -0
  194. package/src/app/components/reuseableUI/newsletter/newsletterClient.tsx +622 -0
  195. package/src/app/components/reuseableUI/newsletter/newslettersHomeModal.tsx +68 -0
  196. package/src/app/components/reuseableUI/offerCard.tsx +42 -0
  197. package/src/app/components/reuseableUI/passwordRules/passwordRules.tsx +56 -0
  198. package/src/app/components/reuseableUI/primaryButton/index.tsx +34 -0
  199. package/src/app/components/reuseableUI/productCard.tsx +118 -0
  200. package/src/app/components/reuseableUI/productSkeleton.tsx +34 -0
  201. package/src/app/components/reuseableUI/searchByVehicle.tsx +187 -0
  202. package/src/app/components/reuseableUI/secondaryButton/index.tsx +34 -0
  203. package/src/app/components/reuseableUI/section.tsx +20 -0
  204. package/src/app/components/reuseableUI/select/index.tsx +98 -0
  205. package/src/app/components/reuseableUI/skeletonLoader.tsx +117 -0
  206. package/src/app/components/reuseableUI/statusTag.tsx +24 -0
  207. package/src/app/components/reuseableUI/tags/saleTag.tsx +19 -0
  208. package/src/app/components/reuseableUI/testimonialCard.tsx +93 -0
  209. package/src/app/components/richText/EditorRenderer.tsx +318 -0
  210. package/src/app/components/search/HierarchicalCategoryFilter.tsx +155 -0
  211. package/src/app/components/search/SearchFilters.tsx +155 -0
  212. package/src/app/components/search/YMMSearchSidebar.tsx +187 -0
  213. package/src/app/components/seo/ServerProductCard.tsx +91 -0
  214. package/src/app/components/seo/ServerProductGrid.tsx +45 -0
  215. package/src/app/components/shop/CategoryFilter.tsx +184 -0
  216. package/src/app/components/shop/ItemsPerPageSelect.tsx +69 -0
  217. package/src/app/components/shop/ItemsPerPageSelectClient.tsx +58 -0
  218. package/src/app/components/shop/MobileFilters.tsx +103 -0
  219. package/src/app/components/shop/ProductGridSkeleton.tsx +16 -0
  220. package/src/app/components/shop/ProductsGrid.tsx +230 -0
  221. package/src/app/components/shop/SearchFilter.tsx +218 -0
  222. package/src/app/components/shop/SearchFilterClient.tsx +122 -0
  223. package/src/app/components/shop/SearchLoadingOverlay.tsx +32 -0
  224. package/src/app/components/shop/ShopMobileFilters.tsx +205 -0
  225. package/src/app/components/showroom/VehicleSearchDropdowns.tsx +187 -0
  226. package/src/app/components/showroom/brandsSwiper.tsx +49 -0
  227. package/src/app/components/showroom/brandsSwiperClient copy.tsx +93 -0
  228. package/src/app/components/showroom/brandsSwiperClient.tsx +122 -0
  229. package/src/app/components/showroom/brandsSwiperServer.tsx +42 -0
  230. package/src/app/components/showroom/bundleProducts.tsx +120 -0
  231. package/src/app/components/showroom/categoryGrid.tsx +51 -0
  232. package/src/app/components/showroom/categoryGridServer.tsx +45 -0
  233. package/src/app/components/showroom/categorySwiper.tsx +115 -0
  234. package/src/app/components/showroom/featureStrip.tsx +139 -0
  235. package/src/app/components/showroom/offersSwiper.tsx +181 -0
  236. package/src/app/components/showroom/productGrid.tsx +56 -0
  237. package/src/app/components/showroom/productSwiper.tsx +119 -0
  238. package/src/app/components/showroom/promotion-slider.tsx +138 -0
  239. package/src/app/components/showroom/promotion.tsx +207 -0
  240. package/src/app/components/showroom/promotionsSwiper.tsx +174 -0
  241. package/src/app/components/showroom/showroomHeroCarousel.tsx +141 -0
  242. package/src/app/components/showroom/testimonialsGrid.tsx +106 -0
  243. package/src/app/components/skeletons/ContentSkeleton.tsx +14 -0
  244. package/src/app/components/sortDropdown/index.tsx +116 -0
  245. package/src/app/components/tertiaryButton/index.tsx +25 -0
  246. package/src/app/components/theme/theme-provider.tsx +82 -0
  247. package/src/app/contact/layout.tsx +32 -0
  248. package/src/app/contact/page.tsx +591 -0
  249. package/src/app/content/[slug]/layout.tsx +17 -0
  250. package/src/app/content/[slug]/page.tsx +159 -0
  251. package/src/app/content/layout.tsx +31 -0
  252. package/src/app/content/page.tsx +88 -0
  253. package/src/app/core-policies/page.tsx +55 -0
  254. package/src/app/discounts/page.tsx +54 -0
  255. package/src/app/frequently-asked-questions/page.tsx +57 -0
  256. package/src/app/globals.css +440 -0
  257. package/src/app/hooks/useDealerLocations.ts +259 -0
  258. package/src/app/hooks/useGTMEngagement.ts +71 -0
  259. package/src/app/hooks/useGoogleAnalytics.ts +145 -0
  260. package/src/app/layout.tsx +149 -0
  261. package/src/app/not-found.tsx +31 -0
  262. package/src/app/order-confirmation/layout.tsx +19 -0
  263. package/src/app/order-confirmation/page.tsx +12 -0
  264. package/src/app/order-confirmation/summary.tsx +1775 -0
  265. package/src/app/page.tsx +194 -0
  266. package/src/app/privacy-policy/loading.tsx +17 -0
  267. package/src/app/privacy-policy/page.tsx +56 -0
  268. package/src/app/product/[id]/ProductDetailClient.tsx +2448 -0
  269. package/src/app/product/[id]/components/itemInquiryModal.tsx +461 -0
  270. package/src/app/product/[id]/layout.tsx +116 -0
  271. package/src/app/product/[id]/page.tsx +200 -0
  272. package/src/app/product/layout.tsx +15 -0
  273. package/src/app/products/all/AllProductsClient.tsx +743 -0
  274. package/src/app/products/all/page.tsx +176 -0
  275. package/src/app/products/components/shopEmptyState.tsx +29 -0
  276. package/src/app/request-return/layout.tsx +36 -0
  277. package/src/app/request-return/page.tsx +597 -0
  278. package/src/app/robots.txt/route.ts +27 -0
  279. package/src/app/search/layout.tsx +16 -0
  280. package/src/app/search/page.tsx +736 -0
  281. package/src/app/shipping-returns/page.tsx +60 -0
  282. package/src/app/site-map/layout.tsx +33 -0
  283. package/src/app/site-map/page.tsx +113 -0
  284. package/src/app/sitemap-index.xml/route.ts +20 -0
  285. package/src/app/sitemap.ts +10 -0
  286. package/src/app/terms-and-conditions/loading.tsx +17 -0
  287. package/src/app/terms-and-conditions/page.tsx +56 -0
  288. package/src/app/utils/appConfiguration.ts +327 -0
  289. package/src/app/utils/branding.ts +52 -0
  290. package/src/app/utils/configurationService.ts +202 -0
  291. package/src/app/utils/constant.tsx +242 -0
  292. package/src/app/utils/editorJsUtils.tsx +249 -0
  293. package/src/app/utils/functions.ts +146 -0
  294. package/src/app/utils/googleAnalytics.ts +168 -0
  295. package/src/app/utils/googleTagManager.ts +475 -0
  296. package/src/app/utils/ipDetection.ts +270 -0
  297. package/src/app/utils/serverConfigurationService.ts +209 -0
  298. package/src/app/utils/svgs/GridIcon.tsx +45 -0
  299. package/src/app/utils/svgs/account/myAccount/listDotIcon.tsx +3 -0
  300. package/src/app/utils/svgs/account/myAccount/tickIcon.tsx +10 -0
  301. package/src/app/utils/svgs/account/orderHistory/InfoIcon.tsx +49 -0
  302. package/src/app/utils/svgs/arrowDownIcon.tsx +17 -0
  303. package/src/app/utils/svgs/arrowIcon.tsx +25 -0
  304. package/src/app/utils/svgs/arrowUpIcon.tsx +16 -0
  305. package/src/app/utils/svgs/brandsSearchIcon.tsx +25 -0
  306. package/src/app/utils/svgs/cart/cartIcon.tsx +31 -0
  307. package/src/app/utils/svgs/cart/plusIcon.tsx +13 -0
  308. package/src/app/utils/svgs/cart/subtractIcon.tsx +13 -0
  309. package/src/app/utils/svgs/cart/successTickIcon.tsx +14 -0
  310. package/src/app/utils/svgs/chevronDownIcon.tsx +21 -0
  311. package/src/app/utils/svgs/closeEyeIcon.tsx +47 -0
  312. package/src/app/utils/svgs/crossIcon.tsx +25 -0
  313. package/src/app/utils/svgs/eyeIcon.tsx +29 -0
  314. package/src/app/utils/svgs/featureTag.tsx +20 -0
  315. package/src/app/utils/svgs/filterIcon.tsx +3 -0
  316. package/src/app/utils/svgs/globleIcon.tsx +41 -0
  317. package/src/app/utils/svgs/infoIcon.tsx +34 -0
  318. package/src/app/utils/svgs/listIcon.tsx +50 -0
  319. package/src/app/utils/svgs/logOutIcon.tsx +35 -0
  320. package/src/app/utils/svgs/menuIcon.tsx +8 -0
  321. package/src/app/utils/svgs/minusIcon.tsx +18 -0
  322. package/src/app/utils/svgs/newsletterIcon.tsx +19 -0
  323. package/src/app/utils/svgs/noDataFoundIcon-.tsx +26 -0
  324. package/src/app/utils/svgs/noProductFoundIcon.tsx +43 -0
  325. package/src/app/utils/svgs/passwordIcons/errorIcon.tsx +31 -0
  326. package/src/app/utils/svgs/passwordIcons/successIcon.tsx +24 -0
  327. package/src/app/utils/svgs/paymentProcessingIcons/hourglassIcon.tsx +43 -0
  328. package/src/app/utils/svgs/paymentProcessingIcons/modalCrossIcon.tsx +23 -0
  329. package/src/app/utils/svgs/paymentProcessingIcons/paymentFailedIcon.tsx +47 -0
  330. package/src/app/utils/svgs/pencilIcon.tsx +11 -0
  331. package/src/app/utils/svgs/plusIcon.tsx +25 -0
  332. package/src/app/utils/svgs/productInquiryIcon.tsx +40 -0
  333. package/src/app/utils/svgs/searchIcon.tsx +31 -0
  334. package/src/app/utils/svgs/shoppingCart.tsx +32 -0
  335. package/src/app/utils/svgs/spinnerIcon.tsx +22 -0
  336. package/src/app/utils/svgs/spinnerLoadingIcon.tsx +26 -0
  337. package/src/app/utils/svgs/successTickIcon.tsx +40 -0
  338. package/src/app/utils/svgs/swiperArrowIconLeft.tsx +18 -0
  339. package/src/app/utils/svgs/swiperArrowIconRight.tsx +18 -0
  340. package/src/app/utils/svgs/userProfileIcon.tsx +31 -0
  341. package/src/app/utils/svgs/warningCircleIcon.tsx +15 -0
  342. package/src/app/warranty/constant.tsx +63 -0
  343. package/src/app/warranty/loading.tsx +17 -0
  344. package/src/app/warranty/page.tsx +56 -0
  345. package/src/graphql/client.ts +288 -0
  346. package/src/graphql/mutations/accountAddressCreate.ts +56 -0
  347. package/src/graphql/mutations/accountAddressDelete.ts +23 -0
  348. package/src/graphql/mutations/accountAddressUpdate.ts +55 -0
  349. package/src/graphql/mutations/accountSetDefaultAddress.ts +32 -0
  350. package/src/graphql/mutations/accountUpdate.ts +34 -0
  351. package/src/graphql/mutations/changePassword.ts +25 -0
  352. package/src/graphql/mutations/checkout.ts +117 -0
  353. package/src/graphql/mutations/checkoutAddVoucher.ts +63 -0
  354. package/src/graphql/mutations/checkoutComplete.ts +79 -0
  355. package/src/graphql/mutations/checkoutCreate.ts +131 -0
  356. package/src/graphql/mutations/checkoutCustomerAttach.ts +50 -0
  357. package/src/graphql/mutations/checkoutEmailUpdate.ts +15 -0
  358. package/src/graphql/mutations/checkoutLineMetadataUpdate.ts +52 -0
  359. package/src/graphql/mutations/checkoutPaymentCreate.ts +82 -0
  360. package/src/graphql/mutations/paymentGatewayInitialize.ts +58 -0
  361. package/src/graphql/mutations/registerAccount.ts +65 -0
  362. package/src/graphql/mutations/requestPasswordReset.ts +32 -0
  363. package/src/graphql/mutations/setPassword.ts +49 -0
  364. package/src/graphql/mutations/signIn.ts +50 -0
  365. package/src/graphql/mutations/tokenRefresh.ts +19 -0
  366. package/src/graphql/mutations/updateCheckoutMetadata.ts +49 -0
  367. package/src/graphql/mutations/updateProfile.ts +18 -0
  368. package/src/graphql/mutations/willCallDeliveryMethod.ts +81 -0
  369. package/src/graphql/queries/checkout.ts +168 -0
  370. package/src/graphql/queries/findProductByOldSlug.ts +58 -0
  371. package/src/graphql/queries/getAboutPage.ts +24 -0
  372. package/src/graphql/queries/getAboutPageId.ts +9 -0
  373. package/src/graphql/queries/getAboutUs.ts +38 -0
  374. package/src/graphql/queries/getAddressInformation.ts +38 -0
  375. package/src/graphql/queries/getAllCategories.ts +41 -0
  376. package/src/graphql/queries/getAllCategoriesTree.ts +67 -0
  377. package/src/graphql/queries/getAllCategoriesWithProducts.ts +29 -0
  378. package/src/graphql/queries/getAllCollectionsWithProducts.ts +16 -0
  379. package/src/graphql/queries/getBlogs.ts +222 -0
  380. package/src/graphql/queries/getBrands.ts +17 -0
  381. package/src/graphql/queries/getBundles.ts +43 -0
  382. package/src/graphql/queries/getCategories.ts +20 -0
  383. package/src/graphql/queries/getChannels.ts +77 -0
  384. package/src/graphql/queries/getCheckoutQuestions.ts +115 -0
  385. package/src/graphql/queries/getCheckoutTermsAndConditions.ts +37 -0
  386. package/src/graphql/queries/getContactPage.ts +117 -0
  387. package/src/graphql/queries/getContentPage.ts +191 -0
  388. package/src/graphql/queries/getDiscountOffers.ts +18 -0
  389. package/src/graphql/queries/getDynamicPageBySlug.ts +251 -0
  390. package/src/graphql/queries/getFeaturedProducts.ts +48 -0
  391. package/src/graphql/queries/getHeroMetadata.ts +23 -0
  392. package/src/graphql/queries/getMenuBySlug.ts +84 -0
  393. package/src/graphql/queries/getMyProfile.ts +23 -0
  394. package/src/graphql/queries/getNewsletter.ts +122 -0
  395. package/src/graphql/queries/getNewsletterPage.ts +111 -0
  396. package/src/graphql/queries/getPageBySlug.ts +52 -0
  397. package/src/graphql/queries/getPageTypeId.ts +27 -0
  398. package/src/graphql/queries/getPaymentMethods.ts +61 -0
  399. package/src/graphql/queries/getProducts.ts +78 -0
  400. package/src/graphql/queries/getPromotions.ts +24 -0
  401. package/src/graphql/queries/getRequestReturnPage.ts +121 -0
  402. package/src/graphql/queries/getSiteInfo.ts +54 -0
  403. package/src/graphql/queries/getSocialLinks.ts +52 -0
  404. package/src/graphql/queries/getTestimonials.ts +25 -0
  405. package/src/graphql/queries/getUserWithCheckout.ts +27 -0
  406. package/src/graphql/queries/getVehicleMakes.ts +21 -0
  407. package/src/graphql/queries/getVehicleModels.ts +21 -0
  408. package/src/graphql/queries/getVehicleYears.ts +21 -0
  409. package/src/graphql/queries/meAddresses.ts +56 -0
  410. package/src/graphql/queries/myOrders.ts +37 -0
  411. package/src/graphql/queries/orderDetail.ts +231 -0
  412. package/src/graphql/queries/productDetailsById.ts +197 -0
  413. package/src/graphql/queries/productInquiry.ts +115 -0
  414. package/src/graphql/queries/productsByCategoriesAndCollections.ts +39 -0
  415. package/src/graphql/queries/willCallCollectionPoints.ts +55 -0
  416. package/src/graphql/server-client.ts +54 -0
  417. package/src/graphql/types/categories.ts +9 -0
  418. package/src/graphql/types/checkout.ts +168 -0
  419. package/src/graphql/types/offer.ts +12 -0
  420. package/src/graphql/types/product.ts +44 -0
  421. package/src/hooks/scrollPageTop.ts +9 -0
  422. package/src/hooks/serverNavbarData.ts +79 -0
  423. package/src/hooks/useCartSync.ts +24 -0
  424. package/src/hooks/useRecaptcha.ts +33 -0
  425. package/src/hooks/useTokenExpiration.ts +81 -0
  426. package/src/hooks/useVehicleData.ts +346 -0
  427. package/src/lib/api/kount.ts +165 -0
  428. package/src/lib/api/shop.ts +1445 -0
  429. package/src/lib/saleor/getSaleorApiUrl.ts +25 -0
  430. package/src/lib/schema.ts +303 -0
  431. package/src/lib/seo/extractTextFromEditorJs.ts +58 -0
  432. package/src/lib/seo/site.ts +10 -0
  433. package/src/lib/urls/normalizeInternalUrl.ts +53 -0
  434. package/src/middleware.ts +134 -0
  435. package/src/sitemaps/README.md +105 -0
  436. package/src/sitemaps/dynamic-pages-sitemap.ts +247 -0
  437. package/src/sitemaps/sitemap-index.ts +21 -0
  438. package/src/sitemaps/static-pages-sitemap.ts +36 -0
  439. package/src/store/useGlobalStore.tsx +1656 -0
  440. package/src/types/global.d.ts +148 -0
  441. package/tsconfig.json +27 -0
@@ -0,0 +1,383 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { useRouter } from "next/navigation";
5
+ import { PaymentProcessingState } from "@/graphql/types/checkout";
6
+ import LoadingUI from "../reuseableUI/loadingUI";
7
+
8
+ interface AffirmPaymentProps {
9
+ checkoutId: string;
10
+ totalAmount: number;
11
+ currency?: string;
12
+ onSuccess: () => void;
13
+ onError: (message: string) => void;
14
+ setIsProcessingPayment: (state: PaymentProcessingState) => void;
15
+ userEmail?: string;
16
+ guestEmail?: string;
17
+ termsAccepted?: boolean;
18
+ termsData?: { page?: { isPublished: boolean } | null };
19
+ onTermsModalOpen?: () => void;
20
+ onTermsAcceptedChange?: (accepted: boolean) => void;
21
+ questionsValid?: boolean;
22
+ }
23
+
24
+ declare global {
25
+ interface Window {
26
+ _affirm_config: {
27
+ public_api_key: string;
28
+ script: string;
29
+ locale: string;
30
+ country_code: string;
31
+ };
32
+ affirm: {
33
+ ui: {
34
+ ready: (callback: () => void) => void;
35
+ };
36
+ checkout: {
37
+ open: (config: { checkout_token: string }) => void;
38
+ success: (callback: (checkoutToken: string) => void) => void;
39
+ cancel: (callback: () => void) => void;
40
+ };
41
+ };
42
+ }
43
+ }
44
+
45
+ export function AffirmPayment({
46
+ checkoutId,
47
+ totalAmount,
48
+ currency = "USD",
49
+ onSuccess,
50
+ onError,
51
+ setIsProcessingPayment,
52
+ userEmail,
53
+ guestEmail,
54
+ termsAccepted = true,
55
+ termsData,
56
+ onTermsModalOpen,
57
+ onTermsAcceptedChange,
58
+ questionsValid = true,
59
+ }: AffirmPaymentProps) {
60
+ const router = useRouter();
61
+ const [sdkLoaded, setSdkLoaded] = useState(false);
62
+ const [sdkError, setSdkError] = useState<string | null>(null);
63
+ const [isProcessing, setIsProcessing] = useState(false);
64
+ const [affirmConfig, setAffirmConfig] = useState<{
65
+ publicApiKey: string;
66
+ environment: string;
67
+ scriptUrl: string;
68
+ } | null>(null);
69
+ const [isLoadingConfig, setIsLoadingConfig] = useState(true);
70
+ const configFetched = useRef(false);
71
+
72
+ // Fetch Affirm configuration
73
+ useEffect(() => {
74
+ if (configFetched.current) return;
75
+
76
+ const fetchAffirmConfig = async () => {
77
+ try {
78
+ setIsLoadingConfig(true);
79
+
80
+ const response = await fetch("/api/affirm/get-config", {
81
+ method: "POST",
82
+ headers: { "Content-Type": "application/json" },
83
+ body: JSON.stringify({ checkoutId, amount: totalAmount }),
84
+ });
85
+
86
+ if (!response.ok) {
87
+ const errorData = await response.json();
88
+ throw new Error(errorData.error || `Failed to fetch Affirm configuration (HTTP ${response.status})`);
89
+ }
90
+
91
+ const result = await response.json();
92
+
93
+ if (!result.publicApiKey) {
94
+ throw new Error("Affirm public API key not configured in the payment app");
95
+ }
96
+
97
+ setAffirmConfig({
98
+ publicApiKey: result.publicApiKey,
99
+ environment: result.environment,
100
+ scriptUrl: result.scriptUrl,
101
+ });
102
+
103
+ configFetched.current = true;
104
+ } catch (error) {
105
+ setSdkError(error instanceof Error ? error.message : "Failed to load Affirm configuration");
106
+ } finally {
107
+ setIsLoadingConfig(false);
108
+ }
109
+ };
110
+
111
+ fetchAffirmConfig();
112
+ }, [checkoutId, totalAmount]);
113
+
114
+ // Load Affirm SDK
115
+ useEffect(() => {
116
+ if (!affirmConfig || isLoadingConfig) return;
117
+
118
+ if (window.affirm) {
119
+ setSdkLoaded(true);
120
+ return;
121
+ }
122
+
123
+ const scriptUrl = affirmConfig.environment === "production"
124
+ ? "https://cdn1.affirm.com/js/v2/affirm.js"
125
+ : "https://cdn1-sandbox.affirm.com/js/v2/affirm.js";
126
+
127
+ window._affirm_config = {
128
+ public_api_key: affirmConfig.publicApiKey,
129
+ script: scriptUrl,
130
+ locale: "en_US",
131
+ country_code: "USA",
132
+ };
133
+
134
+ const script = document.createElement("script");
135
+ script.src = scriptUrl;
136
+ script.async = true;
137
+
138
+ script.onload = () => {
139
+ // Avoid noisy logs in templates/production.
140
+ setSdkLoaded(true);
141
+ };
142
+
143
+ script.onerror = () => {
144
+ console.error("❌ Failed to load Affirm SDK from:", affirmConfig.scriptUrl);
145
+ setSdkError("Failed to load Affirm payment system. Please check the configuration.");
146
+ };
147
+
148
+ document.body.appendChild(script);
149
+
150
+ return () => {
151
+ if (document.body.contains(script)) {
152
+ document.body.removeChild(script);
153
+ }
154
+ };
155
+ }, [affirmConfig, isLoadingConfig]);
156
+
157
+ const handleAffirmPayment = async () => {
158
+ if (isProcessing) return;
159
+
160
+ try {
161
+ setIsProcessing(true);
162
+ setIsProcessingPayment({
163
+ isModalOpen: true,
164
+ paymentProcessingLoading: true,
165
+ error: false,
166
+ success: false,
167
+ });
168
+
169
+ // Create Affirm checkout
170
+ // Avoid logging checkout/payment details.
171
+
172
+ const response = await fetch("/api/affirm/create-checkout", {
173
+ method: "POST",
174
+ headers: { "Content-Type": "application/json" },
175
+ body: JSON.stringify({
176
+ checkoutId,
177
+ amount: totalAmount,
178
+ currency,
179
+ }),
180
+ });
181
+
182
+ const data = await response.json();
183
+
184
+ if (!response.ok || !data.checkoutToken) {
185
+ console.error("❌ Affirm checkout creation failed:", data);
186
+ throw new Error(data.error || "Failed to create Affirm checkout");
187
+ }
188
+
189
+ // Store transaction ID for later use
190
+ if (data.transactionId) {
191
+ sessionStorage.setItem(`affirm-txn-${checkoutId}`, data.transactionId);
192
+ }
193
+
194
+ // Use redirect approach instead of modal
195
+ const redirectUrl = data.checkoutUrl;
196
+
197
+ if (!redirectUrl) {
198
+ console.error("❌ No redirect URL received from Affirm");
199
+ throw new Error("No redirect URL received from Affirm");
200
+ }
201
+
202
+ // Open Affirm checkout in new window
203
+ const affirmWindow = window.open(
204
+ redirectUrl,
205
+ 'affirm-checkout',
206
+ 'width=600,height=700,scrollbars=yes,resizable=yes'
207
+ );
208
+
209
+ if (!affirmWindow) {
210
+ throw new Error("Failed to open Affirm checkout window. Please allow popups.");
211
+ }
212
+
213
+ // Monitor the window for completion and poll for payment success
214
+ const checkClosed = setInterval(() => {
215
+ if (affirmWindow.closed) {
216
+ clearInterval(checkClosed);
217
+ setIsProcessing(false);
218
+
219
+ // Show error when popup is closed without completion
220
+ setIsProcessingPayment({
221
+ isModalOpen: false,
222
+ paymentProcessingLoading: false,
223
+ error: true,
224
+ success: false,
225
+ });
226
+
227
+ onError("Your payment was not processed.");
228
+ }
229
+ }, 1000);
230
+
231
+ // Listen for success message from popup instead of polling
232
+ const handleMessage = (event: MessageEvent) => {
233
+ // Avoid noisy logs in templates/production.
234
+
235
+ if (event.data.type === 'AFFIRM_SUCCESS' && event.data.order) {
236
+ // Success message received.
237
+
238
+ // Clean up
239
+ clearInterval(checkClosed);
240
+ window.removeEventListener('message', handleMessage);
241
+
242
+ // Close popup if still open
243
+ if (!affirmWindow.closed) {
244
+ affirmWindow.close();
245
+ }
246
+
247
+ setIsProcessing(false);
248
+ setIsProcessingPayment({
249
+ isModalOpen: false,
250
+ paymentProcessingLoading: false,
251
+ error: false,
252
+ success: true,
253
+ });
254
+
255
+ // Redirect to order confirmation
256
+ router.push(
257
+ `/order-confirmation?orderId=${event.data.order.id}&orderNumber=${event.data.order.number}&total=${event.data.order.total}`
258
+ );
259
+
260
+ onSuccess();
261
+ }
262
+ };
263
+
264
+ // Add message listener
265
+ // Avoid noisy logs in templates/production.
266
+ window.addEventListener('message', handleMessage);
267
+
268
+ } catch (error) {
269
+ setIsProcessing(false);
270
+ setIsProcessingPayment({
271
+ isModalOpen: false,
272
+ paymentProcessingLoading: false,
273
+ error: true,
274
+ success: false,
275
+ });
276
+ onError(error instanceof Error ? `Failed to create Affirm checkout: ${error.message}` : "Failed to create Affirm checkout");
277
+ }
278
+ };
279
+
280
+ if (sdkError) {
281
+ return (
282
+ <div className="bg-red-50 border border-red-200 rounded-md p-4">
283
+ <p className="text-red-700 text-sm">{sdkError}</p>
284
+ <p className="text-red-600 text-xs mt-2">Please refresh the page or contact support.</p>
285
+ </div>
286
+ );
287
+ }
288
+
289
+ if (isLoadingConfig || !affirmConfig || !sdkLoaded) {
290
+ return (
291
+ <div className="space-y-4">
292
+ <LoadingUI className="h-32" />
293
+ <p className="text-center text-sm text-[var(--color-secondary-600)]">
294
+ {isLoadingConfig ? "Loading Affirm configuration..." : "Loading Affirm payment system..."}
295
+ </p>
296
+ </div>
297
+ );
298
+ }
299
+
300
+ const hasEmail = userEmail || guestEmail;
301
+ const needsTermsAcceptance = termsData?.page?.isPublished && !termsAccepted;
302
+ const isDisabled = !questionsValid || needsTermsAcceptance || !hasEmail || isProcessing;
303
+
304
+ return (
305
+ <div className="space-y-6">
306
+ {isProcessing && (
307
+ <div className="space-y-4">
308
+ <LoadingUI className="h-32" />
309
+ <p className="text-center text-sm text-[var(--color-secondary-600)]">Processing payment...</p>
310
+ </div>
311
+ )}
312
+
313
+ <div className={isProcessing ? "hidden" : ""}>
314
+ {!hasEmail && (
315
+ <div className="bg-yellow-50 border border-yellow-200 rounded-md p-3 mb-4">
316
+ <p className="text-yellow-700 text-sm">Please provide an email address to continue with payment.</p>
317
+ </div>
318
+ )}
319
+
320
+ {!questionsValid && (
321
+ <div className="bg-yellow-50 border border-yellow-200 rounded-md p-3 mb-4">
322
+ <p className="text-yellow-700 text-sm">Please complete all required questions below.</p>
323
+ </div>
324
+ )}
325
+
326
+ <div className={`transition-opacity mb-4 ${isDisabled ? "opacity-50 pointer-events-none" : ""}`}>
327
+ <button
328
+ onClick={handleAffirmPayment}
329
+ disabled={isDisabled}
330
+ className="w-full bg-[#4a4af4] hover:bg-[#4646EB] text-white font-medium py-3 px-4 rounded-md transition-colors flex items-center justify-center"
331
+ >
332
+ <svg width="296" height="25" viewBox="0 8 296 40" fill="none" xmlns="http://www.w3.org/2000/svg">
333
+ <path d="M44.667 30.939C44.667 26.615 47.473 23.648 51.245 23.648C54.58 23.648 56.627 25.603 57.156 28.432H54.235C53.752 27.144 52.878 26.27 51.245 26.27C48.991 26.27 47.657 28.248 47.657 30.939C47.657 33.607 48.991 35.608 51.245 35.608C52.878 35.608 53.752 34.734 54.235 33.423H57.156C56.627 36.275 54.58 38.23 51.245 38.23C47.473 38.23 44.667 35.263 44.667 30.939ZM59.0106 38V23.05H61.8626V28.662C62.4146 28.018 63.4266 27.489 64.6226 27.489C66.9456 27.489 68.2566 29.007 68.2566 31.284V38H65.4046V31.882C65.4046 30.801 64.8526 30.065 63.7256 30.065C62.8516 30.065 62.0926 30.594 61.8626 31.491V38H59.0106ZM76.8789 34.642H79.5239C79.1559 36.827 77.5459 38.23 74.9699 38.23C71.9799 38.23 69.9789 36.045 69.9789 32.871C69.9789 29.766 72.0489 27.489 74.9239 27.489C77.9369 27.489 79.5929 29.582 79.5929 32.595V33.469H72.7389C72.8309 35.01 73.7049 35.93 74.9699 35.93C75.9359 35.93 76.6489 35.516 76.8789 34.642ZM74.9469 29.812C73.8429 29.812 73.0609 30.479 72.8079 31.744H76.7869C76.7639 30.663 76.1199 29.812 74.9469 29.812ZM80.85 32.871C80.85 29.674 82.874 27.489 85.795 27.489C88.371 27.489 90.004 29.007 90.303 31.192H87.497C87.336 30.41 86.715 29.927 85.795 29.927C84.484 29.927 83.679 31.123 83.679 32.871C83.679 34.596 84.484 35.792 85.795 35.792C86.715 35.792 87.336 35.309 87.497 34.527H90.303C90.004 36.735 88.371 38.23 85.795 38.23C82.874 38.23 80.85 36.045 80.85 32.871ZM98.7436 38L95.7306 33.86L94.9026 34.757V38H92.0506V23.05H94.9026V31.537L98.4216 27.719H101.964L97.8006 32.089L102.125 38H98.7436ZM117.832 32.871C117.832 36.022 115.785 38.23 112.795 38.23C109.805 38.23 107.758 36.022 107.758 32.871C107.758 29.697 109.805 27.489 112.795 27.489C115.785 27.489 117.832 29.697 117.832 32.871ZM115.003 32.871C115.003 31.146 114.221 29.904 112.795 29.904C111.369 29.904 110.587 31.146 110.587 32.871C110.587 34.573 111.369 35.815 112.795 35.815C114.221 35.815 115.003 34.573 115.003 32.871ZM128.763 27.719V38H125.911V37.057C125.336 37.701 124.347 38.23 123.151 38.23C120.851 38.23 119.54 36.712 119.54 34.435V27.719H122.392V33.86C122.392 34.941 122.921 35.677 124.048 35.677C124.922 35.677 125.681 35.148 125.888 34.251V27.719H128.763ZM131.843 34.895V30.019H130.279V27.719H131.843V24.936H134.672V27.719H136.926V30.019H134.672V34.527C134.672 35.332 135.109 35.7 135.845 35.7C136.282 35.7 136.765 35.562 137.087 35.355V37.885C136.696 38.092 136.006 38.207 135.247 38.207C133.154 38.207 131.843 37.172 131.843 34.895ZM151.638 27.719L153.34 34.274L155.18 27.719H157.94L154.812 38H152.19L150.511 31.698L148.832 38H146.21L143.082 27.719H145.934L147.774 34.274L149.453 27.719H151.638ZM162.33 27.719V38H159.478V27.719H162.33ZM162.583 24.752C162.583 25.718 161.801 26.385 160.904 26.385C159.984 26.385 159.202 25.718 159.202 24.752C159.202 23.809 159.984 23.119 160.904 23.119C161.801 23.119 162.583 23.809 162.583 24.752ZM165.445 34.895V30.019H163.881V27.719H165.445V24.936H168.274V27.719H170.528V30.019H168.274V34.527C168.274 35.332 168.711 35.7 169.447 35.7C169.884 35.7 170.367 35.562 170.689 35.355V37.885C170.298 38.092 169.608 38.207 168.849 38.207C166.756 38.207 165.445 37.172 165.445 34.895ZM172.753 38V23.05H175.605V28.662C176.157 28.018 177.169 27.489 178.365 27.489C180.688 27.489 181.999 29.007 181.999 31.284V38H179.147V31.882C179.147 30.801 178.595 30.065 177.468 30.065C176.594 30.065 175.835 30.594 175.605 31.491V38H172.753Z" fill="white"/>
334
+ <g clipPath="url(#clip0_2539_4435)">
335
+ <path fillRule="evenodd" clipRule="evenodd" d="M193.13 36.0613C192.351 36.0613 191.954 35.687 191.954 35.0719C191.954 33.9248 193.266 33.5391 195.657 33.291C195.657 34.8195 194.598 36.0613 193.123 36.0613H193.13ZM194.159 27.4652C192.45 27.4652 190.484 28.2495 189.417 29.0798L190.392 31.0872C191.247 30.3229 192.631 29.6691 193.879 29.6691C195.065 29.6691 195.721 30.0562 195.721 30.8362C195.721 31.3596 195.287 31.6249 194.467 31.7295C191.4 32.1167 188.997 32.9426 188.997 35.2468C188.997 37.0736 190.33 38.1791 192.413 38.1791C193.901 38.1791 195.224 37.3733 195.853 36.3151V37.8923H198.626V31.2836C198.626 28.5593 196.687 27.4595 194.161 27.4595L194.159 27.4652Z" fill="white"/>
336
+ <path fillRule="evenodd" clipRule="evenodd" d="M221.987 27.7615V37.8789H224.953V33.0037C224.953 30.688 226.391 30.0069 227.392 30.0069C227.843 30.0035 228.285 30.1308 228.661 30.3726L229.203 27.6984C228.783 27.5343 228.333 27.4548 227.88 27.4647C226.356 27.4647 225.397 28.1228 224.765 29.4621V27.7615H221.987Z" fill="white"/>
337
+ <path fillRule="evenodd" clipRule="evenodd" d="M242.952 27.4648C241.383 27.4648 240.21 28.3682 239.6 29.24C239.034 28.1144 237.836 27.4648 236.395 27.4648C234.828 27.4648 233.742 28.3137 233.241 29.2916V27.7617H230.38V37.8791H233.349V32.6698C233.349 30.8058 234.353 29.9039 235.29 29.9039C236.138 29.9039 236.917 30.4387 236.917 31.8195V37.8791H239.881V32.6698C239.881 30.7785 240.86 29.9039 241.841 29.9039C242.626 29.9039 243.458 30.4602 243.458 31.7994V37.8791H246.421V30.8846C246.421 28.6119 244.853 27.4648 242.958 27.4648" fill="white"/>
338
+ <path fillRule="evenodd" clipRule="evenodd" d="M214.768 27.7614H212.08V26.7333C212.08 25.394 212.864 25.0126 213.539 25.0126C213.999 25.0185 214.452 25.129 214.862 25.3353L215.776 23.2949C215.776 23.2949 214.848 22.7041 213.162 22.7041C211.267 22.7041 209.111 23.7465 209.111 27.0172V27.7614H204.62V26.7333C204.62 25.394 205.402 25.0126 206.078 25.0126C206.539 25.0126 206.994 25.1234 207.401 25.3353L208.315 23.2949C207.77 22.9837 206.892 22.7041 205.703 22.7041C203.808 22.7041 201.652 23.7465 201.652 27.0172V27.7614H199.935V29.9925H201.656V37.8788H204.62V29.9925H209.117V37.8788H212.08V29.9925H214.768V27.7614Z" fill="white"/>
339
+ <path d="M219.498 27.7622H216.538V37.8753H219.498V27.7622Z" fill="white"/>
340
+ <path fillRule="evenodd" clipRule="evenodd" d="M216.646 26.042H219.547C221.239 20.8529 226.98 16.2917 233.807 16.2917C242.11 16.2917 249.285 22.4574 249.285 32.0557C249.31 34.0259 249.033 35.9887 248.462 37.8787H251.277L251.305 37.784C251.779 35.913 252.013 33.9917 252.002 32.0643C252.002 21.3605 244.005 13.6562 233.813 13.6562C225.807 13.6562 218.671 19.0763 216.648 26.0449L216.646 26.042Z" fill="white"/>
341
+ </g>
342
+ <defs>
343
+ </defs>
344
+ </svg>
345
+ </button>
346
+ </div>
347
+
348
+ {needsTermsAcceptance && (
349
+ <div className="bg-yellow-50 border border-yellow-200 rounded-md p-3 mb-4">
350
+ <p className="text-yellow-700 text-sm">Please accept the Terms and Conditions to continue.</p>
351
+ </div>
352
+ )}
353
+
354
+ {termsData?.page?.isPublished && (
355
+ <div className="flex items-start gap-2 w-full py-2 mb-4">
356
+ <input
357
+ style={{ accentColor: "var(--color-primary-600)" }}
358
+ type="checkbox"
359
+ id="termsAcceptedAffirm"
360
+ className="w-5 h-5 cursor-pointer mt-0.5"
361
+ checked={termsAccepted}
362
+ onChange={(e) => onTermsAcceptedChange?.(e.target.checked)}
363
+ />
364
+ <label
365
+ htmlFor="termsAcceptedAffirm"
366
+ style={{ color: "var(--color-secondary-600)" }}
367
+ className="text-sm lg:text-base tracking-[-0.04px] cursor-pointer"
368
+ >
369
+ I agree to the{" "}
370
+ <button
371
+ type="button"
372
+ onClick={onTermsModalOpen}
373
+ className="font-semibold text-[var(--color-primary-600)] hover:underline focus:underline focus:outline-none"
374
+ >
375
+ Terms and Conditions
376
+ </button>
377
+ </label>
378
+ </div>
379
+ )}
380
+ </div>
381
+ </div>
382
+ );
383
+ }
@@ -0,0 +1,96 @@
1
+ import React from "react";
2
+ import ModalLayout from "../reuseableUI/modalLayout";
3
+ import { HourglassIcon } from "@/app/utils/svgs/paymentProcessingIcons/hourglassIcon";
4
+ import { SuccessTickIcon } from "@/app/utils/svgs/successTickIcon";
5
+ import PrimaryButton from "../reuseableUI/primaryButton";
6
+ import { PaymentFailedIcon } from "@/app/utils/svgs/paymentProcessingIcons/paymentFailedIcon";
7
+ import { PaymentProcessingState } from "@/graphql/types/checkout";
8
+
9
+ const CheckoutProcessingModal = ({
10
+ isModalOpen,
11
+ onClose,
12
+ isProcessingPayment,
13
+ }: {
14
+ isModalOpen: boolean;
15
+ onClose: () => void;
16
+ isProcessingPayment: PaymentProcessingState;
17
+ }) => {
18
+ const renderContent = () => {
19
+ if (isProcessingPayment.paymentProcessingLoading) {
20
+ return (
21
+ <div className="space-y-5 flex flex-col items-center w-full text-center">
22
+ <div className="bg-[var(--color-secondary-200)] p-5 rounded-full w-fit [&>svg]:size-10 [&>svg]:text-[var(--color-secondary-600)] [&>svg]:animate-pulse mx-auto">
23
+ {HourglassIcon}
24
+ </div>
25
+ <div className="space-y-2">
26
+ <p className="text-[var(--color-secondary-800)] font-semibold text-xl font-secondary">
27
+ PROCESSING PAYMENT
28
+ </p>
29
+ <p className="font-normal text-sm font-secondary">
30
+ Your payment is being processed. This may take a few seconds.
31
+ </p>
32
+ </div>
33
+ </div>
34
+ );
35
+ }
36
+ if (isProcessingPayment.success) {
37
+ return (
38
+ <div className="w-full space-y-10 flex flex-col items-center">
39
+ <div className="space-y-5 flex flex-col items-center w-full text-center">
40
+ <span>{SuccessTickIcon}</span>
41
+ <div className="space-y-2">
42
+ <p className="text-[var(--color-secondary-800)] font-semibold text-xl font-secondary">
43
+ PAYMENT SUCCESSFUL
44
+ </p>
45
+ <p className="font-normal text-sm font-secondary">
46
+ Your transaction has been completed successfully. Thank you for
47
+ your purchase.
48
+ </p>
49
+ </div>
50
+ </div>
51
+ <PrimaryButton
52
+ onClick={onClose}
53
+ content="Back to Home"
54
+ className="w-fit mx-auto !bg-[var(--color-secondary-200)] !text-[var(--color-secondary-800)]"
55
+ />
56
+ </div>
57
+ );
58
+ }
59
+ if (isProcessingPayment.error) {
60
+ return (
61
+ <div className="w-full space-y-10 flex flex-col items-center">
62
+ <div className="space-y-5 flex flex-col items-center w-full text-center">
63
+ <span>{PaymentFailedIcon}</span>
64
+ <div className="space-y-2">
65
+ <p className="text-[var(--color-secondary-800)] font-semibold text-xl font-secondary">
66
+ Payment Unsuccessful
67
+ </p>
68
+ <p className="font-normal text-sm font-secondary">
69
+ Something went wrong. Please check your details and try again.
70
+ </p>
71
+ </div>
72
+ </div>
73
+ <PrimaryButton
74
+ onClick={onClose}
75
+ content="Back to Home"
76
+ className="w-fit mx-auto"
77
+ />
78
+ </div>
79
+ );
80
+ }
81
+ return null;
82
+ };
83
+ return (
84
+ <ModalLayout
85
+ removeCrossIcon={isProcessingPayment.paymentProcessingLoading ? true : false}
86
+ removeBgClose={true}
87
+ isModalOpen={isModalOpen}
88
+ onClose={onClose}
89
+ className="px-10 py-16"
90
+ >
91
+ {renderContent()}
92
+ </ModalLayout>
93
+ );
94
+ };
95
+
96
+ export default CheckoutProcessingModal;