@mohasinac/appkit 4.13.1 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +14 -5
  2. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
  3. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
  4. package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
  5. package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
  6. package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
  7. package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
  8. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
  9. package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
  10. package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
  11. package/dist/_internal/server/features/auctions/actions.js +8 -2
  12. package/dist/_internal/server/features/bundles/data.d.ts +16 -0
  13. package/dist/_internal/server/features/bundles/data.js +26 -0
  14. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  15. package/dist/_internal/server/features/bundles/index.js +1 -1
  16. package/dist/_internal/server/features/cart/service.d.ts +3 -3
  17. package/dist/_internal/server/features/checkout/actions.js +25 -0
  18. package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
  19. package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
  20. package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
  21. package/dist/_internal/server/features/checkout/source-context.js +157 -0
  22. package/dist/_internal/server/features/homepage/index.d.ts +0 -1
  23. package/dist/_internal/server/features/homepage/index.js +7 -1
  24. package/dist/_internal/server/features/lottery/adapters.js +4 -0
  25. package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
  26. package/dist/_internal/server/features/offers/adapters.js +88 -0
  27. package/dist/_internal/server/features/offers/index.d.ts +2 -0
  28. package/dist/_internal/server/features/offers/index.js +1 -0
  29. package/dist/_internal/server/features/orders/adapters.js +24 -0
  30. package/dist/_internal/server/features/products/data.js +15 -37
  31. package/dist/_internal/server/features/products/index.d.ts +1 -1
  32. package/dist/_internal/server/features/products/index.js +1 -1
  33. package/dist/_internal/server/features/products/list-public.d.ts +46 -20
  34. package/dist/_internal/server/features/products/list-public.js +266 -90
  35. package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
  36. package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
  37. package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
  38. package/dist/_internal/server/features/site-settings/adapters.js +75 -0
  39. package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
  40. package/dist/_internal/server/features/site-settings/index.js +1 -0
  41. package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
  42. package/dist/_internal/server/features/stores/adapters.js +91 -0
  43. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  44. package/dist/_internal/server/features/stores/index.js +1 -0
  45. package/dist/_internal/server/jobs/core/auctionSettlement.js +56 -2
  46. package/dist/_internal/server/jobs/core/offerExpiry.js +55 -19
  47. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
  48. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
  49. package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
  50. package/dist/_internal/server/jobs/handlers/messages.js +10 -0
  51. package/dist/_internal/shared/actions/action-registry.js +17 -1
  52. package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
  53. package/dist/_internal/shared/checkout/lanes.js +26 -0
  54. package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
  55. package/dist/_internal/shared/features/auctions/config.js +27 -0
  56. package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
  57. package/dist/_internal/shared/features/auctions/schema.js +13 -1
  58. package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
  59. package/dist/_internal/shared/features/cart/schema.d.ts +20 -15
  60. package/dist/_internal/shared/features/cart/schema.js +15 -0
  61. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
  62. package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
  63. package/dist/_internal/shared/features/emi/schedule.js +20 -5
  64. package/dist/_internal/shared/features/events/schema.d.ts +2 -2
  65. package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
  66. package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
  67. package/dist/_internal/shared/features/offers/config.d.ts +30 -0
  68. package/dist/_internal/shared/features/offers/config.js +59 -0
  69. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  70. package/dist/_internal/shared/features/products/schema.d.ts +30 -30
  71. package/dist/_internal/shared/features/products/to-product-item.js +6 -0
  72. package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
  73. package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
  74. package/dist/_internal/shared/features/site-settings/fees.js +39 -0
  75. package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
  76. package/dist/_internal/shared/features/site-settings/types.js +1 -0
  77. package/dist/_internal/shared/history/history.d.ts +88 -0
  78. package/dist/_internal/shared/history/history.js +198 -0
  79. package/dist/_internal/shared/history/index.d.ts +4 -0
  80. package/dist/_internal/shared/history/index.js +2 -0
  81. package/dist/_internal/shared/history/types.d.ts +61 -0
  82. package/dist/_internal/shared/history/types.js +6 -0
  83. package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
  84. package/dist/_internal/shared/listing-types/_registry.js +67 -0
  85. package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
  86. package/dist/_internal/shared/listing-types/art/config.js +5 -0
  87. package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
  88. package/dist/_internal/shared/listing-types/auction/config.js +21 -0
  89. package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
  90. package/dist/_internal/shared/listing-types/availability.js +104 -0
  91. package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
  92. package/dist/_internal/shared/listing-types/capabilities.js +12 -0
  93. package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
  94. package/dist/_internal/shared/listing-types/classified/config.js +5 -0
  95. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
  96. package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
  97. package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
  98. package/dist/_internal/shared/listing-types/live/config.js +5 -0
  99. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
  100. package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
  101. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
  102. package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
  103. package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
  104. package/dist/_internal/shared/listing-types/standard/config.js +5 -0
  105. package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
  106. package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
  107. package/dist/client.d.ts +20 -7
  108. package/dist/client.js +22 -4
  109. package/dist/constants/api-endpoints.d.ts +6 -0
  110. package/dist/constants/api-endpoints.js +2 -0
  111. package/dist/constants/field-names.d.ts +57 -8
  112. package/dist/constants/field-names.js +101 -8
  113. package/dist/constants/table-keys.d.ts +17 -0
  114. package/dist/constants/table-keys.js +17 -0
  115. package/dist/errors/error-codes.d.ts +13 -1
  116. package/dist/errors/error-codes.js +13 -1
  117. package/dist/errors/error-display-map.js +12 -3
  118. package/dist/errors/messages.d.ts +10 -2
  119. package/dist/errors/messages.js +10 -2
  120. package/dist/features/about/components/AboutView.d.ts +3 -0
  121. package/dist/features/about/components/AboutView.js +3 -2
  122. package/dist/features/about/components/PolicyPageView.d.ts +2 -1
  123. package/dist/features/about/components/PolicyPageView.js +61 -23
  124. package/dist/features/about/components/PublicProfileView.js +5 -0
  125. package/dist/features/about/schemas/firestore.d.ts +3 -0
  126. package/dist/features/account/components/UserBidsView.js +12 -4
  127. package/dist/features/account/components/UserOrdersView.js +7 -0
  128. package/dist/features/account/components/UserReturnsView.d.ts +3 -0
  129. package/dist/features/account/components/UserReturnsView.js +17 -1
  130. package/dist/features/account/components/index.d.ts +0 -2
  131. package/dist/features/account/components/index.js +0 -1
  132. package/dist/features/account/schemas/index.d.ts +2 -2
  133. package/dist/features/account/types/index.d.ts +21 -2
  134. package/dist/features/addresses/schemas/index.d.ts +4 -4
  135. package/dist/features/admin/components/AdminArtView.js +8 -3
  136. package/dist/features/admin/components/AdminAuditLogView.js +1 -0
  137. package/dist/features/admin/components/AdminBidsView.js +15 -2
  138. package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
  139. package/dist/features/admin/components/AdminClassifiedView.js +8 -3
  140. package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
  141. package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
  142. package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
  143. package/dist/features/admin/components/AdminLiveView.js +8 -3
  144. package/dist/features/admin/components/AdminNavEditorView.js +15 -5
  145. package/dist/features/admin/components/AdminNewsletterView.js +18 -2
  146. package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
  147. package/dist/features/admin/components/AdminOffersView.js +230 -0
  148. package/dist/features/admin/components/AdminOrdersView.js +10 -1
  149. package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
  150. package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
  151. package/dist/features/admin/components/AdminProductsView.js +16 -29
  152. package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
  153. package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
  154. package/dist/features/admin/components/AdminScammersView.js +3 -8
  155. package/dist/features/admin/components/AdminSectionsView.js +32 -23
  156. package/dist/features/admin/components/AdminSessionsView.js +17 -2
  157. package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
  158. package/dist/features/admin/components/AdminSiteView.js +6 -2
  159. package/dist/features/admin/components/AdminStickersView.js +8 -3
  160. package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
  161. package/dist/features/admin/components/index.d.ts +2 -0
  162. package/dist/features/admin/components/index.js +1 -0
  163. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
  164. package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
  165. package/dist/features/admin/constants/filter-tabs.d.ts +89 -0
  166. package/dist/features/admin/constants/filter-tabs.js +56 -0
  167. package/dist/features/admin/schemas/firestore.d.ts +122 -3
  168. package/dist/features/admin/schemas/firestore.js +1 -0
  169. package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
  170. package/dist/features/admin/schemas/homepage-section-form.js +68 -0
  171. package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
  172. package/dist/features/admin/schemas/nav-item-form.js +72 -0
  173. package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
  174. package/dist/features/auctions/actions/bid-actions.js +93 -20
  175. package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
  176. package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
  177. package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
  178. package/dist/features/auctions/components/AuctionsListView.js +5 -6
  179. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
  180. package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
  181. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
  182. package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
  183. package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
  184. package/dist/features/auctions/components/bid-detail-fields.js +103 -0
  185. package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
  186. package/dist/features/auctions/repository/bid.repository.js +23 -0
  187. package/dist/features/auctions/schemas/firestore.d.ts +17 -0
  188. package/dist/features/auctions/schemas/index.d.ts +12 -12
  189. package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
  190. package/dist/features/audit-log/schemas/firestore.js +7 -0
  191. package/dist/features/auth/permissions/constants.d.ts +1 -1
  192. package/dist/features/auth/permissions/constants.js +10 -1
  193. package/dist/features/blog/actions/blog-actions.d.ts +7 -7
  194. package/dist/features/blog/schemas/blog-form.d.ts +80 -0
  195. package/dist/features/blog/schemas/blog-form.js +100 -0
  196. package/dist/features/blog/schemas/index.d.ts +6 -6
  197. package/dist/features/cart/repository/cart.repository.js +1 -0
  198. package/dist/features/cart/schemas/firestore.d.ts +15 -0
  199. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  200. package/dist/features/categories/components/BrandDetailPageView.js +23 -40
  201. package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
  202. package/dist/features/categories/components/BrandDetailTabs.js +8 -12
  203. package/dist/features/categories/components/BundleCollage.js +1 -1
  204. package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
  205. package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
  206. package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
  207. package/dist/features/categories/components/CategoryProductsListing.js +11 -1
  208. package/dist/features/categories/components/ConcernCard.js +7 -1
  209. package/dist/features/categories/schemas/firestore.d.ts +13 -0
  210. package/dist/features/categories/schemas/index.d.ts +26 -26
  211. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
  212. package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
  213. package/dist/features/events/components/AdminEventEditorView.js +32 -54
  214. package/dist/features/events/components/AdminEventEntriesView.js +22 -3
  215. package/dist/features/events/components/AdminEventsView.js +15 -11
  216. package/dist/features/events/components/EventFilters.d.ts +9 -1
  217. package/dist/features/events/components/EventFilters.js +45 -21
  218. package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
  219. package/dist/features/events/components/EventsIndexListing.js +2 -2
  220. package/dist/features/events/components/EventsListPageView.js +13 -4
  221. package/dist/features/events/repository/events.repository.d.ts +17 -0
  222. package/dist/features/events/repository/events.repository.js +27 -0
  223. package/dist/features/events/schemas/event-form.d.ts +113 -0
  224. package/dist/features/events/schemas/event-form.js +82 -0
  225. package/dist/features/events/schemas/firestore.d.ts +12 -0
  226. package/dist/features/events/schemas/firestore.js +12 -0
  227. package/dist/features/events/schemas/index.d.ts +50 -50
  228. package/dist/features/events/types/index.d.ts +11 -0
  229. package/dist/features/events/types/index.js +57 -1
  230. package/dist/features/faq/actions/faq-actions.d.ts +12 -12
  231. package/dist/features/faq/schemas/index.d.ts +8 -8
  232. package/dist/features/filters/FilterFacetSection.d.ts +7 -1
  233. package/dist/features/filters/FilterFacetSection.js +11 -3
  234. package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
  235. package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
  236. package/dist/features/grouped/schemas/index.d.ts +4 -4
  237. package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
  238. package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
  239. package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
  240. package/dist/features/homepage/components/AnnouncementBar.js +3 -3
  241. package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
  242. package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
  243. package/dist/features/homepage/hooks/homepage-query.js +45 -0
  244. package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
  245. package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
  246. package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
  247. package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
  248. package/dist/features/homepage/schemas/index.d.ts +33 -2
  249. package/dist/features/homepage/schemas/index.js +24 -0
  250. package/dist/features/layout/AppLayoutShell.d.ts +11 -1
  251. package/dist/features/layout/AppLayoutShell.js +15 -14
  252. package/dist/features/layout/BackToTop.d.ts +9 -0
  253. package/dist/features/layout/BackToTop.js +10 -1
  254. package/dist/features/layout/BottomActions.js +28 -25
  255. package/dist/features/layout/BottomChrome.d.ts +34 -0
  256. package/dist/features/layout/BottomChrome.js +55 -0
  257. package/dist/features/layout/BottomNavLayout.d.ts +6 -0
  258. package/dist/features/layout/BottomNavLayout.js +7 -1
  259. package/dist/features/layout/BottomNavbar.js +15 -2
  260. package/dist/features/layout/FooterLayout.js +11 -1
  261. package/dist/features/layout/NavbarLayout.js +1 -1
  262. package/dist/features/layout/TitleBarLayout.d.ts +7 -0
  263. package/dist/features/layout/TitleBarLayout.js +28 -5
  264. package/dist/features/layout/index.d.ts +2 -0
  265. package/dist/features/layout/index.js +1 -0
  266. package/dist/features/lottery/types/index.d.ts +3 -0
  267. package/dist/features/media/MediaPickerModal.js +5 -1
  268. package/dist/features/messages/schemas/index.d.ts +2 -2
  269. package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
  270. package/dist/features/orders/components/OrderScopeTabs.js +31 -0
  271. package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
  272. package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
  273. package/dist/features/orders/constants/order-scope.d.ts +48 -0
  274. package/dist/features/orders/constants/order-scope.js +111 -0
  275. package/dist/features/orders/repository/orders.repository.d.ts +54 -7
  276. package/dist/features/orders/repository/orders.repository.js +121 -22
  277. package/dist/features/orders/schemas/firestore.d.ts +152 -0
  278. package/dist/features/orders/schemas/firestore.js +30 -0
  279. package/dist/features/orders/schemas/index.d.ts +18 -18
  280. package/dist/features/orders/types/index.d.ts +35 -7
  281. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
  282. package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
  283. package/dist/features/pre-orders/schemas/index.d.ts +1 -1
  284. package/dist/features/products/actions/product-actions.d.ts +14 -0
  285. package/dist/features/products/actions/product-actions.js +49 -11
  286. package/dist/features/products/api/route.d.ts +12 -0
  287. package/dist/features/products/api/route.js +42 -100
  288. package/dist/features/products/components/ArtStickersListView.js +2 -2
  289. package/dist/features/products/components/AuctionsIndexListing.js +13 -11
  290. package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
  291. package/dist/features/products/components/AvailabilityTabs.js +47 -0
  292. package/dist/features/products/components/GroupSettingsPanel.js +5 -1
  293. package/dist/features/products/components/MakeOfferButton.js +48 -49
  294. package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
  295. package/dist/features/products/components/PrizeDrawCollage.js +9 -1
  296. package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
  297. package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
  298. package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
  299. package/dist/features/products/components/PrizeDrawsSection.js +23 -18
  300. package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
  301. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  302. package/dist/features/products/components/ProductForm.js +5 -2
  303. package/dist/features/products/components/ProductGrid.js +6 -1
  304. package/dist/features/products/components/ProductsIndexListing.js +22 -32
  305. package/dist/features/products/components/ProductsIndexPageView.js +6 -9
  306. package/dist/features/products/components/index.d.ts +2 -2
  307. package/dist/features/products/components/index.js +1 -1
  308. package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
  309. package/dist/features/products/config/listing-type-listing-config.js +22 -10
  310. package/dist/features/products/constants/action-defs.d.ts +2 -0
  311. package/dist/features/products/constants/action-defs.js +6 -0
  312. package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
  313. package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
  314. package/dist/features/products/hooks/useProducts.d.ts +5 -0
  315. package/dist/features/products/hooks/useProducts.js +13 -2
  316. package/dist/features/products/repository/products.repository.d.ts +31 -2
  317. package/dist/features/products/repository/products.repository.js +53 -21
  318. package/dist/features/products/schemas/firestore.d.ts +17 -3
  319. package/dist/features/products/schemas/firestore.js +7 -2
  320. package/dist/features/products/schemas/index.d.ts +64 -64
  321. package/dist/features/products/schemas/product-features.validators.d.ts +79 -6
  322. package/dist/features/products/schemas/product-features.validators.js +63 -0
  323. package/dist/features/products/types/index.d.ts +16 -1
  324. package/dist/features/promotions/schemas/index.d.ts +2 -2
  325. package/dist/features/reviews/schemas/index.d.ts +16 -16
  326. package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
  327. package/dist/features/scams/constants/scammer-status-display.js +79 -0
  328. package/dist/features/search/schemas/index.d.ts +4 -4
  329. package/dist/features/seller/actions/offer-actions.js +57 -4
  330. package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
  331. package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
  332. package/dist/features/seller/components/SellerArtView.js +5 -0
  333. package/dist/features/seller/components/SellerAuctionsView.js +13 -15
  334. package/dist/features/seller/components/SellerBidsView.js +11 -4
  335. package/dist/features/seller/components/SellerClassifiedView.js +5 -0
  336. package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
  337. package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
  338. package/dist/features/seller/components/SellerLiveView.js +5 -0
  339. package/dist/features/seller/components/SellerOffersView.js +2 -1
  340. package/dist/features/seller/components/SellerOrdersView.js +31 -9
  341. package/dist/features/seller/components/SellerPayoutSettingsView.js +56 -31
  342. package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
  343. package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
  344. package/dist/features/seller/components/SellerProductShell.js +7 -1
  345. package/dist/features/seller/components/SellerProductsView.js +11 -8
  346. package/dist/features/seller/components/SellerStickersView.js +5 -0
  347. package/dist/features/seller/components/index.d.ts +0 -2
  348. package/dist/features/seller/components/index.js +0 -1
  349. package/dist/features/seller/repository/offer.repository.d.ts +142 -24
  350. package/dist/features/seller/repository/offer.repository.js +165 -26
  351. package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
  352. package/dist/features/seller/schemas/coupon-form.js +116 -0
  353. package/dist/features/seller/schemas/firestore.d.ts +56 -2
  354. package/dist/features/seller/schemas/firestore.js +27 -0
  355. package/dist/features/seller/schemas/index.d.ts +2 -2
  356. package/dist/features/seller/schemas/offer-forms.d.ts +46 -0
  357. package/dist/features/seller/schemas/offer-forms.js +42 -0
  358. package/dist/features/seller/server.d.ts +0 -1
  359. package/dist/features/seller/server.js +0 -1
  360. package/dist/features/shell/SectionForm.d.ts +99 -0
  361. package/dist/features/shell/SectionForm.js +128 -0
  362. package/dist/features/shell/build-sections.d.ts +63 -0
  363. package/dist/features/shell/build-sections.js +207 -0
  364. package/dist/features/shell/entity-form.d.ts +109 -0
  365. package/dist/features/shell/entity-form.js +96 -0
  366. package/dist/features/shell/field-ui-meta.d.ts +115 -0
  367. package/dist/features/shell/field-ui-meta.js +324 -0
  368. package/dist/features/shell/index.d.ts +8 -0
  369. package/dist/features/shell/index.js +4 -0
  370. package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
  371. package/dist/features/status-history/components/StatusTimeline.js +46 -0
  372. package/dist/features/status-history/index.d.ts +11 -0
  373. package/dist/features/status-history/index.js +10 -0
  374. package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
  375. package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
  376. package/dist/features/store-extensions/index.d.ts +12 -0
  377. package/dist/features/store-extensions/index.js +12 -0
  378. package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
  379. package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
  380. package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
  381. package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
  382. package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
  383. package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
  384. package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
  385. package/dist/features/store-extensions/schemas/firestore.js +60 -0
  386. package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
  387. package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
  388. package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
  389. package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
  390. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
  391. package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
  392. package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
  393. package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
  394. package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
  395. package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
  396. package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
  397. package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
  398. package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
  399. package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
  400. package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
  401. package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
  402. package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
  403. package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
  404. package/dist/features/stores/api/[storeSlug]/route.js +2 -25
  405. package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
  406. package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
  407. package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
  408. package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
  409. package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
  410. package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
  411. package/dist/features/stores/components/StoreProductsListing.js +11 -1
  412. package/dist/features/stores/repository/store.repository.js +6 -0
  413. package/dist/features/stores/schemas/index.d.ts +6 -6
  414. package/dist/features/support/schemas/index.d.ts +4 -4
  415. package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
  416. package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
  417. package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
  418. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +431 -1
  419. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
  420. package/dist/index.d.ts +25 -12
  421. package/dist/index.js +26 -11
  422. package/dist/next/routing/route-map.d.ts +23 -3
  423. package/dist/next/routing/route-map.js +14 -2
  424. package/dist/providers/db-firebase/base.repository.d.ts +30 -0
  425. package/dist/providers/db-firebase/base.repository.js +50 -1
  426. package/dist/providers/db-firebase/index.d.ts +1 -1
  427. package/dist/providers/db-firebase/index.js +1 -1
  428. package/dist/providers/db-firebase/sieve.d.ts +25 -0
  429. package/dist/providers/db-firebase/sieve.js +52 -18
  430. package/dist/react/hooks/useUrlTable.js +10 -1
  431. package/dist/schemas/firestore-value.d.ts +8 -0
  432. package/dist/schemas/firestore-value.js +44 -0
  433. package/dist/schemas/index.d.ts +1 -1
  434. package/dist/schemas/index.js +1 -1
  435. package/dist/schemas/registry.d.ts +702 -69
  436. package/dist/schemas/registry.js +64 -1
  437. package/dist/seed/_helpers/category-forest.d.ts +2 -0
  438. package/dist/seed/_helpers/category-forest.js +309 -0
  439. package/dist/seed/_helpers/category-tree.d.ts +27 -0
  440. package/dist/seed/_helpers/category-tree.js +103 -0
  441. package/dist/seed/bids-seed-data.js +30 -0
  442. package/dist/seed/catalogue-seed-data.js +12 -12
  443. package/dist/seed/categories-seed-data.js +177 -162
  444. package/dist/seed/events-seed-data.js +61 -10
  445. package/dist/seed/homepage-sections-seed-data.js +5 -1
  446. package/dist/seed/offers-seed-data.js +244 -34
  447. package/dist/seed/orders-seed-data.js +336 -1
  448. package/dist/seed/products-art-seed-data.js +50 -12
  449. package/dist/seed/products-auctions-seed-data.js +138 -18
  450. package/dist/seed/products-classifieds-seed-data.js +80 -16
  451. package/dist/seed/products-digital-codes-seed-data.js +66 -18
  452. package/dist/seed/products-live-items-seed-data.js +64 -13
  453. package/dist/seed/products-preorders-seed-data.d.ts +0 -1
  454. package/dist/seed/products-preorders-seed-data.js +52 -13
  455. package/dist/seed/products-prize-draws-seed-data.js +63 -14
  456. package/dist/seed/products-standard-seed-data.js +99 -26
  457. package/dist/seed/products-stickers-seed-data.js +47 -12
  458. package/dist/seed/reviews-seed-data.js +6 -1
  459. package/dist/seed/site-settings-seed-data.d.ts +1 -38
  460. package/dist/seed/site-settings-seed-data.js +38 -76
  461. package/dist/seed/stores-seed-data.js +71 -1
  462. package/dist/seed/users-seed-data.js +15 -5
  463. package/dist/server-entry.d.ts +1 -2
  464. package/dist/server-entry.js +4 -3
  465. package/dist/server.d.ts +6 -3
  466. package/dist/server.js +13 -4
  467. package/dist/styles.css +78 -12
  468. package/dist/tailwind-utilities.css +1 -1
  469. package/dist/ui/components/Button.style.css +19 -4
  470. package/dist/ui/components/CollapsibleSection.d.ts +17 -1
  471. package/dist/ui/components/CollapsibleSection.js +6 -2
  472. package/dist/ui/components/FilterChipGroup.d.ts +25 -1
  473. package/dist/ui/components/FilterChipGroup.js +21 -4
  474. package/dist/ui/components/HandMode.style.css +47 -0
  475. package/dist/ui/components/Layout.d.ts +9 -2
  476. package/dist/ui/components/Layout.js +1 -1
  477. package/dist/ui/components/ListingLayout.js +8 -8
  478. package/dist/ui/components/ListingLayout.style.css +8 -7
  479. package/dist/ui/components/RecordDetailModal.d.ts +10 -1
  480. package/dist/ui/components/RecordDetailModal.js +2 -2
  481. package/dist/ui/components/StickyToolbar.d.ts +3 -1
  482. package/dist/ui/components/StickyToolbar.js +62 -20
  483. package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
  484. package/dist/ui/components/bottom-chrome-slot.js +29 -0
  485. package/dist/ui/components/index.style.css +3 -0
  486. package/dist/ui/forms/FormShell.d.ts +43 -13
  487. package/dist/ui/forms/FormShell.js +22 -11
  488. package/dist/ui/forms/index.d.ts +1 -1
  489. package/dist/ui/index.d.ts +1 -1
  490. package/package.json +2 -1
  491. package/scripts/node-esm-loader.mjs +65 -0
  492. package/scripts/seed-cli-loader.mjs +6 -49
  493. package/scripts/seed-cli.mjs +1 -1
