@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
@@ -2,8 +2,9 @@ import { normalizeError } from "../../../errors/normalize";
2
2
  import { DatabaseError, NotFoundError } from "../../../errors";
3
3
  import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
4
4
  import { decryptPiiFields, encryptPiiFields, ORDER_PII_FIELDS, } from "../../../security";
5
- import { serverTimestamp } from "../../../contracts/field-ops";
6
- import { createOrderId, ORDER_COLLECTION, OrderStatusValues, } from "../schemas";
5
+ import { serverTimestamp, arrayUnion } from "../../../contracts/field-ops";
6
+ import { createOrderId, ORDER_COLLECTION, ORDER_TRACKED_FIELDS, OrderStatusValues, } from "../schemas";
7
+ import { withHistory } from "../../../_internal/shared/history/index";
7
8
  import { MANUAL_PAYMENT_METHODS, PAYMENT_REVIEW_QUEUE_SCAN_LIMIT, } from "../constants/payment-window";
8
9
  import { ORDER_FIELDS } from "../../../constants/field-names";
9
10
  /**
@@ -65,12 +66,49 @@ class OrderRepository extends BaseRepository {
65
66
  async findPending() {
66
67
  return this.findBy(ORDER_FIELDS.STATUS, "pending");
67
68
  }
68
- async updateStatus(orderId, status, additionalData) {
69
- return this.update(orderId, {
70
- status,
71
- ...additionalData,
72
- updatedAt: new Date(),
69
+ /**
70
+ * Every write primitive below routes through this so `statusHistory` is
71
+ * appended at the SEVEN places a tracked field can change, rather than at
72
+ * the ~32 call sites above them. That is what makes order history a
73
+ * contained change instead of a codebase-wide sweep — and it follows the
74
+ * precedent `postRefundEvent` already set for append-only order data.
75
+ *
76
+ * `ctx` is optional throughout: a caller that has not been updated yet
77
+ * records `system` rather than failing, so this rolls out incrementally.
78
+ * The actor is worth passing wherever it is known — a history entry that
79
+ * cannot say who cancelled an order is a much weaker record.
80
+ */
81
+ async updateWithHistory(orderId, patch, ctx, defaultTrigger,
82
+ /**
83
+ * The already-fetched document, when the caller has one. Three of the six
84
+ * write primitives (`markPicked`, `markCodCollected`, `postRefundEvent`)
85
+ * read the order before patching it — passing it through avoids a second
86
+ * read of the same document on every one of those writes, which matters
87
+ * against the Firestore daily read budget (Rule #6).
88
+ */
89
+ known) {
90
+ const current = known !== undefined ? known : await this.findById(orderId);
91
+ const withEntry = withHistory(current, patch, {
92
+ tracked: ORDER_TRACKED_FIELDS,
93
+ actor: ctx?.actor ?? { role: "system" },
94
+ trigger: ctx?.trigger ?? defaultTrigger,
95
+ reason: ctx?.reason,
96
+ note: ctx?.note,
97
+ extraChanges: ctx?.extraChanges,
98
+ // `encryptPiiFields` is a flat top-level loop and never descends into
99
+ // arrays, so anything PII-named reaching `changes` would persist in
100
+ // PLAINTEXT inside statusHistory. None of ORDER_TRACKED_FIELDS is PII
101
+ // today — this is defence for the next field somebody adds.
102
+ piiFields: ORDER_PII_FIELDS,
103
+ historyField: "statusHistory",
104
+ truncatedField: "statusHistoryTruncated",
73
105
  });
106
+ // `null` means no tracked field actually changed — write the patch as-is
107
+ // so an untracked update never grows the array.
108
+ return this.update(orderId, (withEntry ?? patch));
109
+ }
110
+ async updateStatus(orderId, status, additionalData, ctx) {
111
+ return this.updateWithHistory(orderId, { status, ...additionalData, updatedAt: new Date() }, ctx, "orderRepository.updateStatus");
74
112
  }
