@mohasinac/appkit 2.6.2 → 2.6.4

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 (607) hide show
  1. package/dist/_internal/server/features/account/data.js +2 -2
  2. package/dist/_internal/server/features/bundles/data.d.ts +26 -6
  3. package/dist/_internal/server/features/bundles/data.js +41 -6
  4. package/dist/_internal/server/features/bundles/index.d.ts +3 -2
  5. package/dist/_internal/server/features/bundles/index.js +4 -2
  6. package/dist/_internal/server/features/bundles/metadata.d.ts +20 -0
  7. package/dist/_internal/server/features/bundles/metadata.js +46 -0
  8. package/dist/_internal/server/features/bundles/og.d.ts +38 -0
  9. package/dist/_internal/server/features/bundles/og.js +122 -0
  10. package/dist/_internal/server/features/checkout/actions.js +192 -133
  11. package/dist/_internal/server/features/checkout/bundle-expansion.d.ts +57 -0
  12. package/dist/_internal/server/features/checkout/bundle-expansion.js +70 -0
  13. package/dist/_internal/server/features/checkout/prize-bundle-gates.d.ts +5 -15
  14. package/dist/_internal/server/features/checkout/prize-bundle-gates.js +5 -21
  15. package/dist/_internal/server/features/media/contextGuards.js +15 -1
  16. package/dist/_internal/server/features/payouts/actions.d.ts +19 -0
  17. package/dist/_internal/server/features/payouts/actions.js +38 -0
  18. package/dist/_internal/server/features/products/data.js +1 -2
  19. package/dist/_internal/server/features/raffle/actions.d.ts +11 -0
  20. package/dist/_internal/server/features/raffle/actions.js +31 -0
  21. package/dist/_internal/server/features/refunds/actions.d.ts +31 -0
  22. package/dist/_internal/server/features/refunds/actions.js +77 -0
  23. package/dist/_internal/server/jobs/core/adminAnalytics.d.ts +28 -0
  24. package/dist/_internal/server/jobs/core/adminAnalytics.js +98 -0
  25. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +19 -0
  26. package/dist/_internal/server/jobs/core/assignSpinPrize.js +81 -0
  27. package/dist/_internal/server/jobs/core/auctionSettlement.d.ts +2 -0
  28. package/dist/_internal/server/jobs/core/auctionSettlement.js +70 -0
  29. package/dist/_internal/server/jobs/core/autoPayoutEligibility.d.ts +2 -0
  30. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +109 -0
  31. package/dist/_internal/server/jobs/core/bundleStockSync.d.ts +10 -0
  32. package/dist/_internal/server/jobs/core/bundleStockSync.js +71 -0
  33. package/dist/_internal/server/jobs/core/cartPrune.d.ts +2 -0
  34. package/dist/_internal/server/jobs/core/cartPrune.js +13 -0
  35. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.d.ts +2 -0
  36. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +45 -0
  37. package/dist/_internal/server/jobs/core/countersReconcile.d.ts +2 -0
  38. package/dist/_internal/server/jobs/core/countersReconcile.js +107 -0
  39. package/dist/_internal/server/jobs/core/couponExpiry.d.ts +2 -0
  40. package/dist/_internal/server/jobs/core/couponExpiry.js +13 -0
  41. package/dist/_internal/server/jobs/core/dailyDataCleanup.d.ts +2 -0
  42. package/dist/_internal/server/jobs/core/dailyDataCleanup.js +20 -0
  43. package/dist/_internal/server/jobs/core/index.d.ts +44 -0
  44. package/dist/_internal/server/jobs/core/index.js +47 -0
  45. package/dist/_internal/server/jobs/core/listingProcessor.d.ts +30 -0
  46. package/dist/_internal/server/jobs/core/listingProcessor.js +138 -0
  47. package/dist/_internal/server/jobs/core/mediaTmpCleanup.d.ts +14 -0
  48. package/dist/_internal/server/jobs/core/mediaTmpCleanup.js +68 -0
  49. package/dist/_internal/server/jobs/core/notificationPrune.d.ts +2 -0
  50. package/dist/_internal/server/jobs/core/notificationPrune.js +13 -0
  51. package/dist/_internal/server/jobs/core/offerExpiry.d.ts +2 -0
  52. package/dist/_internal/server/jobs/core/offerExpiry.js +50 -0
  53. package/dist/_internal/server/jobs/core/onBidPlaced.d.ts +15 -0
  54. package/dist/_internal/server/jobs/core/onBidPlaced.js +59 -0
  55. package/dist/_internal/server/jobs/core/onCategoryWrite.d.ts +14 -0
  56. package/dist/_internal/server/jobs/core/onCategoryWrite.js +134 -0
  57. package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +18 -0
  58. package/dist/_internal/server/jobs/core/onOrderCreate.js +78 -0
  59. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +19 -0
  60. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +139 -0
  61. package/dist/_internal/server/jobs/core/onProductStockChange.d.ts +23 -0
  62. package/dist/_internal/server/jobs/core/onProductStockChange.js +130 -0
  63. package/dist/_internal/server/jobs/core/onProductWrite.d.ts +12 -0
  64. package/dist/_internal/server/jobs/core/onProductWrite.js +94 -0
  65. package/dist/_internal/server/jobs/core/onReviewWrite.d.ts +7 -0
  66. package/dist/_internal/server/jobs/core/onReviewWrite.js +49 -0
  67. package/dist/_internal/server/jobs/core/onStoreWrite.d.ts +12 -0
  68. package/dist/_internal/server/jobs/core/onStoreWrite.js +7 -0
  69. package/dist/_internal/server/jobs/core/payoutBatch.d.ts +8 -0
  70. package/dist/_internal/server/jobs/core/payoutBatch.js +102 -0
  71. package/dist/_internal/server/jobs/core/pendingOrderTimeout.d.ts +2 -0
  72. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +27 -0
  73. package/dist/_internal/server/jobs/core/positionsReconcile.d.ts +7 -0
  74. package/dist/_internal/server/jobs/core/positionsReconcile.js +87 -0
  75. package/dist/_internal/server/jobs/core/prizeRevealClose.d.ts +2 -0
  76. package/dist/_internal/server/jobs/core/prizeRevealClose.js +22 -0
  77. package/dist/_internal/server/jobs/core/prizeRevealExpiry.d.ts +2 -0
  78. package/dist/_internal/server/jobs/core/prizeRevealExpiry.js +50 -0
  79. package/dist/_internal/server/jobs/core/prizeRevealOpen.d.ts +2 -0
  80. package/dist/_internal/server/jobs/core/prizeRevealOpen.js +56 -0
  81. package/dist/_internal/server/jobs/core/prizeRevealReminder.d.ts +2 -0
  82. package/dist/_internal/server/jobs/core/prizeRevealReminder.js +38 -0
  83. package/dist/_internal/server/jobs/core/productStatsSync.d.ts +8 -0
  84. package/dist/_internal/server/jobs/core/productStatsSync.js +36 -0
  85. package/dist/_internal/server/jobs/core/promotions.d.ts +12 -0
  86. package/dist/_internal/server/jobs/core/promotions.js +43 -0
  87. package/dist/_internal/server/jobs/core/storeAnalytics.d.ts +30 -0
  88. package/dist/_internal/server/jobs/core/storeAnalytics.js +109 -0
  89. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +19 -0
  90. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +86 -0
  91. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.d.ts +6 -0
  92. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +85 -0
  93. package/dist/_internal/server/jobs/handlers/adminAnalytics.d.ts +2 -26
  94. package/dist/_internal/server/jobs/handlers/adminAnalytics.js +2 -98
  95. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +1 -22
  96. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +2 -86
  97. package/dist/_internal/server/jobs/handlers/auctionSettlement.js +2 -70
  98. package/dist/_internal/server/jobs/handlers/autoPayoutEligibility.js +2 -110
  99. package/dist/_internal/server/jobs/handlers/bundleStockSync.d.ts +0 -16
  100. package/dist/_internal/server/jobs/handlers/bundleStockSync.js +2 -80
  101. package/dist/_internal/server/jobs/handlers/cartPrune.js +2 -13
  102. package/dist/_internal/server/jobs/handlers/cleanupRtdbEvents.js +2 -45
  103. package/dist/_internal/server/jobs/handlers/countersReconcile.js +2 -109
  104. package/dist/_internal/server/jobs/handlers/couponExpiry.js +2 -13
  105. package/dist/_internal/server/jobs/handlers/dailyDataCleanup.js +2 -20
  106. package/dist/_internal/server/jobs/handlers/listingProcessor.d.ts +3 -28
  107. package/dist/_internal/server/jobs/handlers/listingProcessor.js +3 -138
  108. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.d.ts +0 -12
  109. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.js +2 -69
  110. package/dist/_internal/server/jobs/handlers/notificationPrune.js +2 -13
  111. package/dist/_internal/server/jobs/handlers/offerExpiry.js +2 -50
  112. package/dist/_internal/server/jobs/handlers/onBidPlaced.d.ts +1 -10
  113. package/dist/_internal/server/jobs/handlers/onBidPlaced.js +2 -56
  114. package/dist/_internal/server/jobs/handlers/onCategoryWrite.d.ts +1 -8
  115. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +6 -134
  116. package/dist/_internal/server/jobs/handlers/onOrderCreate.d.ts +1 -12
  117. package/dist/_internal/server/jobs/handlers/onOrderCreate.js +2 -76
  118. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.d.ts +1 -12
  119. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.js +2 -139
  120. package/dist/_internal/server/jobs/handlers/onProductStockChange.d.ts +0 -13
  121. package/dist/_internal/server/jobs/handlers/onProductStockChange.js +7 -134
  122. package/dist/_internal/server/jobs/handlers/onProductWrite.d.ts +1 -6
  123. package/dist/_internal/server/jobs/handlers/onProductWrite.js +6 -106
  124. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +2 -49
  125. package/dist/_internal/server/jobs/handlers/onStoreWrite.d.ts +1 -8
  126. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +7 -8
  127. package/dist/_internal/server/jobs/handlers/payoutBatch.d.ts +0 -9
  128. package/dist/_internal/server/jobs/handlers/payoutBatch.js +2 -104
  129. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.d.ts +0 -6
  130. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.js +2 -33
  131. package/dist/_internal/server/jobs/handlers/positionsReconcile.d.ts +0 -5
  132. package/dist/_internal/server/jobs/handlers/positionsReconcile.js +2 -87
  133. package/dist/_internal/server/jobs/handlers/prizeRevealClose.d.ts +0 -7
  134. package/dist/_internal/server/jobs/handlers/prizeRevealClose.js +2 -29
  135. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.d.ts +0 -8
  136. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.js +2 -58
  137. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.d.ts +0 -8
  138. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.js +2 -65
  139. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.d.ts +0 -7
  140. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.js +2 -45
  141. package/dist/_internal/server/jobs/handlers/productStatsSync.d.ts +0 -6
  142. package/dist/_internal/server/jobs/handlers/productStatsSync.js +2 -36
  143. package/dist/_internal/server/jobs/handlers/promotions.d.ts +2 -10
  144. package/dist/_internal/server/jobs/handlers/promotions.js +2 -43
  145. package/dist/_internal/server/jobs/handlers/storeAnalytics.d.ts +2 -28
  146. package/dist/_internal/server/jobs/handlers/storeAnalytics.js +2 -109
  147. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +1 -28
  148. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +2 -94
  149. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.d.ts +0 -6
  150. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.js +2 -87
  151. package/dist/_internal/server/jobs/index.d.ts +1 -0
  152. package/dist/_internal/server/jobs/index.js +1 -0
  153. package/dist/_internal/server/jobs/runtime/adapters/firebase.js +21 -0
  154. package/dist/_internal/shared/actions/action-registry.d.ts +84 -0
  155. package/dist/_internal/shared/actions/action-registry.js +160 -0
  156. package/dist/_internal/shared/checkout/rules/_defaults.d.ts +3 -0
  157. package/dist/_internal/shared/checkout/rules/_defaults.js +22 -0
  158. package/dist/_internal/shared/checkout/rules/_limits.d.ts +19 -0
  159. package/dist/_internal/shared/checkout/rules/_limits.js +19 -0
  160. package/dist/_internal/shared/checkout/rules/_registry.d.ts +44 -0
  161. package/dist/_internal/shared/checkout/rules/_registry.js +87 -0
  162. package/dist/_internal/shared/checkout/rules/auction.rule.d.ts +2 -0
  163. package/dist/_internal/shared/checkout/rules/auction.rule.js +10 -0
  164. package/dist/_internal/shared/checkout/rules/bundle.rule.d.ts +11 -0
  165. package/dist/_internal/shared/checkout/rules/bundle.rule.js +6 -0
  166. package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -0
  167. package/dist/_internal/shared/checkout/rules/classified.rule.js +9 -0
  168. package/dist/_internal/shared/checkout/rules/digital-code.rule.d.ts +8 -0
  169. package/dist/_internal/shared/checkout/rules/digital-code.rule.js +6 -0
  170. package/dist/_internal/shared/checkout/rules/index.d.ts +12 -0
  171. package/dist/_internal/shared/checkout/rules/index.js +12 -0
  172. package/dist/_internal/shared/checkout/rules/live.rule.d.ts +10 -0
  173. package/dist/_internal/shared/checkout/rules/live.rule.js +6 -0
  174. package/dist/_internal/shared/checkout/rules/offer.rule.d.ts +2 -0
  175. package/dist/_internal/shared/checkout/rules/offer.rule.js +9 -0
  176. package/dist/_internal/shared/checkout/rules/preorder.rule.d.ts +2 -0
  177. package/dist/_internal/shared/checkout/rules/preorder.rule.js +28 -0
  178. package/dist/_internal/shared/checkout/rules/prize-draw.rule.d.ts +2 -0
  179. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +65 -0
  180. package/dist/_internal/shared/checkout/rules/standard.rule.d.ts +2 -0
  181. package/dist/_internal/shared/checkout/rules/standard.rule.js +5 -0
  182. package/dist/_internal/shared/checkout/rules/types.d.ts +125 -0
  183. package/dist/_internal/shared/checkout/rules/types.js +13 -0
  184. package/dist/_internal/shared/features/cart/schema.d.ts +6 -6
  185. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +123 -0
  186. package/dist/_internal/shared/features/categories/bundle-copy.js +134 -0
  187. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +318 -0
  188. package/dist/_internal/shared/features/categories/bundle-schemas.js +55 -0
  189. package/dist/_internal/shared/features/orders/refund-copy.d.ts +36 -0
  190. package/dist/_internal/shared/features/orders/refund-copy.js +40 -0
  191. package/dist/_internal/shared/features/orders/schema.d.ts +4 -4
  192. package/dist/_internal/shared/features/products/schema.d.ts +8 -8
  193. package/dist/_internal/shared/listing-types/_registry.d.ts +27 -0
  194. package/dist/_internal/shared/listing-types/_registry.js +8 -0
  195. package/dist/_internal/shared/listing-types/action-tracker.d.ts +41 -0
  196. package/dist/_internal/shared/listing-types/action-tracker.js +70 -0
  197. package/dist/_internal/shared/listing-types/capabilities.js +25 -0
  198. package/dist/_internal/shared/listing-types/cart-shipping.d.ts +37 -0
  199. package/dist/_internal/shared/listing-types/cart-shipping.js +46 -0
  200. package/dist/_internal/shared/listing-types/classified/config.d.ts +7 -0
  201. package/dist/_internal/shared/listing-types/classified/config.js +8 -0
  202. package/dist/_internal/shared/listing-types/classified/ctas.d.ts +1 -0
  203. package/dist/_internal/shared/listing-types/classified/ctas.js +3 -0
  204. package/dist/_internal/shared/listing-types/classified/og.d.ts +1 -0
  205. package/dist/_internal/shared/listing-types/classified/og.js +1 -0
  206. package/dist/_internal/shared/listing-types/classified/schema.d.ts +1 -0
  207. package/dist/_internal/shared/listing-types/classified/schema.js +1 -0
  208. package/dist/_internal/shared/listing-types/classified/seed-factory.d.ts +1 -0
  209. package/dist/_internal/shared/listing-types/classified/seed-factory.js +1 -0
  210. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +7 -0
  211. package/dist/_internal/shared/listing-types/digital-code/config.js +8 -0
  212. package/dist/_internal/shared/listing-types/digital-code/ctas.d.ts +1 -0
  213. package/dist/_internal/shared/listing-types/digital-code/ctas.js +3 -0
  214. package/dist/_internal/shared/listing-types/digital-code/og.d.ts +1 -0
  215. package/dist/_internal/shared/listing-types/digital-code/og.js +1 -0
  216. package/dist/_internal/shared/listing-types/digital-code/schema.d.ts +1 -0
  217. package/dist/_internal/shared/listing-types/digital-code/schema.js +1 -0
  218. package/dist/_internal/shared/listing-types/digital-code/seed-factory.d.ts +1 -0
  219. package/dist/_internal/shared/listing-types/digital-code/seed-factory.js +1 -0
  220. package/dist/_internal/shared/listing-types/feature-flags.d.ts +34 -0
  221. package/dist/_internal/shared/listing-types/feature-flags.js +45 -0
  222. package/dist/_internal/shared/listing-types/live/config.d.ts +7 -0
  223. package/dist/_internal/shared/listing-types/live/config.js +8 -0
  224. package/dist/_internal/shared/listing-types/live/ctas.d.ts +1 -0
  225. package/dist/_internal/shared/listing-types/live/ctas.js +3 -0
  226. package/dist/_internal/shared/listing-types/live/og.d.ts +1 -0
  227. package/dist/_internal/shared/listing-types/live/og.js +1 -0
  228. package/dist/_internal/shared/listing-types/live/schema.d.ts +1 -0
  229. package/dist/_internal/shared/listing-types/live/schema.js +1 -0
  230. package/dist/_internal/shared/listing-types/live/seed-factory.d.ts +1 -0
  231. package/dist/_internal/shared/listing-types/live/seed-factory.js +1 -0
  232. package/dist/_internal/shared/media/limits.js +8 -0
  233. package/dist/client.d.ts +6 -1
  234. package/dist/client.js +14 -1
  235. package/dist/configs/next.js +7 -0
  236. package/dist/constants/api-endpoints.d.ts +6 -0
  237. package/dist/constants/api-endpoints.js +4 -0
  238. package/dist/core/hooks/useSyncManager.js +13 -1
  239. package/dist/core/unit-of-work.d.ts +1 -1
  240. package/dist/core/unit-of-work.js +2 -2
  241. package/dist/features/account/actions/address-actions.d.ts +1 -1
  242. package/dist/features/account/actions/address-actions.js +15 -7
  243. package/dist/features/account/schemas/firestore.d.ts +8 -43
  244. package/dist/features/account/schemas/firestore.js +8 -54
  245. package/dist/features/account/schemas/index.d.ts +6 -6
  246. package/dist/features/account/server.d.ts +1 -1
  247. package/dist/features/account/server.js +3 -1
  248. package/dist/features/addresses/index.d.ts +2 -0
  249. package/dist/features/addresses/index.js +2 -0
  250. package/dist/features/addresses/repository/addresses.repository.d.ts +29 -0
  251. package/dist/features/addresses/repository/addresses.repository.js +157 -0
  252. package/dist/features/addresses/schemas/firestore.d.ts +53 -0
  253. package/dist/features/addresses/schemas/firestore.js +68 -0
  254. package/dist/features/{bundles → addresses}/schemas/index.d.ts +0 -1
  255. package/dist/features/{bundles → addresses}/schemas/index.js +0 -1
  256. package/dist/features/addresses/server.d.ts +2 -0
  257. package/dist/features/addresses/server.js +2 -0
  258. package/dist/features/admin/components/AdminAllEventEntriesView.js +4 -3
  259. package/dist/features/admin/components/AdminBidsView.js +4 -3
  260. package/dist/features/admin/components/AdminBlogView.js +8 -3
  261. package/dist/features/admin/components/AdminBundleEditorView.d.ts +9 -0
  262. package/dist/features/admin/components/AdminBundleEditorView.js +209 -0
  263. package/dist/features/admin/components/AdminBundlesView.d.ts +9 -0
  264. package/dist/features/admin/components/AdminBundlesView.js +59 -0
  265. package/dist/features/admin/components/AdminCartsView.js +13 -3
  266. package/dist/features/admin/components/AdminContactView.js +4 -3
  267. package/dist/features/admin/components/AdminCouponsView.js +32 -13
  268. package/dist/features/admin/components/AdminNewsletterView.js +4 -3
  269. package/dist/features/admin/components/AdminOrdersView.js +15 -7
  270. package/dist/features/admin/components/AdminPayoutsView.js +4 -3
  271. package/dist/features/admin/components/AdminProductsView.js +6 -5
  272. package/dist/features/admin/components/AdminReviewsView.js +5 -4
  273. package/dist/features/admin/components/AdminStoresView.js +4 -3
  274. package/dist/features/admin/components/AdminUsersView.js +15 -5
  275. package/dist/features/admin/components/AdminWishlistsView.js +10 -1
  276. package/dist/features/admin/components/DataTable.d.ts +5 -1
  277. package/dist/features/admin/components/DataTable.js +24 -20
  278. package/dist/features/admin/components/index.d.ts +4 -0
  279. package/dist/features/admin/components/index.js +3 -0
  280. package/dist/features/admin/constants/filter-tabs.d.ts +401 -0
  281. package/dist/features/admin/constants/filter-tabs.js +200 -0
  282. package/dist/features/admin/hooks/useAdminListingData.d.ts +1 -0
  283. package/dist/features/admin/hooks/useAdminListingData.js +1 -0
  284. package/dist/features/admin/schemas/firestore.d.ts +15 -0
  285. package/dist/features/admin/schemas/firestore.js +18 -0
  286. package/dist/features/admin/types/product.types.d.ts +2 -2
  287. package/dist/features/auctions/components/AuctionCard.d.ts +4 -1
  288. package/dist/features/auctions/components/AuctionCard.js +5 -3
  289. package/dist/features/auctions/components/AuctionDetailPageView.js +1 -1
  290. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +2 -2
  291. package/dist/features/auctions/components/PlaceBidFormClient.js +12 -2
  292. package/dist/features/auctions/schemas/index.d.ts +2 -2
  293. package/dist/features/auth/index.d.ts +1 -0
  294. package/dist/features/auth/index.js +1 -0
  295. package/dist/features/auth/role-predicates.d.ts +16 -0
  296. package/dist/features/auth/role-predicates.js +15 -0
  297. package/dist/features/blog/components/BlogFeaturedCard.d.ts +4 -1
  298. package/dist/features/blog/components/BlogFeaturedCard.js +5 -3
  299. package/dist/features/cart/actions/cart-actions.d.ts +1 -0
  300. package/dist/features/cart/actions/cart-actions.js +16 -0
  301. package/dist/features/cart/components/CartView.d.ts +19 -1
  302. package/dist/features/cart/components/CartView.js +2 -2
  303. package/dist/features/cart/components/ShippingPicker.d.ts +13 -0
  304. package/dist/features/cart/components/ShippingPicker.js +48 -0
  305. package/dist/features/cart/components/index.d.ts +3 -1
  306. package/dist/features/cart/components/index.js +1 -0
  307. package/dist/features/cart/hooks/useCartCount.js +7 -1
  308. package/dist/features/cart/repository/cart.repository.d.ts +1 -0
  309. package/dist/features/cart/repository/cart.repository.js +35 -0
  310. package/dist/features/cart/schemas/firestore.d.ts +27 -2
  311. package/dist/features/categories/components/BundleAddToCartCta.d.ts +16 -0
  312. package/dist/features/categories/components/BundleAddToCartCta.js +54 -0
  313. package/dist/features/categories/components/BundleBuyNowCta.d.ts +8 -0
  314. package/dist/features/categories/components/BundleBuyNowCta.js +37 -0
  315. package/dist/features/categories/components/BundleDetailView.d.ts +22 -0
  316. package/dist/features/categories/components/BundleDetailView.js +31 -0
  317. package/dist/features/categories/components/BundleDynamicRuleEditor.d.ts +18 -0
  318. package/dist/features/categories/components/BundleDynamicRuleEditor.js +60 -0
  319. package/dist/features/categories/components/BundleItemsPicker.d.ts +26 -0
  320. package/dist/features/categories/components/BundleItemsPicker.js +135 -0
  321. package/dist/features/categories/components/BundlesListView.d.ts +13 -0
  322. package/dist/features/categories/components/BundlesListView.js +27 -0
  323. package/dist/features/categories/components/index.d.ts +12 -0
  324. package/dist/features/categories/components/index.js +9 -0
  325. package/dist/features/checkout/actions/checkout-actions.js +10 -3
  326. package/dist/features/events/components/AdminEventEditorView.js +108 -2
  327. package/dist/features/events/components/AdminEventsView.js +16 -4
  328. package/dist/features/events/components/EventCard.d.ts +4 -1
  329. package/dist/features/events/components/EventCard.js +7 -3
  330. package/dist/features/events/components/EventRaffleWinnerView.d.ts +21 -0
  331. package/dist/features/events/components/EventRaffleWinnerView.js +18 -0
  332. package/dist/features/events/components/SpinWheelView.d.ts +27 -0
  333. package/dist/features/events/components/SpinWheelView.js +64 -0
  334. package/dist/features/events/components/index.d.ts +4 -0
  335. package/dist/features/events/components/index.js +2 -0
  336. package/dist/features/events/schemas/firestore.d.ts +27 -1
  337. package/dist/features/events/schemas/firestore.js +7 -0
  338. package/dist/features/events/types/index.d.ts +27 -1
  339. package/dist/features/homepage/components/FeaturedBundlesSection.d.ts +16 -0
  340. package/dist/features/homepage/components/FeaturedBundlesSection.js +24 -0
  341. package/dist/features/homepage/components/MarketplaceHomepageView.js +4 -1
  342. package/dist/features/homepage/components/WhatsAppCommunitySection.js +2 -2
  343. package/dist/features/homepage/lib/section-renderer.d.ts +2 -0
  344. package/dist/features/homepage/lib/section-renderer.js +5 -5
  345. package/dist/features/layout/NavbarLayout.d.ts +3 -1
  346. package/dist/features/layout/NavbarLayout.js +32 -3
  347. package/dist/features/layout/TitleBarLayout.d.ts +6 -3
  348. package/dist/features/layout/TitleBarLayout.js +22 -7
  349. package/dist/features/media/upload/MediaUploadField.d.ts +15 -1
  350. package/dist/features/media/upload/MediaUploadField.js +22 -1
  351. package/dist/features/orders/components/MarketplaceOrderCard.js +4 -2
  352. package/dist/features/orders/components/OrderSiblingPayments.d.ts +8 -0
  353. package/dist/features/orders/components/OrderSiblingPayments.js +16 -0
  354. package/dist/features/orders/components/RefundHistoryTable.d.ts +6 -0
  355. package/dist/features/orders/components/RefundHistoryTable.js +23 -0
  356. package/dist/features/orders/components/RefundRequestView.d.ts +8 -0
  357. package/dist/features/orders/components/RefundRequestView.js +42 -0
  358. package/dist/features/orders/components/index.d.ts +6 -0
  359. package/dist/features/orders/components/index.js +3 -0
  360. package/dist/features/orders/index.d.ts +1 -0
  361. package/dist/features/orders/index.js +2 -0
  362. package/dist/features/orders/repository/orders.repository.d.ts +20 -1
  363. package/dist/features/orders/repository/orders.repository.js +30 -1
  364. package/dist/features/orders/schemas/firestore.d.ts +63 -13
  365. package/dist/features/orders/schemas/firestore.js +5 -5
  366. package/dist/features/orders/schemas/index.d.ts +4 -4
  367. package/dist/features/orders/types/index.d.ts +12 -2
  368. package/dist/features/orders/utils/bundle-grouping.d.ts +48 -0
  369. package/dist/features/orders/utils/bundle-grouping.js +54 -0
  370. package/dist/features/orders/utils/order-splitter.d.ts +9 -10
  371. package/dist/features/orders/utils/order-splitter.js +24 -30
  372. package/dist/features/payments/repository/payout.repository.d.ts +17 -1
  373. package/dist/features/payments/repository/payout.repository.js +47 -0
  374. package/dist/features/payments/schemas/firestore.d.ts +26 -0
  375. package/dist/features/pre-orders/components/PreorderCard.d.ts +4 -1
  376. package/dist/features/pre-orders/components/PreorderCard.js +8 -6
  377. package/dist/features/products/actions/product-actions.d.ts +1 -1
  378. package/dist/features/products/actions/product-actions.js +1 -1
  379. package/dist/features/products/components/CompareOverlay.d.ts +2 -2
  380. package/dist/features/products/components/CompareOverlay.js +4 -4
  381. package/dist/features/products/components/InteractiveProductCard.js +7 -12
  382. package/dist/features/products/components/NonRefundableConsentModal.d.ts +1 -1
  383. package/dist/features/products/components/NonRefundableConsentModal.js +0 -10
  384. package/dist/features/products/components/ProductGrid.js +28 -12
  385. package/dist/features/products/components/ShowGroupSection.js +3 -3
  386. package/dist/features/products/components/SublistingCarouselSection.js +2 -2
  387. package/dist/features/products/components/index.d.ts +0 -4
  388. package/dist/features/products/components/index.js +5 -2
  389. package/dist/features/products/index.d.ts +1 -1
  390. package/dist/features/products/index.js +3 -1
  391. package/dist/features/products/repository/products.repository.js +4 -0
  392. package/dist/features/products/schemas/catalog-product.d.ts +70 -0
  393. package/dist/features/products/schemas/catalog-product.js +50 -0
  394. package/dist/features/products/schemas/firestore.d.ts +110 -2
  395. package/dist/features/products/schemas/firestore.js +30 -0
  396. package/dist/features/products/schemas/index.d.ts +8 -8
  397. package/dist/features/products/types/index.d.ts +1 -1
  398. package/dist/features/products/utils/listing-type.d.ts +9 -0
  399. package/dist/features/products/utils/listing-type.js +4 -0
  400. package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
  401. package/dist/features/promotions/actions/coupon-actions.js +1 -1
  402. package/dist/features/promotions/components/CouponCard.d.ts +28 -10
  403. package/dist/features/promotions/components/CouponCard.js +116 -14
  404. package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
  405. package/dist/features/promotions/repository/coupons.repository.d.ts +1 -1
  406. package/dist/features/reviews/schemas/index.d.ts +2 -2
  407. package/dist/features/search/schemas/index.d.ts +2 -2
  408. package/dist/features/search/types/index.d.ts +2 -2
  409. package/dist/features/seller/components/SellerAuctionsView.js +4 -5
  410. package/dist/features/seller/components/SellerBidsView.js +5 -13
  411. package/dist/features/seller/components/SellerCouponsView.js +31 -67
  412. package/dist/features/seller/components/SellerOffersView.js +4 -5
  413. package/dist/features/seller/components/SellerOrdersView.js +4 -5
  414. package/dist/features/seller/components/SellerPayoutsView.js +4 -5
  415. package/dist/features/seller/components/SellerProductsView.js +4 -8
  416. package/dist/features/seller/schemas/index.d.ts +2 -2
  417. package/dist/features/stores/actions/store-address-actions.d.ts +10 -6
  418. package/dist/features/stores/actions/store-address-actions.js +8 -7
  419. package/dist/features/stores/components/InteractiveStoreCard.js +3 -10
  420. package/dist/features/stores/components/StoreDetailLayoutView.js +20 -5
  421. package/dist/features/stores/schemas/firestore.d.ts +45 -38
  422. package/dist/features/stores/schemas/firestore.js +2 -49
  423. package/dist/features/stores/server.d.ts +0 -1
  424. package/dist/features/stores/server.js +2 -1
  425. package/dist/features/wishlist/hooks/useWishlistCount.d.ts +7 -9
  426. package/dist/features/wishlist/hooks/useWishlistCount.js +67 -86
  427. package/dist/features/wishlist/types/index.d.ts +1 -1
  428. package/dist/index.d.ts +50 -9
  429. package/dist/index.js +57 -11
  430. package/dist/next/routing/route-map.d.ts +6 -0
  431. package/dist/next/routing/route-map.js +4 -0
  432. package/dist/providers/db-firebase/admin-app-lite.js +21 -0
  433. package/dist/providers/db-firebase/admin.d.ts +6 -2
  434. package/dist/providers/db-firebase/admin.js +23 -0
  435. package/dist/repositories/index.d.ts +1 -2
  436. package/dist/repositories/index.js +5 -2
  437. package/dist/security/authorization.d.ts +2 -1
  438. package/dist/security/authorization.js +3 -2
  439. package/dist/seed/actions/demo-seed-actions.d.ts +1 -1
  440. package/dist/seed/bids-seed-data.d.ts +2 -2
  441. package/dist/seed/bids-seed-data.js +77 -2
  442. package/dist/seed/cart-seed-data.d.ts +10 -10
  443. package/dist/seed/cart-seed-data.js +15 -15
  444. package/dist/seed/events-seed-data.js +77 -0
  445. package/dist/seed/manifest.js +16 -8
  446. package/dist/seed/orders-seed-data.js +41 -2
  447. package/dist/seed/payouts-seed-data.js +18 -2
  448. package/dist/seed/stores-seed-data.js +55 -0
  449. package/dist/server-entry.d.ts +1 -0
  450. package/dist/server-entry.js +2 -0
  451. package/dist/server.d.ts +4 -0
  452. package/dist/server.js +8 -0
  453. package/dist/tailwind-utilities.css +1 -1
  454. package/dist/ui/components/FilterChipGroup.d.ts +39 -0
  455. package/dist/ui/components/FilterChipGroup.js +15 -0
  456. package/dist/ui/components/HorizontalScroller.js +32 -7
  457. package/dist/ui/components/HorizontalScroller.style.css +6 -0
  458. package/dist/ui/components/SiteLogo.js +1 -1
  459. package/dist/ui/index.d.ts +2 -0
  460. package/dist/ui/index.js +2 -0
  461. package/dist/utils/id-generators.d.ts +11 -0
  462. package/dist/utils/id-generators.js +16 -0
  463. package/package.json +1 -1
  464. package/dist/_internal/shared/features/bundles/config.d.ts +0 -6
  465. package/dist/_internal/shared/features/bundles/config.js +0 -6
  466. package/dist/_internal/shared/schema-versions.d.ts +0 -76
  467. package/dist/_internal/shared/schema-versions.js +0 -82
  468. package/dist/features/account/migrations.d.ts +0 -2
  469. package/dist/features/account/migrations.js +0 -10
  470. package/dist/features/admin/migrations.d.ts +0 -2
  471. package/dist/features/admin/migrations.js +0 -10
  472. package/dist/features/auctions/migrations.d.ts +0 -2
  473. package/dist/features/auctions/migrations.js +0 -10
  474. package/dist/features/auth/migrations.d.ts +0 -2
  475. package/dist/features/auth/migrations.js +0 -10
  476. package/dist/features/blog/migrations.d.ts +0 -2
  477. package/dist/features/blog/migrations.js +0 -10
  478. package/dist/features/brands/actions/brand-actions.d.ts +0 -2
  479. package/dist/features/brands/actions/brand-actions.js +0 -5
  480. package/dist/features/brands/index.d.ts +0 -3
  481. package/dist/features/brands/index.js +0 -3
  482. package/dist/features/brands/migrations.d.ts +0 -2
  483. package/dist/features/brands/migrations.js +0 -10
  484. package/dist/features/brands/repository/brands.repository.d.ts +0 -13
  485. package/dist/features/brands/repository/brands.repository.js +0 -60
  486. package/dist/features/brands/schemas/index.d.ts +0 -33
  487. package/dist/features/brands/schemas/index.js +0 -15
  488. package/dist/features/brands/server.d.ts +0 -7
  489. package/dist/features/brands/server.js +0 -7
  490. package/dist/features/bundles/components/AdminBundleEditorView.d.ts +0 -8
  491. package/dist/features/bundles/components/AdminBundleEditorView.js +0 -7
  492. package/dist/features/bundles/components/BundleDetailPageView.d.ts +0 -9
  493. package/dist/features/bundles/components/BundleDetailPageView.js +0 -45
  494. package/dist/features/bundles/components/BundleForm.d.ts +0 -12
  495. package/dist/features/bundles/components/BundleForm.js +0 -126
  496. package/dist/features/bundles/components/BundleItemsPicker.d.ts +0 -9
  497. package/dist/features/bundles/components/BundleItemsPicker.js +0 -77
  498. package/dist/features/bundles/components/BundlesByCategoryListing.d.ts +0 -6
  499. package/dist/features/bundles/components/BundlesByCategoryListing.js +0 -50
  500. package/dist/features/bundles/components/BundlesListingView.d.ts +0 -17
  501. package/dist/features/bundles/components/BundlesListingView.js +0 -50
  502. package/dist/features/bundles/components/FeaturedBundlesSection.d.ts +0 -5
  503. package/dist/features/bundles/components/FeaturedBundlesSection.js +0 -55
  504. package/dist/features/bundles/components/SellerBundleCreateView.d.ts +0 -8
  505. package/dist/features/bundles/components/SellerBundleCreateView.js +0 -7
  506. package/dist/features/bundles/components/SellerBundleEditView.d.ts +0 -9
  507. package/dist/features/bundles/components/SellerBundleEditView.js +0 -7
  508. package/dist/features/bundles/components/index.d.ts +0 -18
  509. package/dist/features/bundles/components/index.js +0 -9
  510. package/dist/features/bundles/constants/index.d.ts +0 -32
  511. package/dist/features/bundles/constants/index.js +0 -35
  512. package/dist/features/bundles/index.d.ts +0 -2
  513. package/dist/features/bundles/index.js +0 -2
  514. package/dist/features/bundles/migrations.d.ts +0 -2
  515. package/dist/features/bundles/migrations.js +0 -10
  516. package/dist/features/bundles/repository/bundles.repository.d.ts +0 -36
  517. package/dist/features/bundles/repository/bundles.repository.js +0 -148
  518. package/dist/features/bundles/repository/index.d.ts +0 -1
  519. package/dist/features/bundles/repository/index.js +0 -1
  520. package/dist/features/bundles/schemas/firestore.d.ts +0 -88
  521. package/dist/features/bundles/schemas/firestore.js +0 -29
  522. package/dist/features/bundles/schemas/zod.d.ts +0 -377
  523. package/dist/features/bundles/schemas/zod.js +0 -71
  524. package/dist/features/cart/migrations.d.ts +0 -2
  525. package/dist/features/cart/migrations.js +0 -10
  526. package/dist/features/categories/migrations.d.ts +0 -2
  527. package/dist/features/categories/migrations.js +0 -10
  528. package/dist/features/events/migrations.d.ts +0 -2
  529. package/dist/features/events/migrations.js +0 -10
  530. package/dist/features/faq/migrations.d.ts +0 -2
  531. package/dist/features/faq/migrations.js +0 -10
  532. package/dist/features/grouped/migrations.d.ts +0 -2
  533. package/dist/features/grouped/migrations.js +0 -10
  534. package/dist/features/history/migrations.d.ts +0 -2
  535. package/dist/features/history/migrations.js +0 -10
  536. package/dist/features/messages/migrations.d.ts +0 -2
  537. package/dist/features/messages/migrations.js +0 -10
  538. package/dist/features/orders/migrations.d.ts +0 -2
  539. package/dist/features/orders/migrations.js +0 -10
  540. package/dist/features/payments/migrations.d.ts +0 -2
  541. package/dist/features/payments/migrations.js +0 -10
  542. package/dist/features/products/migrations.d.ts +0 -2
  543. package/dist/features/products/migrations.js +0 -10
  544. package/dist/features/products/repository/sublisting-categories.repository.d.ts +0 -16
  545. package/dist/features/products/repository/sublisting-categories.repository.js +0 -126
  546. package/dist/features/products/schemas/sublisting-categories.d.ts +0 -45
  547. package/dist/features/products/schemas/sublisting-categories.js +0 -16
  548. package/dist/features/promotions/migrations.d.ts +0 -2
  549. package/dist/features/promotions/migrations.js +0 -10
  550. package/dist/features/reviews/migrations.d.ts +0 -2
  551. package/dist/features/reviews/migrations.js +0 -10
  552. package/dist/features/scams/migrations.d.ts +0 -2
  553. package/dist/features/scams/migrations.js +0 -10
  554. package/dist/features/seller/migrations.d.ts +0 -2
  555. package/dist/features/seller/migrations.js +0 -10
  556. package/dist/features/stores/migrations.d.ts +0 -2
  557. package/dist/features/stores/migrations.js +0 -10
  558. package/dist/features/sublisting/migrations.d.ts +0 -2
  559. package/dist/features/sublisting/migrations.js +0 -10
  560. package/dist/features/sublisting/schemas/firestore.d.ts +0 -32
  561. package/dist/features/sublisting/schemas/firestore.js +0 -19
  562. package/dist/features/support/migrations.d.ts +0 -2
  563. package/dist/features/support/migrations.js +0 -10
  564. package/dist/features/wishlist/migrations.d.ts +0 -2
  565. package/dist/features/wishlist/migrations.js +0 -10
  566. package/dist/seed/_bundle-constants.d.ts +0 -14
  567. package/dist/seed/_bundle-constants.js +0 -14
  568. package/dist/seed/anime-figures-seed-data.d.ts +0 -8
  569. package/dist/seed/anime-figures-seed-data.js +0 -1033
  570. package/dist/seed/beyblade-seed-data.d.ts +0 -7
  571. package/dist/seed/beyblade-seed-data.js +0 -1129
  572. package/dist/seed/brands-seed-data.d.ts +0 -7
  573. package/dist/seed/brands-seed-data.js +0 -410
  574. package/dist/seed/bundles-seed-data.d.ts +0 -13
  575. package/dist/seed/bundles-seed-data.js +0 -229
  576. package/dist/seed/cosplay-accessories-seed-data.d.ts +0 -8
  577. package/dist/seed/cosplay-accessories-seed-data.js +0 -647
  578. package/dist/seed/hot-wheels-seed-data.d.ts +0 -7
  579. package/dist/seed/hot-wheels-seed-data.js +0 -1612
  580. package/dist/seed/letitrip-official-seed-data.d.ts +0 -8
  581. package/dist/seed/letitrip-official-seed-data.js +0 -399
  582. package/dist/seed/pokemon-carousel-slides-seed-data.d.ts +0 -8
  583. package/dist/seed/pokemon-carousel-slides-seed-data.js +0 -322
  584. package/dist/seed/pokemon-categories-seed-data.d.ts +0 -24
  585. package/dist/seed/pokemon-categories-seed-data.js +0 -547
  586. package/dist/seed/pokemon-coupons-seed-data.d.ts +0 -6
  587. package/dist/seed/pokemon-coupons-seed-data.js +0 -465
  588. package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +0 -7
  589. package/dist/seed/pokemon-homepage-sections-seed-data.js +0 -241
  590. package/dist/seed/pokemon-products-seed-data.d.ts +0 -9
  591. package/dist/seed/pokemon-products-seed-data.js +0 -1791
  592. package/dist/seed/pokemon-seed-bundle.d.ts +0 -47
  593. package/dist/seed/pokemon-seed-bundle.js +0 -71
  594. package/dist/seed/pokemon-stores-seed-data.d.ts +0 -6
  595. package/dist/seed/pokemon-stores-seed-data.js +0 -179
  596. package/dist/seed/pokemon-users-seed-data.d.ts +0 -6
  597. package/dist/seed/pokemon-users-seed-data.js +0 -521
  598. package/dist/seed/products-seed-data.d.ts +0 -6
  599. package/dist/seed/products-seed-data.js +0 -2530
  600. package/dist/seed/retro-gaming-seed-data.d.ts +0 -8
  601. package/dist/seed/retro-gaming-seed-data.js +0 -801
  602. package/dist/seed/server.d.ts +0 -2
  603. package/dist/seed/server.js +0 -7
  604. package/dist/seed/sublisting-categories-seed-data.d.ts +0 -7
  605. package/dist/seed/sublisting-categories-seed-data.js +0 -159
  606. package/dist/seed/transformers-seed-data.d.ts +0 -7
  607. package/dist/seed/transformers-seed-data.js +0 -530
