@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,108 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * DEPRECATED: This provider is no longer used.
5
+ * Use ServerAppConfigurationProvider instead, which handles configuration server-side
6
+ * to prevent exposing sensitive configuration data to the client.
7
+ *
8
+ * This file is kept for backward compatibility but should not be used in new code.
9
+ */
10
+
11
+ import React, { createContext, useContext, useEffect, useState } from 'react';
12
+ import {
13
+ AppConfigurationResponse,
14
+ appConfigService,
15
+ GoogleRecaptchaConfig,
16
+ GoogleTagManagerConfig,
17
+ GoogleMapsConfig,
18
+ GoogleAnalyticsConfig,
19
+ GoogleAdSenseConfig
20
+ } from '@/app/utils/appConfiguration';
21
+
22
+ interface AppConfigurationContextType {
23
+ configuration: AppConfigurationResponse | null;
24
+ loading: boolean;
25
+ error: string | null;
26
+ isAppActive: (appName: string) => boolean;
27
+ isDealerLocatorEnabled: () => boolean;
28
+ getGoogleRecaptchaConfig: () => GoogleRecaptchaConfig | null;
29
+ getGoogleTagManagerConfig: () => GoogleTagManagerConfig | null;
30
+ getGoogleMapsConfig: () => GoogleMapsConfig | null;
31
+ getGoogleAnalyticsConfig: () => GoogleAnalyticsConfig | null;
32
+ getGoogleAdSenseConfig: () => GoogleAdSenseConfig | null;
33
+ }
34
+
35
+ const AppConfigurationContext = createContext<AppConfigurationContextType | undefined>(undefined);
36
+
37
+ interface AppConfigurationProviderProps {
38
+ children: React.ReactNode;
39
+ }
40
+
41
+ export const AppConfigurationProvider = ({ children }: AppConfigurationProviderProps) => {
42
+ const [configuration, setConfiguration] = useState<AppConfigurationResponse | null>(null);
43
+ const [loading, setLoading] = useState(true);
44
+ const [error, setError] = useState<string | null>(null);
45
+
46
+ useEffect(() => {
47
+ let isMounted = true;
48
+
49
+ const loadConfiguration = async () => {
50
+ try {
51
+ setLoading(true);
52
+ setError(null);
53
+
54
+ const config = await appConfigService.fetchConfiguration();
55
+
56
+ if (isMounted) {
57
+ setConfiguration(config);
58
+
59
+ const lastError = appConfigService.getLastError();
60
+ if (lastError) {
61
+ setError(lastError);
62
+ }
63
+ }
64
+ } catch (err) {
65
+ if (isMounted) {
66
+ setError(err instanceof Error ? err.message : 'Failed to load configuration');
67
+ }
68
+ } finally {
69
+ if (isMounted) {
70
+ setLoading(false);
71
+ }
72
+ }
73
+ };
74
+
75
+ loadConfiguration();
76
+
77
+ return () => {
78
+ isMounted = false;
79
+ };
80
+ }, []);
81
+
82
+ const contextValue: AppConfigurationContextType = {
83
+ configuration,
84
+ loading,
85
+ error,
86
+ isAppActive: (appName: string) => appConfigService.isAppActive(appName),
87
+ isDealerLocatorEnabled: () => appConfigService.isDealerLocatorEnabled(),
88
+ getGoogleRecaptchaConfig: () => appConfigService.getGoogleRecaptchaConfig(),
89
+ getGoogleTagManagerConfig: () => appConfigService.getGoogleTagManagerConfig(),
90
+ getGoogleMapsConfig: () => appConfigService.getGoogleMapsConfig(),
91
+ getGoogleAnalyticsConfig: () => appConfigService.getGoogleAnalyticsConfig(),
92
+ getGoogleAdSenseConfig: () => appConfigService.getGoogleAdSenseConfig(),
93
+ };
94
+
95
+ return (
96
+ <AppConfigurationContext.Provider value={contextValue}>
97
+ {children}
98
+ </AppConfigurationContext.Provider>
99
+ );
100
+ };
101
+
102
+ export const useAppConfiguration = () => {
103
+ const context = useContext(AppConfigurationContext);
104
+ if (context === undefined) {
105
+ throw new Error('useAppConfiguration must be used within an AppConfigurationProvider');
106
+ }
107
+ return context;
108
+ };
@@ -0,0 +1,149 @@
1
+ "use client";
2
+
3
+ import { useEffect } from "react";
4
+ import { useGoogleAnalytics, useTrackEntrance, useTrackExit } from "@/app/hooks/useGoogleAnalytics";
5
+ import { setUserProperties } from "@/app/utils/googleAnalytics";
6
+ import { sendGAEvent } from '@next/third-parties/google';
7
+ import { useAppConfiguration } from "./ServerAppConfigurationProvider";
8
+
9
+
10
+ interface GoogleAnalyticsProviderProps {
11
+ children: React.ReactNode;
12
+ }
13
+
14
+ export default function GoogleAnalyticsProvider({ children }: GoogleAnalyticsProviderProps) {
15
+ const { isAppActive, getGoogleAnalyticsConfig } = useAppConfiguration();
16
+
17
+ const isGoogleAnalyticsEnabled = isAppActive('google_analytics');
18
+ const gaConfig = getGoogleAnalyticsConfig();
19
+
20
+ useGoogleAnalytics(isGoogleAnalyticsEnabled ? gaConfig?.measurement_id : null);
21
+
22
+ useTrackEntrance(isGoogleAnalyticsEnabled ? gaConfig?.measurement_id : null);
23
+ useTrackExit(isGoogleAnalyticsEnabled ? gaConfig?.measurement_id : null);
24
+
25
+ useEffect(() => {
26
+ if (!isGoogleAnalyticsEnabled) return;
27
+ const userAgent = navigator.userAgent;
28
+ const platform = (navigator as { userAgentData?: { platform?: string } }).userAgentData?.platform || navigator.platform;
29
+ const language = navigator.language;
30
+ const screenResolution = `${screen.width}x${screen.height}`;
31
+ const viewportSize = `${window.innerWidth}x${window.innerHeight}`;
32
+
33
+ const userProperties = {
34
+ user_agent: userAgent,
35
+ platform: platform,
36
+ language: language,
37
+ screen_resolution: screenResolution,
38
+ viewport_size: viewportSize,
39
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
40
+ };
41
+
42
+ setUserProperties(userProperties, gaConfig?.measurement_id);
43
+
44
+ // Bounce detection variables
45
+ let interactionOccurred = false;
46
+ let bounceTimer: NodeJS.Timeout | null = null;
47
+ const startTime = Date.now();
48
+
49
+ const trackInteraction = () => {
50
+ if (!interactionOccurred) {
51
+ interactionOccurred = true;
52
+
53
+ // Clear the bounce timer since user interacted
54
+ if (bounceTimer) {
55
+ clearTimeout(bounceTimer);
56
+ }
57
+ }
58
+ };
59
+
60
+ const sendBounceEvent = (timeOnSite: number, trigger: string) => {
61
+ if (!interactionOccurred) {
62
+ const eventData = {
63
+ event: 'bounce_detected',
64
+ time_on_page: timeOnSite,
65
+ interaction_occurred: false,
66
+ trigger: trigger
67
+ };
68
+
69
+ // Send via Next.js third-parties
70
+ sendGAEvent(eventData);
71
+
72
+ // Also send via direct gtag as fallback
73
+ if (typeof window !== 'undefined' && (window as { gtag?: (command: string, action: string, parameters?: object) => void }).gtag) {
74
+ (window as { gtag: (command: string, action: string, parameters?: object) => void }).gtag('event', 'bounce_detected', {
75
+ time_on_page: timeOnSite,
76
+ interaction_occurred: false,
77
+ trigger: trigger,
78
+ custom_parameter_1: 'bounce_tracking'
79
+ });
80
+ }
81
+
82
+ // Mark that bounce was detected to prevent duplicate events
83
+ interactionOccurred = true;
84
+ }
85
+ };
86
+
87
+ const handleBeforeUnload = () => {
88
+ const timeOnSite = Date.now() - startTime;
89
+ sendBounceEvent(timeOnSite, 'beforeunload');
90
+ };
91
+
92
+ const handleVisibilityChange = () => {
93
+ if (document.visibilityState === 'hidden') {
94
+ const timeOnSite = Date.now() - startTime;
95
+ sendBounceEvent(timeOnSite, 'visibility_change');
96
+ }
97
+ };
98
+
99
+ // Set up interaction tracking
100
+ const events = ["click", "scroll", "keydown", "mousemove", "touchstart"];
101
+ events.forEach(event => {
102
+ document.addEventListener(event, trackInteraction, { once: true, passive: true });
103
+ });
104
+
105
+ // Set up exit tracking
106
+ window.addEventListener('beforeunload', handleBeforeUnload);
107
+ document.addEventListener('visibilitychange', handleVisibilityChange);
108
+
109
+ // Set up bounce timer (10 seconds for faster testing, can be changed to 30000 for production)
110
+ const BOUNCE_TIMEOUT = process.env.NODE_ENV === 'development' ? 10000 : 30000;
111
+ bounceTimer = setTimeout(() => {
112
+ const timeOnSite = Date.now() - startTime;
113
+ sendBounceEvent(timeOnSite, `${BOUNCE_TIMEOUT/1000}_second_timeout`);
114
+ }, BOUNCE_TIMEOUT);
115
+
116
+ // Development helper: expose bounce testing to window
117
+ if (typeof window !== 'undefined' && process.env.NODE_ENV === 'development') {
118
+ (window as { testBounceDetection?: () => void }).testBounceDetection = () => {
119
+ const timeOnSite = Date.now() - startTime;
120
+ sendBounceEvent(timeOnSite, 'manual_test');
121
+ };
122
+
123
+ (window as { getBounceStatus?: () => object }).getBounceStatus = () => {
124
+ const timeOnSite = Date.now() - startTime;
125
+ return {
126
+ timeOnSite: timeOnSite,
127
+ interactionOccurred: interactionOccurred,
128
+ bounceTimerActive: !!bounceTimer
129
+ };
130
+ };
131
+ }
132
+
133
+ // Cleanup function
134
+ return () => {
135
+ if (bounceTimer) {
136
+ clearTimeout(bounceTimer);
137
+ }
138
+
139
+ events.forEach(event => {
140
+ document.removeEventListener(event, trackInteraction);
141
+ });
142
+
143
+ window.removeEventListener('beforeunload', handleBeforeUnload);
144
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
145
+ };
146
+ }, [isGoogleAnalyticsEnabled]);
147
+
148
+ return <>{children}</>;
149
+ }
@@ -0,0 +1,31 @@
1
+ "use client";
2
+
3
+ import { useEffect } from "react";
4
+ import { usePathname } from "next/navigation";
5
+ import { gtmPageView } from "@/app/utils/googleTagManager";
6
+ import { useGTMEngagement } from "@/app/hooks/useGTMEngagement";
7
+ import { useAppConfiguration } from "./ServerAppConfigurationProvider";
8
+
9
+ interface GoogleTagManagerProviderProps {
10
+ children: React.ReactNode;
11
+ }
12
+
13
+ export default function GoogleTagManagerProvider({ children }: GoogleTagManagerProviderProps) {
14
+ const pathname = usePathname();
15
+ const { isAppActive, getGoogleTagManagerConfig } = useAppConfiguration();
16
+
17
+ const isGTMEnabled = isAppActive('google_tag_manager');
18
+ const gtmConfig = getGoogleTagManagerConfig();
19
+
20
+ // Track user engagement (scroll depth, time on page) - only if GTM is enabled
21
+ useGTMEngagement(isGTMEnabled ? gtmConfig?.container_id : null);
22
+
23
+ useEffect(() => {
24
+ if (!isGTMEnabled || !gtmConfig?.container_id) return;
25
+ if (typeof window !== "undefined") {
26
+ gtmPageView(window.location.href, undefined, gtmConfig.container_id);
27
+ }
28
+ }, [pathname, isGTMEnabled, gtmConfig]);
29
+
30
+ return <>{children}</>;
31
+ }
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+
3
+ import type React from 'react';
4
+ import { useAppConfiguration } from "./ServerAppConfigurationProvider";
5
+
6
+ interface RecaptchaProviderProps {
7
+ children: React.ReactNode;
8
+ }
9
+
10
+ export default function RecaptchaProvider({ children }: RecaptchaProviderProps) {
11
+ const { getGoogleRecaptchaConfig } = useAppConfiguration();
12
+
13
+ const recaptchaConfig = getGoogleRecaptchaConfig();
14
+
15
+ // For now, just return children. In the future, this could inject reCAPTCHA scripts
16
+ // based on the dynamic configuration
17
+ return <>{children}</>;
18
+ }
@@ -0,0 +1,133 @@
1
+ 'use client';
2
+
3
+ import type { ClientSafeConfiguration } from '@/app/utils/serverConfigurationService';
4
+ import React, { createContext, useContext } from 'react';
5
+
6
+ interface ServerAppConfigurationContextType {
7
+ // Feature flags
8
+ isDealerLocatorEnabled: () => boolean;
9
+ isTieredPricingEnabled: () => boolean;
10
+ isWillCallEnabled: () => boolean;
11
+
12
+ // Dealer locator configuration
13
+ getDealerLocatorToken: () => string | null;
14
+
15
+ // Google services configurations (only what's needed client-side)
16
+ getGoogleRecaptchaSiteKey: () => string | null;
17
+ getGoogleTagManagerContainerId: () => string | null;
18
+ getGoogleMapsApiKey: () => string | null;
19
+ getGoogleAnalyticsMeasurementId: () => string | null;
20
+ getGoogleAdSensePublisherId: () => string | null;
21
+
22
+ // reCAPTCHA location-based checks
23
+ isRecaptchaEnabledFor: (location: 'login' | 'signup' | 'checkout') => boolean;
24
+
25
+ // Legacy compatibility methods
26
+ isAppActive: (appName: string) => boolean;
27
+ getGoogleRecaptchaConfig: () => { site_key: string; locations?: { login?: boolean; signup?: boolean; checkout?: boolean } } | null;
28
+ getGoogleTagManagerConfig: () => { container_id: string } | null;
29
+ getGoogleMapsConfig: () => { api_key: string } | null;
30
+ getGoogleAnalyticsConfig: () => { measurement_id: string } | null;
31
+ getGoogleAdSenseConfig: () => { publisher_id: string } | null;
32
+ }
33
+
34
+ const ServerAppConfigurationContext = createContext<ServerAppConfigurationContextType | undefined>(undefined);
35
+
36
+ interface ServerAppConfigurationProviderProps {
37
+ children: React.ReactNode;
38
+ configuration: ClientSafeConfiguration;
39
+ }
40
+
41
+ export const ServerAppConfigurationProvider = ({
42
+ children,
43
+ configuration
44
+ }: ServerAppConfigurationProviderProps) => {
45
+ const contextValue: ServerAppConfigurationContextType = {
46
+ // Feature flags
47
+ isDealerLocatorEnabled: () => configuration.features.dealer_locator,
48
+ isTieredPricingEnabled: () => configuration.features.tiered_pricing,
49
+ isWillCallEnabled: () => configuration.features.will_call,
50
+
51
+ // Dealer locator
52
+ getDealerLocatorToken: () => configuration.dealer_locator.token,
53
+
54
+ // Google services
55
+ getGoogleRecaptchaSiteKey: () => configuration.google.recaptcha_site_key,
56
+ getGoogleTagManagerContainerId: () => configuration.google.tag_manager_container_id,
57
+ getGoogleMapsApiKey: () => configuration.google.maps_api_key,
58
+ getGoogleAnalyticsMeasurementId: () => configuration.google.analytics_measurement_id,
59
+ getGoogleAdSensePublisherId: () => configuration.google.adsense_publisher_id,
60
+
61
+ // reCAPTCHA location-based checks
62
+ isRecaptchaEnabledFor: (location: 'login' | 'signup' | 'checkout') => {
63
+ if (!configuration.google.recaptcha_site_key) return false;
64
+ return configuration.google.recaptcha_locations[location] ?? false;
65
+ },
66
+
67
+ // Legacy compatibility methods
68
+ isAppActive: (appName: string) => {
69
+ switch (appName) {
70
+ case 'dealer_locator':
71
+ return configuration.features.dealer_locator;
72
+ case 'tiered-pricing':
73
+ return configuration.features.tiered_pricing;
74
+ case 'will-call':
75
+ return configuration.features.will_call;
76
+ case 'google_recaptcha':
77
+ return !!configuration.google.recaptcha_site_key;
78
+ case 'google_tag_manager':
79
+ return !!configuration.google.tag_manager_container_id;
80
+ case 'google_maps':
81
+ return !!configuration.google.maps_api_key;
82
+ case 'google_analytics':
83
+ return !!configuration.google.analytics_measurement_id;
84
+ case 'google_adsense':
85
+ return !!configuration.google.adsense_publisher_id;
86
+ default:
87
+ return false;
88
+ }
89
+ },
90
+
91
+ getGoogleRecaptchaConfig: () =>
92
+ configuration.google.recaptcha_site_key
93
+ ? {
94
+ site_key: configuration.google.recaptcha_site_key,
95
+ locations: configuration.google.recaptcha_locations
96
+ }
97
+ : null,
98
+
99
+ getGoogleTagManagerConfig: () =>
100
+ configuration.google.tag_manager_container_id
101
+ ? { container_id: configuration.google.tag_manager_container_id }
102
+ : null,
103
+
104
+ getGoogleMapsConfig: () =>
105
+ configuration.google.maps_api_key
106
+ ? { api_key: configuration.google.maps_api_key }
107
+ : null,
108
+
109
+ getGoogleAnalyticsConfig: () =>
110
+ configuration.google.analytics_measurement_id
111
+ ? { measurement_id: configuration.google.analytics_measurement_id }
112
+ : null,
113
+
114
+ getGoogleAdSenseConfig: () =>
115
+ configuration.google.adsense_publisher_id
116
+ ? { publisher_id: configuration.google.adsense_publisher_id }
117
+ : null,
118
+ };
119
+
120
+ return (
121
+ <ServerAppConfigurationContext.Provider value={contextValue}>
122
+ {children}
123
+ </ServerAppConfigurationContext.Provider>
124
+ );
125
+ };
126
+
127
+ export const useAppConfiguration = () => {
128
+ const context = useContext(ServerAppConfigurationContext);
129
+ if (context === undefined) {
130
+ throw new Error('useAppConfiguration must be used within a ServerAppConfigurationProvider');
131
+ }
132
+ return context;
133
+ };
@@ -0,0 +1,15 @@
1
+ "use client";
2
+
3
+ import { useEffect } from "react";
4
+ import { useGlobalStore } from "@/store/useGlobalStore";
5
+
6
+ export default function YMMStatusProvider() {
7
+ const checkYMMStatus = useGlobalStore((state) => state.checkYMMStatus);
8
+
9
+ useEffect(() => {
10
+ // Check YMM API status on app load
11
+ checkYMMStatus();
12
+ }, [checkYMMStatus]);
13
+
14
+ return null;
15
+ }
@@ -0,0 +1,115 @@
1
+ import React from "react";
2
+ import Link from "next/link";
3
+ import createApolloServerClient from "@/graphql/server-client";
4
+ import {
5
+ AboutUsResponse,
6
+ GET_ABOUT_US_PAGE,
7
+ } from "@/graphql/queries/getAboutUs";
8
+ import { EditorJsBlock } from "../richText/EditorRenderer";
9
+
10
+ function parseEditorJsContent(raw?: string | null): string {
11
+ if (!raw) return "";
12
+ try {
13
+ const json = JSON.parse(raw) as { blocks?: EditorJsBlock[] };
14
+ const blocks = Array.isArray(json?.blocks)
15
+ ? (json.blocks as EditorJsBlock[])
16
+ : [];
17
+
18
+ // Extract all paragraph text and join them
19
+ const paragraphs = blocks
20
+ .filter((b) => b?.type === "paragraph" && b?.data?.text)
21
+ .map((b) => b.data.text?.trim())
22
+ .filter(Boolean);
23
+
24
+ return paragraphs.join(" ");
25
+ } catch {
26
+ return "";
27
+ }
28
+ }
29
+
30
+ export const AboutUsSection = async () => {
31
+ // Default values (fallback)
32
+ let title = "";
33
+ let description =
34
+ "";
35
+ const buttonText = "CONTACT US TODAY";
36
+ const buttonLink = "/contact";
37
+ const videoUrl = "/brand-video.mp4";
38
+
39
+ try {
40
+ const client = createApolloServerClient();
41
+ const resp = await client.query<AboutUsResponse>({
42
+ query: GET_ABOUT_US_PAGE,
43
+ variables: { first: 1 },
44
+ fetchPolicy: "cache-first",
45
+ errorPolicy: "all",
46
+ context: {
47
+ fetchOptions: {
48
+ next: { revalidate: 600 }, // Cache for 10 minutes
49
+ },
50
+ },
51
+ });
52
+
53
+ const node = resp.data?.pages?.edges?.[0]?.node || null;
54
+ if (node) {
55
+ // Use CMS title if available
56
+ if (node.title?.trim()) {
57
+ title = node.title;
58
+ }
59
+
60
+ // Parse content for description
61
+ const parsedContent = parseEditorJsContent(node.content);
62
+ if (parsedContent) {
63
+ description = parsedContent;
64
+ }
65
+
66
+ }
67
+ } catch {
68
+ // fall back to defaults silently
69
+ }
70
+
71
+ // Avoid noisy logs during build/SSR.
72
+
73
+ return (
74
+ <section
75
+ aria-labelledby="about-us-heading"
76
+ className="relative w-full h-[500px] md:h-[600px] overflow-hidden"
77
+ >
78
+ {/* Video Background */}
79
+ <video
80
+ autoPlay
81
+ loop
82
+ muted
83
+ playsInline
84
+ className="absolute inset-0 w-full h-full object-cover"
85
+ >
86
+ <source src={videoUrl} type="video/mp4" />
87
+ Your browser does not support the video tag.
88
+ </video>
89
+
90
+ {/* Overlay */}
91
+ <div className="absolute inset-0 bg-black/40" />
92
+
93
+ {/* Content Overlay */}
94
+ <div className="relative h-full container mx-auto px-6 flex flex-col items-center justify-center text-center text-white z-10">
95
+ <h2
96
+ id="about-us-heading"
97
+ className="font-primary italic font-black uppercase text-3xl md:text-5xl lg:text-6xl mb-6 tracking-tight"
98
+ >
99
+ {title}
100
+ </h2>
101
+
102
+ <p className="font-secondary text-sm md:text-lg lg:text-xl max-w-3xl mb-10 leading-relaxed font-medium">
103
+ {description}
104
+ </p>
105
+
106
+ <Link
107
+ href={buttonLink}
108
+ className="bg-white text-black font-secondary font-bold uppercase py-3 px-8 rounded-sm hover:bg-gray-200 transition-colors text-sm md:text-base"
109
+ >
110
+ {buttonText}
111
+ </Link>
112
+ </div>
113
+ </section>
114
+ );
115
+ };