@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,571 @@
1
+ "use client";
2
+
3
+ import { PhoneInput } from "react-international-phone";
4
+ import Input from "../reuseableUI/input";
5
+ import Select from "../reuseableUI/select";
6
+ import { SwiperArrowIconLeft } from "@/app/utils/svgs/swiperArrowIconLeft";
7
+ import { PlusIcon } from "@/app/utils/svgs/plusIcon";
8
+ import CommonButton from "../reuseableUI/commonButton";
9
+ import { AddressForm } from "@/graphql/types/checkout";
10
+ import { MeAddressesData } from "@/graphql/queries/meAddresses";
11
+ import AddNewAddressModal from "@/app/checkout/components/addNewAddressModal";
12
+ import { useState, useMemo } from "react";
13
+ import { State } from "country-state-city";
14
+
15
+ interface AddressInfo {
16
+ firstName: string;
17
+ lastName: string;
18
+ address: string;
19
+ city: string;
20
+ state: string;
21
+ zipCode: string;
22
+ email: string;
23
+ phone: string;
24
+ country: string;
25
+ }
26
+ // Made these static because we only support US and CA
27
+ const countryOptions = [
28
+ {
29
+ value: "CA",
30
+ label: "Canada",
31
+ },
32
+ {
33
+ value: "US",
34
+ label: "United States",
35
+ },
36
+ ];
37
+
38
+ interface AddressManagementProps {
39
+ isLoggedIn: boolean;
40
+ // Guest user props
41
+ shippingInfo: AddressInfo;
42
+ billingInfo: AddressInfo;
43
+ useShippingAsBilling: boolean;
44
+ onShippingChange: (
45
+ e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>,
46
+ ) => void;
47
+ onBillingChange: (
48
+ e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>,
49
+ ) => void;
50
+ onUseShippingAsBillingChange: (checked: boolean) => void;
51
+ onShippingPhoneChange: (phone: string) => void;
52
+ onBillingPhoneChange: (phone: string) => void;
53
+
54
+ // Logged-in user props
55
+ meData?: MeAddressesData;
56
+ formData: AddressForm;
57
+ setFormData: React.Dispatch<React.SetStateAction<AddressForm>>;
58
+ selectedAddressId: string | null;
59
+ setSelectedAddressId: (id: string | null) => void;
60
+ selectedBillingAddressId: string | null;
61
+ setSelectedBillingAddressId: (id: string | null) => void;
62
+ onAddressAdded: () => Promise<void>;
63
+ onSetDefaultAddress: (
64
+ addressId: string,
65
+ type: "SHIPPING" | "BILLING",
66
+ ) => Promise<void>;
67
+ }
68
+
69
+ // Extract the LoggedInAddressSelector component
70
+ function LoggedInAddressSelector({
71
+ meData,
72
+ selectedAddressId,
73
+ setSelectedAddressId,
74
+ onAdded,
75
+ formData,
76
+ setFormData,
77
+ title = "SHIPPING DETAILS",
78
+ groupName = "accountAddress",
79
+ handleSetDefaultAddress,
80
+ }: {
81
+ meData: MeAddressesData | undefined;
82
+ selectedAddressId: string | null;
83
+ setSelectedAddressId: (id: string | null) => void;
84
+ onAdded: () => Promise<void> | void;
85
+ formData: AddressForm;
86
+ setFormData: React.Dispatch<React.SetStateAction<AddressForm>>;
87
+ title?: string;
88
+ groupName?: "accountAddress" | "billingAddress";
89
+ handleSetDefaultAddress?: (
90
+ addressId: string,
91
+ type: "SHIPPING" | "BILLING",
92
+ ) => Promise<void>;
93
+ }) {
94
+ const [showForm, setShowForm] = useState(false);
95
+ const [editingId, setEditingId] = useState<string | null>(null);
96
+
97
+ const me = meData?.me;
98
+ const defaultShippingId = me?.defaultShippingAddress?.id;
99
+ const defaultBillingId = me?.defaultBillingAddress?.id;
100
+
101
+ const [getMethods] = useState({
102
+ defaultShippingId: defaultShippingId || null,
103
+ defaultBillingId: defaultBillingId || null,
104
+ });
105
+
106
+ const handleAddNewAddress = () => {
107
+ setShowForm(true);
108
+ setFormData({
109
+ firstName: "",
110
+ lastName: "",
111
+ phone: "",
112
+ streetAddress1: "",
113
+ city: "",
114
+ postalCode: "",
115
+ country: "US",
116
+ countryArea: "",
117
+ companyName: "",
118
+ streetAddress2: "",
119
+ });
120
+ };
121
+
122
+ const handleEdit = (
123
+ addr: NonNullable<MeAddressesData["me"]>["addresses"][number],
124
+ ) => {
125
+ setEditingId(addr.id);
126
+ setFormData({
127
+ id: addr.id,
128
+ firstName: addr.firstName,
129
+ lastName: addr.lastName,
130
+ phone: addr.phone || "",
131
+ companyName: addr.companyName || "",
132
+ streetAddress1: addr.streetAddress1,
133
+ streetAddress2: addr.streetAddress2 || "",
134
+ city: addr.city,
135
+ postalCode: addr.postalCode,
136
+ country: addr.country.code,
137
+ countryArea: addr.countryArea || "",
138
+ });
139
+ setShowForm(true);
140
+ };
141
+
142
+ const handleAddressSelect = async (
143
+ addr: NonNullable<MeAddressesData["me"]>["addresses"][number],
144
+ ) => {
145
+ setSelectedAddressId(addr.id);
146
+ if (!handleSetDefaultAddress) return;
147
+ try {
148
+ if (groupName === "accountAddress") {
149
+ await handleSetDefaultAddress(addr.id, "SHIPPING");
150
+ } else if (groupName === "billingAddress") {
151
+ await handleSetDefaultAddress(addr.id, "BILLING");
152
+ }
153
+ } catch (error) {
154
+ console.error("Error setting default address:", error);
155
+ }
156
+ };
157
+
158
+ return (
159
+ <div>
160
+ <div>
161
+ <h2 className="text-base font-semibold font-secondary text-[var(--color-secondary-800)] mb-3 uppercase">
162
+ {title}
163
+ </h2>
164
+ <div className=" grid grid-cols-2 gap-2">
165
+ {meData?.me?.addresses?.map((addr) => (
166
+ <div
167
+ onClick={() => handleAddressSelect(addr)}
168
+ key={addr.id}
169
+ className={`border flex justify-between w-full items-center px-4 py-2 cursor-pointer ${
170
+ selectedAddressId === addr.id
171
+ ? "border-[var(--color-primary-100)] bg-[var(--color-primary-50)]"
172
+ : "border-[var(--color-secondary-200)] bg-white hover:bg-gray-50"
173
+ }`}
174
+ >
175
+ <div className="flex items-center gap-3">
176
+ <input
177
+ type="radio"
178
+ name={groupName}
179
+ className="mt-1 accent-[var(--color-primary-600)]"
180
+ checked={selectedAddressId === addr.id}
181
+ onChange={() => handleAddressSelect(addr)}
182
+ />
183
+ <div className="font-secondary text-sm text-gray-800 space-y-1">
184
+ <div className="font-medium">{addr.companyName}</div>
185
+ <div className="flex items-center gap-1 font-medium text-sm text-[var(--color-secondary-800)]">
186
+ {addr.streetAddress1} {addr.city}{" "}
187
+ {addr.countryArea ? `, ${addr.countryArea}` : ""}{" "}
188
+ {addr.postalCode} {addr.country?.country}
189
+ </div>
190
+ <div className="text-[var(--color-secondary-800)] text-sm font-normal">
191
+ {addr.phone && (
192
+ <div className="text-gray-600">{addr.phone}</div>
193
+ )}
194
+ </div>
195
+ </div>
196
+ </div>
197
+ <CommonButton
198
+ variant="tertiary"
199
+ className="text-sm p-0"
200
+ onClick={() => handleEdit(addr)}
201
+ >
202
+ Edit
203
+ </CommonButton>
204
+ </div>
205
+ ))}
206
+ {meData?.me?.addresses?.length === 0 && (
207
+ <div className="text-sm text-gray-600">
208
+ No addresses yet. Click below to add your first address.
209
+ </div>
210
+ )}
211
+ </div>
212
+
213
+ <button
214
+ onClick={handleAddNewAddress}
215
+ className="mt-4 text-[var(--color-secondary-800)] underline underline-offset-4 uppercase transition-all ease-in-out duration-300 cursor-pointer font-semibold hover:text-[var(--color-primary-600)] text-sm font-secondary"
216
+ >
217
+ <div className="flex items-center gap-2">
218
+ <span className="size-5 text-[var(--color-primary-600)]">
219
+ {PlusIcon}
220
+ </span>
221
+ <p>
222
+ {meData?.me?.addresses?.length === 0
223
+ ? "Add Address"
224
+ : "Add New Address"}
225
+ </p>
226
+ </div>
227
+ </button>
228
+ </div>
229
+ <AddNewAddressModal
230
+ getMethods={getMethods}
231
+ editingId={editingId}
232
+ isModalOpen={showForm}
233
+ onClose={() => {
234
+ setShowForm(false);
235
+ setEditingId(null);
236
+ }}
237
+ formData={formData}
238
+ setFormData={setFormData}
239
+ onAddressAdded={onAdded}
240
+ />
241
+ </div>
242
+ );
243
+ }
244
+
245
+ export default function AddressManagement({
246
+ isLoggedIn,
247
+ shippingInfo,
248
+ billingInfo,
249
+ useShippingAsBilling,
250
+ onShippingChange,
251
+ onBillingChange,
252
+ onUseShippingAsBillingChange,
253
+ onShippingPhoneChange,
254
+ onBillingPhoneChange,
255
+ meData,
256
+ formData,
257
+ setFormData,
258
+ selectedAddressId,
259
+ setSelectedAddressId,
260
+ selectedBillingAddressId,
261
+ setSelectedBillingAddressId,
262
+ onAddressAdded,
263
+ onSetDefaultAddress,
264
+ }: AddressManagementProps) {
265
+ const shippingStateOptions = useMemo(() => {
266
+ if (!shippingInfo.country) return [];
267
+ return State.getStatesOfCountry(shippingInfo.country).map((state) => ({
268
+ value: state.isoCode, // Use state abbreviation like "NY", "CA"
269
+ label: state.name,
270
+ }));
271
+ }, [shippingInfo.country]);
272
+
273
+ const billingStateOptions = useMemo(() => {
274
+ if (!billingInfo.country) return [];
275
+ return State.getStatesOfCountry(billingInfo.country).map((state) => ({
276
+ value: state.isoCode, // Use state abbreviation like "NY", "CA"
277
+ label: state.name,
278
+ }));
279
+ }, [billingInfo.country]);
280
+ if (!isLoggedIn) {
281
+ return (
282
+ <div>
283
+ <p className="text-base font-semibold font-secondary text-[var(--color-secondary-800)] mb-3">
284
+ SHIPPING DETAILS
285
+ </p>
286
+ <div className="space-y-4 md:space-y-2 w-full">
287
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
288
+ <Input
289
+ label="First Name"
290
+ name="firstName"
291
+ type="text"
292
+ value={shippingInfo.firstName}
293
+ onChange={onShippingChange}
294
+ required
295
+ className="py-2"
296
+ />
297
+ <Input
298
+ label="Last Name"
299
+ name="lastName"
300
+ type="text"
301
+ value={shippingInfo.lastName}
302
+ onChange={onShippingChange}
303
+ required
304
+ className="py-2"
305
+ />
306
+ </div>
307
+ <Input
308
+ label="Street Address"
309
+ name="address"
310
+ type="text"
311
+ value={shippingInfo.address}
312
+ onChange={onShippingChange}
313
+ required
314
+ className="py-2"
315
+ />
316
+ <div className="md:col-span-2">
317
+ <label className="block text-sm font-medium text-[var(--color-secondary-800)] pb-2 uppercase">
318
+ Phone Number
319
+ </label>
320
+ <div className="relative">
321
+ <PhoneInput
322
+ required
323
+ name="phoneNumber"
324
+ defaultCountry="us"
325
+ value={shippingInfo.phone}
326
+ className="text-sm font-normal font-secondary text-[var(--color-secondary-800)] flex h-9 w-full !bg-white [&>div>button>div]:flex [&>div>button>div]:gap-3 [&>div>button]:!h-full [&>div>button>div>img]:!w-9 [&>div>button>div>img]:!pl-4 [&>div>button]:!w-[95px] [&>div>button]:border [&>div>button]:cursor-pointer [&>div>button]:border-[var(--color-secondary-200)] [&>input]:border [&>input]:border-[var(--color-secondary-200)] [&>div>button]:mr-1.5 [&>div>button]:border-r-dot-black-200 [&>div>button]:!bg-white [&>div]:!h-full [&>input]:!h-full [&>input]:w-full [&>input]:!bg-white [&>input]:px-4 [&>input]:py-3 [&>input]:outline-none"
327
+ onChange={onShippingPhoneChange}
328
+ />
329
+ <div className="size-4 text-[var(--color-primary-600)] absolute left-14 rotate-[270deg] top-1/2 -translate-y-1/2 pointer-events-none">
330
+ {SwiperArrowIconLeft}
331
+ </div>
332
+ </div>
333
+ </div>
334
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
335
+ <Select
336
+ label="Country"
337
+ name="country"
338
+ value={shippingInfo.country}
339
+ options={countryOptions}
340
+ onChange={(e) => {
341
+ // Create a synthetic event that matches the expected signature
342
+ const syntheticEvent = {
343
+ target: {
344
+ name: "country",
345
+ value: e.target.value,
346
+ },
347
+ } as React.ChangeEvent<HTMLInputElement>;
348
+ onShippingChange(syntheticEvent);
349
+
350
+ // Also clear the state when country changes
351
+ const stateEvent = {
352
+ target: {
353
+ name: "state",
354
+ value: "",
355
+ },
356
+ } as React.ChangeEvent<HTMLInputElement>;
357
+ onShippingChange(stateEvent);
358
+ }}
359
+ required
360
+ className="py-2"
361
+ />
362
+ <Select
363
+ label="State"
364
+ name="state"
365
+ value={shippingInfo.state}
366
+ options={shippingStateOptions}
367
+ onChange={onShippingChange}
368
+ disabled={!shippingInfo.country}
369
+ required
370
+ className="py-2"
371
+ />
372
+ <Input
373
+ label="ZIP / Postal Code"
374
+ name="zipCode"
375
+ type="text"
376
+ value={shippingInfo.zipCode}
377
+ onChange={onShippingChange}
378
+ required
379
+ className="py-2"
380
+ />
381
+ <Input
382
+ label="City"
383
+ name="city"
384
+ type="text"
385
+ value={shippingInfo.city}
386
+ onChange={onShippingChange}
387
+ required
388
+ className="py-2"
389
+ />
390
+ </div>
391
+ </div>
392
+
393
+ <div className="flex items-center gap-2 cursor-pointer mt-8">
394
+ <input
395
+ id="useShippingAsBilling"
396
+ type="checkbox"
397
+ className="accent-[var(--color-primary-600)]"
398
+ checked={useShippingAsBilling}
399
+ onChange={(e) => onUseShippingAsBillingChange(e.target.checked)}
400
+ />
401
+ <label
402
+ htmlFor="useShippingAsBilling"
403
+ className="text-base font-normal text-[var(--color-secondary-600)] select-none"
404
+ >
405
+ Use shipping address as billing address.
406
+ </label>
407
+ </div>
408
+
409
+ {!useShippingAsBilling && (
410
+ <div>
411
+ <p className="text-base font-semibold font-secondary text-[var(--color-secondary-800)] mt-6 mb-3 md:mb-5 lg:mt-8">
412
+ BILLING DETAILS
413
+ </p>
414
+ <div className="space-y-4 md:space-y-2 w-full">
415
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
416
+ <Input
417
+ label="First Name"
418
+ name="firstName"
419
+ type="text"
420
+ value={billingInfo.firstName}
421
+ onChange={onBillingChange}
422
+ required
423
+ className="py-2"
424
+ />
425
+ <Input
426
+ label="Last Name"
427
+ name="lastName"
428
+ type="text"
429
+ value={billingInfo.lastName}
430
+ onChange={onBillingChange}
431
+ required
432
+ className="py-2"
433
+ />
434
+ </div>
435
+ <Input
436
+ label="Street Address"
437
+ name="address"
438
+ type="text"
439
+ value={billingInfo.address}
440
+ onChange={onBillingChange}
441
+ required
442
+ className="py-2"
443
+ />
444
+ <div className="md:col-span-2">
445
+ <label className="block text-sm font-medium text-[var(--color-secondary-800)] pb-2 uppercase">
446
+ Phone Number
447
+ </label>
448
+ <div className="relative">
449
+ <PhoneInput
450
+ required
451
+ name="phone"
452
+ defaultCountry="us"
453
+ value={billingInfo.phone}
454
+ className="text-sm font-normal font-secondary text-[var(--color-secondary-800)] flex h-9 w-full !bg-white [&>div>button>div]:flex [&>div>button>div]:gap-3 [&>div>button]:!h-full [&>div>button>div>img]:!w-9 [&>div>button>div>img]:!pl-4 [&>div>button]:!w-[95px] [&>div>button]:border [&>div>button]:cursor-pointer [&>div>button]:border-[var(--color-secondary-200)] [&>input]:border [&>input]:border-[var(--color-secondary-200)] [&>div>button]:mr-1.5 [&>div>button]:border-r-dot-black-200 [&>div>button]:!bg-white [&>div]:!h-full [&>input]:!h-full [&>input]:w-full [&>input]:!bg-white [&>input]:px-4 [&>input]:py-3 [&>input]:outline-none"
455
+ onChange={onBillingPhoneChange}
456
+ />
457
+ <div className="size-4 text-[var(--color-primary-600)] absolute left-14 rotate-[270deg] top-1/2 -translate-y-1/2 pointer-events-none">
458
+ {SwiperArrowIconLeft}
459
+ </div>
460
+ </div>
461
+ </div>
462
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
463
+ <Select
464
+ label="Country"
465
+ name="country"
466
+ value={billingInfo.country}
467
+ options={countryOptions}
468
+ onChange={(e) => {
469
+ // Create a synthetic event that matches the expected signature
470
+ const syntheticEvent = {
471
+ target: {
472
+ name: "country",
473
+ value: e.target.value,
474
+ },
475
+ } as React.ChangeEvent<HTMLInputElement>;
476
+ onBillingChange(syntheticEvent);
477
+
478
+ // Also clear the state when country changes
479
+ const stateEvent = {
480
+ target: {
481
+ name: "state",
482
+ value: "",
483
+ },
484
+ } as React.ChangeEvent<HTMLInputElement>;
485
+ onBillingChange(stateEvent);
486
+ }}
487
+ required
488
+ className="py-2"
489
+ />
490
+ <Select
491
+ label="State"
492
+ name="state"
493
+ value={billingInfo.state}
494
+ options={billingStateOptions}
495
+ onChange={onBillingChange}
496
+ disabled={!billingInfo.country}
497
+ required
498
+ className="py-2"
499
+ />
500
+ <Input
501
+ label="ZIP / Postal Code"
502
+ name="zipCode"
503
+ type="text"
504
+ value={billingInfo.zipCode}
505
+ onChange={onBillingChange}
506
+ required
507
+ className="py-2"
508
+ />
509
+ <Input
510
+ label="City"
511
+ name="city"
512
+ type="text"
513
+ value={billingInfo.city}
514
+ onChange={onBillingChange}
515
+ required
516
+ className="py-2"
517
+ />
518
+ </div>
519
+ </div>
520
+ </div>
521
+ )}
522
+ </div>
523
+ );
524
+ }
525
+
526
+ return (
527
+ <div className="space-y-2">
528
+ {/* Shipping Address Selector for logged-in users */}
529
+ <LoggedInAddressSelector
530
+ meData={meData}
531
+ formData={formData}
532
+ setFormData={setFormData}
533
+ selectedAddressId={selectedAddressId}
534
+ setSelectedAddressId={setSelectedAddressId}
535
+ onAdded={onAddressAdded}
536
+ handleSetDefaultAddress={onSetDefaultAddress}
537
+ />
538
+
539
+ {/* Toggle + Billing selector for logged-in users */}
540
+ <div className="flex items-center gap-2 cursor-pointer">
541
+ <input
542
+ id="useShippingAsBilling_logged"
543
+ type="checkbox"
544
+ className="accent-[var(--color-primary-600)]"
545
+ checked={useShippingAsBilling}
546
+ onChange={(e) => onUseShippingAsBillingChange(e.target.checked)}
547
+ />
548
+ <label
549
+ htmlFor="useShippingAsBilling_logged"
550
+ className="text-base font-normal text-[var(--color-secondary-600)] select-none cursor-pointer"
551
+ >
552
+ Use shipping address as billing address.
553
+ </label>
554
+ </div>
555
+
556
+ {!useShippingAsBilling && (
557
+ <LoggedInAddressSelector
558
+ formData={formData}
559
+ setFormData={setFormData}
560
+ meData={meData}
561
+ selectedAddressId={selectedBillingAddressId}
562
+ setSelectedAddressId={setSelectedBillingAddressId}
563
+ onAdded={onAddressAdded}
564
+ title="Billing Address"
565
+ groupName="billingAddress"
566
+ handleSetDefaultAddress={onSetDefaultAddress}
567
+ />
568
+ )}
569
+ </div>
570
+ );
571
+ }
@@ -0,0 +1,51 @@
1
+ "use client";
2
+
3
+ import { useRouter } from "next/navigation";
4
+ import Breadcrumb from "../reuseableUI/breadcrumb";
5
+ import CommonButton from "../reuseableUI/commonButton";
6
+ import { ArrowIcon } from "@/app/utils/svgs/arrowIcon";
7
+
8
+ const breadcrumbItems = [
9
+ { text: "HOME", link: "/" },
10
+ { text: "CART", link: "/cart" },
11
+ { text: "CHECKOUT" },
12
+ ];
13
+
14
+ interface CheckoutHeaderProps {
15
+ isLoggedIn: boolean;
16
+ }
17
+
18
+ export default function CheckoutHeader({ isLoggedIn }: CheckoutHeaderProps) {
19
+ const router = useRouter();
20
+
21
+ return (
22
+ <div className="space-y-6 lg:space-y-10">
23
+ <div className="font-semibold text-sm font-secondary text-[var(--color-secondary-400)] flex items-center w-full justify-between">
24
+ <Breadcrumb items={breadcrumbItems} />
25
+ <div className="flex items-center gap-1 cursor-pointer">
26
+ {isLoggedIn ? (
27
+ <CommonButton
28
+ onClick={() => router.push("/")}
29
+ className="p-0 text-xs md:text-sm lg:text-base"
30
+ content="CONTINUE SHOPPING"
31
+ variant="tertiary"
32
+ />
33
+ ) : (
34
+ <CommonButton
35
+ onClick={() => router.push("/account/login")}
36
+ className="p-0 text-xs md:text-sm lg:text-base"
37
+ content="LOG IN"
38
+ variant="tertiary"
39
+ />
40
+ )}
41
+ <span className="size-5 text-[var(--color-primary-600)]">
42
+ {ArrowIcon}
43
+ </span>
44
+ </div>
45
+ </div>
46
+ <h1 className="font-primary font-normal text-2xl md:text-3xl lg:text-4xl uppercase text-[var(--color-secondary-800)p-0]">
47
+ Checkout
48
+ </h1>
49
+ </div>
50
+ );
51
+ }