@@ -1,10 +1,11 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useEffect } from "react";
4
- import { Article, Button, Div, Heading, Row, Span, Text } from "../../../ui";
4
+ import { Article, BaseListingCard, Button, Div, Heading, Row, Span, Text } from "../../../ui";
5
5
  import { formatCurrency } from "../../../utils/number.formatter";
6
6
  import { getDefaultCurrency } from "../../../core/baseline-resolver";
7
7
  import { THEME_CONSTANTS } from "../../../tokens";
8
+ import { useLongPress } from "../../../react/hooks/useLongPress";
8
9
  function useCountdown(endsAt) {
9
10
  const [msLeft, setMsLeft] = useState(() => new Date(endsAt).getTime() - Date.now());
10
11
  useEffect(() => {
@@ -29,8 +30,9 @@ export function AuctionCountdown({ endsAt, className = "", labels = {}, }) {
29
30
  const pad = (n) => String(n).padStart(2, "0");
30
31
  return (_jsxs(Row, { className: `gap-1 text-sm font-mono ${className}`, children: [_jsx(Span, { className: "rounded bg-gray-900 dark:bg-slate-700 px-1.5 py-0.5 text-white", children: pad(countdown.h) }), _jsx(Span, { className: "text-gray-400 dark:text-zinc-500", children: ":" }), _jsx(Span, { className: "rounded bg-gray-900 dark:bg-slate-700 px-1.5 py-0.5 text-white", children: pad(countdown.m) }), _jsx(Span, { className: "text-gray-400 dark:text-zinc-500", children: ":" }), _jsx(Span, { className: "rounded bg-gray-900 dark:bg-slate-700 px-1.5 py-0.5 text-white", children: pad(countdown.s) })] }));
31
32
  }
32
- export function AuctionCard({ auction, labels = {}, onBid, className = "", }) {
33
+ export function AuctionCard({ auction, labels = {}, onBid, className = "", selectable = false, isSelected = false, onSelect, }) {
33
34
  const hasEnded = new Date(auction.auctionEndDate) <= new Date();
34
35
  const displayBid = auction.currentBid ?? auction.startingBid;
35
- return (_jsxs(Article, { className: `rounded-xl border border-gray-200 dark:border-slate-700 bg-white dark:bg-slate-900 overflow-hidden shadow-sm hover:shadow-md transition-shadow ${className}`, children: [auction.mainImage && (_jsxs(Div, { className: "aspect-square overflow-hidden relative", children: [_jsx(Div, { role: "img", "aria-label": auction.title, className: "h-full w-full bg-center bg-cover", style: { backgroundImage: `url(${auction.mainImage})` } }), _jsx(Span, { className: "absolute top-2 left-2 rounded-full bg-orange-500 px-2 py-0.5 text-xs font-bold text-white", children: "AUCTION" })] })), _jsxs(Div, { className: "p-4", children: [_jsx(Heading, { level: 3, className: `font-semibold text-gray-900 dark:text-zinc-100 text-sm leading-snug mb-2 ${THEME_CONSTANTS.utilities.textClamp2}`, children: auction.title }), _jsxs(Row, { justify: "between", className: "mb-2", children: [_jsxs(Div, { children: [_jsx(Text, { className: "text-xs text-gray-400 dark:text-zinc-500", children: labels.currentBid ?? "Current bid" }), _jsx(Text, { className: "text-base font-bold text-gray-900 dark:text-zinc-100", children: formatCurrency(displayBid, getDefaultCurrency()) })] }), _jsx(Div, { className: "text-right", children: _jsxs(Text, { className: "text-xs text-gray-400 dark:text-zinc-500", children: [auction.bidCount, " ", labels.bids ?? "bids"] }) })] }), _jsx(Div, { className: "mb-3", children: _jsx(AuctionCountdown, { endsAt: auction.auctionEndDate, labels: { ended: labels.ended } }) }), !hasEnded && onBid && (_jsx(Button, { type: "button", variant: "warning", onClick: () => onBid(auction), className: "w-full rounded-lg bg-orange-500 py-2 text-sm font-medium text-white hover:bg-orange-600 transition-colors", children: labels.placeBid ?? "Place Bid" }))] })] }));
36
+ const longPress = useLongPress(() => onSelect?.(auction.id, !isSelected));
37
+ return (_jsxs(Article, { className: `group relative rounded-xl border bg-white dark:bg-slate-900 overflow-hidden shadow-sm hover:shadow-md transition-shadow ${isSelected ? "border-primary outline outline-2 outline-primary" : "border-gray-200 dark:border-slate-700"} ${className}`, onMouseDown: onSelect && !isSelected ? longPress.onMouseDown : undefined, onMouseUp: onSelect && !isSelected ? longPress.onMouseUp : undefined, onMouseLeave: onSelect && !isSelected ? longPress.onMouseLeave : undefined, onTouchStart: onSelect && !isSelected ? longPress.onTouchStart : undefined, onTouchEnd: onSelect && !isSelected ? longPress.onTouchEnd : undefined, children: [onSelect && (_jsx(BaseListingCard.Checkbox, { selected: isSelected, onSelect: (e) => { e.preventDefault(); onSelect(auction.id, !isSelected); }, label: isSelected ? "Deselect auction" : "Select auction", position: "top-2 right-2", className: selectable || isSelected ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity" })), auction.mainImage && (_jsxs(Div, { className: "aspect-square overflow-hidden relative", children: [_jsx(Div, { role: "img", "aria-label": auction.title, className: "h-full w-full bg-center bg-cover", style: { backgroundImage: `url(${auction.mainImage})` } }), _jsx(Span, { className: "absolute top-2 left-2 rounded-full bg-orange-500 px-2 py-0.5 text-xs font-bold text-white", children: "AUCTION" })] })), _jsxs(Div, { className: "p-4", children: [_jsx(Heading, { level: 3, className: `font-semibold text-gray-900 dark:text-zinc-100 text-sm leading-snug mb-2 ${THEME_CONSTANTS.utilities.textClamp2}`, children: auction.title }), _jsxs(Row, { justify: "between", className: "mb-2", children: [_jsxs(Div, { children: [_jsx(Text, { className: "text-xs text-gray-400 dark:text-zinc-500", children: labels.currentBid ?? "Current bid" }), _jsx(Text, { className: "text-base font-bold text-gray-900 dark:text-zinc-100", children: formatCurrency(displayBid, getDefaultCurrency()) })] }), _jsx(Div, { className: "text-right", children: _jsxs(Text, { className: "text-xs text-gray-400 dark:text-zinc-500", children: [auction.bidCount, " ", labels.bids ?? "bids"] }) })] }), _jsx(Div, { className: "mb-3", children: _jsx(AuctionCountdown, { endsAt: auction.auctionEndDate, labels: { ended: labels.ended } }) }), !hasEnded && onBid && (_jsx(Button, { type: "button", variant: "warning", onClick: () => onBid(auction), className: "w-full rounded-lg bg-orange-500 py-2 text-sm font-medium text-white hover:bg-orange-600 transition-colors", children: labels.placeBid ?? "Place Bid" }))] })] }));
36
38
  }
@@ -133,7 +133,7 @@ export async function AuctionDetailPageView({ id, initialAuction, onPlaceBid, pr
133
133
  bidderId: String(b.userId ?? b.bidderId ?? ""),
134
134
  bidderName: (b.bidderName ?? b.userName),
135
135
  amount: (typeof b.bidAmount === "number" ? b.bidAmount : typeof b.amount === "number" ? b.amount : 0),
136
- placedAt: (b.createdAt ?? b.bidAt ?? ""),
136
+ placedAt: (b.bidDate ?? b.createdAt ?? b.bidAt ?? ""),
137
137
  }));
138
138
  return _jsx(CollapsibleBidHistory, { bids: bids, currency: currency });
139
139
  }, renderRelated: () => {
@@ -11,8 +11,8 @@ export interface MarketplaceAuctionCardData {
11
11
  url?: string;
12
12
  thumbnailUrl?: string;
13
13
  };
14
- /** Canonical discriminator (SB1-G Phase 4). */
15
- listingType?: "standard" | "auction" | "pre-order" | "prize-draw";
14
+ /** Canonical discriminator (SB1-G Phase 4 · SB-UNI-F 2026-05-13 union extension). */
15
+ listingType?: "standard" | "auction" | "pre-order" | "prize-draw" | "classified" | "digital-code" | "live";
16
16
  auctionEndDate?: string | Date;
17
17
  startingBid?: number;
18
18
  currentBid?: number;
@@ -20,12 +20,22 @@ export function PlaceBidFormClient({ productId, currentBid, startingBid, minBidI
20
20
  setSuccess(false);
21
21
  startTransition(async () => {
22
22
  try {
23
- await onPlaceBid({ productId, bidAmount: amount });
23
+ const result = await onPlaceBid({ productId, bidAmount: amount });
24
+ if (result &&
25
+ typeof result === "object" &&
26
+ "ok" in result &&
27
+ result.ok === false) {
28
+ const msg = result.error;
29
+ setError(msg || "Failed to place bid. Please try again.");
30
+ return;
31
+ }
24
32
  setSuccess(true);
25
33
  setBidAmount(String(amount + minBidIncrement));
26
34
  }
27
35
  catch (err) {
28
- setError(err instanceof Error ? err.message : "Failed to place bid. Please try again.");
36
+ setError(err instanceof Error && err.message
37
+ ? err.message
38
+ : "Failed to place bid. Please try again.");
29
39
  }
30
40
  });
31
41
  }
@@ -65,8 +65,8 @@ export declare const auctionItemSchema: z.ZodObject<{
65
65
  status: "draft" | "published" | "archived" | "sold";
66
66
  title: string;
67
67
  price: number;
68
- featured: boolean;
69
68
  listingType: "auction";
69
+ featured: boolean;
70
70
  slug: string;
71
71
  auctionEndDate: string;
72
72
  startingBid: number;
@@ -94,8 +94,8 @@ export declare const auctionItemSchema: z.ZodObject<{
94
94
  status: "draft" | "published" | "archived" | "sold";
95
95
  title: string;
96
96
  price: number;
97
- featured: boolean;
98
97
  listingType: "auction";
98
+ featured: boolean;
99
99
  slug: string;
100
100
  auctionEndDate: string;
101
101
  startingBid: number;
@@ -1,5 +1,6 @@
1
1
  export * from "./types";
2
2
  export * from "./schemas";
3
+ export * from "./role-predicates";
3
4
  export * from "./auth-helpers";
4
5
  export * from "./token-helpers";
5
6
  export * from "./hooks/useAuth";
@@ -1,5 +1,6 @@
1
1
  export * from "./types";
2
2
  export * from "./schemas";
3
+ export * from "./role-predicates";
3
4
  export * from "./auth-helpers";
4
5
  export * from "./token-helpers";
5
6
  export * from "./hooks/useAuth";
@@ -0,0 +1,16 @@
1
+ import type { UserRole } from "./types";
2
+ export declare const isAdminUser: (input?: {
3
+ role?: UserRole;
4
+ }) => boolean;
5
+ export declare const isSellerUser: (input?: {
6
+ role?: UserRole;
7
+ }) => boolean;
8
+ export declare const isModeratorUser: (input?: {
9
+ role?: UserRole;
10
+ }) => boolean;
11
+ export declare const isEmployeeUser: (input?: {
12
+ role?: UserRole;
13
+ }) => boolean;
14
+ export declare const isBuyerUser: (input?: {
15
+ role?: UserRole;
16
+ }) => boolean;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Canonical user-role predicates — mirror of the listing-type accessors in
3
+ * `features/products/utils/listing-type.ts`. Read the canonical role
4
+ * discriminator off an `AuthUser`/`UserDocument`-shaped object and return a
5
+ * boolean. Undefined input falls back to `"user"` so legacy payloads classify
6
+ * safely without a separate guard. SB-UNI-E 2026-05-13.
7
+ */
8
+ function normalizeRole(input) {
9
+ return input?.role ?? "user";
10
+ }
11
+ export const isAdminUser = (input) => normalizeRole(input) === "admin";
12
+ export const isSellerUser = (input) => normalizeRole(input) === "seller";
13
+ export const isModeratorUser = (input) => normalizeRole(input) === "moderator";
14
+ export const isEmployeeUser = (input) => normalizeRole(input) === "employee";
15
+ export const isBuyerUser = (input) => normalizeRole(input) === "user";
@@ -7,5 +7,8 @@ export interface BlogFeaturedCardProps {
7
7
  readTime?: string;
8
8
  };
9
9
  className?: string;
10
+ selectable?: boolean;
11
+ isSelected?: boolean;
12
+ onSelect?: (id: string, selected: boolean) => void;
10
13
  }
11
- export declare function BlogFeaturedCard({ post, href, labels, className, }: BlogFeaturedCardProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function BlogFeaturedCard({ post, href, labels, className, selectable, isSelected, onSelect, }: BlogFeaturedCardProps): import("react/jsx-runtime").JSX.Element;
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Article, Div, Heading, Row, Span, Text, TextLink } from "../../../ui";
2
+ import { Article, BaseListingCard, Div, Heading, Row, Span, Text, TextLink } from "../../../ui";
3
3
  import { THEME_CONSTANTS } from "../../../tokens";
4
4
  import { getMediaUrl } from "../../media/types/index";
5
5
  import { getDefaultLocale } from "../../../core/baseline-resolver";
6
6
  import { safeDisplayName } from "../../../security";
7
+ import { useLongPress } from "../../../react/hooks/useLongPress";
7
8
  const CATEGORY_BADGE = {
8
9
  news: "bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300",
9
10
  tips: "bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-300",
@@ -11,7 +12,8 @@ const CATEGORY_BADGE = {
11
12
  updates: "bg-purple-100 text-purple-800 dark:bg-purple-900/40 dark:text-purple-300",
12
13
  community: "bg-orange-100 text-orange-800 dark:bg-orange-900/40 dark:text-orange-300",
13
14
  };
14
- export function BlogFeaturedCard({ post, href, labels = {}, className = "", }) {
15
+ export function BlogFeaturedCard({ post, href, labels = {}, className = "", selectable = false, isSelected = false, onSelect, }) {
16
+ const longPress = useLongPress(() => onSelect?.(post.id, !isSelected));
15
17
  const safeTitle = post.title?.trim() || "Untitled post";
16
18
  const coverImageUrl = getMediaUrl(post.coverImage);
17
19
  const date = post.publishedAt
@@ -21,5 +23,5 @@ export function BlogFeaturedCard({ post, href, labels = {}, className = "", }) {
21
23
  day: "numeric",
22
24
  })
23
25
  : "";
24
- return (_jsx(TextLink, { href: href, className: "block h-full", children: _jsxs(Article, { className: `flex h-full flex-col overflow-hidden rounded-xl border border-neutral-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm hover:shadow-md transition-shadow duration-200 ${className}`, children: [_jsx(Div, { className: "aspect-video overflow-hidden flex-shrink-0", children: coverImageUrl ? (_jsx(Div, { role: "img", "aria-label": safeTitle, className: "h-full w-full bg-cover bg-center transition-transform duration-300 group-hover:scale-105", style: { backgroundImage: `url(${coverImageUrl})` } })) : (_jsx(Div, { role: "img", "aria-label": safeTitle, className: "h-full w-full bg-gradient-to-br from-zinc-200 via-zinc-100 to-zinc-300 dark:from-slate-800 dark:via-slate-700 dark:to-slate-900" })) }), _jsxs(Div, { className: "flex flex-1 flex-col p-4", children: [_jsxs(Row, { className: "gap-1.5 mb-2 flex-wrap", children: [_jsx(Span, { className: `inline-block px-2 py-0.5 rounded-full text-xs font-medium capitalize ${CATEGORY_BADGE[post.category] ?? "bg-zinc-100 text-zinc-700"}`, children: post.category }), post.isFeatured && (_jsx(Span, { className: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/40 dark:text-yellow-300 px-2 py-0.5 rounded-full text-xs font-medium", children: labels.featuredBadge ?? "Featured" }))] }), _jsx(Heading, { level: 3, className: `font-semibold text-neutral-900 dark:text-zinc-100 text-base leading-snug mb-1 ${THEME_CONSTANTS.utilities.textClamp2}`, children: safeTitle }), post.excerpt && (_jsx(Text, { className: `text-neutral-500 dark:text-zinc-400 text-sm ${THEME_CONSTANTS.utilities.textClamp2} mb-3`, children: post.excerpt })), _jsxs(Row, { className: "mt-auto gap-3 text-xs text-neutral-400 dark:text-zinc-500 flex-wrap", children: [post.authorName && (_jsx(Span, { children: safeDisplayName(post.authorName, "Author") })), post.readTimeMinutes != null && (_jsxs(Span, { children: [post.readTimeMinutes, " ", labels.readTime ?? "min read"] })), date && _jsx(Span, { children: date })] })] })] }) }));
26
+ return (_jsxs(Article, { className: `group relative flex h-full flex-col overflow-hidden rounded-xl border border-neutral-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm hover:shadow-md transition-shadow duration-200 ${isSelected ? "ring-2 ring-primary outline outline-2 outline-primary" : ""} ${className}`, onMouseDown: onSelect && !isSelected ? longPress.onMouseDown : undefined, onMouseUp: onSelect && !isSelected ? longPress.onMouseUp : undefined, onMouseLeave: onSelect && !isSelected ? longPress.onMouseLeave : undefined, onTouchStart: onSelect && !isSelected ? longPress.onTouchStart : undefined, onTouchEnd: onSelect && !isSelected ? longPress.onTouchEnd : undefined, children: [onSelect && (_jsx(BaseListingCard.Checkbox, { selected: isSelected, onSelect: (e) => { e.preventDefault(); onSelect(post.id, !isSelected); }, label: isSelected ? "Deselect post" : "Select post", position: "top-2 left-2", className: selectable || isSelected ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity" })), _jsxs(TextLink, { href: href, className: "flex h-full flex-col", children: [_jsx(Div, { className: "aspect-video overflow-hidden flex-shrink-0", children: coverImageUrl ? (_jsx(Div, { role: "img", "aria-label": safeTitle, className: "h-full w-full bg-cover bg-center transition-transform duration-300 group-hover:scale-105", style: { backgroundImage: `url(${coverImageUrl})` } })) : (_jsx(Div, { role: "img", "aria-label": safeTitle, className: "h-full w-full bg-gradient-to-br from-zinc-200 via-zinc-100 to-zinc-300 dark:from-slate-800 dark:via-slate-700 dark:to-slate-900" })) }), _jsxs(Div, { className: "flex flex-1 flex-col p-4", children: [_jsxs(Row, { className: "gap-1.5 mb-2 flex-wrap", children: [_jsx(Span, { className: `inline-block px-2 py-0.5 rounded-full text-xs font-medium capitalize ${CATEGORY_BADGE[post.category] ?? "bg-zinc-100 text-zinc-700"}`, children: post.category }), post.isFeatured && (_jsx(Span, { className: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/40 dark:text-yellow-300 px-2 py-0.5 rounded-full text-xs font-medium", children: labels.featuredBadge ?? "Featured" }))] }), _jsx(Heading, { level: 3, className: `font-semibold text-neutral-900 dark:text-zinc-100 text-base leading-snug mb-1 ${THEME_CONSTANTS.utilities.textClamp2}`, children: safeTitle }), post.excerpt && (_jsx(Text, { className: `text-neutral-500 dark:text-zinc-400 text-sm ${THEME_CONSTANTS.utilities.textClamp2} mb-3`, children: post.excerpt })), _jsxs(Row, { className: "mt-auto gap-3 text-xs text-neutral-400 dark:text-zinc-500 flex-wrap", children: [post.authorName && (_jsx(Span, { children: safeDisplayName(post.authorName, "Author") })), post.readTimeMinutes != null && (_jsxs(Span, { children: [post.readTimeMinutes, " ", labels.readTime ?? "min read"] })), date && _jsx(Span, { children: date })] })] })] })] }));
25
27
  }
@@ -14,3 +14,4 @@ export declare function mergeGuestCart(userId: string, items: Array<{
14
14
  quantity: number;
15
15
  }>): Promise<void>;
16
16
  export declare function getCart(userId: string): Promise<CartDocument | null>;
17
+ export declare function updateCartItemShipping(userId: string, itemId: string, providerId: string, feeInPaise: number): Promise<CartDocument>;
@@ -5,12 +5,20 @@
5
5
  * are handled by the calling server action in the consumer.
6
6
  */
7
7
  import { serverLogger } from "../../../monitoring";
8
+ import { ValidationError } from "../../../errors";
8
9
  import { cartRepository } from "../repository/cart.repository";
9
10
  import { productRepository } from "../../products/repository/products.repository";
10
11
  import { normalizeListingType } from "../../products/utils/listing-type";
11
12
  import { getDefaultCurrency } from "../../../core/baseline-resolver";
12
13
  export async function addItemToCart(userId, input) {
13
14
  serverLogger.debug("addItemToCart", { userId, productId: input.productId });
15
+ // SB-UNI-F 2026-05-13 — capability gate. Classified + live listings reject
16
+ // add-to-cart at the action layer. UI surfaces a chat-only / jurisdiction
17
+ // CTA for those types instead.
18
+ const { canAddToCart } = await import("../../../_internal/shared/listing-types/capabilities");
19
+ if (!canAddToCart(input.listingType)) {
20
+ throw new ValidationError(`Listings of type "${input.listingType}" cannot be added to the cart.`);
21
+ }
14
22
  return cartRepository.addItem(userId, input);
15
23
  }
16
24
  export async function updateCartItem(userId, itemId, input) {
@@ -51,3 +59,11 @@ export async function mergeGuestCart(userId, items) {
51
59
  export async function getCart(userId) {
52
60
  return cartRepository.findByUserId(userId);
53
61
  }
62
+ export async function updateCartItemShipping(userId, itemId, providerId, feeInPaise) {
63
+ if (!itemId || !providerId)
64
+ throw new ValidationError("itemId and providerId are required");
65
+ if (!Number.isFinite(feeInPaise) || feeInPaise < 0) {
66
+ throw new ValidationError("feeInPaise must be a non-negative number");
67
+ }
68
+ return cartRepository.updateItemShipping(userId, itemId, providerId, feeInPaise);
69
+ }
@@ -1,4 +1,15 @@
1
1
  import React from "react";
2
+ /** Minimal shape of a per-store/per-type order group surfaced to the slot. */
3
+ export interface CartOrderGroup {
4
+ /** Unique key for this group (e.g. `${storeId}:${orderType}`). */
5
+ key: string;
6
+ storeId: string;
7
+ storeName: string;
8
+ orderType: string;
9
+ items: unknown[];
10
+ subtotalInPaise: number;
11
+ shippingFeeInPaise: number;
12
+ }
2
13
  export interface CartViewProps {
3
14
  labels?: {
4
15
  title?: string;
@@ -6,6 +17,13 @@ export interface CartViewProps {
6
17
  checkoutButton?: string;
7
18
  };
8
19
  renderItems: (isLoading: boolean) => React.ReactNode;
20
+ /**
21
+ * When provided, replaces `renderItems` + `renderPromoCode` with a
22
+ * per-group tabbed breakdown. Each group shows its own subtotal + shipping.
23
+ */
24
+ renderGroups?: (groups: CartOrderGroup[], isLoading: boolean) => React.ReactNode;
25
+ /** Computed groups passed to `renderGroups`. Ignored when `renderGroups` is absent. */
26
+ groups?: CartOrderGroup[];
9
27
  renderSummary?: () => React.ReactNode;
10
28
  renderPromoCode?: () => React.ReactNode;
11
29
  renderCheckoutButton?: (onCheckout: () => void, isLoading: boolean) => React.ReactNode;
@@ -14,4 +32,4 @@ export interface CartViewProps {
14
32
  isLoading?: boolean;
15
33
  className?: string;
16
34
  }
17
- export declare function CartView({ labels, renderItems, renderSummary, renderPromoCode, renderCheckoutButton, renderEmpty, isEmpty, isLoading, className, }: CartViewProps): import("react/jsx-runtime").JSX.Element;
35
+ export declare function CartView({ labels, renderItems, renderGroups, groups, renderSummary, renderPromoCode, renderCheckoutButton, renderEmpty, isEmpty, isLoading, className, }: CartViewProps): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Div, Heading } from "../../../ui";
3
- export function CartView({ labels = {}, renderItems, renderSummary, renderPromoCode, renderCheckoutButton, renderEmpty, isEmpty = false, isLoading = false, className = "", }) {
3
+ export function CartView({ labels = {}, renderItems, renderGroups, groups = [], renderSummary, renderPromoCode, renderCheckoutButton, renderEmpty, isEmpty = false, isLoading = false, className = "", }) {
4
4
  if (isEmpty && renderEmpty)
5
5
  return _jsx(_Fragment, { children: renderEmpty() });
6
- return (_jsxs(Div, { className: className, children: [labels.title && (_jsx(Heading, { level: 1, className: "text-2xl font-bold mb-6", children: labels.title })), _jsxs(Div, { className: "flex flex-col gap-6 lg:flex-row lg:gap-8", children: [_jsxs(Div, { className: "flex-1", children: [renderItems(isLoading), renderPromoCode?.()] }), _jsxs(Div, { className: "w-full lg:w-80", children: [renderSummary?.(), renderCheckoutButton?.(() => { }, isLoading)] })] })] }));
6
+ return (_jsxs(Div, { className: className, children: [labels.title && (_jsx(Heading, { level: 1, className: "text-2xl font-bold mb-6", children: labels.title })), _jsxs(Div, { className: "flex flex-col gap-6 lg:flex-row lg:gap-8", children: [_jsxs(Div, { className: "flex-1", children: [renderGroups ? renderGroups(groups, isLoading) : renderItems(isLoading), !renderGroups && renderPromoCode?.(), renderGroups && renderPromoCode?.()] }), _jsxs(Div, { className: "w-full lg:w-80", children: [renderSummary?.(), renderCheckoutButton?.(() => { }, isLoading)] })] })] }));
7
7
  }
@@ -0,0 +1,13 @@
1
+ import type { ShippingProviderConfig } from "../../stores/schemas/firestore";
2
+ export interface ShippingPickerProps {
3
+ providers: ShippingProviderConfig[];
4
+ /** Currently persisted provider id (from CartItemDocument.chosenShippingProviderId). */
5
+ selectedProviderId?: string;
6
+ /** Order subtotal in paise — used to evaluate freeAboveInPaise + percentOfOrder rules. */
7
+ subtotalInPaise?: number;
8
+ /** Called when the buyer picks (or changes) a provider. */
9
+ onPickProvider: (providerId: string, feeInPaise: number) => void | Promise<void>;
10
+ isLoading?: boolean;
11
+ className?: string;
12
+ }
13
+ export declare function ShippingPicker({ providers, selectedProviderId, subtotalInPaise, onPickProvider, isLoading, className, }: ShippingPickerProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * ShippingPicker — buyer-facing shipping provider selector.
5
+ *
6
+ * Renders the store's configured shipping providers as a radio list.
7
+ * The selected provider's id + calculated fee are surfaced via the
8
+ * `onPickProvider` callback so the parent can persist them to the cart item.
9
+ */
10
+ import { useState } from "react";
11
+ import { Button, Div, Row, Stack, Text } from "../../../ui";
12
+ import { formatCurrency } from "../../../utils/number.formatter";
13
+ import { REFUND_COPY } from "../../../_internal/shared/features/orders/refund-copy";
14
+ /** Resolve the effective flat fee for a provider given the current subtotal. */
15
+ function resolveProviderFee(p, subtotalInPaise) {
16
+ const { fee } = p;
17
+ if (fee.freeAboveInPaise !== undefined && subtotalInPaise >= fee.freeAboveInPaise)
18
+ return 0;
19
+ let total = fee.flatInPaise ?? 0;
20
+ if (fee.percentOfOrder !== undefined) {
21
+ total += Math.round((fee.percentOfOrder / 100) * subtotalInPaise);
22
+ }
23
+ if (fee.minInPaise !== undefined)
24
+ total = Math.max(total, fee.minInPaise);
25
+ return total;
26
+ }
27
+ export function ShippingPicker({ providers, selectedProviderId, subtotalInPaise = 0, onPickProvider, isLoading = false, className = "", }) {
28
+ const [pending, setPending] = useState(false);
29
+ if (providers.length === 0) {
30
+ return (_jsx(Text, { size: "sm", color: "muted", className: className, children: REFUND_COPY.shipping.noOptions }));
31
+ }
32
+ const handleSelect = async (p) => {
33
+ const fee = resolveProviderFee(p, subtotalInPaise);
34
+ setPending(true);
35
+ try {
36
+ await onPickProvider(p.providerId, fee);
37
+ }
38
+ finally {
39
+ setPending(false);
40
+ }
41
+ };
42
+ return (_jsx(Stack, { gap: "xs", className: className, role: "radiogroup", "aria-label": "Shipping options", children: providers.map((p) => {
43
+ const fee = resolveProviderFee(p, subtotalInPaise);
44
+ const selected = p.providerId === selectedProviderId;
45
+ const disabled = isLoading || pending;
46
+ return (_jsx(Button, { type: "button", variant: selected ? "primary" : "outline", size: "sm", disabled: disabled, onClick: () => handleSelect(p), "aria-checked": selected, role: "radio", className: "w-full justify-start text-left", children: _jsxs(Row, { gap: "sm", className: "w-full flex-wrap", align: "center", children: [_jsxs(Div, { className: "flex-1", children: [_jsx(Text, { size: "sm", weight: selected ? "semibold" : "normal", children: p.label }), _jsx(Text, { size: "xs", color: "muted", children: REFUND_COPY.shipping.etaFormat(p.etaDaysMin, p.etaDaysMax) })] }), _jsx(Text, { size: "sm", weight: "semibold", children: fee === 0 ? REFUND_COPY.shipping.freeLabel : formatCurrency(fee / 100, "INR") })] }) }, p.providerId));
47
+ }) }));
48
+ }
@@ -1,6 +1,6 @@
1
1
  export { CartItemRow, CartDrawer } from "./CartDrawer";
2
2
  export { CartView } from "./CartView";
3
- export type { CartViewProps } from "./CartView";
3
+ export type { CartViewProps, CartOrderGroup } from "./CartView";
4
4
  export { CartSummary } from "./CartSummary";
5
5
  export type { CartSummaryProps } from "./CartSummary";
6
6
  export { CheckoutView } from "./CheckoutView";
@@ -11,3 +11,5 @@ export { CheckoutOtpModal } from "./CheckoutOtpModal";
11
11
  export type { CheckoutOtpModalProps } from "./CheckoutOtpModal";
12
12
  export { CheckoutSuccessView } from "./CheckoutSuccessView";
13
13
  export type { CheckoutSuccessViewProps } from "./CheckoutSuccessView";
14
+ export { ShippingPicker } from "./ShippingPicker";
15
+ export type { ShippingPickerProps } from "./ShippingPicker";
@@ -5,3 +5,4 @@ export { CheckoutView } from "./CheckoutView";
5
5
  export { CheckoutAddressStep } from "./CheckoutAddressStep";
6
6
  export { CheckoutOtpModal } from "./CheckoutOtpModal";
7
7
  export { CheckoutSuccessView } from "./CheckoutSuccessView";
8
+ export { ShippingPicker } from "./ShippingPicker";
@@ -16,5 +16,11 @@ export function useCartCount(enabled = false) {
16
16
  queryFn: () => apiClient.get(CART_ENDPOINTS.GET),
17
17
  enabled,
18
18
  });
19
- return data?.itemCount ?? guestCount;
19
+ // When authenticated, the server is authoritative — never mix in the guest
20
+ // count, otherwise stale localStorage entries leak into the badge after
21
+ // login (the cart-merge clears the local store but `useGuestCart`'s React
22
+ // state holds the pre-clear snapshot until remount).
23
+ if (enabled)
24
+ return data?.itemCount ?? 0;
25
+ return guestCount;
20
26
  }
@@ -16,6 +16,7 @@ export declare class CartRepository extends BaseRepository<CartDocument> {
16
16
  getSubtotal(cart: CartDocument): number;
17
17
  addCoupon(userId: string, coupon: CartAppliedCoupon): Promise<void>;
18
18
  removeCoupon(userId: string, code: string): Promise<void>;
19
+ updateItemShipping(userId: string, itemId: string, providerId: string, feeInPaise: number): Promise<CartDocument>;
19
20
  clearAllCoupons(userId: string): Promise<void>;
20
21
  setSelectedItems(userId: string, itemIds: string[] | null): Promise<void>;
21
22
  /**
@@ -84,6 +84,13 @@ export class CartRepository extends BaseRepository {
84
84
  ...(input.lockedPrice !== undefined && {
85
85
  lockedPrice: input.lockedPrice,
86
86
  }),
87
+ // SB-UNI-4 2026-05-13 — propagate bundle identifiers when present.
88
+ ...(input.bundleCategorySlug !== undefined && {
89
+ bundleCategorySlug: input.bundleCategorySlug,
90
+ }),
91
+ ...(input.bundleProductIds !== undefined && {
92
+ bundleProductIds: input.bundleProductIds,
93
+ }),
87
94
  addedAt: new Date(),
88
95
  updatedAt: new Date(),
89
96
  };
@@ -209,6 +216,34 @@ export class CartRepository extends BaseRepository {
209
216
  .doc(userId)
210
217
  .set({ appliedCoupons: updated, updatedAt: new Date() }, { merge: true });
211
218
  }
219
+ async updateItemShipping(userId, itemId, providerId, feeInPaise) {
220
+ try {
221
+ const cart = await this.findByUserId(userId);
222
+ if (!cart)
223
+ throw new NotFoundError("Cart not found");
224
+ const itemIndex = cart.items.findIndex((item) => item.itemId === itemId);
225
+ if (itemIndex < 0)
226
+ throw new NotFoundError("Cart item not found");
227
+ const items = [...cart.items];
228
+ items[itemIndex] = {
229
+ ...items[itemIndex],
230
+ chosenShippingProviderId: providerId,
231
+ chosenShippingFeeInPaise: feeInPaise,
232
+ updatedAt: new Date(),
233
+ };
234
+ const updatedCart = { ...cart, items, updatedAt: new Date() };
235
+ await this.db
236
+ .collection(this.collection)
237
+ .doc(userId)
238
+ .set(prepareForFirestore(updatedCart));
239
+ return updatedCart;
240
+ }
241
+ catch (error) {
242
+ if (error instanceof DatabaseError || error instanceof NotFoundError)
243
+ throw error;
244
+ throw new DatabaseError("Failed to update cart item shipping", error);
245
+ }
246
+ }
212
247
  async clearAllCoupons(userId) {
213
248
  await this.db
214
249
  .collection(this.collection)
@@ -21,12 +21,33 @@ export interface CartItemDocument {
21
21
  * carts) and cart-side UI badges. Replaces the legacy `isAuction`/`isPreOrder`
22
22
  * pair on the cart item.
23
23
  */
24
- listingType: "standard" | "auction" | "pre-order" | "prize-draw";
24
+ listingType: "standard" | "auction" | "pre-order" | "prize-draw" | "classified" | "digital-code" | "live";
25
25
  /** True when item was added from an accepted Make-an-Offer */
26
26
  isOffer?: boolean;
27
27
  offerId?: string;
28
28
  /** Locked offer price — overrides normal product price at checkout */
29
29
  lockedPrice?: number;
30
+ /**
31
+ * SB-UNI-4 2026-05-13 — bundle identifier when this cart line represents a
32
+ * bundle (categoryType:"bundle" row on the categories collection). When set,
33
+ * `productId` points at the bundle category's id, `price` is the locked
34
+ * bundlePriceInPaise, and `bundleProductIds` snapshots the member product
35
+ * ids at add-to-cart time. Order-side fan-out into per-product OrderItem
36
+ * entries lands in S-SBUNI-5 (checkout-side stock decrement + per-store
37
+ * grouping); until then the foundation is here but BundleDetailView keeps
38
+ * the "Add to cart coming soon" notice up.
39
+ */
40
+ bundleCategorySlug?: string;
41
+ /** Snapshot of `bundle.bundleProductIds` at add-to-cart time. */
42
+ bundleProductIds?: string[];
43
+ /**
44
+ * S-SBUNI-RULES 2026-05-13 — buyer's chosen shipping provider for this
45
+ * item, snapshotted at cart time. Locked at checkout; the per-tab
46
+ * ShippingPicker writes this when the buyer selects a provider.
47
+ */
48
+ chosenShippingProviderId?: string;
49
+ /** Fee in paise for the chosen provider, snapshotted at cart time. */
50
+ chosenShippingFeeInPaise?: number;
30
51
  addedAt: Date;
31
52
  updatedAt: Date;
32
53
  }
@@ -89,10 +110,14 @@ export type AddToCartInput = {
89
110
  /** Store slug (= storeId = store.id) */
90
111
  storeId: string;
91
112
  storeName: string;
92
- listingType: "standard" | "auction" | "pre-order" | "prize-draw";
113
+ listingType: "standard" | "auction" | "pre-order" | "prize-draw" | "classified" | "digital-code" | "live";
93
114
  isOffer?: boolean;
94
115
  offerId?: string;
95
116
  lockedPrice?: number;
117
+ /** SB-UNI-4 2026-05-13 — bundle identifier when the line is a bundle. */
118
+ bundleCategorySlug?: string;
119
+ /** Snapshot of bundle members at add-to-cart time. */
120
+ bundleProductIds?: string[];
96
121
  };
97
122
  export type UpdateCartItemInput = {
98
123
  quantity: number;
@@ -0,0 +1,16 @@
1
+ export interface BundleAddToCartCtaProps {
2
+ /** Bundle slug — `categories/{bundle-...}` row. */
3
+ bundleSlug: string;
4
+ /** True when bundleStockStatus === "out_of_stock". Renders disabled CTA. */
5
+ outOfStock?: boolean;
6
+ /**
7
+ * Server-action callback. Returning successfully marks the toast as success;
8
+ * any thrown error surfaces inline + as an error toast. Typed as a generic
9
+ * async fn so consumers can wrap the underlying action however they like.
10
+ */
11
+ onAddToCart: (input: {
12
+ bundleSlug: string;
13
+ quantity: number;
14
+ }) => Promise<unknown>;
15
+ }
16
+ export declare function BundleAddToCartCta({ bundleSlug, outOfStock, onAddToCart, }: BundleAddToCartCtaProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * BundleAddToCartCta — S-SBUNI-5 2026-05-13.
5
+ *
6
+ * Client island for the bundle detail page CTA. Replaces the "coming soon"
7
+ * disabled-CTA notice from S-SBUNI-3 + S-SBUNI-4 now that the cart-line
8
+ * foundation + per-member stock decrement at checkout are wired.
9
+ *
10
+ * Receives the bundle slug + an `onAddToCart` callback (typically the
11
+ * `addBundleToCartAction` server action from the consumer app). Renders
12
+ * a qty input + Add button + inline error / toast feedback.
13
+ *
14
+ * Out-of-stock bundles render a disabled button with `ctaOutOfStock` text.
15
+ */
16
+ import { useState, useCallback } from "react";
17
+ import { Button, Input, Row, Stack, Text } from "../../../ui";
18
+ import { useToast } from "../../../ui";
19
+ import { BUNDLE_COPY } from "../../../_internal/shared/features/categories/bundle-copy";
20
+ const MIN_QTY = 1;
21
+ const MAX_QTY = 10;
22
+ export function BundleAddToCartCta({ bundleSlug, outOfStock = false, onAddToCart, }) {
23
+ const { showToast } = useToast();
24
+ const [quantity, setQuantity] = useState(MIN_QTY);
25
+ const [submitting, setSubmitting] = useState(false);
26
+ const [error, setError] = useState(null);
27
+ const handleClick = useCallback(async () => {
28
+ setError(null);
29
+ setSubmitting(true);
30
+ try {
31
+ await onAddToCart({ bundleSlug, quantity });
32
+ showToast(BUNDLE_COPY.detail.ctaSuccess, "success");
33
+ }
34
+ catch (err) {
35
+ const message = err instanceof Error ? err.message : BUNDLE_COPY.detail.ctaErrorFallback;
36
+ setError(message);
37
+ showToast(message, "error");
38
+ }
39
+ finally {
40
+ setSubmitting(false);
41
+ }
42
+ }, [bundleSlug, quantity, onAddToCart, showToast]);
43
+ if (outOfStock) {
44
+ return (_jsxs(Stack, { gap: "xs", "aria-live": "polite", children: [_jsx(Button, { variant: "primary", disabled: true, "aria-disabled": true, children: BUNDLE_COPY.detail.ctaOutOfStock }), _jsx(Text, { size: "xs", color: "muted", children: BUNDLE_COPY.detail.ctaHint })] }));
45
+ }
46
+ return (_jsxs(Stack, { gap: "sm", children: [_jsxs(Row, { gap: "sm", align: "center", className: "flex-wrap", children: [_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "xs", color: "muted", children: BUNDLE_COPY.detail.qtyLabel }), _jsx(Input, { type: "number", inputMode: "numeric", min: MIN_QTY, max: MAX_QTY, step: 1, value: String(quantity), "aria-label": BUNDLE_COPY.detail.qtyAriaLabel, onChange: (e) => {
47
+ const next = Number(e.target.value);
48
+ if (Number.isFinite(next)) {
49
+ setQuantity(Math.min(Math.max(MIN_QTY, Math.floor(next)), MAX_QTY));
50
+ }
51
+ }, disabled: submitting, className: "w-20" })] }), _jsx(Button, { variant: "primary", onClick: handleClick, disabled: submitting, "aria-busy": submitting, children: submitting
52
+ ? BUNDLE_COPY.detail.ctaAdding
53
+ : BUNDLE_COPY.detail.ctaAddToCart })] }), error && (_jsx(Text, { size: "sm", color: "danger", role: "alert", children: error }))] }));
54
+ }
@@ -0,0 +1,8 @@
1
+ export interface BundleBuyNowCtaProps {
2
+ bundleSlug: string;
3
+ outOfStock?: boolean;
4
+ onBuyNow: (input: {
5
+ bundleSlug: string;
6
+ }) => Promise<unknown>;
7
+ }
8
+ export declare function BundleBuyNowCta({ bundleSlug, outOfStock, onBuyNow, }: BundleBuyNowCtaProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * BundleBuyNowCta — direct-checkout CTA for bundle detail pages.
5
+ *
6
+ * Replaces BundleAddToCartCta (deleted). Bundles bypass the cart and go
7
+ * straight to checkout via the `directBundleCheckoutAction` server action.
8
+ * No qty input — bundles are always qty=1 per checkout.
9
+ */
10
+ import { useState, useCallback } from "react";
11
+ import { Button, Stack, Text } from "../../../ui";
12
+ import { useToast } from "../../../ui";
13
+ import { BUNDLE_COPY } from "../../../_internal/shared/features/categories/bundle-copy";
14
+ export function BundleBuyNowCta({ bundleSlug, outOfStock = false, onBuyNow, }) {
15
+ const { showToast } = useToast();
16
+ const [submitting, setSubmitting] = useState(false);
17
+ const [error, setError] = useState(null);
18
+ const handleClick = useCallback(async () => {
19
+ setError(null);
20
+ setSubmitting(true);
21
+ try {
22
+ await onBuyNow({ bundleSlug });
23
+ }
24
+ catch (err) {
25
+ const message = err instanceof Error ? err.message : BUNDLE_COPY.detail.ctaErrorFallback;
26
+ setError(message);
27
+ showToast(message, "error");
28
+ }
29
+ finally {
30
+ setSubmitting(false);
31
+ }
32
+ }, [bundleSlug, onBuyNow, showToast]);
33
+ if (outOfStock) {
34
+ return (_jsxs(Stack, { gap: "xs", "aria-live": "polite", children: [_jsx(Button, { variant: "primary", disabled: true, "aria-disabled": true, children: BUNDLE_COPY.detail.ctaOutOfStock }), _jsx(Text, { size: "xs", color: "muted", children: BUNDLE_COPY.detail.ctaHint })] }));
35
+ }
36
+ return (_jsxs(Stack, { gap: "sm", children: [_jsx(Button, { variant: "primary", onClick: handleClick, disabled: submitting, "aria-busy": submitting, children: submitting ? BUNDLE_COPY.detail.ctaAdding : BUNDLE_COPY.detail.ctaBuyNow }), error && (_jsx(Text, { size: "sm", color: "danger", role: "alert", children: error }))] }));
37
+ }