@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,122 @@
1
+ import { gql } from "@apollo/client";
2
+ import createApolloServerClient from "../server-client";
3
+
4
+ export const GET_NEWSLETTER = gql`
5
+ query Contact($first: Int = 1) {
6
+ pages(first: $first, filter: { slugs: "newsletter-signup" }) {
7
+ edges {
8
+ node {
9
+ id
10
+ title
11
+ content
12
+ isPublished
13
+ metadata {
14
+ key
15
+ value
16
+ }
17
+ }
18
+ }
19
+ }
20
+ }
21
+ `;
22
+
23
+ export type NEWSLETTERMetadata = {
24
+ key: string;
25
+ value: string;
26
+ };
27
+
28
+ export type NewsletterPageNode = {
29
+ id: string;
30
+ title: string;
31
+ content: string | null;
32
+ isPublished: boolean;
33
+ metadata: NEWSLETTERMetadata[];
34
+ };
35
+
36
+ export type NewsletterPageEdge = {
37
+ node: NewsletterPageNode;
38
+ };
39
+
40
+ export type NewsletterPageResponse = {
41
+ pages: {
42
+ edges: NewsletterPageEdge[];
43
+ };
44
+ };
45
+
46
+ export type NewsLetterPageData = {
47
+ id: string;
48
+ title: string;
49
+ content: string | null;
50
+ contactFormEnabled: boolean;
51
+ isPublished: boolean;
52
+ productInquiryFormEnabled: boolean;
53
+ recaptchaEnabled: boolean;
54
+ fields: string[];
55
+ description: string | null;
56
+ emailTo: string | null;
57
+ emailCc: string | null;
58
+ emailBcc: string | null;
59
+ emailSubject: string | null;
60
+ successMessage: string | null;
61
+ };
62
+
63
+ export function parseContactPageMetadata(node: NewsletterPageNode): NewsLetterPageData {
64
+ const metadata = node.metadata.reduce((acc, item) => {
65
+ acc[item.key] = item.value;
66
+ return acc;
67
+ }, {} as Record<string, string>);
68
+ return {
69
+ id: node.id,
70
+ title: node.title,
71
+ content: node.content,
72
+ contactFormEnabled: metadata.contact_form === "true",
73
+ isPublished: node.isPublished,
74
+ productInquiryFormEnabled: metadata.product_inquiry_form === "true",
75
+ recaptchaEnabled: metadata.reCAPTCHA === "true",
76
+ fields: metadata.fields
77
+ ? metadata.fields.split(",").map((f) => f.trim())
78
+ : [],
79
+ description: metadata.description || null,
80
+ emailTo: metadata.email_to || null,
81
+ emailCc: metadata.email_cc || null,
82
+ emailBcc: metadata.email_bcc || null,
83
+ emailSubject: metadata.email_subject || null,
84
+ successMessage: metadata.success_message || null,
85
+ };
86
+ }
87
+
88
+ export async function fetchContactPage(): Promise<NewsLetterPageData | null> {
89
+ if (!process.env.NEXT_PUBLIC_API_URL) {
90
+ console.warn("API URL not configured, skipping contact page fetch");
91
+ return null;
92
+ }
93
+
94
+ try {
95
+ const client = createApolloServerClient();
96
+ const timeoutPromise = new Promise<never>((_, reject) =>
97
+ setTimeout(() => reject(new Error("Contact page fetch timeout")), 5000)
98
+ );
99
+
100
+ const queryPromise = client.query<NewsletterPageResponse>({
101
+ query: GET_NEWSLETTER,
102
+ variables: { first: 1 },
103
+ fetchPolicy: "network-only",
104
+ errorPolicy: "ignore",
105
+ });
106
+
107
+ const result = await Promise.race([queryPromise, timeoutPromise]);
108
+ const edges = result?.data?.pages?.edges;
109
+
110
+ if (edges && edges.length > 0) {
111
+ return parseContactPageMetadata(edges[0].node);
112
+ }
113
+
114
+ return null;
115
+ } catch (err) {
116
+ console.warn(
117
+ "Failed to fetch contact page:",
118
+ err instanceof Error ? err.message : "Unknown error"
119
+ );
120
+ return null;
121
+ }
122
+ }
@@ -0,0 +1,111 @@
1
+ import { gql } from "@apollo/client";
2
+ import createApolloServerClient from "../server-client";
3
+
4
+ export const GET_NEWSLETTER_PAGE = gql`
5
+ query Newsletter($first: Int = 1) {
6
+ pages(first: $first, filter: { slugs: "newsletter-signup" }) {
7
+ edges {
8
+ node {
9
+ id
10
+ title
11
+ content
12
+ metadata {
13
+ key
14
+ value
15
+ }
16
+ }
17
+ }
18
+ }
19
+ }
20
+ `;
21
+
22
+ export type NewsletterMetadata = {
23
+ key: string;
24
+ value: string;
25
+ };
26
+
27
+ export type NewsletterPageNode = {
28
+ id: string;
29
+ title: string;
30
+ content: string | null;
31
+ metadata: NewsletterMetadata[];
32
+ };
33
+
34
+ export type NewsletterPageEdge = {
35
+ node: NewsletterPageNode;
36
+ };
37
+
38
+ export type NewsletterPageResponse = {
39
+ pages: {
40
+ edges: NewsletterPageEdge[];
41
+ };
42
+ };
43
+
44
+ export type NewsletterPageData = {
45
+ id: string;
46
+ title: string;
47
+ content: string | null;
48
+ description: string | null;
49
+ emailTo: string | null;
50
+ emailCc: string | null;
51
+ emailBcc: string | null;
52
+ emailSubject: string | null;
53
+ successMessage: string | null;
54
+ };
55
+
56
+ export function parseNewsletterPageMetadata(
57
+ node: NewsletterPageNode
58
+ ): NewsletterPageData {
59
+ const metadata = node.metadata.reduce((acc, item) => {
60
+ acc[item.key] = item.value;
61
+ return acc;
62
+ }, {} as Record<string, string>);
63
+
64
+ return {
65
+ id: node.id,
66
+ title: node.title,
67
+ content: node.content,
68
+ description: metadata.description || null,
69
+ emailTo: metadata.email_to || null,
70
+ emailCc: metadata.email_cc || null,
71
+ emailBcc: metadata.email_bcc || null,
72
+ emailSubject: metadata.email_subject || null,
73
+ successMessage: metadata.success_message || null,
74
+ };
75
+ }
76
+
77
+ export async function fetchNewsletterPage(): Promise<NewsletterPageData | null> {
78
+ if (!process.env.NEXT_PUBLIC_API_URL) {
79
+ console.warn("API URL not configured, skipping newsletter page fetch");
80
+ return null;
81
+ }
82
+
83
+ try {
84
+ const client = createApolloServerClient();
85
+ const timeoutPromise = new Promise<never>((_, reject) =>
86
+ setTimeout(() => reject(new Error("Newsletter page fetch timeout")), 5000)
87
+ );
88
+
89
+ const queryPromise = client.query<NewsletterPageResponse>({
90
+ query: GET_NEWSLETTER_PAGE,
91
+ variables: { first: 1 },
92
+ fetchPolicy: "network-only",
93
+ errorPolicy: "ignore",
94
+ });
95
+
96
+ const result = await Promise.race([queryPromise, timeoutPromise]);
97
+ const edges = result?.data?.pages?.edges;
98
+
99
+ if (edges && edges.length > 0) {
100
+ return parseNewsletterPageMetadata(edges[0].node);
101
+ }
102
+
103
+ return null;
104
+ } catch (err) {
105
+ console.warn(
106
+ "Failed to fetch newsletter page:",
107
+ err instanceof Error ? err.message : "Unknown error"
108
+ );
109
+ return null;
110
+ }
111
+ }
@@ -0,0 +1,52 @@
1
+ import { gql } from "@apollo/client"
2
+ import createApolloServerClient from "../server-client"
3
+
4
+ export const GET_PAGE_BY_SLUG = gql`
5
+ query PageBySlug($slug: String!) {
6
+ page(slug: $slug) {
7
+ id
8
+ seoTitle
9
+ seoDescription
10
+ content
11
+ }
12
+ }
13
+ `
14
+
15
+ export type AncillaryPage = {
16
+ id: string
17
+ seoTitle: string | null
18
+ seoDescription: string | null
19
+ content: string | null
20
+ }
21
+
22
+ type PageBySlugResponse = { page: AncillaryPage | null }
23
+
24
+ export async function fetchPageBySlug(slug: string): Promise<AncillaryPage | null> {
25
+ if (!process.env.NEXT_PUBLIC_API_URL) {
26
+ console.warn("API URL not configured, skipping page fetch")
27
+ return null
28
+ }
29
+
30
+ try {
31
+ const client = createApolloServerClient()
32
+ const timeoutPromise = new Promise<never>((_, reject) =>
33
+ setTimeout(() => reject(new Error("Page fetch timeout")), 5000)
34
+ )
35
+
36
+ const queryPromise = client.query<PageBySlugResponse>({
37
+ query: GET_PAGE_BY_SLUG,
38
+ variables: { slug },
39
+ fetchPolicy: "network-only",
40
+ errorPolicy: "ignore",
41
+ })
42
+
43
+ const result = await Promise.race([queryPromise, timeoutPromise])
44
+ return result?.data?.page ?? null
45
+ } catch (err) {
46
+ console.warn(
47
+ "Failed to fetch page by slug:",
48
+ err instanceof Error ? err.message : "Unknown error"
49
+ )
50
+ return null
51
+ }
52
+ }
@@ -0,0 +1,27 @@
1
+ import { gql } from "@apollo/client"
2
+
3
+ export const GET_TESTIMONIAL_PAGE_TYPE = gql`
4
+ query PageTypeList {
5
+ pageTypes(first: 100, filter: { slugs: "testimonial" }) {
6
+ edges {
7
+ node {
8
+ id
9
+ slug
10
+ }
11
+ }
12
+ }
13
+ }
14
+ `
15
+
16
+ export const GET_PROMOTION_PAGE_TYPE = gql`
17
+ query PageTypeList {
18
+ pageTypes(first: 100, filter: { slugs: "promotion" }) {
19
+ edges {
20
+ node {
21
+ id
22
+ slug
23
+ }
24
+ }
25
+ }
26
+ }
27
+ `
@@ -0,0 +1,61 @@
1
+ import { gql } from "@apollo/client";
2
+ import createApolloServerClient from "../server-client";
3
+
4
+ // GraphQL: fetch a single page by slug that includes metadata key/value pairs
5
+ const GET_PAYMENT_METHODS = gql`
6
+ query PaymentMethods {
7
+ page(slug: "payment-methods") {
8
+ id
9
+ metadata {
10
+ key
11
+ value
12
+ }
13
+ }
14
+ }
15
+ `;
16
+
17
+ export type PaymentMethodFlagKey =
18
+ | "VISA"
19
+ | "MasterCard"
20
+ | "Amex"
21
+ | "PayPal"
22
+ | "GooglePay"
23
+ | "ApplePay";
24
+
25
+ export type PaymentMethodsResponse = {
26
+ page: {
27
+ id: string;
28
+ metadata: { key: PaymentMethodFlagKey; value: string }[];
29
+ } | null;
30
+ };
31
+
32
+ export const fetchPaymentMethods = async () => {
33
+ if (!process.env.NEXT_PUBLIC_API_URL) {
34
+ // Same behavior as other fetchers: be tolerant when API is not configured
35
+ console.warn("API URL not configured, skipping payment methods fetch");
36
+ return null as PaymentMethodsResponse["page"];
37
+ }
38
+
39
+ try {
40
+ const client = createApolloServerClient();
41
+
42
+ const timeoutPromise = new Promise<never>((_, reject) =>
43
+ setTimeout(() => reject(new Error("Payment methods fetch timeout")), 5000)
44
+ );
45
+
46
+ const queryPromise = client.query<{ page: PaymentMethodsResponse["page"]}>({
47
+ query: GET_PAYMENT_METHODS,
48
+ fetchPolicy: "network-only",
49
+ errorPolicy: "ignore",
50
+ });
51
+
52
+ const result = await Promise.race([queryPromise, timeoutPromise]);
53
+ return result?.data?.page ?? null;
54
+ } catch (err) {
55
+ console.warn(
56
+ "Failed to fetch payment methods:",
57
+ err instanceof Error ? err.message : "Unknown error"
58
+ );
59
+ return null;
60
+ }
61
+ };
@@ -0,0 +1,78 @@
1
+ import { gql } from "@apollo/client";
2
+
3
+ export const GET_PRODUCTS = gql`
4
+ query GetProducts(
5
+ $channel: String!
6
+ $first: Int!
7
+ $after: String
8
+ $categoryIds: [ID!]
9
+ $search: String
10
+ ) {
11
+ products(
12
+ filter: { categories: $categoryIds, search: $search }
13
+ channel: $channel
14
+ first: $first
15
+ after: $after
16
+ ) {
17
+ totalCount
18
+ pageInfo {
19
+ hasNextPage
20
+ hasPreviousPage
21
+ startCursor
22
+ endCursor
23
+ }
24
+ edges {
25
+ node {
26
+ id
27
+ name
28
+ slug
29
+ media { id url alt }
30
+ category { id name }
31
+ pricing {
32
+ onSale
33
+ priceRange {
34
+ start { gross { amount currency } }
35
+ stop { gross { amount currency } }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ `;
43
+
44
+ export interface GetProductsData {
45
+ products: {
46
+ totalCount: number;
47
+ pageInfo: {
48
+ hasNextPage: boolean;
49
+ hasPreviousPage: boolean;
50
+ startCursor: string | null;
51
+ endCursor: string | null;
52
+ };
53
+ edges: Array<{
54
+ node: {
55
+ id: string;
56
+ name: string;
57
+ slug: string;
58
+ media: Array<{ id: string; url: string; alt: string | null }>;
59
+ category: { id: string; name: string } | null;
60
+ pricing: {
61
+ onSale: boolean | null;
62
+ priceRange: {
63
+ start: { gross: { amount: number; currency: string } } | null;
64
+ stop: { gross: { amount: number; currency: string } } | null;
65
+ } | null;
66
+ } | null;
67
+ };
68
+ }>;
69
+ };
70
+ }
71
+
72
+ export interface GetProductsVars {
73
+ channel: string;
74
+ first: number;
75
+ after?: string | null;
76
+ categoryIds?: string[];
77
+ search?: string;
78
+ }
@@ -0,0 +1,24 @@
1
+ import { gql } from "@apollo/client"
2
+
3
+ export const GET_PROMOTIONS = gql`
4
+ query Promotions($pageTypeId: ID!, $first: Int = 100, $after: String) {
5
+ pages(
6
+ first: $first
7
+ after: $after
8
+ filter: { pageTypes: [$pageTypeId] }
9
+ sortBy: { field: PUBLICATION_DATE, direction: DESC }
10
+ ) {
11
+ edges {
12
+ node {
13
+ id
14
+ title
15
+ content
16
+ metadata {
17
+ key
18
+ value
19
+ }
20
+ }
21
+ }
22
+ }
23
+ }
24
+ `
@@ -0,0 +1,121 @@
1
+ import { gql } from "@apollo/client";
2
+ import createApolloServerClient from "../server-client";
3
+
4
+ export const GET_REQUEST_RETURN_PAGE = gql`
5
+ query Contact($first: Int = 1) {
6
+ pages(first: $first, filter: { slugs: "rma-request" }) {
7
+ edges {
8
+ node {
9
+ id
10
+ title
11
+ content
12
+ isPublished
13
+ metadata {
14
+ key
15
+ value
16
+ }
17
+ }
18
+ }
19
+ }
20
+ }
21
+ `;
22
+
23
+ export type RequestReturnMetadata = {
24
+ key: string;
25
+ value: string;
26
+ };
27
+
28
+ export type RequestReturnPageNode = {
29
+ id: string;
30
+ title: string;
31
+ content: string | null;
32
+ isPublished: boolean;
33
+ metadata: RequestReturnMetadata[];
34
+ };
35
+
36
+ export type RequestReturnPageEdge = {
37
+ node: RequestReturnPageNode;
38
+ };
39
+
40
+ export type RequestReturnPageResponse = {
41
+ pages: {
42
+ edges: RequestReturnPageEdge[];
43
+ };
44
+ };
45
+
46
+ export type ReturnsPageData = {
47
+ id: string;
48
+ title: string;
49
+ content: string | null;
50
+ isPublished: boolean;
51
+ productInquiryFormEnabled: boolean;
52
+ recaptchaEnabled: boolean;
53
+ fields: string[];
54
+ description: string | null;
55
+ emailTo: string | null;
56
+ emailCc: string | null;
57
+ emailBcc: string | null;
58
+ emailSubject: string | null;
59
+ successMessage: string | null;
60
+ };
61
+
62
+ export function parseRequestReturnPageMetadata(
63
+ node: RequestReturnPageNode
64
+ ): ReturnsPageData {
65
+ const metadata = node.metadata.reduce((acc, item) => {
66
+ acc[item.key] = item.value;
67
+ return acc;
68
+ }, {} as Record<string, string>);
69
+
70
+ return {
71
+ id: node.id,
72
+ title: node.title,
73
+ content: node.content,
74
+ isPublished: node.isPublished,
75
+ productInquiryFormEnabled: metadata.product_inquiry_form === "true",
76
+ recaptchaEnabled: metadata.reCAPTCHA === "true",
77
+ fields: metadata.fields ? metadata.fields.split(",").map((f) => f.trim()) : [],
78
+ description: metadata.description || null,
79
+ emailTo: metadata.email_to || null,
80
+ emailCc: metadata.email_cc || null,
81
+ emailBcc: metadata.email_bcc || null,
82
+ emailSubject: metadata.email_subject || null,
83
+ successMessage: metadata.success_message || null,
84
+ };
85
+ }
86
+
87
+ export async function fetchContactPage(): Promise<ReturnsPageData | null> {
88
+ if (!process.env.NEXT_PUBLIC_API_URL) {
89
+ console.warn("API URL not configured, skipping contact page fetch");
90
+ return null;
91
+ }
92
+
93
+ try {
94
+ const client = createApolloServerClient();
95
+ const timeoutPromise = new Promise<never>((_, reject) =>
96
+ setTimeout(() => reject(new Error("Contact page fetch timeout")), 5000)
97
+ );
98
+
99
+ const queryPromise = client.query<RequestReturnPageResponse>({
100
+ query: GET_REQUEST_RETURN_PAGE,
101
+ variables: { first: 1 },
102
+ fetchPolicy: "network-only",
103
+ errorPolicy: "ignore",
104
+ });
105
+
106
+ const result = await Promise.race([queryPromise, timeoutPromise]);
107
+ const edges = result?.data?.pages?.edges;
108
+
109
+ if (edges && edges.length > 0) {
110
+ return parseRequestReturnPageMetadata(edges[0].node);
111
+ }
112
+
113
+ return null;
114
+ } catch (err) {
115
+ console.warn(
116
+ "Failed to fetch contact page:",
117
+ err instanceof Error ? err.message : "Unknown error"
118
+ );
119
+ return null;
120
+ }
121
+ }
@@ -0,0 +1,54 @@
1
+ import { gql } from "@apollo/client";
2
+ import createApolloServerClient from "../server-client";
3
+
4
+ const GET_SITE_INFO = gql`
5
+ query SiteInfo {
6
+ page(slug: "site-info") {
7
+ id
8
+ content
9
+ metadata {
10
+ key
11
+ value
12
+ }
13
+ }
14
+ }
15
+ `;
16
+
17
+ export type SiteInfoKey = "Address" | "Email" | "Phone" | "Timings";
18
+
19
+ export type SiteInfoResponse = {
20
+ page: {
21
+ id: string;
22
+ content: string;
23
+ metadata: { key: SiteInfoKey; value: string }[];
24
+ } | null;
25
+ };
26
+
27
+ export const fetchSiteInfo = async () => {
28
+ if (!process.env.NEXT_PUBLIC_API_URL) {
29
+ console.warn("API URL not configured, skipping site info fetch");
30
+ return null as SiteInfoResponse["page"];
31
+ }
32
+
33
+ try {
34
+ const client = createApolloServerClient();
35
+ const timeoutPromise = new Promise<never>((_, reject) =>
36
+ setTimeout(() => reject(new Error("Site info fetch timeout")), 5000)
37
+ );
38
+
39
+ const queryPromise = client.query<{ page: SiteInfoResponse["page"]}>({
40
+ query: GET_SITE_INFO,
41
+ fetchPolicy: "network-only",
42
+ errorPolicy: "ignore",
43
+ });
44
+
45
+ const result = await Promise.race([queryPromise, timeoutPromise]);
46
+ return result?.data?.page ?? null;
47
+ } catch (err) {
48
+ console.warn(
49
+ "Failed to fetch site info:",
50
+ err instanceof Error ? err.message : "Unknown error"
51
+ );
52
+ return null;
53
+ }
54
+ };
@@ -0,0 +1,52 @@
1
+ import { gql } from "@apollo/client";
2
+ import createApolloServerClient from "../server-client";
3
+
4
+ const GET_SOCIAL_LINKS = gql`
5
+ query SocialMediaLinks {
6
+ page(slug: "social-media-links") {
7
+ id
8
+ metadata {
9
+ key
10
+ value
11
+ }
12
+ }
13
+ }
14
+ `;
15
+
16
+ export type SocialKey = "facebook" | "instagram" | "twitter" | "youtube";
17
+
18
+ export type SocialLinksResponse = {
19
+ page: {
20
+ id: string;
21
+ metadata: { key: SocialKey; value: string }[];
22
+ } | null;
23
+ };
24
+
25
+ export const fetchSocialLinks = async () => {
26
+ if (!process.env.NEXT_PUBLIC_API_URL) {
27
+ console.warn("API URL not configured, skipping social links fetch");
28
+ return null as SocialLinksResponse["page"];
29
+ }
30
+
31
+ try {
32
+ const client = createApolloServerClient();
33
+ const timeoutPromise = new Promise<never>((_, reject) =>
34
+ setTimeout(() => reject(new Error("Social links fetch timeout")), 5000)
35
+ );
36
+
37
+ const queryPromise = client.query<{ page: SocialLinksResponse["page"] }>({
38
+ query: GET_SOCIAL_LINKS,
39
+ fetchPolicy: "network-only",
40
+ errorPolicy: "ignore",
41
+ });
42
+
43
+ const result = await Promise.race([queryPromise, timeoutPromise]);
44
+ return result?.data?.page ?? null;
45
+ } catch (err) {
46
+ console.warn(
47
+ "Failed to fetch social links:",
48
+ err instanceof Error ? err.message : "Unknown error"
49
+ );
50
+ return null;
51
+ }
52
+ };