@@ -7,28 +7,25 @@ import { PRODUCT_FIELDS } from "../../../constants/field-names";
7
7
  import { TABLE_KEYS } from "../../../constants/table-keys";
8
8
  import { sortBy } from "../../../constants/sort";
9
9
  import { GENERIC_PRODUCT_LISTING_TYPES } from "../constants/listing-tabs";
10
- import { listPublicProducts, parsePublicProductParams, defaultTogglesForListingTypes, } from "../../../_internal/server/features/products/list-public";
10
+ import { listPublicProducts, parsePublicProductParams, defaultAvailabilityForListingTypes, } from "../../../_internal/server/features/products/list-public";
11
11
  import { parseSelectedListingTypes } from "../utils/listing-type";
12
12
  const DEFAULT_PAGE_SIZE = 24;
13
13
  const DEFAULT_SORT = sortBy(PRODUCT_FIELDS.CREATED_AT);
14
14
  export async function ProductsIndexPageView({ searchParams = {} }) {
15
- // The "Show sold" / "Show ended" defaults depend on WHICH types are in play,
16
- // and this page now spans all nine. Both sides derive them from the same
17
- // helper — a hardcoded `hideSoldByDefault: true` here would disagree with
18
- // the client the moment the user ticks Auctions, and `staleTime: Infinity`
19
- // would freeze that disagreement (Root Cause #30).
15
+ // The availability scope is derived from the same helper the client reads
16
+ // its default from — a hardcoded default here would disagree with the
17
+ // client, and `staleTime: Infinity` would freeze that disagreement
18
+ // (Root Cause #30).
20
19
  const raw = searchParams[TABLE_KEYS.LISTING_TYPE];
21
20
  const selectedTypes = parseSelectedListingTypes(Array.isArray(raw) ? raw[0] : raw);
22
21
  const effectiveTypes = selectedTypes.length > 0 ? selectedTypes : GENERIC_PRODUCT_LISTING_TYPES;
23
- const { hideSoldByDefault, hideEndedByDefault } = defaultTogglesForListingTypes(effectiveTypes);
24
22
  // See ArtStickersListView — one shared filter implementation with
25
23
  // /api/products, so SSR and the client refetch agree by construction.
26
24
  const products = await listPublicProducts(parsePublicProductParams(searchParams, {
27
25
  listingTypes: GENERIC_PRODUCT_LISTING_TYPES,
28
26
  pageSize: DEFAULT_PAGE_SIZE,
29
27
  sorts: DEFAULT_SORT,
30
- hideSoldByDefault,
31
- hideEndedByDefault,
28
+ ...defaultAvailabilityForListingTypes(effectiveTypes),
32
29
  }));
33
30
  return (_jsxs(Main, { children: [_jsx(Section, { border: "bottom-subtle", paddingY: "b-md", padding: "t-xl", children: _jsxs(Container, { size: "xl", children: [_jsx(Heading, { level: 1, size: "3xl", weight: "bold", color: "primary", children: "Products" }), _jsx(Text, { className: "mt-1", color: "muted", size: "sm", children: "Discover amazing products and deals" }), _jsx(Div, { className: "mt-3", children: _jsx(TextLink, { variant: "bare", href: String(ROUTES.PUBLIC.AUCTIONS), rounded: "full", paddingX: "sm", paddingY: "2xs", size: "xs", weight: "medium", layout: "inline-flex", align: "center", gap: "sm", className: "border border-primary/30 bg-primary/10 text-primary-700 dark:text-primary-400 hover:bg-primary/15 transition-colors", children: "\uD83C\uDFF7\uFE0F Looking for unique deals? Browse Auctions \u2192" }) })] }) }), _jsxs(Container, { size: "xl", padding: "x-md", children: [_jsx(AdSlot, { id: "listing-sidebar-top", className: "mb-4 mt-4" }), _jsx(ProductsIndexListing, { initialData: products }), _jsx(AdSlot, { id: "listing-sidebar-bottom", className: "mt-8" })] })] }));
34
31
  }
