@mohasinac/appkit 2.7.27 → 2.7.31

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 (397) hide show
  1. package/dist/_internal/client/features/filters/filter-load-options.d.ts +29 -0
  2. package/dist/_internal/client/features/filters/filter-load-options.js +98 -0
  3. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +1 -1
  4. package/dist/_internal/server/features/checkout/actions.js +42 -35
  5. package/dist/_internal/server/features/classified/adapters.d.ts +21 -0
  6. package/dist/_internal/server/features/classified/adapters.js +24 -0
  7. package/dist/_internal/server/features/classified/index.d.ts +3 -0
  8. package/dist/_internal/server/features/classified/index.js +3 -0
  9. package/dist/_internal/server/features/classified/metadata.d.ts +8 -0
  10. package/dist/_internal/server/features/classified/metadata.js +43 -0
  11. package/dist/_internal/server/features/classified/og.d.ts +30 -0
  12. package/dist/_internal/server/features/classified/og.js +76 -0
  13. package/dist/_internal/server/features/digital-code/adapters.d.ts +21 -0
  14. package/dist/_internal/server/features/digital-code/adapters.js +29 -0
  15. package/dist/_internal/server/features/digital-code/index.d.ts +3 -0
  16. package/dist/_internal/server/features/digital-code/index.js +3 -0
  17. package/dist/_internal/server/features/digital-code/metadata.d.ts +8 -0
  18. package/dist/_internal/server/features/digital-code/metadata.js +36 -0
  19. package/dist/_internal/server/features/digital-code/og.d.ts +27 -0
  20. package/dist/_internal/server/features/digital-code/og.js +77 -0
  21. package/dist/_internal/server/features/live/adapters.d.ts +21 -0
  22. package/dist/_internal/server/features/live/adapters.js +34 -0
  23. package/dist/_internal/server/features/live/index.d.ts +3 -0
  24. package/dist/_internal/server/features/live/index.js +3 -0
  25. package/dist/_internal/server/features/live/metadata.d.ts +8 -0
  26. package/dist/_internal/server/features/live/metadata.js +39 -0
  27. package/dist/_internal/server/features/live/og.d.ts +27 -0
  28. package/dist/_internal/server/features/live/og.js +72 -0
  29. package/dist/_internal/server/features/promotions/actions.js +4 -3
  30. package/dist/_internal/server/jobs/core/onOrderCreate.js +19 -16
  31. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +25 -22
  32. package/dist/_internal/server/jobs/core/onProductWrite.js +48 -58
  33. package/dist/_internal/shared/actions/action-registry.js +504 -9
  34. package/dist/_internal/shared/features/blog/schema.d.ts +4 -4
  35. package/dist/_internal/shared/features/brands/schema.d.ts +5 -5
  36. package/dist/_internal/shared/features/cart/schema.d.ts +18 -18
  37. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +1 -1
  38. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +38 -38
  39. package/dist/_internal/shared/features/events/schema.d.ts +8 -8
  40. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  41. package/dist/_internal/shared/features/products/schema.d.ts +42 -42
  42. package/dist/_internal/shared/features/promotions/schema.d.ts +4 -4
  43. package/dist/_internal/shared/features/reviews/schema.d.ts +1 -1
  44. package/dist/_internal/shared/media/limits.js +4 -3
  45. package/dist/client.d.ts +4 -0
  46. package/dist/client.js +2 -0
  47. package/dist/configs/next.js +4 -0
  48. package/dist/constants/api-endpoints.d.ts +6 -0
  49. package/dist/constants/api-endpoints.js +2 -0
  50. package/dist/constants/field-names.d.ts +1 -0
  51. package/dist/constants/field-names.js +1 -0
  52. package/dist/constants/table-keys.d.ts +6 -0
  53. package/dist/constants/table-keys.js +9 -0
  54. package/dist/core/hooks/useSyncManager.js +9 -8
  55. package/dist/features/about/components/FeesView.js +10 -7
  56. package/dist/features/about/components/HelpPageView.js +10 -1
  57. package/dist/features/about/components/HowAuctionsWorkView.js +10 -1
  58. package/dist/features/about/components/HowCheckoutWorksView.js +10 -1
  59. package/dist/features/about/components/HowOffersWorkView.js +10 -1
  60. package/dist/features/about/components/HowOrdersWorkView.js +10 -1
  61. package/dist/features/about/components/HowPayoutsWorkView.js +10 -1
  62. package/dist/features/about/components/HowPreOrdersWorkView.js +10 -1
  63. package/dist/features/about/components/HowReviewsWorkView.js +10 -1
  64. package/dist/features/about/components/PublicProfileView.js +46 -16
  65. package/dist/features/about/components/SecurityPrivacyView.js +7 -1
  66. package/dist/features/account/components/AddressesIndexListing.js +2 -2
  67. package/dist/features/account/components/NotificationBell.js +27 -16
  68. package/dist/features/account/components/NotificationPreferencesPanel.d.ts +9 -0
  69. package/dist/features/account/components/NotificationPreferencesPanel.js +91 -0
  70. package/dist/features/account/components/UserSidebar.js +4 -4
  71. package/dist/features/account/components/UserSupportView.js +16 -6
  72. package/dist/features/account/components/index.d.ts +2 -0
  73. package/dist/features/account/components/index.js +1 -0
  74. package/dist/features/account/schemas/index.d.ts +4 -4
  75. package/dist/features/account/types/index.d.ts +34 -0
  76. package/dist/features/admin/actions/admin-actions.js +4 -3
  77. package/dist/features/admin/actions/notification-actions.d.ts +24 -22
  78. package/dist/features/admin/actions/notification-actions.js +122 -22
  79. package/dist/features/admin/components/AdminAdEditorView.js +29 -15
  80. package/dist/features/admin/components/AdminAddressEditorView.d.ts +7 -0
  81. package/dist/features/admin/components/AdminAddressEditorView.js +117 -0
  82. package/dist/features/admin/components/AdminAdsView.js +22 -28
  83. package/dist/features/admin/components/AdminAllEventEntriesView.js +6 -1
  84. package/dist/features/admin/components/AdminBidsView.js +10 -3
  85. package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
  86. package/dist/features/admin/components/AdminBlogView.js +8 -3
  87. package/dist/features/admin/components/AdminBrandsView.js +7 -2
  88. package/dist/features/admin/components/AdminBundleEditorView.js +5 -2
  89. package/dist/features/admin/components/AdminCarouselEditorView.js +6 -3
  90. package/dist/features/admin/components/AdminCarouselView.js +13 -7
  91. package/dist/features/admin/components/AdminCategoriesView.js +8 -3
  92. package/dist/features/admin/components/AdminCategoryEditorView.js +12 -9
  93. package/dist/features/admin/components/AdminContactView.js +6 -1
  94. package/dist/features/admin/components/AdminCouponEditorView.js +8 -2
  95. package/dist/features/admin/components/AdminCouponsView.js +6 -1
  96. package/dist/features/admin/components/AdminEmployeeEditorView.js +12 -9
  97. package/dist/features/admin/components/AdminFaqEditorView.js +2 -2
  98. package/dist/features/admin/components/AdminFaqsView.js +7 -2
  99. package/dist/features/admin/components/AdminFeatureFlagsView.js +58 -13
  100. package/dist/features/admin/components/AdminFeaturesView.js +4 -3
  101. package/dist/features/admin/components/AdminMediaView.js +9 -8
  102. package/dist/features/admin/components/AdminNavigationView.js +10 -17
  103. package/dist/features/admin/components/AdminNewsletterView.js +6 -1
  104. package/dist/features/admin/components/AdminNotificationsView.js +11 -3
  105. package/dist/features/admin/components/AdminOrdersView.js +6 -1
  106. package/dist/features/admin/components/AdminPayoutsView.js +10 -3
  107. package/dist/features/admin/components/AdminPrizeDrawsView.js +10 -3
  108. package/dist/features/admin/components/AdminProductEditorView.d.ts +3 -1
  109. package/dist/features/admin/components/AdminProductEditorView.js +12 -9
  110. package/dist/features/admin/components/AdminProductsView.js +18 -12
  111. package/dist/features/admin/components/AdminReturnRequestsView.js +5 -4
  112. package/dist/features/admin/components/AdminReviewsView.js +36 -26
  113. package/dist/features/admin/components/AdminScammerEditorView.js +3 -2
  114. package/dist/features/admin/components/AdminScammersView.js +28 -26
  115. package/dist/features/admin/components/AdminSectionsView.js +112 -99
  116. package/dist/features/admin/components/AdminSessionsView.js +10 -3
  117. package/dist/features/admin/components/AdminSidebar.js +4 -4
  118. package/dist/features/admin/components/AdminSiteSettingsView.js +45 -4
  119. package/dist/features/admin/components/AdminStoresView.js +6 -1
  120. package/dist/features/admin/components/AdminSublistingCategoriesView.js +0 -1
  121. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  122. package/dist/features/admin/components/AdminSupportTicketsView.js +32 -34
  123. package/dist/features/admin/components/AdminTeamView.js +6 -1
  124. package/dist/features/admin/components/AdminUserEditorView.js +8 -15
  125. package/dist/features/admin/components/AdminUsersView.js +6 -1
  126. package/dist/features/admin/components/AdminViewCards.js +4 -3
  127. package/dist/features/admin/components/DashboardStats.js +2 -2
  128. package/dist/features/admin/components/DataTable.js +2 -2
  129. package/dist/features/admin/components/index.d.ts +2 -0
  130. package/dist/features/admin/components/index.js +1 -0
  131. package/dist/features/admin/components/sections/adminSectionsTypes.js +4 -3
  132. package/dist/features/admin/repository/chat.repository.js +8 -8
  133. package/dist/features/admin/repository/site-settings.repository.d.ts +1 -0
  134. package/dist/features/admin/repository/site-settings.repository.js +11 -9
  135. package/dist/features/admin/schemas/firestore.d.ts +38 -0
  136. package/dist/features/admin/schemas/firestore.js +15 -0
  137. package/dist/features/auctions/components/AuctionBidsTable.d.ts +13 -0
  138. package/dist/features/auctions/components/AuctionBidsTable.js +62 -0
  139. package/dist/features/auctions/components/AuctionDetailPageView.js +15 -21
  140. package/dist/features/auctions/components/AuctionFilters.d.ts +7 -1
  141. package/dist/features/auctions/components/AuctionFilters.js +3 -2
  142. package/dist/features/auctions/components/MarketplaceAuctionCard.js +18 -9
  143. package/dist/features/auctions/components/MarketplaceAuctionGrid.js +3 -2
  144. package/dist/features/auctions/components/index.d.ts +2 -1
  145. package/dist/features/auctions/components/index.js +1 -1
  146. package/dist/features/auctions/schemas/index.d.ts +14 -14
  147. package/dist/features/auth/actions/realtime-token-actions.js +19 -4
  148. package/dist/features/auth/components/RegisterForm.js +8 -4
  149. package/dist/features/auth/consent-otp.d.ts +2 -0
  150. package/dist/features/auth/consent-otp.js +8 -0
  151. package/dist/features/auth/schemas/firestore.d.ts +2 -0
  152. package/dist/features/auth/schemas/firestore.js +18 -25
  153. package/dist/features/auth/schemas/index.d.ts +2 -2
  154. package/dist/features/before-after/api/[id]/route.js +8 -6
  155. package/dist/features/before-after/schemas/index.d.ts +2 -2
  156. package/dist/features/blog/actions/blog-actions.d.ts +3 -3
  157. package/dist/features/blog/components/BlogIndexListing.js +21 -2
  158. package/dist/features/blog/components/BlogPostForm.js +11 -5
  159. package/dist/features/blog/components/BlogPostView.js +10 -2
  160. package/dist/features/blog/schemas/index.d.ts +18 -18
  161. package/dist/features/cart/components/CartDrawer.js +3 -2
  162. package/dist/features/cart/components/CartView.js +2 -1
  163. package/dist/features/cart/components/CheckoutView.js +2 -1
  164. package/dist/features/cart/repository/cart.repository.js +4 -3
  165. package/dist/features/cart/utils/pending-ops.d.ts +1 -1
  166. package/dist/features/categories/api/[id]/route.js +4 -3
  167. package/dist/features/categories/api/route.js +4 -3
  168. package/dist/features/categories/components/BrandDetailPageView.js +2 -2
  169. package/dist/features/categories/components/BrandDetailTabs.d.ts +5 -1
  170. package/dist/features/categories/components/BrandDetailTabs.js +30 -16
  171. package/dist/features/categories/components/BundleCollage.d.ts +8 -0
  172. package/dist/features/categories/components/BundleCollage.js +50 -0
  173. package/dist/features/categories/components/BundleDetailView.js +2 -10
  174. package/dist/features/categories/components/BundleItemsPicker.js +20 -13
  175. package/dist/features/categories/components/CategoriesIndexListing.js +28 -9
  176. package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
  177. package/dist/features/categories/components/CategoryDetailTabs.d.ts +5 -1
  178. package/dist/features/categories/components/CategoryDetailTabs.js +31 -16
  179. package/dist/features/categories/components/CategoryProductsListing.js +52 -13
  180. package/dist/features/categories/components/index.d.ts +2 -0
  181. package/dist/features/categories/components/index.js +1 -0
  182. package/dist/features/categories/schemas/index.d.ts +6 -6
  183. package/dist/features/checkout/actions/checkout-actions.js +4 -3
  184. package/dist/features/checkout/hooks/usePaymentCheckout.js +31 -22
  185. package/dist/features/classified/components/ClassifiedFilters.d.ts +12 -0
  186. package/dist/features/classified/components/ClassifiedFilters.js +20 -0
  187. package/dist/features/classified/components/ClassifiedIndexListing.d.ts +4 -0
  188. package/dist/features/classified/components/ClassifiedIndexListing.js +110 -0
  189. package/dist/features/classified/components/ClassifiedListView.d.ts +6 -0
  190. package/dist/features/classified/components/ClassifiedListView.js +43 -0
  191. package/dist/features/classified/components/index.d.ts +6 -0
  192. package/dist/features/classified/components/index.js +3 -0
  193. package/dist/features/collections/api/[slug]/route.js +16 -12
  194. package/dist/features/collections/schemas/index.d.ts +5 -5
  195. package/dist/features/consultation/api/[id]/route.js +12 -9
  196. package/dist/features/consultation/components/ConsultationForm.js +3 -2
  197. package/dist/features/consultation/schemas/index.d.ts +6 -6
  198. package/dist/features/contact/email.js +77 -116
  199. package/dist/features/copilot/components/AdminCopilotView.js +12 -2
  200. package/dist/features/corporate/api/[id]/route.js +12 -9
  201. package/dist/features/corporate/components/CorporateInquiryForm.js +2 -1
  202. package/dist/features/digital-codes/components/DigitalCodeFilters.d.ts +12 -0
  203. package/dist/features/digital-codes/components/DigitalCodeFilters.js +17 -0
  204. package/dist/features/digital-codes/components/DigitalCodesIndexListing.d.ts +4 -0
  205. package/dist/features/digital-codes/components/DigitalCodesIndexListing.js +107 -0
  206. package/dist/features/digital-codes/components/DigitalCodesListView.d.ts +6 -0
  207. package/dist/features/digital-codes/components/DigitalCodesListView.js +37 -0
  208. package/dist/features/digital-codes/components/index.d.ts +6 -0
  209. package/dist/features/digital-codes/components/index.js +3 -0
  210. package/dist/features/events/actions/event-actions.js +4 -3
  211. package/dist/features/events/components/AdminEventEditorView.js +3 -2
  212. package/dist/features/events/components/AdminEventsView.js +4 -2
  213. package/dist/features/events/components/EventPollWidget.js +5 -5
  214. package/dist/features/events/components/EventsIndexListing.js +2 -2
  215. package/dist/features/events/repository/event-entry.repository.d.ts +1 -0
  216. package/dist/features/events/repository/event-entry.repository.js +5 -0
  217. package/dist/features/events/schemas/index.d.ts +20 -20
  218. package/dist/features/faq/actions/faq-actions.d.ts +8 -8
  219. package/dist/features/faq/components/ContactCTA.js +3 -1
  220. package/dist/features/faq/components/FAQAccordion.js +1 -1
  221. package/dist/features/faq/schemas/index.d.ts +4 -4
  222. package/dist/features/filters/AsyncFacetSection.d.ts +18 -0
  223. package/dist/features/filters/AsyncFacetSection.js +65 -0
  224. package/dist/features/filters/index.d.ts +2 -0
  225. package/dist/features/filters/index.js +1 -0
  226. package/dist/features/forms/Checkbox.js +2 -2
  227. package/dist/features/forms/Input.js +2 -2
  228. package/dist/features/forms/Radio.js +5 -5
  229. package/dist/features/forms/Select.js +2 -2
  230. package/dist/features/forms/Slider.js +2 -2
  231. package/dist/features/forms/Textarea.js +2 -2
  232. package/dist/features/homepage/api/[id]/route.js +4 -3
  233. package/dist/features/homepage/api/sections/[id]/route.js +12 -9
  234. package/dist/features/homepage/components/AdSlot.js +2 -1
  235. package/dist/features/homepage/components/AdvertisementBanner.js +5 -3
  236. package/dist/features/homepage/components/BrandsSection.js +2 -2
  237. package/dist/features/homepage/components/CTABannerSection.js +2 -2
  238. package/dist/features/homepage/components/CharacterHotspot.d.ts +2 -2
  239. package/dist/features/homepage/components/CharacterHotspot.js +119 -157
  240. package/dist/features/homepage/components/CharacterHotspotForm.js +25 -20
  241. package/dist/features/homepage/components/CustomCardsSection.js +8 -6
  242. package/dist/features/homepage/components/FeaturedProductsSection.js +2 -2
  243. package/dist/features/homepage/components/GoogleReviewsSection.js +3 -3
  244. package/dist/features/homepage/components/HeroBanner.js +5 -4
  245. package/dist/features/homepage/components/HeroCarousel.js +13 -26
  246. package/dist/features/homepage/components/HowItWorksSection.js +4 -2
  247. package/dist/features/homepage/components/SocialFeedSection.js +2 -2
  248. package/dist/features/homepage/components/SocialPostCard.js +3 -2
  249. package/dist/features/homepage/lib/social-feed-fetcher.js +6 -3
  250. package/dist/features/layout/AppLayoutShell.d.ts +8 -2
  251. package/dist/features/layout/AppLayoutShell.js +54 -78
  252. package/dist/features/layout/BottomActions.js +43 -48
  253. package/dist/features/live/components/LiveItemFilters.d.ts +12 -0
  254. package/dist/features/live/components/LiveItemFilters.js +24 -0
  255. package/dist/features/live/components/LiveItemsIndexListing.d.ts +4 -0
  256. package/dist/features/live/components/LiveItemsIndexListing.js +108 -0
  257. package/dist/features/live/components/LiveItemsListView.d.ts +6 -0
  258. package/dist/features/live/components/LiveItemsListView.js +43 -0
  259. package/dist/features/live/components/index.d.ts +6 -0
  260. package/dist/features/live/components/index.js +3 -0
  261. package/dist/features/media/MediaLightbox.js +8 -14
  262. package/dist/features/media/types/index.d.ts +2 -2
  263. package/dist/features/media/upload/CameraCapture.js +2 -2
  264. package/dist/features/media/upload/ImageUpload.js +4 -2
  265. package/dist/features/media/upload/MediaUploadField.js +24 -8
  266. package/dist/features/media/upload/MediaUploadList.js +1 -1
  267. package/dist/features/orders/actions/order-actions.js +4 -3
  268. package/dist/features/orders/components/MarketplaceOrderCard.js +2 -1
  269. package/dist/features/orders/components/OrderFilters.js +12 -9
  270. package/dist/features/orders/schemas/index.d.ts +6 -6
  271. package/dist/features/pre-orders/api/[id]/route.js +12 -9
  272. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +5 -4
  273. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +29 -22
  274. package/dist/features/pre-orders/components/PreOrderFilters.d.ts +7 -1
  275. package/dist/features/pre-orders/components/PreOrderFilters.js +3 -2
  276. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +17 -52
  277. package/dist/features/pre-orders/components/PreorderCard.d.ts +0 -9
  278. package/dist/features/pre-orders/components/PreorderCard.js +2 -13
  279. package/dist/features/pre-orders/components/index.d.ts +1 -1
  280. package/dist/features/pre-orders/components/index.js +1 -1
  281. package/dist/features/pre-orders/schemas/index.d.ts +10 -10
  282. package/dist/features/products/api/[id]/route.js +9 -7
  283. package/dist/features/products/api/route.js +1 -1
  284. package/dist/features/products/columns/productTableColumns.js +3 -3
  285. package/dist/features/products/components/AuctionsIndexListing.js +15 -51
  286. package/dist/features/products/components/BidHistory.js +2 -2
  287. package/dist/features/products/components/CompareOverlay.d.ts +2 -0
  288. package/dist/features/products/components/CompareOverlay.js +3 -2
  289. package/dist/features/products/components/MakeOfferButton.js +20 -14
  290. package/dist/features/products/components/MarketplacePrizeDrawCard.js +2 -1
  291. package/dist/features/products/components/PrizeDrawCollage.d.ts +1 -15
  292. package/dist/features/products/components/PrizeDrawCollage.js +54 -14
  293. package/dist/features/products/components/PrizeDrawDetailPageView.js +2 -1
  294. package/dist/features/products/components/PrizeDrawEntryActions.js +2 -1
  295. package/dist/features/products/components/PrizeDrawItemsEditor.js +9 -7
  296. package/dist/features/products/components/PrizeDrawsIndexListing.js +18 -51
  297. package/dist/features/products/components/PrizeRevealModal.js +24 -14
  298. package/dist/features/products/components/ProductDetailPageView.js +2 -1
  299. package/dist/features/products/components/ProductFilters.d.ts +7 -1
  300. package/dist/features/products/components/ProductFilters.js +11 -8
  301. package/dist/features/products/components/ProductForm.js +18 -16
  302. package/dist/features/products/components/ProductGalleryClient.js +2 -1
  303. package/dist/features/products/components/ProductGrid.js +12 -15
  304. package/dist/features/products/components/ProductsIndexListing.js +16 -52
  305. package/dist/features/products/components/ProductsIndexPageView.js +2 -2
  306. package/dist/features/products/repository/products.repository.d.ts +4 -0
  307. package/dist/features/products/repository/products.repository.js +22 -3
  308. package/dist/features/products/schemas/firestore.d.ts +7 -1
  309. package/dist/features/products/schemas/index.d.ts +56 -56
  310. package/dist/features/products/schemas/product-features.validators.d.ts +14 -14
  311. package/dist/features/products/types/index.d.ts +4 -0
  312. package/dist/features/promotions/components/CouponsIndexListing.js +1 -1
  313. package/dist/features/promotions/schemas/index.d.ts +6 -6
  314. package/dist/features/reviews/actions/review-actions.js +6 -5
  315. package/dist/features/reviews/api/[id]/route.js +4 -3
  316. package/dist/features/reviews/components/ReviewDetailPageView.js +2 -2
  317. package/dist/features/reviews/components/ReviewDetailShell.js +6 -3
  318. package/dist/features/reviews/components/ReviewsIndexListing.js +2 -2
  319. package/dist/features/reviews/schemas/index.d.ts +6 -6
  320. package/dist/features/scams/components/ScamProfileView.js +19 -10
  321. package/dist/features/scams/components/ScamRegistryView.js +2 -1
  322. package/dist/features/search/components/Search.d.ts +1 -1
  323. package/dist/features/search/components/Search.js +56 -49
  324. package/dist/features/search/schemas/index.d.ts +5 -5
  325. package/dist/features/seller/actions/offer-actions.js +11 -9
  326. package/dist/features/seller/components/SellerAddressesView.js +6 -4
  327. package/dist/features/seller/components/SellerBidsView.js +2 -2
  328. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  329. package/dist/features/seller/components/SellerOffersPanel.js +6 -1
  330. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  331. package/dist/features/seller/components/SellerPayoutSettingsView.js +3 -3
  332. package/dist/features/seller/components/SellerPreOrdersView.js +5 -4
  333. package/dist/features/seller/components/SellerPrizeDrawsView.js +5 -4
  334. package/dist/features/seller/components/SellerProductShell.d.ts +19 -1
  335. package/dist/features/seller/components/SellerProductShell.js +75 -9
  336. package/dist/features/seller/components/SellerProductsView.js +10 -11
  337. package/dist/features/seller/components/SellerShippingView.js +3 -3
  338. package/dist/features/seller/components/SellerSidebar.js +10 -7
  339. package/dist/features/seller/components/SellerStorefrontView.js +3 -3
  340. package/dist/features/seller/schemas/index.d.ts +4 -4
  341. package/dist/features/shell/FormShell.js +2 -1
  342. package/dist/features/shell/QuickFormDrawer.js +4 -3
  343. package/dist/features/shell/StepForm.js +4 -3
  344. package/dist/features/stores/actions/store-query-actions.js +4 -3
  345. package/dist/features/stores/components/StoreAboutView.js +2 -1
  346. package/dist/features/stores/components/StoreAuctionsListing.js +43 -64
  347. package/dist/features/stores/components/StoreDetailLayoutView.js +18 -4
  348. package/dist/features/stores/components/StorePreOrdersListing.js +33 -57
  349. package/dist/features/stores/components/StoreProductsListing.js +16 -49
  350. package/dist/features/stores/components/StoresIndexListing.js +2 -2
  351. package/dist/features/stores/schemas/index.d.ts +2 -2
  352. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +8 -7
  353. package/dist/features/wishlist/hooks/useGuestWishlist.d.ts +5 -5
  354. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +6 -6
  355. package/dist/features/wishlist/utils/guest-wishlist.d.ts +5 -5
  356. package/dist/index.d.ts +27 -3
  357. package/dist/index.js +1743 -1725
  358. package/dist/monitoring/server-logger.js +5 -9
  359. package/dist/next/api/apiHandler.js +56 -37
  360. package/dist/next/components/GlobalError.js +2 -1
  361. package/dist/next/routing/route-map.d.ts +41 -0
  362. package/dist/next/routing/route-map.js +17 -0
  363. package/dist/react/ErrorBoundary.js +2 -1
  364. package/dist/react/contexts/SessionContext.js +38 -28
  365. package/dist/react/hooks/useCamera.d.ts +1 -1
  366. package/dist/react/hooks/useCamera.js +8 -7
  367. package/dist/seed/products-auctions-seed-data.js +40 -40
  368. package/dist/seed/products-preorders-seed-data.js +16 -16
  369. package/dist/seed/products-prize-draws-seed-data.js +4 -4
  370. package/dist/seed/products-standard-seed-data.js +202 -202
  371. package/dist/seed/site-settings-seed-data.js +6 -0
  372. package/dist/server-entry.d.ts +3 -0
  373. package/dist/server-entry.js +3 -0
  374. package/dist/server.d.ts +12 -0
  375. package/dist/server.js +15 -0
  376. package/dist/tailwind-utilities.css +1 -1
  377. package/dist/ui/DataTable.js +28 -7
  378. package/dist/ui/components/Button.d.ts +8 -1
  379. package/dist/ui/components/Button.js +47 -8
  380. package/dist/ui/components/CollageLightbox.d.ts +18 -0
  381. package/dist/ui/components/CollageLightbox.js +41 -0
  382. package/dist/ui/components/Dropdown.js +7 -6
  383. package/dist/ui/components/ImageLightbox.d.ts +7 -1
  384. package/dist/ui/components/ImageLightbox.js +15 -5
  385. package/dist/ui/components/PageLoader.js +4 -3
  386. package/dist/ui/components/PaginatedMultiSelect.d.ts +28 -0
  387. package/dist/ui/components/PaginatedMultiSelect.js +141 -0
  388. package/dist/ui/components/PaginatedMultiSelect.style.css +272 -0
  389. package/dist/ui/components/Semantic.js +1 -1
  390. package/dist/ui/components/SideDrawer.js +17 -15
  391. package/dist/ui/components/index.style.css +1 -0
  392. package/dist/ui/index.d.ts +2 -0
  393. package/dist/ui/index.js +1 -0
  394. package/dist/utils/number.formatter.js +5 -13
  395. package/dist/utils/string.formatter.js +21 -18
  396. package/dist/validation/schemas.d.ts +2 -2
  397. package/package.json +1 -1
