@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
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { type GenerateOfferIdInput } from "../../../utils/id-generators";
5
5
  import type { BaseDocument } from "../../../_internal/shared/types/base-document";
6
+ import type { StatusChangeEntry } from "../../../_internal/shared/history/index";
6
7
  export type OfferStatus = "pending" | "accepted" | "declined" | "countered" | "expired" | "withdrawn" | "paid";
7
8
  /** Runtime-accessible offer status values — use instead of bare string literals. */
8
9
  export declare const OfferStatusValues: {
@@ -39,7 +40,52 @@ export interface OfferDocument extends BaseDocument {
39
40
  /** Set by `markPaid` once the buyer's order exists — makes "paid" auditable. */
40
41
  paidOrderId?: string;
41
42
  paidAt?: Date;
43
+ /**
44
+ * Append-only delta log — the canonical record of when things happened to
45
+ * this offer. Shares `StatusChangeEntry` with `OrderDocument`; an offer is
46
+ * an order with more phases in front of it.
47
+ *
48
+ * `respondedAt` is deliberately kept but NOT extended: it means four
49
+ * different events (seller-accept, seller-decline, seller-counter,
50
+ * buyer-withdraw) and survives only as the legacy fallback for offers
51
+ * written before this field existed.
52
+ */
53
+ statusHistory?: StatusChangeEntry[];
54
+ /** Entries dropped off the front — so the UI never implies "this is all of it". */
55
+ statusHistoryTruncated?: number;
56
+ /**
57
+ * The multi-round chain. A counter-offer is a NEW document, so without
58
+ * these three a three-round negotiation is three unrelated records —
59
+ * which is what it is today: `previousOfferId` currently exists only
60
+ * inside a `serverLogger.info` call and never reaches Firestore.
61
+ */
62
+ previousOfferId?: string;
63
+ supersededByOfferId?: string;
64
+ /**
65
+ * Denormalised root of the chain (the root stores its own id) so a list row
66
+ * renders "Round 2" with ZERO extra reads, and `findChain` is a single-field
67
+ * equality served by the automatic index — no composite index needed.
68
+ */
69
+ chainRootOfferId?: string;
70
+ /** 1-based. Absent means round 1. */
71
+ counterRound?: number;
72
+ /**
73
+ * Admin escalation. The store keeps sole authority to accept/counter/
74
+ * decline; an admin may only cancel, with a reason, and it is recorded
75
+ * here as well as in `adminAuditLog`.
76
+ */
77
+ cancelledByAdminUid?: string;
78
+ cancelReason?: string;
42
79
  }
80
+ /**
81
+ * Fields whose changes are recorded in an offer's `statusHistory`.
82
+ *
83
+ * Excludes `buyerName`/`buyerEmail` (PII — `encryptPiiFields` never descends
84
+ * into arrays, so they would persist in plaintext inside the history),
85
+ * `buyerNote`/`sellerNote` (they ride in the entry's `note`), and
86
+ * `updatedAt`/`respondedAt` (noise that would burn the FIFO cap).
87
+ */
88
+ export declare const OFFER_TRACKED_FIELDS: readonly ["status", "offerAmount", "counterAmount", "lockedPrice", "checkoutDeadline", "paidOrderId", "supersededByOfferId", "previousOfferId"];
43
89
  export declare const OFFER_COLLECTION: "offers";
44
90
  export declare const OFFER_INDEXED_FIELDS: readonly ["buyerUid", "storeId", "productId", "status", "createdAt", "expiresAt", "checkoutDeadline"];
45
91
  export declare const OFFER_FIELDS: {
@@ -67,9 +113,17 @@ export declare const OFFER_FIELDS: {
67
113
  readonly PAID_AT: "paidAt";
68
114
  readonly CREATED_AT: "createdAt";
69
115
  readonly UPDATED_AT: "updatedAt";
116
+ readonly STATUS_HISTORY: "statusHistory";
117
+ readonly STATUS_HISTORY_TRUNCATED: "statusHistoryTruncated";
118
+ readonly PREVIOUS_OFFER_ID: "previousOfferId";
119
+ readonly SUPERSEDED_BY_OFFER_ID: "supersededByOfferId";
120
+ readonly CHAIN_ROOT_OFFER_ID: "chainRootOfferId";
121
+ readonly COUNTER_ROUND: "counterRound";
122
+ readonly CANCELLED_BY_ADMIN_UID: "cancelledByAdminUid";
123
+ readonly CANCEL_REASON: "cancelReason";
70
124
  };
71
- export type OfferCreateInput = Pick<OfferDocument, "productId" | "productTitle" | "productSlug" | "productImageUrl" | "buyerUid" | "buyerName" | "buyerEmail" | "storeId" | "storeName" | "offerAmount" | "listedPrice" | "currency" | "buyerNote">;
72
- export type OfferUpdateInput = Partial<Pick<OfferDocument, "status" | "counterAmount" | "lockedPrice" | "sellerNote" | "acceptedAt" | "checkoutDeadline" | "respondedAt" | "paidOrderId" | "paidAt" | "updatedAt">>;
125
+ export type OfferCreateInput = Pick<OfferDocument, "productId" | "productTitle" | "productSlug" | "productImageUrl" | "buyerUid" | "buyerName" | "buyerEmail" | "storeId" | "storeName" | "offerAmount" | "listedPrice" | "currency" | "buyerNote" | "previousOfferId" | "chainRootOfferId" | "counterRound">;
126
+ export type OfferUpdateInput = Partial<Pick<OfferDocument, "status" | "counterAmount" | "lockedPrice" | "sellerNote" | "acceptedAt" | "checkoutDeadline" | "respondedAt" | "paidOrderId" | "paidAt" | "updatedAt" | "statusHistory" | "statusHistoryTruncated" | "supersededByOfferId" | "cancelledByAdminUid" | "cancelReason">>;
73
127
  export declare const offerQueryHelpers: {
74
128
  readonly byBuyer: (buyerUid: string) => readonly ["buyerUid", "==", string];
75
129
  readonly byStore: (storeId: string) => readonly ["storeId", "==", string];
@@ -12,6 +12,24 @@ export const OfferStatusValues = {
12
12
  WITHDRAWN: "withdrawn",
13
13
  PAID: "paid",
14
14
  };
15
+ /**
16
+ * Fields whose changes are recorded in an offer's `statusHistory`.
17
+ *
18
+ * Excludes `buyerName`/`buyerEmail` (PII — `encryptPiiFields` never descends
19
+ * into arrays, so they would persist in plaintext inside the history),
20
+ * `buyerNote`/`sellerNote` (they ride in the entry's `note`), and
21
+ * `updatedAt`/`respondedAt` (noise that would burn the FIFO cap).
22
+ */
23
+ export const OFFER_TRACKED_FIELDS = [
24
+ "status",
25
+ "offerAmount",
26
+ "counterAmount",
27
+ "lockedPrice",
28
+ "checkoutDeadline",
29
+ "paidOrderId",
30
+ "supersededByOfferId",
31
+ "previousOfferId",
32
+ ];
15
33
  export const OFFER_COLLECTION = "offers";
16
34
  export const OFFER_INDEXED_FIELDS = [
17
35
  "buyerUid",
@@ -47,6 +65,15 @@ export const OFFER_FIELDS = {
47
65
  PAID_AT: "paidAt",
48
66
  CREATED_AT: "createdAt",
49
67
  UPDATED_AT: "updatedAt",
68
+ // Negotiation history + chain (W2)
69
+ STATUS_HISTORY: "statusHistory",
70
+ STATUS_HISTORY_TRUNCATED: "statusHistoryTruncated",
71
+ PREVIOUS_OFFER_ID: "previousOfferId",
72
+ SUPERSEDED_BY_OFFER_ID: "supersededByOfferId",
73
+ CHAIN_ROOT_OFFER_ID: "chainRootOfferId",
74
+ COUNTER_ROUND: "counterRound",
75
+ CANCELLED_BY_ADMIN_UID: "cancelledByAdminUid",
76
+ CANCEL_REASON: "cancelReason",
50
77
  };
51
78
  export const offerQueryHelpers = {
52
79
  byBuyer: (buyerUid) => ["buyerUid", "==", buyerUid],
@@ -89,8 +89,8 @@ export declare const sellerStoreSchema: z.ZodObject<{
89
89
  id: string;
90
90
  createdAt: string;
91
91
  updatedAt: string;
92
- storeName: string;
93
92
  ownerId: string;
93
+ storeName: string;
94
94
  storeSlug: string;
95
95
  isPublic: boolean;
96
96
  location?: string | undefined;
@@ -121,8 +121,8 @@ export declare const sellerStoreSchema: z.ZodObject<{
121
121
  id: string;
122
122
  createdAt: string;
123
123
  updatedAt: string;
124
- storeName: string;
125
124
  ownerId: string;
125
+ storeName: string;
126
126
  storeSlug: string;
127
127
  isPublic: boolean;
128
128
  location?: string | undefined;
@@ -10,3 +10,49 @@ export declare const counterOfferFormSchema: z.ZodObject<{
10
10
  sellerNote?: string | undefined;
11
11
  }>;
12
12
  export type CounterOfferFormValues = z.infer<typeof counterOfferFormSchema>;
13
+ /**
14
+ * Buyer-side Make-an-Offer form.
15
+ *
16
+ * A factory rather than a constant because both bounds depend on the listing:
17
+ * the floor is `minOfferAmount(listedPrice, minOfferPercent)` and the ceiling is
18
+ * the listed price itself. Both are re-checked server-side in `makeOffer` — this
19
+ * exists so the buyer is told before submitting, using the SAME
20
+ * `minOfferAmount()` the server uses, rather than a second rounding rule that
21
+ * could disagree by a rupee.
22
+ */
23
+ export declare function makeOfferFormSchema(opts: {
24
+ listedPrice: number;
25
+ minOffer: number;
26
+ formatAmount: (n: number) => string;
27
+ }): z.ZodObject<{
28
+ offerAmount: z.ZodNumber;
29
+ buyerNote: z.ZodOptional<z.ZodString>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ offerAmount: number;
32
+ buyerNote?: string | undefined;
33
+ }, {
34
+ offerAmount: number;
35
+ buyerNote?: string | undefined;
36
+ }>;
37
+ export type MakeOfferFormValues = z.infer<ReturnType<typeof makeOfferFormSchema>>;
38
+ /**
39
+ * Admin cancel-offer form.
40
+ *
41
+ * A bare confirm dialog was the wrong control here. Admin cancel is an
42
+ * escalation over the store's own authority, and it lands in three permanent
43
+ * places at once — the buyer's notification, the offer's own status history,
44
+ * and `adminAuditLog`. All three are useless without a reason, and the route
45
+ * used to accept an optional one and never read it.
46
+ *
47
+ * The 10-character floor mirrors the server schema exactly. Stating it in both
48
+ * places is deliberate: the client bound exists so the admin is told before
49
+ * submitting, not so the server can trust it.
50
+ */
51
+ export declare const cancelOfferFormSchema: z.ZodObject<{
52
+ reason: z.ZodString;
53
+ }, "strip", z.ZodTypeAny, {
54
+ reason: string;
55
+ }, {
56
+ reason: string;
57
+ }>;
58
+ export type CancelOfferFormValues = z.infer<typeof cancelOfferFormSchema>;
@@ -11,6 +11,8 @@
11
11
  *
12
12
  * EXPORTS:
13
13
  * counterOfferFormSchema, type CounterOfferFormValues
14
+ * makeOfferFormSchema, type MakeOfferFormValues
15
+ * cancelOfferFormSchema, type CancelOfferFormValues
14
16
  *
15
17
  * @tag domain:seller,offers
16
18
  * @tag layer:schema
@@ -26,3 +28,43 @@ export const counterOfferFormSchema = z.object({
26
28
  .positive("Counter amount must be greater than zero."),
27
29
  sellerNote: z.string().max(500, "Keep your note under 500 characters.").optional(),
28
30
  });
31
+ /**
32
+ * Buyer-side Make-an-Offer form.
33
+ *
34
+ * A factory rather than a constant because both bounds depend on the listing:
35
+ * the floor is `minOfferAmount(listedPrice, minOfferPercent)` and the ceiling is
36
+ * the listed price itself. Both are re-checked server-side in `makeOffer` — this
37
+ * exists so the buyer is told before submitting, using the SAME
38
+ * `minOfferAmount()` the server uses, rather than a second rounding rule that
39
+ * could disagree by a rupee.
40
+ */
41
+ export function makeOfferFormSchema(opts) {
42
+ const { listedPrice, minOffer, formatAmount } = opts;
43
+ return z.object({
44
+ offerAmount: z.coerce
45
+ .number({ invalid_type_error: "Enter an offer amount." })
46
+ .positive("Offer amount must be greater than zero.")
47
+ .min(minOffer, `Minimum offer is ${formatAmount(minOffer)}.`)
48
+ .max(listedPrice - 0.01, `Offer must be below the listed price of ${formatAmount(listedPrice)} — use Add to Cart to buy at that price.`),
49
+ buyerNote: z.string().max(300, "Keep your note under 300 characters.").optional(),
50
+ });
51
+ }
52
+ /**
53
+ * Admin cancel-offer form.
54
+ *
55
+ * A bare confirm dialog was the wrong control here. Admin cancel is an
56
+ * escalation over the store's own authority, and it lands in three permanent
57
+ * places at once — the buyer's notification, the offer's own status history,
58
+ * and `adminAuditLog`. All three are useless without a reason, and the route
59
+ * used to accept an optional one and never read it.
60
+ *
61
+ * The 10-character floor mirrors the server schema exactly. Stating it in both
62
+ * places is deliberate: the client bound exists so the admin is told before
63
+ * submitting, not so the server can trust it.
64
+ */
65
+ export const cancelOfferFormSchema = z.object({
66
+ reason: z
67
+ .string()
68
+ .min(10, "Give a reason of at least 10 characters — the buyer sees this.")
69
+ .max(300, "Keep the reason under 300 characters."),
70
+ });
@@ -8,4 +8,3 @@ export { OfferRepository, offerRepository, } from "./repository/offer.repository
8
8
  export { GET as sellerProductsGET } from "./api/products/route";
9
9
  export { GET as sellerStoreGET } from "./api/store/route";
10
10
  export { GET as sellerCouponsGET } from "./api/coupons/route";
11
- export { GET as sellerOffersGET } from "./api/offers/route";
@@ -8,4 +8,3 @@ export { OfferRepository, offerRepository, } from "./repository/offer.repository
8
8
  export { GET as sellerProductsGET } from "./api/products/route";
9
9
  export { GET as sellerStoreGET } from "./api/store/route";
10
10
  export { GET as sellerCouponsGET } from "./api/coupons/route";
11
- export { GET as sellerOffersGET } from "./api/offers/route";
@@ -0,0 +1,99 @@
1
+ import { type ReactNode } from "react";
2
+ import type { JsonValue } from "@mohasinac/appkit/client";
3
+ import type { ZodTypeAny } from "zod";
4
+ import type { FormShellStep } from "../../ui/forms/FormShell";
5
+ /**
6
+ * A collapsible form segment. Replaces `StepDef` — the differences are the
7
+ * point, not incidental:
8
+ *
9
+ * - there is no `goNext` gate, so a section can never block access to a
10
+ * later one. Everything is reachable at all times;
11
+ * - `required` sections sort first and open on mount;
12
+ * - one shared submit at the bottom, never per-section.
13
+ */
14
+ export interface SectionDef<T extends object = Record<string, JsonValue>> {
15
+ /** Stable, URL-safe. Becomes the `?section=` value and the DOM anchor id. */
16
+ id: string;
17
+ label: string;
18
+ /** Longer heading for the open panel. Defaults to `label`. */
19
+ heading?: string;
20
+ /**
21
+ * Mandatory section: sorted first, open on mount, and its header renders
22
+ * without a collapse control so it can't be hidden.
23
+ */
24
+ required?: boolean;
25
+ /**
26
+ * This section's fields belong to quick mode. Consumed by
27
+ * `deriveQuickFields` in `entity-form.ts`, not by SectionForm itself.
28
+ */
29
+ quick?: boolean;
30
+ /**
31
+ * Keep the panel mounted while collapsed. Set on any section holding
32
+ * uncommitted state — media uploads, rich-text buffers. See
33
+ * `CollapsibleSection.keepMounted`.
34
+ */
35
+ keepMounted?: boolean;
36
+ render: (props: {
37
+ values: T;
38
+ onChange: (partial: Partial<T>) => void;
39
+ errors: Record<string, string>;
40
+ }) => ReactNode;
41
+ /**
42
+ * Schema field names this section owns — drives error→section attribution
43
+ * so `<FormErrorSummary>` can offer a jump link.
44
+ */
45
+ fields?: string[];
46
+ /** Per-section schema. Falls back to `schema`, then `FormSchemaContext`. */
47
+ schema?: ZodTypeAny;
48
+ /** Hide the section entirely (conditional per-type sections). */
49
+ when?: (values: T) => boolean;
50
+ }
51
+ export interface SectionFormProps<T extends object = Record<string, JsonValue>> {
52
+ sections: SectionDef<T>[];
53
+ values: T;
54
+ onChange: (partial: Partial<T>) => void;
55
+ onSubmit: () => void | Promise<void>;
56
+ submitLabel?: string;
57
+ isLoading?: boolean;
58
+ /** Whole-form schema for sections that don't declare their own. */
59
+ schema?: ZodTypeAny;
60
+ /** Controlled open set. Omit to let SectionForm own it. */
61
+ openIds?: string[];
62
+ onOpenChange?: (ids: string[]) => void;
63
+ /** `"single"` = accordion. Default `"multi"` — independent sections. */
64
+ expandMode?: "single" | "multi";
65
+ /** Suppress the built-in submit row (a FormShell footer owns it instead). */
66
+ hideActions?: boolean;
67
+ /**
68
+ * Fires whenever live validation recomputes. SectionForm deliberately does
69
+ * NOT mount its own `FormShellContext.Provider` — the owning view keeps the
70
+ * single provider and composes these in, exactly as StepForm did, so a
71
+ * second provider can never shadow the real one.
72
+ */
73
+ onValidationChange?: (fieldErrors: Record<string, string>, fieldToSectionIndex: Record<string, number>) => void;
74
+ }
75
+ /** Sections in render order: required first, original order preserved within each group. */
76
+ export declare function orderSections<T extends object>(sections: SectionDef<T>[]): SectionDef<T>[];
77
+ /** `fieldName -> index into the ORDERED section list`. */
78
+ export declare function buildFieldToSectionIndex<T extends object>(ordered: SectionDef<T>[]): Record<string, number>;
79
+ export interface UseSectionFormNavResult<T extends object> {
80
+ /** Sections in render order — required first. */
81
+ ordered: SectionDef<T>[];
82
+ openIds: string[];
83
+ setOpenIds: (ids: string[]) => void;
84
+ /** Expand section `index`, then scroll it into view. */
85
+ goToSection: (index: number) => void;
86
+ fieldToSectionIndex: Record<string, number>;
87
+ /** Descriptors for `useFormShellState`'s `nav.sections`. */
88
+ sectionMeta: FormShellStep[];
89
+ }
90
+ /**
91
+ * Navigation state for a `<SectionForm>`. Feed `sectionMeta`/`goToSection`/
92
+ * `fieldToSectionIndex` into `useFormShellState(schema, nav)` and `openIds`
93
+ * back into `<SectionForm>`.
94
+ */
95
+ export declare function useSectionFormNav<T extends object = Record<string, JsonValue>>(sections: SectionDef<T>[], values?: T): UseSectionFormNavResult<T>;
96
+ /** DOM id for a section panel — kept in one place so nav and render agree. */
97
+ export declare function sectionAnchorId(id: string): string;
98
+ export declare function SectionForm<T extends object = Record<string, JsonValue>>({ sections, values, onChange, onSubmit, submitLabel, isLoading, schema, openIds: controlledOpenIds, onOpenChange, expandMode, hideActions, onValidationChange, }: SectionFormProps<T>): import("react").JSX.Element;
99
+ export default SectionForm;
@@ -0,0 +1,128 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
4
+ import { Button } from "../../ui/components/Button";
5
+ import { CollapsibleSection } from "../../ui/components/CollapsibleSection";
6
+ import { Badge } from "../../ui/components/Badge";
7
+ import { Row, Span, Stack } from "../../ui";
8
+ import { FormSchemaContext } from "./FormShell";
9
+ /** Sections in render order: required first, original order preserved within each group. */
10
+ export function orderSections(sections) {
11
+ return [...sections.filter((s) => s.required), ...sections.filter((s) => !s.required)];
12
+ }
13
+ /** `fieldName -> index into the ORDERED section list`. */
14
+ export function buildFieldToSectionIndex(ordered) {
15
+ const map = {};
16
+ ordered.forEach((section, i) => {
17
+ section.fields?.forEach((field) => { map[field] = i; });
18
+ });
19
+ return map;
20
+ }
21
+ /**
22
+ * Navigation state for a `<SectionForm>`. Feed `sectionMeta`/`goToSection`/
23
+ * `fieldToSectionIndex` into `useFormShellState(schema, nav)` and `openIds`
24
+ * back into `<SectionForm>`.
25
+ */
26
+ export function useSectionFormNav(sections, values) {
27
+ const ordered = useMemo(() => {
28
+ const visible = values
29
+ ? sections.filter((s) => (s.when ? s.when(values) : true))
30
+ : sections;
31
+ return orderSections(visible);
32
+ }, [sections, values]);
33
+ const [openIds, setOpenIds] = useState(() => orderSections(sections).filter((s) => s.required).map((s) => s.id));
34
+ const fieldToSectionIndex = useMemo(() => buildFieldToSectionIndex(ordered), [ordered]);
35
+ const sectionMeta = useMemo(() => ordered.map((s) => ({ id: s.id, label: s.label, requiredFields: s.fields })), [ordered]);
36
+ const goToSection = useCallback((index) => {
37
+ const target = ordered[index];
38
+ if (!target)
39
+ return;
40
+ setOpenIds((prev) => (prev.includes(target.id) ? prev : [...prev, target.id]));
41
+ // The panel must MOUNT before it can be scrolled to — expanding is a state
42
+ // update, so defer a frame. Without this the scroll lands on a zero-height
43
+ // collapsed header and the offending field stays off-screen.
44
+ requestAnimationFrame(() => {
45
+ const el = document.getElementById(sectionAnchorId(target.id));
46
+ el?.scrollIntoView({ behavior: "smooth", block: "start" });
47
+ el?.querySelector("[aria-invalid='true']")?.focus();
48
+ });
49
+ }, [ordered]);
50
+ return { ordered, openIds, setOpenIds, goToSection, fieldToSectionIndex, sectionMeta };
51
+ }
52
+ /** DOM id for a section panel — kept in one place so nav and render agree. */
53
+ export function sectionAnchorId(id) {
54
+ return `section-${id}`;
55
+ }
56
+ export function SectionForm({ sections, values, onChange, onSubmit, submitLabel = "Save", isLoading = false, schema, openIds: controlledOpenIds, onOpenChange, expandMode = "multi", hideActions = false, onValidationChange, }) {
57
+ const inheritedSchema = useContext(FormSchemaContext);
58
+ const [fieldErrors, setFieldErrors] = useState({});
59
+ const [uncontrolledOpenIds, setUncontrolledOpenIds] = useState(() => orderSections(sections).filter((s) => s.required).map((s) => s.id));
60
+ const ordered = useMemo(() => orderSections(sections.filter((s) => (s.when ? s.when(values) : true))), [sections, values]);
61
+ const openIds = controlledOpenIds ?? uncontrolledOpenIds;
62
+ const setOpenIds = useCallback((ids) => {
63
+ if (!controlledOpenIds)
64
+ setUncontrolledOpenIds(ids);
65
+ onOpenChange?.(ids);
66
+ }, [controlledOpenIds, onOpenChange]);
67
+ const fieldToSectionIndex = useMemo(() => buildFieldToSectionIndex(ordered), [ordered]);
68
+ // Keep the latest callback without making runValidation depend on it — the
69
+ // caller usually passes an inline arrow, which would otherwise rebuild the
70
+ // validator on every render and re-fire the effect below in a loop.
71
+ const onValidationChangeRef = useRef(onValidationChange);
72
+ onValidationChangeRef.current = onValidationChange;
73
+ const runValidation = useCallback((nextValues) => {
74
+ const activeSchema = schema ?? inheritedSchema;
75
+ if (!activeSchema)
76
+ return;
77
+ // audit-unvalidated-safeparse-ok: bulk-replaces fieldErrors from the full
78
+ // parse result so a field that just became valid is cleared — which
79
+ // applyZodIssues' incremental setFieldError-per-issue cannot do.
80
+ const parsed = activeSchema.safeParse(nextValues);
81
+ if (parsed.success) {
82
+ setFieldErrors({});
83
+ onValidationChangeRef.current?.({}, fieldToSectionIndex);
84
+ return;
85
+ }
86
+ const next = {};
87
+ for (const issue of parsed.error.issues) {
88
+ if (!issue.path || issue.path.length === 0)
89
+ continue;
90
+ next[issue.path.map(String).join(".")] = issue.message;
91
+ }
92
+ setFieldErrors(next);
93
+ onValidationChangeRef.current?.(next, fieldToSectionIndex);
94
+ }, [schema, inheritedSchema, fieldToSectionIndex]);
95
+ useEffect(() => {
96
+ runValidation(values);
97
+ // eslint-disable-next-line react-hooks/exhaustive-deps
98
+ }, [schema, inheritedSchema, fieldToSectionIndex]);
99
+ const handleFieldChange = useCallback((partial) => {
100
+ onChange(partial);
101
+ runValidation({ ...values, ...partial });
102
+ }, [values, onChange, runValidation]);
103
+ const toggle = useCallback((id) => {
104
+ const isOpen = openIds.includes(id);
105
+ if (expandMode === "single") {
106
+ setOpenIds(isOpen ? [] : [id]);
107
+ return;
108
+ }
109
+ setOpenIds(isOpen ? openIds.filter((x) => x !== id) : [...openIds, id]);
110
+ }, [openIds, expandMode, setOpenIds]);
111
+ const errorCountFor = useCallback((section) => {
112
+ if (!section.fields?.length)
113
+ return 0;
114
+ return section.fields.filter((f) => Object.keys(fieldErrors).some((k) => k === f || k.startsWith(`${f}.`))).length;
115
+ }, [fieldErrors]);
116
+ return (_jsxs(Stack, { gap: "md", children: [ordered.map((section) => {
117
+ const isRequired = section.required === true;
118
+ // A required section is always open — it holds the fields without
119
+ // which the record cannot be saved, so hiding it is never useful.
120
+ const isCollapsed = isRequired ? false : !openIds.includes(section.id);
121
+ const errorCount = errorCountFor(section);
122
+ return (_jsx(CollapsibleSection, { id: sectionAnchorId(section.id), title: _jsxs(Row, { align: "center", gap: "xs", children: [_jsx(Span, { weight: "semibold", size: "sm", children: section.heading ?? section.label }), isRequired && _jsx(Span, { size: "xs", color: "muted", children: "Required" })] }), isCollapsed: isCollapsed, onToggle: () => { if (!isRequired)
123
+ toggle(section.id); }, keepMounted: section.keepMounted, renderHeaderExtra: errorCount > 0
124
+ ? () => (_jsxs(Badge, { variant: "danger", children: [errorCount, " ", errorCount === 1 ? "issue" : "issues"] }))
125
+ : undefined, children: section.render({ values, onChange: handleFieldChange, errors: fieldErrors }) }, section.id));
126
+ }), !hideActions && (_jsx(Row, { justify: "end", paddingY: "y-sm", children: _jsx(Button, { variant: "primary", type: "submit", onClick: () => void onSubmit(), isLoading: isLoading, disabled: isLoading, children: submitLabel }) }))] }));
127
+ }
128
+ export default SectionForm;
@@ -0,0 +1,63 @@
1
+ import { type ReactNode } from "react";
2
+ import type { ZodTypeAny } from "zod";
3
+ import type { SectionDef } from "./SectionForm";
4
+ import { type FieldUiMeta } from "./field-ui-meta";
5
+ /** One field, resolved: its name, its schema, and its final metadata. */
6
+ export interface ResolvedField {
7
+ name: string;
8
+ schema: ZodTypeAny;
9
+ meta: FieldUiMeta;
10
+ required: boolean;
11
+ }
12
+ /** Per-field JSX override. Receives everything the derived control would get. */
13
+ export type FieldRenderer<T extends object> = (props: {
14
+ field: ResolvedField;
15
+ values: T;
16
+ onChange: (partial: Partial<T>) => void;
17
+ errors: Record<string, string>;
18
+ }) => ReactNode;
19
+ export interface BuildSectionsOptions<T extends object> {
20
+ /** Per-field JSX overrides, keyed by field name. */
21
+ renderers?: Record<string, FieldRenderer<T>>;
22
+ /** Option lists for `kind: "select"` fields that aren't Zod enums. */
23
+ options?: Record<string, {
24
+ value: string;
25
+ label: string;
26
+ }[]>;
27
+ /** Section id → label, when no field declared `sectionLabel`. */
28
+ sectionLabels?: Record<string, string>;
29
+ /**
30
+ * Section ids in the order they should appear. Sections not listed follow,
31
+ * in first-declaration order. `sectionRequired` still sorts first regardless.
32
+ */
33
+ sectionOrder?: string[];
34
+ }
35
+ /**
36
+ * Resolve every field in a schema's shape.
37
+ *
38
+ * Fields with no registration are still returned, carrying inferred metadata
39
+ * and a `section` of `""`. Dropping them silently would hide the exact defect
40
+ * `audit-field-ui-meta` is meant to report — an unregistered field, or one
41
+ * whose `.register()` was not the last call in the chain and was therefore
42
+ * discarded by a subsequent `.optional()`.
43
+ */
44
+ export declare function resolveFields(schema: ZodTypeAny): ResolvedField[];
45
+ /** Group resolved fields by section, preserving declaration order within each. */
46
+ export declare function groupFieldsBySection(fields: ResolvedField[]): Map<string, ResolvedField[]>;
47
+ /**
48
+ * Pack consecutive fields into rows by their span.
49
+ *
50
+ * A `full` field always breaks the current row — that is what stops a media
51
+ * upload or a textarea being squeezed alongside a short input. Mixed spans
52
+ * start a new row too, rather than being crammed together: two `pair` fields
53
+ * make a clean 2-up, a `pair` next to a `quarter` makes neither.
54
+ */
55
+ export declare function packRows(fields: ResolvedField[]): ResolvedField[][];
56
+ /**
57
+ * Build the `SectionDef[]` a `<SectionForm>` renders.
58
+ *
59
+ * Section order: `sectionRequired` first (there is normally exactly one — the
60
+ * fields without which the record cannot be saved), then `sectionOrder`, then
61
+ * first-declaration order.
62
+ */
63
+ export declare function buildSectionsFromSchema<T extends object>(schema: ZodTypeAny, opts?: BuildSectionsOptions<T>): SectionDef<T>[];