@@ -21,6 +21,8 @@ export { MarketplaceBundleCard } from "./MarketplaceBundleCard";
21
21
  export type { MarketplaceBundleCardProps, MarketplaceBundleCardData, MarketplaceBundleCardLabels, } from "./MarketplaceBundleCard";
22
22
  export { PrizeDrawsIndexListing } from "./PrizeDrawsIndexListing";
23
23
  export type { PrizeDrawsIndexListingProps } from "./PrizeDrawsIndexListing";
24
+ export { AvailabilityTabs } from "./AvailabilityTabs";
25
+ export type { AvailabilityTabsProps } from "./AvailabilityTabs";
24
26
  export { PrizeDrawEntryActions } from "./PrizeDrawEntryActions";
25
27
  export type { PrizeDrawEntryActionsProps } from "./PrizeDrawEntryActions";
26
28
  export { ProductFeaturesSelector } from "./ProductFeaturesSelector";
@@ -46,8 +48,6 @@ export { BidHistory } from "./BidHistory";
46
48
  export type { BidHistoryProps, BidHistoryEntry } from "./BidHistory";
47
49
  export { PlaceBidForm } from "./PlaceBidForm";
48
50
  export type { PlaceBidFormProps } from "./PlaceBidForm";
49
- export { MakeOfferForm } from "./MakeOfferForm";
50
- export type { MakeOfferFormProps } from "./MakeOfferForm";
51
51
  export { MakeOfferButton } from "./MakeOfferButton";