75
113
  async assignWorker(orderId, workerId) {
76
114
  return this.update(orderId, { assignedWorkerId: workerId, updatedAt: new Date() });
@@ -78,12 +116,12 @@ class OrderRepository extends BaseRepository {
78
116
  async unassignWorker(orderId) {
79
117
  return this.update(orderId, { assignedWorkerId: undefined, updatedAt: new Date() });
80
118
  }
81
- async markPicked(orderId) {
119
+ async markPicked(orderId, ctx) {
82
120
  const order = await this.findById(orderId);
83
121
  if (!order)
84
122
  throw new NotFoundError(`Order ${orderId} not found`);
85
123
  const nextStatus = order.status === "confirmed" ? "processing" : order.status;
86
- return this.update(orderId, { pickedAt: new Date(), status: nextStatus, updatedAt: new Date() });
124
+ return this.updateWithHistory(orderId, { pickedAt: new Date(), status: nextStatus, updatedAt: new Date() }, ctx, "orderRepository.markPicked", order);
87
125
  }
88
126
  async markPacked(orderId) {
89
127
  return this.update(orderId, { packedAt: new Date(), updatedAt: new Date() });
@@ -95,11 +133,11 @@ class OrderRepository extends BaseRepository {
95
133
  * verify against, so `verifiedBy` is the acting user's uid and
96
134
  * `verificationMethod` is always "cod_collection".
97
135
  */
98
- async markCodCollected(orderId, verifiedBy, note) {
136
+ async markCodCollected(orderId, verifiedBy, note, ctx) {
99
137
  const order = await this.findById(orderId);
100
138
  if (!order)
101
139
  throw new NotFoundError(`Order ${orderId} not found`);
102
- return this.update(orderId, {
140
+ return this.updateWithHistory(orderId, {
103
141
  paymentStatus: "paid",
104
142
  paymentRecord: {
105
143
  method: "cod",
@@ -110,7 +148,10 @@ class OrderRepository extends BaseRepository {
110
148
  verificationMethod: "cod_collection",
111
149
  },
112
150
  updatedAt: new Date(),
113
- });
151
+ },
152
+ // `verifiedBy` is the acting user — use it unless the caller supplied a
153
+ // richer actor. Cash collection is always a person, never the system.
154
+ ctx ?? { actor: { uid: verifiedBy, role: "seller" }, note }, "orderRepository.markCodCollected", order);
114
155
  }
115
156
  async findFulfillmentQueue(storeId) {
116
157
  const snap = await this.db
@@ -122,21 +163,25 @@ class OrderRepository extends BaseRepository {
122
163
  .get();
123
164
  return snap.docs.map((doc) => this.decryptOrder({ id: doc.id, ...doc.data() }));
124
165
  }
125
- async updatePaymentStatus(orderId, paymentStatus, paymentId) {
126
- return this.update(orderId, {
166
+ async updatePaymentStatus(orderId, paymentStatus, paymentId, ctx) {
167
+ return this.updateWithHistory(orderId, {
127
168
  paymentStatus,
128
169
  ...(paymentId ? { paymentId } : {}),
129
170
  updatedAt: new Date(),
130
- });
171
+ }, ctx, "orderRepository.updatePaymentStatus");
131
172
  }
132
- async cancelOrder(orderId, reason, refundAmount) {
133
- return this.update(orderId, {
173
+ async cancelOrder(orderId, reason, refundAmount, ctx) {
174
+ return this.updateWithHistory(orderId, {
134
175
  status: "cancelled",
135
176
  cancellationDate: new Date(),
136
177
  cancellationReason: reason,
137
178
  ...(refundAmount ? { refundAmount, refundStatus: "pending" } : {}),
138
179
  updatedAt: new Date(),
139
- });
180
+ },
181
+ // The cancellation reason is already a first-class argument here — carry
182
+ // it into the history entry so the timeline can say WHY, not just that
183
+ // it was cancelled.
184
+ { ...ctx, reason: ctx?.reason ?? reason }, "orderRepository.cancelOrder");
140
185
  }
141
186
  async findRecentByUser(userId) {
142
187
  const now = new Date();
@@ -251,17 +296,38 @@ class OrderRepository extends BaseRepository {
251
296
  * Append one refund event to the order and mark it non-contestable.
252
297
  * If `becomeRefunded` is true, also transitions the order status to "refunded".
253
298
  */
254
- async postRefundEvent(orderId, event, becomeRefunded = false) {
299
+ async postRefundEvent(orderId, event, becomeRefunded = false, ctx) {
255
300
  const order = await this.findById(orderId);
256
301
  if (!order)
257
302
  throw new NotFoundError(`Order ${orderId} not found`);
258
303
  const existing = order.refunds ?? [];
259
- return this.update(orderId, {
304
+ return this.updateWithHistory(orderId, {
260
305
  refunds: [...existing, event],
261
306
  contestable: false,
262
307
  ...(becomeRefunded ? { status: "refunded" } : {}),
263
308
  updatedAt: new Date(),
264
- });
309
+ }, {
310
+ ...ctx,
311
+ // The refund is contributed explicitly rather than diffed. A raw diff
312
+ // of `refunds[]` would say "an array of 1 became an array of 2" —
313
+ // true, and useless on a timeline. PARTIAL refunds matter as much as
314
+ // full ones here: a partial changes no tracked field at all, so
315
+ // without this it would leave no trace despite being exactly the kind
316
+ // of event a buyer later asks about.
317
+ extraChanges: {
318
+ refund: {
319
+ from: null,
320
+ to: {
321
+ refundId: event.refundId,
322
+ type: event.type,
323
+ amount: event.amount,
324
+ reason: event.reason,
325
+ },
326
+ },
327
+ },
328
+ actor: ctx?.actor ?? { uid: event.refundedBy, role: "admin" },
329
+ reason: ctx?.reason ?? event.reason,
330
+ }, "orderRepository.postRefundEvent", order);
265
331
  }
266
332
  /** Fetch all orders sharing a paymentBatchId (for sibling-orders display). */
267
333
  async findByPaymentBatchId(batchId) {
@@ -469,19 +535,52 @@ class OrderRepository extends BaseRepository {
469
535
  payoutStatus: "requested",
470
536
  payoutId,
471
537
  updatedAt: serverTimestamp(),
538
+ ...this.batchHistoryPatch({
539
+ changes: { payoutStatus: { from: "eligible", to: "requested" } },
540
+ trigger: "orderRepository.markPayoutRequested",
541
+ }),
472
542
  });
473
543
  }
474
544
  /**
475
545
  * Cloud Functions: stage a cancellation update into a caller-owned WriteBatch.
546
+ *
547
+ * `fromStatus` is supplied by the caller because a batch write does no read
548
+ * — but the sweep that calls this already filtered on a status, so it knows
549
+ * the value. Passing it beats recording `null` for something that is
550
+ * genuinely known one stack frame up.
476
551
  */
477
- cancelInBatch(batch, ref) {
552
+ cancelInBatch(batch, ref, fromStatus = null) {
478
553
  batch.update(ref, {
479
554
  status: OrderStatusValues.CANCELLED,
480
555
  cancellationDate: new Date(),
481
556
  cancellationReason: "payment_timeout",
482
557
  updatedAt: serverTimestamp(),
558
+ ...this.batchHistoryPatch({
559
+ changes: { status: { from: fromStatus, to: OrderStatusValues.CANCELLED } },
560
+ reason: "payment_timeout",
561
+ trigger: "orderRepository.cancelInBatch",
562
+ }),
483
563
  });
484
564
  }
565
+ /**
566
+ * History append for the two WriteBatch paths, which cannot read-then-diff.
567
+ *
568
+ * Uses `arrayUnion` so the entry lands without a prior read. The FIFO cap
569
+ * therefore is NOT applied here — it is enforced on the next ordinary
570
+ * write. That is an acceptable trade: both batch paths are terminal
571
+ * transitions (cancelled, payout-requested) that fire at most once per
572
+ * order, so they cannot be what overflows the array.
573
+ */
574
+ batchHistoryPatch(input) {
575
+ const entry = {
576
+ at: new Date(),
577
+ actorRole: "system",
578
+ changes: input.changes,
579
+ trigger: input.trigger,
580
+ ...(input.reason ? { reason: input.reason } : {}),
581
+ };
582
+ return { statusHistory: arrayUnion(entry) };
583
+ }
485
584
  }
486
585
  OrderRepository.SELLER_SIEVE_FIELDS = {
487
586
  id: { canFilter: true, canSort: false },
@@ -5,6 +5,94 @@ import type { OrderStatus, PaymentStatus } from "../types";
5
5
  import type { OrderType } from "../utils/order-splitter";
6
6
  import type { BaseDocument } from "../../../_internal/shared/types/base-document";
7
7
  import type { ListingType } from "../../products/types";
8
+ import type { StatusChangeEntry } from "../../../_internal/shared/history/index";
9
+ export interface OrderSourceStandard {
10
+ path: "standard";
11
+ listPrice: number;
12
+ }
13
+ export interface OrderSourceAuctionWon {
14
+ path: "auction-won";
15
+ auctionId: string;
16
+ bidId: string;
17
+ winningBidAmount: number;
18
+ /** Bids placed across the whole auction — the "against N bidders" figure. */
19
+ bidCount: number;
20
+ startingBid: number;
21
+ reservePrice?: number;
22
+ reserveMet: boolean;
23
+ auctionEndedAt: Date;
24
+ /** Second-highest bid, when there was one. */
25
+ runnerUpAmount?: number;
26
+ }
27
+ /**
28
+ * A buyout is a REAL BID, not a bid-free purchase.
29
+ *
30
+ * An earlier draft of this type asserted "zero bids BY DEFINITION, because
31
+ * buy-now is only valid while `!bidsHaveStarted`". That gate no longer
32
+ * exists: `buyNowAuction` places an actual `BidDocument` (`isBuyout: true`)
33
+ * plus a 1h locked cart line and leaves the auction **live**, and Buy Now is
34
+ * offered whenever `buyNowPrice` still beats the standing bid. Recording
35
+ * `bidCount: 0` would bake a falsehood into an immutable audit record.
36
+ *
37
+ * `standingBidAtBuyout` is the highest NON-buyout bid the buyout beat — read
38
+ * from the bids rather than `product.currentBid`, because a pending buyout
39
+ * deliberately never writes to that mirror.
40
+ *
41
+ * An unpaid buyout lapses to **`cancelled`**, not `forfeited`, and the seller
42
+ * is deliberately not notified: nothing was ever sold. That makes its
43
+ * timeline materially different from a lapsed auction win.
44
+ */
45
+ export interface OrderSourceAuctionBuyNow {
46
+ path: "auction-buy-now";
47
+ auctionId: string;
48
+ /** The buyout bid itself — a buyout IS a bid. */
49
+ bidId: string;
50
+ buyNowPrice: number;
51
+ listPrice: number;
52
+ /** Highest non-buyout bid at the moment of buyout. 0 when nobody had bid. */
53
+ standingBidAtBuyout: number;
54
+ /** Active non-buyout bids at buyout time. NOT always zero. */
55
+ bidCount: number;
56
+ boughtAt: Date;
57
+ /** `min(now + AUCTION_BUYOUT_WINDOW_MS, auctionEndDate)`. */
58
+ checkoutDeadline: Date;
59
+ auctionEndDate?: Date;
60
+ }
61
+ export interface OrderSourceOfferAccepted {
62
+ path: "offer-accepted";
63
+ offerId: string;
64
+ offeredAmount: number;
65
+ /** The asking price at the moment the offer was made. */
66
+ listPriceAtOffer: number;
67
+ counterAmount?: number;
68
+ /**
69
+ * How many counter rounds before agreement. 1 = accepted outright.
70
+ *
71
+ * Read straight off the accepted offer's `counterRound`, which W2 made a
72
+ * persisted field. Before that this number was **unknowable**: each counter
73
+ * created an unlinked document and `previousOfferId` lived only inside a
74
+ * `serverLogger.info` call, so a three-round negotiation left no trace of
75
+ * having been one.
76
+ */
77
+ counterRounds: number;
78
+ acceptedBy: string;
79
+ acceptedAt: Date;
80
+ checkoutDeadline?: Date;
81
+ }
82
+ export interface OrderSourcePreOrder {
83
+ path: "pre-order";
84
+ depositAmount: number;
85
+ balanceDue: number;
86
+ expectedDeliveryDate?: Date;
87
+ }
88
+ export interface OrderSourcePrizeDraw {
89
+ path: "prize-draw";
90
+ prizeDrawProductId: string;
91
+ pricePerEntry: number;
92
+ entryCount: number;
93
+ revealMode: "instant" | "scheduled";
94
+ }
95
+ export type OrderSourceContext = OrderSourceStandard | OrderSourceAuctionWon | OrderSourceAuctionBuyNow | OrderSourceOfferAccepted | OrderSourcePreOrder | OrderSourcePrizeDraw;
8
96
  /** Manual shipping is the only supported method — sellers enter carrier + tracking directly, no carrier API integration. */
9
97
  export type ShippingMethod = "custom";
10
98
  export type RefundType = "full" | "partial";
@@ -150,6 +238,18 @@ export interface OrderDocument extends BaseDocument {
150
238
  storeName?: string;
151
239
  items?: OrderDocumentItem[];
152
240
  orderType?: OrderType;
241
+ /**
242
+ * True when this `orderType: "auction"` order came from Buy Now rather than
243
+ * from winning the bidding.
244
+ *
245
+ * Not a new `orderType` value on purpose — the /user/orders tabs key on
246
+ * `orderType`, and a buyout IS an auction order from the buyer's point of
247
+ * view. What it changes is the ADMIN review window: a buyout is settled in a
248
+ * one-hour scramble against a still-live auction, so `paymentReviewAutoApprove`
249
+ * gives an admin a full day to verify its proof instead of the usual couple of
250
+ * hours before auto-approving.
251
+ */
252
+ isBuyout?: boolean;
153
253
  imageUrls?: string[];
154
254
  quantity: number;
155
255
  unitPrice: number;
@@ -248,6 +348,37 @@ export interface OrderDocument extends BaseDocument {
248
348
  * orders are the source of truth for invoicing, refunds, and disputes.
249
349
  */
250
350
  paymentBatchId?: string;
351
+ /**
352
+ * Append-only delta log of every tracked-field change on this order —
353
+ * who, when, from what to what, and which function did it.
354
+ *
355
+ * DELTAS, never snapshots: only `statusHistory[0]` (the creation entry)
356
+ * carries a `snapshot`, holding the provenance that cannot be re-derived
357
+ * later because its sources move on — the discounts and add-ons actually
358
+ * applied and the fee breakdown at the moment of purchase.
359
+ *
360
+ * Capped at `STATUS_HISTORY_MAX` (FIFO). An unbounded array on a document
361
+ * this hot inflates every read of it (Rule #6).
362
+ */
363
+ statusHistory?: StatusChangeEntry[];
364
+ /**
365
+ * Entries dropped off the front of `statusHistory` over this order's
366
+ * lifetime. Present so the UI can say "earlier history trimmed" instead
367
+ * of implying the order simply had no earlier history.
368
+ */
369
+ statusHistoryTruncated?: number;
370
+ /**
371
+ * How the buyer acquired the right to buy, written ONCE at creation.
372
+ *
373
+ * A discriminated union rather than optional fields, because `orderType`
374
+ * cannot distinguish an auction that was WON from one that was BOUGHT OUT
375
+ * — both are `"auction"` — and `winningBidAmount`/`bidCount` are
376
+ * meaningless on a buy-now, where there are zero bids by definition.
377
+ *
378
+ * Never recomputed: a settled auction's numbers must not move when the
379
+ * auction document is later archived or the product is re-priced.
380
+ */
381
+ sourceContext?: OrderSourceContext;
251
382
  /**
252
383
  * Append-only log of refund events on this order. Multiple partial refund
253
384
  * events are allowed until the cumulative amount equals `totalPrice`.
@@ -384,6 +515,27 @@ export declare const ORDER_INDEXED_FIELDS: readonly ["userId", "productId", "sto
384
515
  export declare const DEFAULT_ORDER_DATA: Partial<OrderDocument>;
385
516
  export declare const ORDER_PUBLIC_FIELDS: readonly ["id", "productId", "productTitle", "quantity", "unitPrice", "totalPrice", "currency", "status", "paymentStatus", "shippingAddress", "trackingNumber", "notes", "orderDate", "shippingDate", "deliveryDate", "createdAt"];
386
517
  export declare const ORDER_UPDATABLE_FIELDS: readonly ["notes", "shippingAddress"];
518
+ /**
519
+ * The fields whose changes are recorded in `statusHistory`.
520
+ *
521
+ * Deliberately minimal — the timeline answers "where is my order and what
522
+ * happened to it", nothing else.
523
+ *
524
+ * **Money is NOT tracked here.** `appliedDiscounts`, `storeAddons` and the
525
+ * fee fields hold the FINAL state on the order document, and that is the
526
+ * record. Logging every intermediate coupon/add-on change would bury the five
527
+ * transitions anyone actually reads under pricing churn, and a coupon that
528
+ * was dropped before the order existed is not part of the order's history.
529
+ *
530
+ * **Acquisition is NOT tracked here either** — how the buyer got the right to
531
+ * buy (auction won, offer accepted, bought out) is written once to
532
+ * `sourceContext` at creation. It never changes, so it is not a timeline
533
+ * event.
534
+ *
535
+ * A whole-document diff would append an entry for every `updatedAt` bump —
536
+ * which is every single write — and exhaust the FIFO cap within days.
537
+ */
538
+ export declare const ORDER_TRACKED_FIELDS: readonly ["status", "paymentStatus", "paymentReviewOutcome", "trackingNumber", "cancellationReason"];
387
539
  export type OrderCreateInput = Omit<OrderDocument, "id" | "createdAt" | "updatedAt" | "orderDate">;
388
540
  export type OrderUpdateInput = Partial<Pick<OrderDocument, (typeof ORDER_UPDATABLE_FIELDS)[number]>>;
389
541
  export type OrderAdminUpdateInput = Partial<Omit<OrderDocument, "id" | "createdAt">>;
@@ -88,6 +88,36 @@ export const ORDER_PUBLIC_FIELDS = [
88
88
  "createdAt",
89
89
  ];
90
90
  export const ORDER_UPDATABLE_FIELDS = ["notes", "shippingAddress"];
91
+ /**
92
+ * The fields whose changes are recorded in `statusHistory`.
93
+ *
94
+ * Deliberately minimal — the timeline answers "where is my order and what
95
+ * happened to it", nothing else.
96
+ *
97
+ * **Money is NOT tracked here.** `appliedDiscounts`, `storeAddons` and the
98
+ * fee fields hold the FINAL state on the order document, and that is the
99
+ * record. Logging every intermediate coupon/add-on change would bury the five
100
+ * transitions anyone actually reads under pricing churn, and a coupon that
101
+ * was dropped before the order existed is not part of the order's history.
102
+ *
103
+ * **Acquisition is NOT tracked here either** — how the buyer got the right to
104
+ * buy (auction won, offer accepted, bought out) is written once to
105
+ * `sourceContext` at creation. It never changes, so it is not a timeline
106
+ * event.
107
+ *
108
+ * A whole-document diff would append an entry for every `updatedAt` bump —
109
+ * which is every single write — and exhaust the FIFO cap within days.
110
+ */
111
+ export const ORDER_TRACKED_FIELDS = [
112
+ "status",
113
+ "paymentStatus",
114
+ /** Manual-payment review: proof verified, re-upload requested, rejected. */
115
+ "paymentReviewOutcome",
116
+ /** The substance of the "shipped" transition. */
117
+ "trackingNumber",
118
+ /** Why it was cancelled — a bare "cancelled" is not a useful entry. */
119
+ "cancellationReason",
120
+ ];
91
121
  export const orderQueryHelpers = {
92
122
  byUser: (userId) => ["userId", "==", userId],
93
123
  byStore: (storeId) => ["storeId", "==", storeId],
@@ -562,14 +562,7 @@ export declare const orderFirestoreSchema: z.ZodObject<{
562
562
  platformFee?: number | undefined;
563
563
  paymentMethod?: string | undefined;
564
564
  notes?: string | undefined;
565
- storeName?: string | undefined;
566
565
  prizeRevealMode?: "scheduled" | "instant" | undefined;
567
- physicalLocation?: {
568
- zone: string;
569
- shelf: string;
570
- bin: string;
571
- } | undefined;
572
- payoutStatus?: "paid" | "eligible" | "requested" | undefined;
573
566
  paymentId?: string | undefined;
574
567
  shippingAddress?: string | undefined;
575
568
  trackingNumber?: string | undefined;
@@ -588,6 +581,7 @@ export declare const orderFirestoreSchema: z.ZodObject<{
588
581
  depositAmount?: number | undefined;
589
582
  codRemainingAmount?: number | undefined;
590
583
  shippingFee?: number | undefined;
584
+ payoutStatus?: "paid" | "eligible" | "requested" | undefined;
591
585
  payoutId?: string | undefined;
592
586
  shippingMethod?: "custom" | undefined;
593
587
  shippingCarrier?: string | undefined;
@@ -611,9 +605,13 @@ export declare const orderFirestoreSchema: z.ZodObject<{
611
605
  }, z.ZodTypeAny, "passthrough">;
612
606
  } | undefined;
613
607
  prizeDrawProductId?: string | undefined;
608
+ storeName?: string | undefined;
614
609
  couponCode?: string | undefined;
615
- emiEnabled?: boolean | undefined;
616
- emiTenureMonths?: number | undefined;
610
+ physicalLocation?: {
611
+ zone: string;
612
+ shelf: string;
613
+ bin: string;
614
+ } | undefined;
617
615
  orderType?: string | undefined;
618
616
  imageUrls?: string[] | undefined;
619
617
  refundFeeDeducted?: number | undefined;
@@ -629,6 +627,8 @@ export declare const orderFirestoreSchema: z.ZodObject<{
629
627
  couponId?: string | undefined;
630
628
  }[] | undefined;
631
629
  codHandlingFee?: number | undefined;
630
+ emiEnabled?: boolean | undefined;
631
+ emiTenureMonths?: number | undefined;
632
632
  emiTokenAmount?: number | undefined;
633
633
  emiSurchargeAmount?: number | undefined;
634
634
  emiInstallments?: {
@@ -710,14 +710,7 @@ export declare const orderFirestoreSchema: z.ZodObject<{
710
710
  platformFee?: number | undefined;
711
711
  paymentMethod?: string | undefined;
712
712
  notes?: string | undefined;
713
- storeName?: string | undefined;
714
713
  prizeRevealMode?: "scheduled" | "instant" | undefined;
715
- physicalLocation?: {
716
- zone: string;
717
- shelf: string;
718
- bin: string;
719
- } | undefined;
720
- payoutStatus?: "paid" | "eligible" | "requested" | undefined;
721
714
  paymentId?: string | undefined;
722
715
  shippingAddress?: string | undefined;
723
716
  trackingNumber?: string | undefined;
@@ -736,6 +729,7 @@ export declare const orderFirestoreSchema: z.ZodObject<{
736
729
  depositAmount?: number | undefined;
737
730
  codRemainingAmount?: number | undefined;
738
731
  shippingFee?: number | undefined;
732
+ payoutStatus?: "paid" | "eligible" | "requested" | undefined;
739
733
  payoutId?: string | undefined;
740
734
  shippingMethod?: "custom" | undefined;
741
735
  shippingCarrier?: string | undefined;
@@ -759,9 +753,13 @@ export declare const orderFirestoreSchema: z.ZodObject<{
759
753
  }, z.ZodTypeAny, "passthrough">;
760
754
  } | undefined;
761
755
  prizeDrawProductId?: string | undefined;
756
+ storeName?: string | undefined;
762
757
  couponCode?: string | undefined;
763
- emiEnabled?: boolean | undefined;
764
- emiTenureMonths?: number | undefined;
758
+ physicalLocation?: {
759
+ zone: string;
760
+ shelf: string;
761
+ bin: string;
762
+ } | undefined;
765
763
  orderType?: string | undefined;
766
764
  imageUrls?: string[] | undefined;
767
765
  refundFeeDeducted?: number | undefined;
@@ -777,6 +775,8 @@ export declare const orderFirestoreSchema: z.ZodObject<{
777
775
  couponId?: string | undefined;
778
776
  }[] | undefined;
779
777
  codHandlingFee?: number | undefined;
778
+ emiEnabled?: boolean | undefined;
779
+ emiTenureMonths?: number | undefined;
780
780
  emiTokenAmount?: number | undefined;
781
781
  emiSurchargeAmount?: number | undefined;
782
782
  emiInstallments?: {
@@ -2,7 +2,8 @@ import { type PaymentGateway, PaymentGatewayValues } from "../../payments/schema
2
2
  export { type PaymentGateway, PaymentGatewayValues };
3
3
  import type { ListingType } from "../../products/types/index";
4
4
  import type { OrderType } from "../utils/order-splitter";
5
- import type { AppliedOrderDiscount } from "../schemas/firestore";
5
+ import type { AppliedOrderDiscount, OrderSourceContext } from "../schemas/firestore";
6
+ import type { FieldChange } from "../../../_internal/shared/history/index";
6
7
  export type PaymentStatus = "pending" | "processing" | "paid" | "failed" | "refunded" | "partial_refund";
7
8
  export interface UserAddress {
8
9
  id: string;
@@ -46,12 +47,34 @@ export interface OrderItem {
46
47
  /** Snapshot of bundle.bundleProductIds at order-creation time. */
47
48
  bundleProductIds?: string[];
48
49
  }
49
- export interface OrderTimeline {
50
- status: OrderStatus;
51
- message?: string;
52
- timestamp: string;
53
- actor?: string;
50
+ /**
51
+ * One entry on an order's timeline — the client-facing shape of
52
+ * `StatusChangeEntry`, with dates as ISO strings.
53
+ *
54
+ * The previous declaration here was `{status, message?, timestamp, actor?}`
55
+ * and had **zero writers** in the entire codebase since the day it was
56
+ * added, so nothing depended on it. `OrderStatusTimeline` synthesised its
57
+ * steps from four scalar date fields instead, which meant any transition
58
+ * without a dedicated date field — payment reviewed, proof re-upload asked
59
+ * for, a partial refund posted — could not appear at all.
60
+ */
61
+ export interface OrderTimelineEntry {
62
+ at: string;
63
+ actorUid?: string;
64
+ actorRole: "buyer" | "seller" | "admin" | "system";
65
+ /**
66
+ * Delta only: `{ status: { from: "confirmed", to: "shipped" } }`.
67
+ * Reuses the primitive's `FieldChange` rather than restating the shape, so
68
+ * the client type cannot drift from what the repository writes.
69
+ */
70
+ changes: Record<string, FieldChange>;
71
+ reason?: string;
72
+ note?: string;
73
+ /** The function or job that caused it — what the timeline renders by. */
74
+ trigger: string;
54
75
  }
76
+ /** @deprecated Use {@link OrderTimelineEntry}. Kept only to avoid breaking a stale import. */
77
+ export type OrderTimeline = OrderTimelineEntry;
55
78
  export interface Order {
56
79
  id: string;
57
80
  userId: string;
@@ -108,7 +131,12 @@ export interface Order {
108
131
  /** Carrier tracking page URL — rendered as an external link that opens in a new tab. No live-tracking API integration; this is just the passthrough URL a seller/admin entered. */
109
132
  trackingUrl?: string;
110
133
  notes?: string;
111
- timeline?: OrderTimeline[];
134
+ /** Real recorded transitions — see {@link OrderTimelineEntry}. */
135
+ timeline?: OrderTimelineEntry[];
136
+ /** Entries trimmed off the front of the capped history, if any. */
137
+ timelineTruncated?: number;
138
+ /** How the buyer acquired the right to buy. Written once, at creation. */
139
+ sourceContext?: OrderSourceContext;
112
140
  physicalLocation?: {
113
141
  zone: string;
114
142
  shelf: string;