@@ -0,0 +1,29 @@
1
+ /**
2
+ * filter-load-options.ts
3
+ *
4
+ * Factory functions that return `loadOptions(query, page)` callbacks for use
5
+ * with AsyncFacetSection, PaginatedMultiSelect, DynamicSelect, and
6
+ * InlineCreateSelect. Each factory hits a paginated API endpoint and maps the
7
+ * response to { items: DynamicSelectOption[], hasMore: boolean }.
8
+ *
9
+ * Usage:
10
+ * const load = makeCategoryLoadOptions();
11
+ * <AsyncFacetSection loadOptions={load} ... />
12
+ */
13
+ import type { DynamicSelectOption, AsyncPage } from "../../../../ui/components/DynamicSelect";
14
+ import type { FacetOption } from "../../../../features/filters/FilterFacetSection";
15
+ export type LoadOptionsFn<T = DynamicSelectOption> = (query: string, page: number) => Promise<AsyncPage<T>>;
16
+ /**
17
+ * Returns a loadOptions function for categories.
18
+ * @param variant "admin" uses /api/admin/categories; "public" uses /api/categories.
19
+ * @param categoryType Optional filter to narrow to a specific category type (e.g. "brand").
20
+ */
21
+ export declare function makeCategoryLoadOptions(variant?: "public" | "admin", categoryType?: string): LoadOptionsFn;
22
+ export declare function makeCategoryFacetLoadOptions(variant?: "public" | "admin", categoryType?: string): LoadOptionsFn<FacetOption>;
23
+ export declare function makeBrandLoadOptions(variant?: "public" | "admin"): LoadOptionsFn;
24
+ export declare function makeBrandFacetLoadOptions(variant?: "public" | "admin"): LoadOptionsFn<FacetOption>;
25
+ export declare function makeStoreLoadOptions(): LoadOptionsFn;
26
+ export declare function makeStoreFacetLoadOptions(): LoadOptionsFn<FacetOption>;
27
+ export declare function makeProductLoadOptions(storeId?: string): LoadOptionsFn;
28
+ export declare function makeUserLoadOptions(role?: string): LoadOptionsFn;
29
+ export declare function makeAddressLoadOptions(ownerType?: "user" | "store"): LoadOptionsFn;
@@ -0,0 +1,98 @@
1
+ "use client";
2
+ const PAGE_SIZE = 25;
3
+ function buildUrl(base, q, page, extra) {
4
+ const params = new URLSearchParams({
5
+ q,
6
+ page: String(page),
7
+ pageSize: String(PAGE_SIZE),
8
+ ...extra,
9
+ });
10
+ return `${base}?${params.toString()}`;
11
+ }
12
+ async function fetchPage(url, mapItem) {
13
+ const res = await fetch(url);
14
+ if (!res.ok)
15
+ return { items: [], hasMore: false };
16
+ const json = (await res.json());
17
+ const raw = json.data?.items ?? [];
18
+ const hasMore = json.data?.hasMore ?? false;
19
+ return {
20
+ items: raw.map(mapItem),
21
+ hasMore,
22
+ };
23
+ }
24
+ // ── Categories ────────────────────────────────────────────────────────────────
25
+ /**
26
+ * Returns a loadOptions function for categories.
27
+ * @param variant "admin" uses /api/admin/categories; "public" uses /api/categories.
28
+ * @param categoryType Optional filter to narrow to a specific category type (e.g. "brand").
29
+ */
30
+ export function makeCategoryLoadOptions(variant = "admin", categoryType) {
31
+ const base = variant === "admin" ? "/api/admin/categories" : "/api/categories";
32
+ return async (q, page) => fetchPage(buildUrl(base, q, page, categoryType ? { categoryType } : undefined), (item) => ({
33
+ value: String(item.id ?? item.slug ?? ""),
34
+ label: String(item.name ?? item.id ?? ""),
35
+ meta: item,
36
+ }));
37
+ }
38
+ export function makeCategoryFacetLoadOptions(variant = "public", categoryType) {
39
+ const base = variant === "admin" ? "/api/admin/categories" : "/api/categories";
40
+ return async (q, page) => fetchPage(buildUrl(base, q, page, categoryType ? { categoryType } : undefined), (item) => ({
41
+ value: String(item.id ?? item.slug ?? ""),
42
+ label: String(item.name ?? item.id ?? ""),
43
+ }));
44
+ }
45
+ // ── Brands ────────────────────────────────────────────────────────────────────
46
+ export function makeBrandLoadOptions(variant = "admin") {
47
+ const base = variant === "admin" ? "/api/admin/brands" : "/api/brands";
48
+ return async (q, page) => fetchPage(buildUrl(base, q, page), (item) => ({
49
+ value: String(item.id ?? item.slug ?? ""),
50
+ label: String(item.name ?? item.id ?? ""),
51
+ meta: item,
52
+ }));
53
+ }
54
+ export function makeBrandFacetLoadOptions(variant = "public") {
55
+ const base = variant === "admin" ? "/api/admin/brands" : "/api/brands";
56
+ return async (q, page) => fetchPage(buildUrl(base, q, page), (item) => ({
57
+ value: String(item.id ?? item.slug ?? ""),
58
+ label: String(item.name ?? item.id ?? ""),
59
+ }));
60
+ }
61
+ // ── Stores ────────────────────────────────────────────────────────────────────
62
+ export function makeStoreLoadOptions() {
63
+ return async (q, page) => fetchPage(buildUrl("/api/admin/stores", q, page), (item) => ({
64
+ value: String(item.id ?? item.slug ?? ""),
65
+ label: String(item.storeName ?? item.name ?? item.id ?? ""),
66
+ meta: item,
67
+ }));
68
+ }
69
+ export function makeStoreFacetLoadOptions() {
70
+ return async (q, page) => fetchPage(buildUrl("/api/admin/stores", q, page), (item) => ({
71
+ value: String(item.id ?? item.slug ?? ""),
72
+ label: String(item.storeName ?? item.name ?? item.id ?? ""),
73
+ }));
74
+ }
75
+ // ── Products ──────────────────────────────────────────────────────────────────
76
+ export function makeProductLoadOptions(storeId) {
77
+ return async (q, page) => fetchPage(buildUrl("/api/admin/products", q, page, storeId ? { storeId } : undefined), (item) => ({
78
+ value: String(item.id ?? item.slug ?? ""),
79
+ label: String(item.title ?? item.name ?? item.id ?? ""),
80
+ meta: item,
81
+ }));
82
+ }
83
+ // ── Users ─────────────────────────────────────────────────────────────────────
84
+ export function makeUserLoadOptions(role) {
85
+ return async (q, page) => fetchPage(buildUrl("/api/admin/users", q, page, role ? { role } : undefined), (item) => ({
86
+ value: String(item.id ?? item.uid ?? ""),
87
+ label: String(item.displayName ?? item.email ?? item.id ?? ""),
88
+ meta: item,
89
+ }));
90
+ }
91
+ // ── Addresses ─────────────────────────────────────────────────────────────────
92
+ export function makeAddressLoadOptions(ownerType) {
93
+ return async (q, page) => fetchPage(buildUrl("/api/admin/addresses", q, page, ownerType ? { ownerType } : undefined), (item) => ({
94
+ value: String(item.id ?? ""),
95
+ label: [item.label, item.city, item.state].filter(Boolean).join(", "),
96
+ meta: item,
97
+ }));
98
+ }
@@ -91,5 +91,5 @@ export function DashboardLayoutClient({ variant, groups, permissions, activeHref
91
91
  const adminGroups = variant === "admin"
92
92
  ? filteredGroups
93
93
  : groups;
94
- return (_jsxs(_Fragment, { children: [variant === "admin" && (_jsx(AdminSidebar, { variant: "sidebar", desktopOpen: desktopOpen, mobileOpen: mobileOpen, activePath: activeHref, groups: adminGroups, onCloseMobile: close, onToggle: toggle, className: className })), variant === "store" && (_jsx(StoreSidebar, { variant: "sidebar", desktopOpen: desktopOpen, mobileOpen: mobileOpen, activeHref: activeHref, items: [], groups: filteredGroups, onCloseMobile: close, onToggle: toggle, className: className })), variant === "user" && (_jsx(UserSidebar, { variant: "sidebar", desktopOpen: desktopOpen, mobileOpen: mobileOpen, items: filteredGroups.flatMap((g) => g.items), groups: filteredGroups, onCloseMobile: close, onToggle: toggle, className: className })), children] }));
94
+ return (_jsxs(_Fragment, { children: [variant === "admin" && (_jsx(AdminSidebar, { variant: "sidebar", desktopOpen: desktopOpen, mobileOpen: mobileOpen, activePath: activeHref, groups: adminGroups, onCloseMobile: close, onToggle: toggle, className: className })), variant === "store" && (_jsx(StoreSidebar, { variant: "sidebar", desktopOpen: desktopOpen, mobileOpen: mobileOpen, activeHref: activeHref, items: [], groups: filteredGroups, onCloseMobile: close, onToggle: toggle, className: className })), variant === "user" && (_jsx(UserSidebar, { variant: "sidebar", desktopOpen: desktopOpen, mobileOpen: mobileOpen, items: filteredGroups.flatMap((g) => g.items), groups: filteredGroups, onCloseMobile: close, onToggle: toggle, className: className })), _jsx("div", { className: "w-full px-4 py-6 md:pl-5 md:pr-6 lg:pr-8 min-h-[calc(100dvh-var(--header-height,3.5rem))]", children: children })] }));
95
95
  }
@@ -92,6 +92,45 @@ function emitOrderPlacedNotifications(args) {
92
92
  : Promise.resolve();
93
93
  void Promise.all([buyerNotif, sellerNotif]);
94
94
  }
95
+ function accumulateCouponUsage(accumulator, couponCode, couponId, discountAmount) {
96
+ const entry = accumulator.get(couponCode) ?? {
97
+ couponId,
98
+ code: couponCode,
99
+ orderIds: [],
100
+ totalDiscount: 0,
101
+ };
102
+ entry.totalDiscount += discountAmount;
103
+ accumulator.set(couponCode, entry);
104
+ }
105
+ async function resolveShippingCost(storeId, groupTotal, commissions) {
106
+ if (!storeId)
107
+ return { shippingFee: 0, storeOwnerId: undefined };
108
+ const store = await storeRepository.findById(storeId);
109
+ const storeOwnerId = store?.ownerId;
110
+ if (!storeOwnerId)
111
+ return { shippingFee: 0, storeOwnerId: undefined };
112
+ const sellerUser = await userRepository.findById(storeOwnerId);
113
+ const shippingConfig = sellerUser?.shippingConfig;
114
+ if (!shippingConfig?.isConfigured)
115
+ return { shippingFee: 0, storeOwnerId };
116
+ if (shippingConfig.method === "custom") {
117
+ return { shippingFee: shippingConfig.customShippingPrice ?? 0, storeOwnerId };
118
+ }
119
+ if (shippingConfig.method === "shiprocket") {
120
+ const percentFee = groupTotal * (commissions.platformShippingPercent / 100);
121
+ return { shippingFee: Math.max(percentFee, commissions.platformShippingFixedMin), storeOwnerId };
122
+ }
123
+ return { shippingFee: 0, storeOwnerId };
124
+ }
125
+ function buildStockUpdatePayload(product, qtyDelta) {
126
+ const lt = (product.listingType ?? "standard");
127
+ const rule = getListingRule(lt);
128
+ return {
129
+ availableQuantity: product.availableQuantity - qtyDelta,
130
+ updatedAt: new Date(),
131
+ ...rule.stockDecrementExtras(product, qtyDelta),
132
+ };
133
+ }
95
134
  /**
96
135
  * Place order(s) from the user's cart in a single Firestore transaction.
97
136
  *
@@ -239,13 +278,7 @@ export async function createCheckoutOrderAction(input) {
239
278
  const product = productById.get(pid);
240
279
  if (!product)
241
280
  continue;
242
- const lt = (product.listingType ?? "standard");
243
- const rule = getListingRule(lt);
244
- const update = {
245
- availableQuantity: product.availableQuantity - qtyDelta,
246
- updatedAt: new Date(),
247
- ...rule.stockDecrementExtras(product, qtyDelta),
248
- };
281
+ const update = buildStockUpdatePayload(product, qtyDelta);
249
282
  tx.update(productRefById.get(pid), update);
250
283
  }
251
284
  }
@@ -330,26 +363,7 @@ export async function createCheckoutOrderAction(input) {
330
363
  return itemRule.decorateOrderItem(baseLine, product);
331
364
  });
332
365
  const totalQuantity = group.reduce((sum, { item }) => sum + item.quantity, 0);
333
- let shippingFee = 0;
334
- let storeOwnerId;
335
- const storeId = firstItem.storeId;
336
- if (storeId) {
337
- const store = await storeRepository.findById(storeId);
338
- storeOwnerId = store?.ownerId;
339
- if (storeOwnerId) {
340
- const sellerUser = await userRepository.findById(storeOwnerId);
341
- const shippingConfig = sellerUser?.shippingConfig;
342
- if (shippingConfig?.isConfigured) {
343
- if (shippingConfig.method === "custom") {
344
- shippingFee = shippingConfig.customShippingPrice ?? 0;
345
- }
346
- else if (shippingConfig.method === "shiprocket") {
347
- const percentFee = groupTotal * (commissions.platformShippingPercent / 100);
348
- shippingFee = Math.max(percentFee, commissions.platformShippingFixedMin);
349
- }
350
- }
351
- }
352
- }
366
+ const { shippingFee, storeOwnerId } = await resolveShippingCost(firstItem.storeId, groupTotal, commissions);
353
367
  const isCodLike = paymentMethod === "cod" || paymentMethod === "upi_manual";
354
368
  const depositAmount = isCodLike
355
369
  ? Math.round(groupTotal * (commissions.codDepositPercent / 100) * 100) / 100
@@ -395,14 +409,7 @@ export async function createCheckoutOrderAction(input) {
395
409
  storeId: coupon.storeId,
396
410
  });
397
411
  if (coupon.couponId) {
398
- const entry = couponUsageAccumulator.get(coupon.code) ?? {
399
- couponId: coupon.couponId,
400
- code: coupon.code,
401
- orderIds: [],
402
- totalDiscount: 0,
403
- };
404
- entry.totalDiscount += couponGroupDiscount;
405
- couponUsageAccumulator.set(coupon.code, entry);
412
+ accumulateCouponUsage(couponUsageAccumulator, coupon.code, coupon.couponId, couponGroupDiscount);
406
413
  groupCouponCodes.add(coupon.code);
407
414
  }
408
415
  }
@@ -0,0 +1,21 @@
1
+ import type { ProductDocument, ProductClassifiedMeta } from "../../../../features/products/schemas/firestore";
2
+ export interface ClassifiedClientShape {
3
+ id: string;
4
+ title: string;
5
+ description: string;
6
+ price: number;
7
+ priceLabel: string;
8
+ currency: string;
9
+ mainImage: string | null;
10
+ images: string[];
11
+ storeId: string;
12
+ storeName: string | null;
13
+ category: string;
14
+ condition: ProductDocument["condition"] | null;
15
+ tags: string[];
16
+ classified: ProductClassifiedMeta | null;
17
+ status: ProductDocument["status"];
18
+ createdAt: string;
19
+ }
20
+ /** Maps a raw `ProductDocument` to the client-safe classified shape. */
21
+ export declare function toClientClassified(doc: ProductDocument): ClassifiedClientShape;
@@ -0,0 +1,24 @@
1
+ import { formatCurrency } from "../../../../utils/number.formatter";
2
+ /** Maps a raw `ProductDocument` to the client-safe classified shape. */
3
+ export function toClientClassified(doc) {
4
+ return {
5
+ id: doc.id,
6
+ title: doc.title,
7
+ description: doc.description,
8
+ price: doc.price,
9
+ priceLabel: formatCurrency(doc.price, doc.currency ?? "INR"),
10
+ currency: doc.currency ?? "INR",
11
+ mainImage: doc.mainImage || doc.images?.[0] || null,
12
+ images: doc.images ?? [],
13
+ storeId: doc.storeId,
14
+ storeName: doc.storeName ?? null,
15
+ category: doc.categorySlugs?.[0] ?? doc.category ?? "",
16
+ condition: doc.condition ?? null,
17
+ tags: doc.tags ?? [],
18
+ classified: doc.classified ?? null,
19
+ status: doc.status,
20
+ createdAt: doc.createdAt instanceof Date
21
+ ? doc.createdAt.toISOString()
22
+ : String(doc.createdAt),
23
+ };
24
+ }
@@ -1,2 +1,5 @@
1
1
  export * from "./data";
2
2
  export * from "./actions";
3
+ export * from "./adapters";
4
+ export * from "./metadata";
5
+ export * from "./og";
@@ -1,2 +1,5 @@
1
1
  export * from "./data";
2
2
  export * from "./actions";
3
+ export * from "./adapters";
4
+ export * from "./metadata";
5
+ export * from "./og";
@@ -0,0 +1,8 @@
1
+ import type { Metadata } from "next";
2
+ import type { ProductDocument } from "../../../../features/products/schemas/firestore";
3
+ export interface ClassifiedMetadataOptions {
4
+ siteName?: string;
5
+ siteUrl?: string;
6
+ ogImageUrl?: string;
7
+ }
8
+ export declare function buildClassifiedMetadata(product: ProductDocument | null, opts?: ClassifiedMetadataOptions): Metadata;
@@ -0,0 +1,43 @@
1
+ export function buildClassifiedMetadata(product, opts) {
2
+ const siteName = opts?.siteName?.trim() || "";
3
+ const suffix = siteName ? ` — ${siteName}` : "";
4
+ if (!product) {
5
+ return {
6
+ title: `Listing not found${suffix}`,
7
+ description: "This classified listing is unavailable or has been removed.",
8
+ robots: { index: false },
9
+ };
10
+ }
11
+ const location = product.classified?.meetupArea
12
+ ? [product.classified.meetupArea.locality, product.classified.meetupArea.city]
13
+ .filter(Boolean)
14
+ .join(", ")
15
+ : null;
16
+ const title = `${product.title}${suffix}`;
17
+ const description = product.seoDescription?.trim()
18
+ ? product.seoDescription.trim()
19
+ : location
20
+ ? `${product.description?.slice(0, 120) ?? ""} — Available in ${location}.`
21
+ : product.description?.slice(0, 160) ?? "";
22
+ const image = opts?.ogImageUrl ?? (product.mainImage || product.images?.[0] || null);
23
+ const siteUrl = opts?.siteUrl?.replace(/\/+$/, "");
24
+ const canonical = siteUrl ? `${siteUrl}/classified/${product.id}` : undefined;
25
+ return {
26
+ title,
27
+ description,
28
+ alternates: canonical ? { canonical } : undefined,
29
+ openGraph: {
30
+ title,
31
+ description,
32
+ url: canonical,
33
+ type: "website",
34
+ images: image ? [{ url: image }] : undefined,
35
+ },
36
+ twitter: {
37
+ card: image ? "summary_large_image" : "summary",
38
+ title,
39
+ description,
40
+ images: image ? [image] : undefined,
41
+ },
42
+ };
43
+ }
@@ -0,0 +1,30 @@
1
+ import type { ReactElement } from "react";
2
+ import type { ProductDocument } from "../../../../features/products/schemas/firestore";
3
+ export interface ClassifiedOgData {
4
+ title: string;
5
+ priceLabel?: string | null;
6
+ location?: string | null;
7
+ imageUrl?: string | null;
8
+ }
9
+ interface ClassifiedDocLike {
10
+ title?: string | null;
11
+ price?: number | null;
12
+ currency?: string | null;
13
+ mainImage?: string | null;
14
+ images?: (string | null | undefined)[] | null;
15
+ classified?: {
16
+ meetupArea?: {
17
+ city?: string;
18
+ locality?: string;
19
+ };
20
+ } | null;
21
+ }
22
+ export declare function renderClassifiedOg(doc: ClassifiedDocLike | null | undefined, opts: {
23
+ siteName: string;
24
+ }): ReactElement;
25
+ export declare function renderClassifiedOgImage(data: ClassifiedOgData, siteName: string): ReactElement;
26
+ /** Type-safe overload that accepts the full ProductDocument. */
27
+ export declare function renderClassifiedOgFromDoc(doc: ProductDocument | null | undefined, opts: {
28
+ siteName: string;
29
+ }): ReactElement;
30
+ export {};
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function renderClassifiedOg(doc, opts) {
3
+ const meta = doc?.classified;
4
+ const location = meta?.meetupArea
5
+ ? [meta.meetupArea.locality, meta.meetupArea.city].filter(Boolean).join(", ")
6
+ : null;
7
+ const priceLabel = doc?.price != null
8
+ ? new Intl.NumberFormat("en-IN", {
9
+ style: "currency",
10
+ currency: doc.currency ?? "INR",
11
+ maximumFractionDigits: 0,
12
+ }).format(doc.price / 100)
13
+ : null;
14
+ return renderClassifiedOgImage({
15
+ title: doc?.title ?? "Classified Listing",
16
+ priceLabel,
17
+ location,
18
+ imageUrl: doc?.mainImage || doc?.images?.[0] || null,
19
+ }, opts.siteName);
20
+ }
21
+ export function renderClassifiedOgImage(data, siteName) {
22
+ const { title, priceLabel, location, imageUrl } = data;
23
+ return (_jsxs("div", { style: {
24
+ display: "flex",
25
+ width: "100%",
26
+ height: "100%",
27
+ background: "#0f172a",
28
+ fontFamily: "sans-serif",
29
+ position: "relative",
30
+ overflow: "hidden",
31
+ }, children: [imageUrl && (_jsx("img", { src: imageUrl, alt: "", style: {
32
+ position: "absolute",
33
+ inset: 0,
34
+ width: "100%",
35
+ height: "100%",
36
+ objectFit: "cover",
37
+ opacity: 0.12,
38
+ } })), _jsx("div", { style: {
39
+ position: "absolute",
40
+ inset: 0,
41
+ background: "linear-gradient(135deg, rgba(15,23,42,0.96) 0%, rgba(15,23,42,0.82) 100%)",
42
+ } }), _jsxs("div", { style: {
43
+ position: "relative",
44
+ display: "flex",
45
+ width: "100%",
46
+ height: "100%",
47
+ padding: "60px",
48
+ gap: "48px",
49
+ alignItems: "center",
50
+ }, children: [imageUrl && (_jsx("img", { src: imageUrl, alt: title, style: {
51
+ width: 400,
52
+ height: 400,
53
+ objectFit: "contain",
54
+ borderRadius: 16,
55
+ flexShrink: 0,
56
+ } })), _jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 20, flex: 1 }, children: [_jsxs("div", { style: {
57
+ fontSize: 18,
58
+ color: "#38bdf8",
59
+ fontWeight: 600,
60
+ letterSpacing: 2,
61
+ textTransform: "uppercase",
62
+ }, children: [siteName, " \u00B7 Classified"] }), _jsx("div", { style: {
63
+ fontSize: imageUrl ? 44 : 56,
64
+ fontWeight: 700,
65
+ color: "#f1f5f9",
66
+ lineHeight: 1.2,
67
+ display: "-webkit-box",
68
+ WebkitLineClamp: 3,
69
+ WebkitBoxOrient: "vertical",
70
+ overflow: "hidden",
71
+ }, children: title }), priceLabel && (_jsx("div", { style: { fontSize: 32, fontWeight: 700, color: "#4ade80" }, children: priceLabel })), location && (_jsx("div", { style: { fontSize: 22, color: "#94a3b8" }, children: location }))] })] })] }));
72
+ }
73
+ /** Type-safe overload that accepts the full ProductDocument. */
74
+ export function renderClassifiedOgFromDoc(doc, opts) {
75
+ return renderClassifiedOg(doc, opts);
76
+ }
@@ -0,0 +1,21 @@
1
+ import type { ProductDocument, ProductDigitalCodeMeta } from "../../../../features/products/schemas/firestore";
2
+ export interface DigitalCodeClientShape {
3
+ id: string;
4
+ title: string;
5
+ description: string;
6
+ price: number;
7
+ priceLabel: string;
8
+ currency: string;
9
+ mainImage: string | null;
10
+ images: string[];
11
+ storeId: string;
12
+ storeName: string | null;
13
+ category: string;
14
+ tags: string[];
15
+ /** Delivery method and redemption instructions — codesAvailable intentionally omitted (operational). */
16
+ digitalCode: Pick<ProductDigitalCodeMeta, "codeDeliveryMethod" | "redemptionInstructions"> | null;
17
+ status: ProductDocument["status"];
18
+ createdAt: string;
19
+ }
20
+ /** Maps a raw `ProductDocument` to the client-safe digital-code shape. Strips codesAvailable/codePoolSize (operational counters). */
21
+ export declare function toClientDigitalCode(doc: ProductDocument): DigitalCodeClientShape;
@@ -0,0 +1,29 @@
1
+ import { formatCurrency } from "../../../../utils/number.formatter";
2
+ /** Maps a raw `ProductDocument` to the client-safe digital-code shape. Strips codesAvailable/codePoolSize (operational counters). */
3
+ export function toClientDigitalCode(doc) {
4
+ const dc = doc.digitalCode ?? null;
5
+ return {
6
+ id: doc.id,
7
+ title: doc.title,
8
+ description: doc.description,
9
+ price: doc.price,
10
+ priceLabel: formatCurrency(doc.price, doc.currency ?? "INR"),
11
+ currency: doc.currency ?? "INR",
12
+ mainImage: doc.mainImage || doc.images?.[0] || null,
13
+ images: doc.images ?? [],
14
+ storeId: doc.storeId,
15
+ storeName: doc.storeName ?? null,
16
+ category: doc.categorySlugs?.[0] ?? doc.category ?? "",
17
+ tags: doc.tags ?? [],
18
+ digitalCode: dc
19
+ ? {
20
+ codeDeliveryMethod: dc.codeDeliveryMethod,
21
+ redemptionInstructions: dc.redemptionInstructions,
22
+ }
23
+ : null,
24
+ status: doc.status,
25
+ createdAt: doc.createdAt instanceof Date
26
+ ? doc.createdAt.toISOString()
27
+ : String(doc.createdAt),
28
+ };
29
+ }
@@ -1 +1,4 @@
1
1
  export * from "./data";