52
52
  export type { MakeOfferButtonProps } from "./MakeOfferButton";
53
53
  export { RelatedProducts } from "./RelatedProducts";
@@ -10,6 +10,7 @@ export { PrizeDrawWinnerMappingView } from "./PrizeDrawWinnerMappingView";
10
10
  export { MarketplacePrizeDrawCard } from "./MarketplacePrizeDrawCard";
11
11
  export { MarketplaceBundleCard } from "./MarketplaceBundleCard";
12
12
  export { PrizeDrawsIndexListing } from "./PrizeDrawsIndexListing";
13
+ export { AvailabilityTabs } from "./AvailabilityTabs";
13
14
  // PrizeDrawsListingView + PrizeDrawDetailPageView are server components that
14
15
  // import productRepository (→ firebase-admin). Re-exporting them from this
15
16
  // client-mixed barrel pulls firebase-admin into client bundles via webpack/
@@ -28,7 +29,6 @@ export { ProductInfo } from "./ProductInfo";
28
29
  export { ProductTabs } from "./ProductTabs";
29
30
  export { BidHistory } from "./BidHistory";
30
31
  export { PlaceBidForm } from "./PlaceBidForm";
31
- export { MakeOfferForm } from "./MakeOfferForm";
32
32
  export { MakeOfferButton } from "./MakeOfferButton";
33
33
  export { RelatedProducts } from "./RelatedProducts";
34
34
  export { ProductGalleryClient } from "./ProductGalleryClient";
@@ -1,4 +1,5 @@
1
1
  import type { JsonArray } from "../../../schemas/types";
2
+ import type { AvailabilityScope } from "../hooks/useAvailabilityScope";
2
3
  import type { ListingType } from "../types";
3
4
  import type { ListingViewConfig } from "../../admin/components/DataListingView";
4
5
  export interface ListingTypeListingRow {
@@ -10,14 +11,33 @@ export interface ListingTypeListingRow {
10
11
  image?: string;
11
12
  }
12
13
  interface ListingTypeListingResponse {
14
+ /** Admin route shape. */
13
15
  items?: JsonArray;
14
16
  total?: number;
17
+ /** Seller route shape. */
18
+ products?: JsonArray;
19
+ meta?: {
20
+ total?: number;
21
+ };
15
22
  }
16
23
  export interface BuildListingTypeListingOptions {
17
24
  /** Override the page heading; defaults to the type's registered plural label. */
18
25
  title?: string;
19
26
  searchPlaceholder?: string;
20
27
  emptyLabel?: string;
28
+ /**
29
+ * Which dashboard this config is for. `"seller"` swaps the endpoint and the
30
+ * row href for the store-scoped equivalents; the store identity itself is
31
+ * resolved server-side from the session, never passed here.
32
+ */
33
+ portal?: "admin" | "seller";
34
+ /**
35
+ * The availability scope, from `useAvailabilityScope(...)` in the calling
36
+ * component. Passed in rather than called here because this is a plain
37
+ * factory function, not a component — a hook call would break the rules of
38
+ * hooks the moment a caller invoked it conditionally.
39
+ */
40
+ scope?: AvailabilityScope;
21
41
  }
22
42
  /**
23
43
  * Admin browse config for one listing type.
@@ -25,7 +25,7 @@
25
25
  import { SIEVE_OP, sieveAnd, sieveFilter } from "../../../utils/sieve-builder";
26
26
  import { sortBy } from "../../../constants/sort";
27
27
  import { PRODUCT_FIELDS } from "../../../constants/field-names";
28
- import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints";
28
+ import { ADMIN_ENDPOINTS, SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
29
29
  import { ROUTES } from "../../../next/routing/route-map";
30
30
  import { pluginFor } from "../../../_internal/shared/listing-types/_registry";
31
31
  import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
@@ -40,19 +40,23 @@ import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../..
40
40
  export function buildListingTypeListingConfig(type, opts = {}) {
41
41
  const plugin = pluginFor(type);
42
42
  const label = opts.title ?? plugin.pluralLabel;
43
+ const portal = opts.portal ?? "admin";
44
+ const isSeller = portal === "seller";
43
45
  return {
44
- portal: "admin",
46
+ portal,
45
47
  title: label,
46
48
  searchPlaceholder: opts.searchPlaceholder ?? `Search ${label.toLowerCase()} by name or seller`,
47
49
  emptyLabel: opts.emptyLabel ?? `No ${label.toLowerCase()} listings`,
48
50
  filterKeys: ["status"],
49
51
  defaultSort: sortBy(PRODUCT_FIELDS.CREATED_AT),
50
- // Keyed on the canonical type so two types can never share a cache entry.
51
- queryKey: ["admin", "listing-type", type],
52
- endpoint: ADMIN_ENDPOINTS.PRODUCTS,
52
+ // Keyed on the canonical type AND the portal so an admin's all-stores list
53
+ // and a seller's own-store list can never share a cache entry.
54
+ queryKey: [portal, "listing-type", type],
55
+ endpoint: isSeller ? SELLER_ENDPOINTS.PRODUCTS : ADMIN_ENDPOINTS.PRODUCTS,
53
56
  // The type's own sort set, not a copy-pasted three-option array.
54
57
  sortOptions: [...plugin.sortOptions],
55
- mapRows: (response) => toRecordArray(response.items).map((item, index) => ({
58
+ // The seller route returns `{ products }`, the admin route `{ items }`.
59
+ mapRows: (response) => toRecordArray(response.items ?? response.products).map((item, index) => ({
56
60
  id: toStringValue(item.id, `${type}-${index}`),
57
61
  primary: toStringValue(item.title ?? item.productTitle, "Untitled listing"),
58
62
  secondary: [
@@ -63,12 +67,20 @@ export function buildListingTypeListingConfig(type, opts = {}) {
63
67
  updatedAt: toRelativeDate(item.updatedAt ?? item.createdAt),
64
68
  image: toStringValue(item.mainImage, "") || undefined,
65
69
  })),
66
- getTotal: (response, mappedRows) => typeof response.total === "number" ? response.total : mappedRows.length,
70
+ getTotal: (response, mappedRows) => typeof response.total === "number"
71
+ ? response.total
72
+ : typeof response.meta?.total === "number"
73
+ ? response.meta.total
74
+ : mappedRows.length,
67
75
  buildFilters: (state) => sieveAnd(sieveFilter(PRODUCT_FIELDS.LISTING_TYPE, SIEVE_OP.EQ, type), state.status && state.status !== "All"
68
76
  ? sieveFilter(PRODUCT_FIELDS.STATUS, SIEVE_OP.EQ, state.status)
69
77
  : "") || undefined,
70
- // These are products filtered by listingType — reuse the real admin
71
- // product editor rather than leaving rows non-navigable.
72
- rowHrefTemplate: String(ROUTES.ADMIN.PRODUCTS_EDIT("{id}")),
78
+ // The availability scope, when the caller supplies one. Optional so the
79
+ // factory stays usable from a non-component context.
80
+ buildExtraParams: opts.scope ? () => opts.scope.extraParams : undefined,
81
+ renderAboveContent: opts.scope?.renderAboveContent,
82
+ // These are products filtered by listingType — reuse the real product
83
+ // editor rather than leaving rows non-navigable.
84
+ rowHrefTemplate: String(isSeller ? ROUTES.STORE.PRODUCTS_EDIT("{id}") : ROUTES.ADMIN.PRODUCTS_EDIT("{id}")),
73
85
  };
74
86
  }
@@ -192,6 +192,7 @@ export declare const ADMIN_ROW_ACTIONS: {
192
192
  readonly blog: readonly ["row-view", "row-edit", "row-publish", "row-draft", "row-delete"];
193
193
  readonly faqs: readonly ["row-edit", "row-archive", "row-delete"];
194
194
  readonly bids: readonly ["row-view", "row-cancel"];
195
+ readonly offers: readonly ["row-view", "row-cancel"];
195
196
  readonly notifications: readonly ["row-resend", "row-delete"];
196
197
  readonly sessions: readonly ["row-revoke"];
197
198
  readonly bundles: readonly ["row-view", "row-edit", "row-activate", "row-deactivate", "row-delete"];
@@ -356,6 +357,7 @@ export declare const ADMIN_BULK_ACTIONS: {
356
357
  readonly blog: readonly ["row-publish", "row-draft", "row-delete"];
357
358
  readonly faqs: readonly ["row-archive", "row-delete"];
358
359
  readonly bids: readonly ["row-cancel"];
360
+ readonly offers: readonly ["row-cancel"];
359
361
  readonly notifications: readonly ["row-mark-read", "row-delete"];
360
362
  readonly sessions: readonly ["row-revoke"];
361
363
  readonly payouts: readonly ["row-mark-paid"];
@@ -255,6 +255,11 @@ export const ADMIN_ROW_ACTIONS = {
255
255
  blog: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.EDIT, ROW_ACTION_ID.PUBLISH, ROW_ACTION_ID.DRAFT, ROW_ACTION_ID.DELETE],
256
256
  faqs: [ROW_ACTION_ID.EDIT, ROW_ACTION_ID.ARCHIVE, ROW_ACTION_ID.DELETE],
257
257
  bids: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.CANCEL],
258
+ // View + Cancel only, deliberately. Admin does NOT get accept/counter/reject
259
+ // (which the seller preset below has) — negotiating a price on a seller's
260
+ // behalf is an authority nobody asked for. Admin's job here is to read the
261
+ // record and kill a bad one.
262
+ offers: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.CANCEL],
258
263
  notifications: [ROW_ACTION_ID.RESEND, ROW_ACTION_ID.DELETE],
259
264
  sessions: [ROW_ACTION_ID.REVOKE],
260
265
  bundles: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.EDIT, ROW_ACTION_ID.ACTIVATE, ROW_ACTION_ID.DEACTIVATE, ROW_ACTION_ID.DELETE],
@@ -521,6 +526,7 @@ export const ADMIN_BULK_ACTIONS = {
521
526
  blog: [ROW_ACTION_ID.PUBLISH, ROW_ACTION_ID.DRAFT, ROW_ACTION_ID.DELETE],
522
527
  faqs: [ROW_ACTION_ID.ARCHIVE, ROW_ACTION_ID.DELETE],
523
528
  bids: [ROW_ACTION_ID.CANCEL],
529
+ offers: [ROW_ACTION_ID.CANCEL],
524
530
  notifications: [ROW_ACTION_ID.MARK_READ, ROW_ACTION_ID.DELETE],
525
531
  sessions: [ROW_ACTION_ID.REVOKE],
526
532
  payouts: [ROW_ACTION_ID.MARK_PAID],
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import { type AvailabilityFilter } from "../../../constants/field-names";
3
+ import type { ListingType } from "../types";
4
+ export interface AvailabilityScope {
5
+ availability: AvailabilityFilter;
6
+ /** Spread into `ListingViewConfig.buildExtraParams`'s return value. */
7
+ extraParams: {
8
+ availability: AvailabilityFilter;
9
+ };
10
+ /** Assign to `ListingViewConfig.renderAboveContent`. */
11
+ renderAboveContent: () => React.ReactNode;
12
+ }
13
+ export declare function useAvailabilityScope(types: readonly ListingType[]): AvailabilityScope;
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useUrlTable } from "../../../react/hooks/useUrlTable";
4
+ import { TABLE_KEYS } from "../../../constants/table-keys";
5
+ import { AVAILABILITY_VALUES } from "../../../constants/field-names";
6
+ import { AvailabilityTabs } from "../components/AvailabilityTabs";
7
+ export function useAvailabilityScope(types) {
8
+ // A second, independent `useUrlTable()` against the same URL as
9
+ // DataListingView's own instance. Safe by design — the hook holds no local
10
+ // state, so both instances read the same searchParams and stay in sync.
11
+ const table = useUrlTable();
12
+ const availability = table.get(TABLE_KEYS.AVAILABILITY) ||
13
+ AVAILABILITY_VALUES.AVAILABLE;
14
+ return {
15
+ availability,
16
+ extraParams: { availability },
17
+ renderAboveContent: () => _jsx(AvailabilityTabs, { types: types }),
18
+ };
19
+ }
@@ -26,6 +26,11 @@ export declare function useProducts<T extends ProductItem = ProductItem>(params?
26
26
  totalPages: number;
27
27
  page: number;
28
28
  hasMore: boolean;
29
+ /**
30
+ * A bounded fetch hit its ceiling, so `total` is a floor. Render it as
31
+ * "50+", never as an exact count, and never derive a final page from it.
32
+ */
33
+ truncated: boolean;
29
34
  isLoading: boolean;
30
35
  error: Error | null;
31
36
  warning: string | undefined;
@@ -21,8 +21,14 @@ export function useProducts(params = {}, opts) {
21
21
  sp.set("minPrice", String(params.minPrice));
22
22
  if (params.maxPrice !== undefined)
23
23
  sp.set("maxPrice", String(params.maxPrice));
24
- if (params.inStock !== undefined)
25
- sp.set("inStock", String(params.inStock));
24
+ // ALWAYS sent when the caller has a scope, including the default
25
+ // "available". `/api/products` leaves `availability` unset (= all) so that
26
+ // non-browse callers are unaffected — which means a browse component that
27
+ // stopped sending it would filter on the SSR paint and NOT on the refetch,
28
+ // and `staleTime: Infinity` would freeze that disagreement (Root Cause #30).
29
+ // `audit-listing-filter-parity` asserts every listing component sends it.
30
+ if (params.availability)
31
+ sp.set("availability", params.availability);
26
32
  // SB1-G Phase 4 — canonical `listingType` URL param only.
27
33
  if (params.listingType !== undefined)
28
34
  sp.set("listingType", params.listingType);
@@ -87,6 +93,11 @@ export function useProducts(params = {}, opts) {
87
93
  totalPages: query.data?.totalPages ?? 1,
88
94
  page: query.data?.page ?? 1,
89
95
  hasMore: query.data?.hasMore ?? false,
96
+ /**
97
+ * A bounded fetch hit its ceiling, so `total` is a floor. Render it as
98
+ * "50+", never as an exact count, and never derive a final page from it.
99
+ */
100
+ truncated: query.data?.truncated ?? false,
90
101
  isLoading: query.isLoading,
91
102
  error: query.error,
92
103
  warning,
@@ -35,14 +35,12 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
35
35
  listByIds(ids: string[]): Promise<ProductDocument[]>;
36
36
  findAuctions(): Promise<ProductDocument[]>;
37
37
  findPreOrders(): Promise<ProductDocument[]>;
38
- findActivePreOrders(): Promise<ProductDocument[]>;
39
38
  findPromoted(): Promise<ProductDocument[]>;
40
39
  updateProduct(productId: string, data: ProductUpdateInput): Promise<ProductDocument>;
41
40
  updateAvailableQuantity(productId: string, quantity: number): Promise<void>;
42
41
  updateBid(productId: string, bidAmount: number, bidCount: number): Promise<void>;
43
42
  findAvailable(): Promise<ProductDocument[]>;
44
43
  findByGroupId(groupId: string): Promise<ProductDocument[]>;
45
- findActiveAuctions(): Promise<ProductDocument[]>;
46
44
  startGroup(productId: string, slug: string): Promise<void>;
47
45
  updateGroupTitle(productId: string, groupTitle: string): Promise<void>;
48
46
  dissolveGroup(groupId: string): Promise<void>;
@@ -329,12 +327,43 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
329
327
  * is called from — Vercel routes, listingProcessor, server-action views.
330
328
  */
331
329
  static readonly FILTER_ALIASES: SieveFilterAliases;
330
+ /**
331
+ * Firestore's ceiling for `array-contains-any` / `in` comparison values.
332
+ * Exceeding it throws `INVALID_ARGUMENT`, and every caller of `list()` wraps
333
+ * the call in `.catch(() => null)`, so the throw would surface as a silently
334
+ * empty page rather than an error (Root Cause #59).
335
+ */
336
+ private static readonly MAX_ARRAY_CONTAINS_ANY;
337
+ /**
338
+ * Shared scope construction for `list()` and `countBy*()` — both must narrow
339
+ * by exactly the same store/status/category/search predicates or a tab's
340
+ * count would disagree with the rows behind it.
341
+ */
342
+ private buildScopedQuery;
332
343
  list(model: SieveModel, opts?: {
333
344
  storeId?: string;
334
345
  status?: string;
335
346
  categoriesIn?: string[];
336
347
  search?: string;
337
348
  }): Promise<FirebaseSieveResult<ProductDocument>>;
349
+ /**
350
+ * How many products of each listing type exist within a scope — the numbers
351
+ * behind every listing-type tab bar and filter chip group.
352
+ *
353
+ * `types` entries are passed through verbatim, so a pipe-joined OR-group
354
+ * (`"art|stickers"`, the combined Art & Stickers tab) is counted as one
355
+ * bucket, matching how the tab itself queries.
356
+ *
357
+ * A type whose count query fails maps to `undefined`, not 0 — callers hide a
358
+ * tab at zero, and a swallowed failure reading as "none exist" would hide a
359
+ * tab holding real inventory (Root Cause #59).
360
+ */
361
+ countByListingTypes(types: readonly string[], opts?: {
362
+ storeId?: string;
363
+ status?: string;
364
+ categoriesIn?: string[];
365
+ brandName?: string;
366
+ }): Promise<Record<string, number | undefined>>;
338
367
  incrementViewCount(productId: string): Promise<void>;
339
368
  /**
340
369
  * Cloud Functions: find published auctions whose end date has already passed.
@@ -206,15 +206,6 @@ export class ProductRepository extends BaseRepository {
206
206
  async findPreOrders() {
207
207
  return this.findBy(PRODUCT_FIELDS.LISTING_TYPE, LISTING_TYPE_VALUES.PRE_ORDER);
208
208
  }
209
- async findActivePreOrders() {
210
- const now = new Date();
211
- const snapshot = await this.db
212
- .collection(this.collection)
213
- .where(PRODUCT_FIELDS.LISTING_TYPE, "==", LISTING_TYPE_VALUES.PRE_ORDER)
214
- .where(PRODUCT_FIELDS.PRE_ORDER_DELIVERY_DATE, ">=", now)
215
- .get();
216
- return snapshot.docs.map((doc) => this.mapDoc(doc));
217
- }
218
209
  async findPromoted() {
219
210
  return this.findBy(PRODUCT_FIELDS.IS_PROMOTED, true);
220
211
  }
@@ -255,15 +246,6 @@ export class ProductRepository extends BaseRepository {
255
246
  .get();
256
247
  return snapshot.docs.map((doc) => this.mapDoc(doc));
257
248
  }
258
- async findActiveAuctions() {
259
- const now = new Date();
260
- const snapshot = await this.db
261
- .collection(this.collection)
262
- .where(PRODUCT_FIELDS.LISTING_TYPE, "==", LISTING_TYPE_VALUES.AUCTION)
263
- .where(PRODUCT_FIELDS.AUCTION_END_DATE, ">=", now)
264
- .get();
265
- return snapshot.docs.map((doc) => this.mapDoc(doc));
266
- }
267
249
  async startGroup(productId, slug) {
268
250
  await this.getCollection().doc(productId).update({
269
251
  groupId: slug,
@@ -358,8 +340,19 @@ export class ProductRepository extends BaseRepository {
358
340
  this.cacheInvalidateForId(id);
359
341
  return super.delete(id);
360
342
  }
361
- async list(model, opts) {
343
+ /**
344
+ * Shared scope construction for `list()` and `countBy*()` — both must narrow
345
+ * by exactly the same store/status/category/search predicates or a tab's
346
+ * count would disagree with the rows behind it.
347
+ */
348
+ buildScopedQuery(opts) {
362
349
  let baseQuery = this.getCollection();
350
+ if (opts?.brandName) {
351
+ // The free-text display name, NOT brandSlug — BrandDetailPageView filters
352
+ // products this way, so a count keyed on brandSlug would disagree with
353
+ // the rows the tab goes on to show.
354
+ baseQuery = baseQuery.where(PRODUCT_FIELDS.BRAND, "==", opts.brandName);
355
+ }
363
356
  if (opts?.status) {
364
357
  baseQuery = baseQuery.where(PRODUCT_FIELDS.STATUS, "==", opts.status);
365
358
  }
@@ -377,15 +370,47 @@ export class ProductRepository extends BaseRepository {
377
370
  baseQuery = baseQuery.where(PRODUCT_FIELDS.SEARCH_TOKENS, "array-contains-any", searchTokens);
378
371
  }
379
372
  if (searchTokens.length === 0 && opts?.categoriesIn && opts.categoriesIn.length > 0) {
380
- baseQuery = baseQuery.where(PRODUCT_FIELDS.CATEGORY_SLUGS, "array-contains-any", opts.categoriesIn);
373
+ let categoriesIn = opts.categoriesIn;
374
+ if (categoriesIn.length > ProductRepository.MAX_ARRAY_CONTAINS_ANY) {
375
+ // Products carry their FULL ancestor chain in `categorySlugs`, so a
376
+ // category page only ever needs to pass its own id — a list this long
377
+ // means a caller is still expanding descendants. Truncating keeps the
378
+ // query legal (an over-long list throws INVALID_ARGUMENT, which every
379
+ // caller's `.catch(() => null)` would turn into a blank page), and the
380
+ // warning names the real bug instead of hiding it.
381
+ serverLogger.warn(`productRepository: categoriesIn had ${categoriesIn.length} values, above Firestore's ${ProductRepository.MAX_ARRAY_CONTAINS_ANY} limit — truncating. Pass only the category's own id; products are tagged with their full ancestor chain.`);
382
+ categoriesIn = categoriesIn.slice(0, ProductRepository.MAX_ARRAY_CONTAINS_ANY);
383
+ }
384
+ baseQuery = baseQuery.where(PRODUCT_FIELDS.CATEGORY_SLUGS, "array-contains-any", categoriesIn);
381
385
  }
386
+ return baseQuery;
387
+ }
388
+ async list(model, opts) {
382
389
  return this.sieveQuery(model, ProductRepository.SIEVE_FIELDS, {
383
- baseQuery,
390
+ baseQuery: this.buildScopedQuery(opts),
384
391
  defaultPageSize: 20,
385
392
  maxPageSize: 100,
386
393
  aliases: ProductRepository.FILTER_ALIASES,
387
394
  });
388
395
  }
396
+ /**
397
+ * How many products of each listing type exist within a scope — the numbers
398
+ * behind every listing-type tab bar and filter chip group.
399
+ *
400
+ * `types` entries are passed through verbatim, so a pipe-joined OR-group
401
+ * (`"art|stickers"`, the combined Art & Stickers tab) is counted as one
402
+ * bucket, matching how the tab itself queries.
403
+ *
404
+ * A type whose count query fails maps to `undefined`, not 0 — callers hide a
405
+ * tab at zero, and a swallowed failure reading as "none exist" would hide a
406
+ * tab holding real inventory (Root Cause #59).
407
+ */
408
+ async countByListingTypes(types, opts) {
409
+ return this.facetCounts(PRODUCT_FIELDS.LISTING_TYPE, types, ProductRepository.SIEVE_FIELDS, {
410
+ baseQuery: this.buildScopedQuery(opts),
411
+ aliases: ProductRepository.FILTER_ALIASES,
412
+ });
413
+ }
389
414
  async incrementViewCount(productId) {
390
415
  try {
391
416
  await this.db
@@ -672,4 +697,11 @@ ProductRepository.FILTER_ALIASES = {
672
697
  ].join(",");
673
698
  },
674
699
  };
700
+ /**
701
+ * Firestore's ceiling for `array-contains-any` / `in` comparison values.
702
+ * Exceeding it throws `INVALID_ARGUMENT`, and every caller of `list()` wraps
703
+ * the call in `.catch(() => null)`, so the throw would surface as a silently
704
+ * empty page rather than an error (Root Cause #59).
705
+ */
706
+ ProductRepository.MAX_ARRAY_CONTAINS_ANY = 30;
675
707
  export const productRepository = new ProductRepository();
@@ -178,7 +178,21 @@ export interface ProductDocument extends BaseDocument {
178
178
  auctionExtensionMinutes?: number;
179
179
  auctionOriginalEndDate?: Date;
180
180
  auctionShippingPaidBy?: "seller" | "winner";
181
- buyItNowPrice?: number;
181
+ /**
182
+ * True once anybody has bid. Written by `placeBid`, never reset.
183
+ *
184
+ * It no longer gates Buy Now. The original SB-UNI-H design copied eBay's rule
185
+ * — BIN vanishes the moment the first bid lands — which in practice hid the
186
+ * button on nearly every real auction (3 of 4 seeded BIN fixtures had it
187
+ * hidden), while the PDP went on advertising the BIN *price* right above the
188
+ * missing button. Availability is now `buyNowPrice > currentBid`, via
189
+ * `isBuyNowAvailable()`; this field survives as a plain filterable fact about
190
+ * the auction.
191
+ *
192
+ * (A `buyItNowPrice` field used to sit alongside this one, documented as THE
193
+ * BIN price while every consumer actually read `buyNowPrice` above. Deleted
194
+ * 2026-08-24 — it had no readers and had already caused one seed-data bug.)
195
+ */
182
196
  bidsHaveStarted?: boolean;
183
197
  grading?: ProductGrading;
184
198
  card?: ProductCardMetadata;
@@ -369,8 +383,8 @@ export declare const ProductStatusValues: {
369
383
  export declare const PRODUCT_COLLECTION: "products";
370
384
  export declare const PRODUCT_INDEXED_FIELDS: readonly ["storeId", "status", "category", "featured", "listingType", "isPromoted", "isOnSale", "isSold", "searchTokens", "createdAt", "barcodeId"];
371
385
  export declare const DEFAULT_PRODUCT_DATA: Partial<ProductDocument>;
372
- export declare const PRODUCT_PUBLIC_FIELDS: readonly ["id", "title", "description", "category", "subcategory", "brand", "price", "currency", "stockQuantity", "availableQuantity", "images", "status", "storeName", "featured", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "listingType", "auctionEndDate", "startingBid", "currentBid", "bidCount", "reservePrice", "buyNowPrice", "minBidIncrement", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "buyItNowPrice", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderCurrentCount", "preOrderProductionStatus", "preOrderCancellable", "condition", "insurance", "insuranceCost", "shippingPaidBy", "isPromoted", "isOnSale", "isSold", "slug", "seoTitle", "seoDescription", "seoKeywords", "viewCount", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "createdAt"];
373
- export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "subcategory", "brand", "price", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "buyItNowPrice", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "listingType", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderProductionStatus", "preOrderCancellable", "isOnSale", "isSold", "allowShipBeforeEmiComplete", "printMeta", "seoTitle", "seoDescription", "seoKeywords", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "barcodeId"];
386
+ export declare const PRODUCT_PUBLIC_FIELDS: readonly ["allowOffers", "minOfferPercent", "id", "title", "description", "category", "subcategory", "brand", "price", "currency", "stockQuantity", "availableQuantity", "images", "status", "storeName", "featured", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "listingType", "auctionEndDate", "startingBid", "currentBid", "bidCount", "reservePrice", "buyNowPrice", "minBidIncrement", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderCurrentCount", "preOrderProductionStatus", "preOrderCancellable", "condition", "insurance", "insuranceCost", "shippingPaidBy", "isPromoted", "isOnSale", "isSold", "slug", "seoTitle", "seoDescription", "seoKeywords", "viewCount", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "createdAt"];
387
+ export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "subcategory", "brand", "price", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "listingType", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderProductionStatus", "preOrderCancellable", "isOnSale", "isSold", "allowShipBeforeEmiComplete", "printMeta", "seoTitle", "seoDescription", "seoKeywords", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "barcodeId"];
374
388
  export type ProductCreateInput = Omit<ProductDocument, "id" | "createdAt" | "updatedAt" | "availableQuantity" | "bidCount" | "currentBid" | "auctionOriginalEndDate">;
375
389
  export type ProductUpdateInput = Partial<Pick<ProductDocument, (typeof PRODUCT_UPDATABLE_FIELDS)[number]>>;
376
390
  export type ProductAdminUpdateInput = Partial<Omit<ProductDocument, "id" | "createdAt">>;
@@ -46,6 +46,13 @@ export const DEFAULT_PRODUCT_DATA = {
46
46
  auctionShippingPaidBy: "winner",
47
47
  };
48
48
  export const PRODUCT_PUBLIC_FIELDS = [
49
+ // Public-facing offer signals: the card grid renders a "Taking Offers" pill
50
+ // from `allowOffers`, and the detail-page form seeds its minimum from
51
+ // `minOfferPercent`. Listed here prophylactically — this array currently has
52
+ // no consumers, so their absence was not a live bug, but it would become one
53
+ // the moment something starts projecting through it.
54
+ "allowOffers",
55
+ "minOfferPercent",
49
56
  "id",
50
57
  "title",
51
58
  "description",
@@ -77,7 +84,6 @@ export const PRODUCT_PUBLIC_FIELDS = [
77
84
  "auctionExtensionMinutes",
78
85
  "auctionShippingPaidBy",
79
86
  // SB-UNI-H 2026-05-13 — eBay hybrid BIN.
80
- "buyItNowPrice",
81
87
  "bidsHaveStarted",
82
88
  // SB-UNI-G 2026-05-13 — TCGPlayer grading + card metadata.
83
89
  "grading",
@@ -143,7 +149,6 @@ export const PRODUCT_UPDATABLE_FIELDS = [
143
149
  "buyNowPrice",
144
150
  "minBidIncrement",
145
151
  // SB-UNI-H 2026-05-13 — eBay hybrid BIN updatable.
146
- "buyItNowPrice",
147
152
  "bidsHaveStarted",
148
153
  // SB-UNI-G 2026-05-13 — TCGPlayer grading + card metadata updatable.
149
154
  "grading",