2
+ export * from "./adapters";
3
+ export * from "./metadata";
4
+ export * from "./og";
@@ -1 +1,4 @@
1
1
  export * from "./data";
2
+ export * from "./adapters";
3
+ export * from "./metadata";
4
+ export * from "./og";
@@ -0,0 +1,8 @@
1
+ import type { Metadata } from "next";
2
+ import type { ProductDocument } from "../../../../features/products/schemas/firestore";
3
+ export interface DigitalCodeMetadataOptions {
4
+ siteName?: string;
5
+ siteUrl?: string;
6
+ ogImageUrl?: string;
7
+ }
8
+ export declare function buildDigitalCodeMetadata(product: ProductDocument | null, opts?: DigitalCodeMetadataOptions): Metadata;
@@ -0,0 +1,36 @@
1
+ export function buildDigitalCodeMetadata(product, opts) {
2
+ const siteName = opts?.siteName?.trim() || "";
3
+ const suffix = siteName ? ` — ${siteName}` : "";
4
+ if (!product) {
5
+ return {
6
+ title: `Digital code not found${suffix}`,
7
+ description: "This digital code listing is unavailable or has been removed.",
8
+ robots: { index: false },
9
+ };
10
+ }
11
+ const title = `${product.title}${suffix}`;
12
+ const description = product.seoDescription?.trim()
13
+ ? product.seoDescription.trim()
14
+ : product.description?.slice(0, 160) ?? "";
15
+ const image = opts?.ogImageUrl ?? (product.mainImage || product.images?.[0] || null);
16
+ const siteUrl = opts?.siteUrl?.replace(/\/+$/, "");
17
+ const canonical = siteUrl ? `${siteUrl}/digital-codes/${product.id}` : undefined;
18
+ return {
19
+ title,
20
+ description,
21
+ alternates: canonical ? { canonical } : undefined,
22
+ openGraph: {
23
+ title,
24
+ description,
25
+ url: canonical,
26
+ type: "website",
27
+ images: image ? [{ url: image }] : undefined,
28
+ },
29
+ twitter: {
30
+ card: image ? "summary_large_image" : "summary",
31
+ title,
32
+ description,
33
+ images: image ? [image] : undefined,
34
+ },
35
+ };
36
+ }
@@ -0,0 +1,27 @@
1
+ import type { ReactElement } from "react";
2
+ import type { ProductDocument } from "../../../../features/products/schemas/firestore";
3
+ export interface DigitalCodeOgData {
4
+ title: string;
5
+ priceLabel?: string | null;
6
+ deliveryMethod?: string | null;
7
+ imageUrl?: string | null;
8
+ }
9
+ interface DigitalCodeDocLike {
10
+ title?: string | null;
11
+ price?: number | null;
12
+ currency?: string | null;
13
+ mainImage?: string | null;
14
+ images?: (string | null | undefined)[] | null;
15
+ digitalCode?: {
16
+ codeDeliveryMethod?: string;
17
+ } | null;
18
+ }
19
+ export declare function renderDigitalCodeOg(doc: DigitalCodeDocLike | null | undefined, opts: {
20
+ siteName: string;
21
+ }): ReactElement;
22
+ export declare function renderDigitalCodeOgImage(data: DigitalCodeOgData, siteName: string): ReactElement;
23
+ /** Type-safe overload that accepts the full ProductDocument. */
24
+ export declare function renderDigitalCodeOgFromDoc(doc: ProductDocument | null | undefined, opts: {
25
+ siteName: string;
26
+ }): ReactElement;
27
+ export {};