@mohasinac/appkit 4.30.18 → 4.31.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 (557) hide show
  1. package/dist/_internal/client/features/digital-code/CodeRevealPanel.js +5 -2
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +3 -3
  3. package/dist/_internal/client/features/layout/useSidebarSearch.d.ts +21 -5
  4. package/dist/_internal/client/features/layout/useSidebarSearch.js +27 -6
  5. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +23 -3
  6. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +106 -86
  7. package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
  8. package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
  9. package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +5 -2
  10. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +11 -3
  11. package/dist/_internal/client/hand-mode/HandModeProvider.js +2 -0
  12. package/dist/_internal/server/features/auctions/actions.js +14 -3
  13. package/dist/_internal/server/features/auctions/service.js +1 -1
  14. package/dist/_internal/server/features/auth/permissions.d.ts +2 -0
  15. package/dist/_internal/server/features/auth/permissions.js +3 -2
  16. package/dist/_internal/server/features/blog/data.js +2 -2
  17. package/dist/_internal/server/features/blog/service.js +3 -3
  18. package/dist/_internal/server/features/brands/data.js +1 -1
  19. package/dist/_internal/server/features/brands/service.js +3 -3
  20. package/dist/_internal/server/features/bundles/actions.js +6 -1
  21. package/dist/_internal/server/features/bundles/data.js +21 -4
  22. package/dist/_internal/server/features/cart/data.js +3 -1
  23. package/dist/_internal/server/features/cart/service.js +13 -2
  24. package/dist/_internal/server/features/categories/data.js +26 -6
  25. package/dist/_internal/server/features/classified/index.d.ts +0 -1
  26. package/dist/_internal/server/features/classified/index.js +0 -1
  27. package/dist/_internal/server/features/digital-code/index.d.ts +0 -1
  28. package/dist/_internal/server/features/digital-code/index.js +0 -1
  29. package/dist/_internal/server/features/events/actions.js +17 -4
  30. package/dist/_internal/server/features/events/data.js +1 -1
  31. package/dist/_internal/server/features/events/service.js +1 -1
  32. package/dist/_internal/server/features/grouped/data.js +7 -2
  33. package/dist/_internal/server/features/item-requests/data.js +1 -1
  34. package/dist/_internal/server/features/live/index.d.ts +0 -1
  35. package/dist/_internal/server/features/live/index.js +0 -1
  36. package/dist/_internal/server/features/lottery/actions.js +2 -2
  37. package/dist/_internal/server/features/lottery/data.js +1 -1
  38. package/dist/_internal/server/features/orders/actions.js +7 -7
  39. package/dist/_internal/server/features/orders/data.d.ts +1 -1
  40. package/dist/_internal/server/features/orders/data.js +14 -2
  41. package/dist/_internal/server/features/orders/service.js +1 -1
  42. package/dist/_internal/server/features/pre-orders/service.js +1 -1
  43. package/dist/_internal/server/features/prize-draws/actions.js +1 -1
  44. package/dist/_internal/server/features/products/data.js +21 -6
  45. package/dist/_internal/server/features/products/list-public.d.ts +9 -0
  46. package/dist/_internal/server/features/products/list-public.js +95 -7
  47. package/dist/_internal/server/features/products/service.js +1 -1
  48. package/dist/_internal/server/features/promotions/actions.js +1 -1
  49. package/dist/_internal/server/features/promotions/data.js +1 -1
  50. package/dist/_internal/server/features/promotions/service.js +1 -1
  51. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  52. package/dist/_internal/server/features/reviews/data.js +6 -1
  53. package/dist/_internal/server/features/reviews/og-data.js +1 -1
  54. package/dist/_internal/server/features/shared/listing-data-factory.js +7 -2
  55. package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
  56. package/dist/_internal/server/features/site-settings/adapters.js +8 -5
  57. package/dist/_internal/server/features/stores/data.js +1 -1
  58. package/dist/_internal/server/features/sublisting-categories/data.js +1 -1
  59. package/dist/_internal/server/features/tester/visibility.d.ts +2 -1
  60. package/dist/_internal/server/features/tester/visibility.js +2 -2
  61. package/dist/_internal/server/functions/scheduled.d.ts +3 -1
  62. package/dist/_internal/server/functions/scheduled.js +27 -1
  63. package/dist/_internal/server/jobs/core/auctionSettlement.js +6 -1
  64. package/dist/_internal/server/jobs/core/hardBanCascade.js +4 -0
  65. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  66. package/dist/_internal/server/jobs/core/index.js +2 -0
  67. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +7 -15
  68. package/dist/_internal/server/jobs/core/pageViewPrune.d.ts +10 -0
  69. package/dist/_internal/server/jobs/core/pageViewPrune.js +44 -0
  70. package/dist/_internal/server/jobs/core/pageViewRollup.d.ts +2 -0
  71. package/dist/_internal/server/jobs/core/pageViewRollup.js +87 -0
  72. package/dist/_internal/server/jobs/core/revenueRollup.js +7 -1
  73. package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
  74. package/dist/_internal/server/jobs/handlers/index.js +2 -0
  75. package/dist/_internal/server/jobs/handlers/pageViewPrune.d.ts +2 -0
  76. package/dist/_internal/server/jobs/handlers/pageViewPrune.js +2 -0
  77. package/dist/_internal/server/jobs/handlers/pageViewRollup.d.ts +2 -0
  78. package/dist/_internal/server/jobs/handlers/pageViewRollup.js +2 -0
  79. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  80. package/dist/_internal/shared/actions/action-registry.js +69 -22
  81. package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -4
  82. package/dist/_internal/shared/checkout/rules/classified.rule.js +7 -2
  83. package/dist/_internal/shared/features/layout/matchesNavQuery.d.ts +14 -0
  84. package/dist/_internal/shared/features/layout/matchesNavQuery.js +72 -0
  85. package/dist/_internal/shared/features/layout/types.d.ts +37 -1
  86. package/dist/_internal/shared/features/layout/types.js +19 -1
  87. package/dist/_internal/shared/features/notifications/action-url.d.ts +9 -1
  88. package/dist/_internal/shared/features/notifications/action-url.js +47 -0
  89. package/dist/_internal/shared/features/offers/config.d.ts +65 -0
  90. package/dist/_internal/shared/features/offers/config.js +73 -2
  91. package/dist/_internal/shared/features/orders/schema.d.ts +19 -1
  92. package/dist/_internal/shared/features/orders/schema.js +22 -2
  93. package/dist/_internal/shared/features/site-settings/types.d.ts +12 -3
  94. package/dist/_internal/shared/listing-types/capabilities.d.ts +8 -2
  95. package/dist/_internal/shared/listing-types/capabilities.js +6 -1
  96. package/dist/_internal/shared/listing-types/classified/ctas.js +6 -1
  97. package/dist/_internal/shared/listing-types/feature-flags.d.ts +10 -5
  98. package/dist/_internal/shared/listing-types/feature-flags.js +11 -6
  99. package/dist/client/api/useApiQuery.js +17 -6
  100. package/dist/client.d.ts +38 -20
  101. package/dist/client.js +39 -14
  102. package/dist/configs/next.js +10 -2
  103. package/dist/constants/api-endpoints.d.ts +18 -54
  104. package/dist/constants/api-endpoints.js +6 -26
  105. package/dist/constants/field-names.d.ts +6 -24
  106. package/dist/constants/field-names.js +10 -27
  107. package/dist/constants/geo/countries.d.ts +50 -0
  108. package/dist/constants/geo/countries.js +129 -0
  109. package/dist/constants/geo/subdivisions.d.ts +13 -0
  110. package/dist/constants/geo/subdivisions.js +104 -0
  111. package/dist/constants/index.d.ts +2 -2
  112. package/dist/constants/index.js +2 -2
  113. package/dist/constants/table-keys.d.ts +24 -0
  114. package/dist/constants/table-keys.js +28 -0
  115. package/dist/contracts/client-realtime.d.ts +6 -0
  116. package/dist/contracts/extend.d.ts +0 -9
  117. package/dist/contracts/index.d.ts +1 -1
  118. package/dist/contracts/realtime-session.d.ts +12 -12
  119. package/dist/contracts/realtime-session.js +79 -77
  120. package/dist/core/browser.d.ts +1 -1
  121. package/dist/core/browser.js +1 -1
  122. package/dist/core/index.d.ts +1 -1
  123. package/dist/core/index.js +1 -1
  124. package/dist/core/site-config.d.ts +0 -3
  125. package/dist/core/site-config.js +0 -3
  126. package/dist/errors/index.d.ts +1 -1
  127. package/dist/errors/index.js +1 -1
  128. package/dist/errors/messages.d.ts +0 -8
  129. package/dist/errors/messages.js +0 -9
  130. package/dist/features/about/components/DeveloperView.js +7 -2
  131. package/dist/features/about/components/PolicyPageView.js +9 -1
  132. package/dist/features/about/components/PublicProfileView.js +23 -5
  133. package/dist/features/about/schemas/index.d.ts +8 -8
  134. package/dist/features/account/components/AddressFilters.js +32 -11
  135. package/dist/features/account/components/AddressForm.d.ts +26 -25
  136. package/dist/features/account/components/AddressForm.js +81 -103
  137. package/dist/features/account/components/AddressesIndexListing.js +8 -4
  138. package/dist/features/account/components/NotificationBell.js +4 -3
  139. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  140. package/dist/features/account/components/UserOffersPanel.js +1 -1
  141. package/dist/features/account/components/UserSidebar.d.ts +3 -4
  142. package/dist/features/account/components/UserSupportView.js +89 -58
  143. package/dist/features/account/components/index.d.ts +1 -7
  144. package/dist/features/account/components/index.js +0 -3
  145. package/dist/features/account/hooks/useAddresses.d.ts +4 -3
  146. package/dist/features/account/hooks/useAddresses.js +4 -6
  147. package/dist/features/account/hooks/useCollapsedSections.d.ts +51 -10
  148. package/dist/features/account/hooks/useCollapsedSections.js +211 -38
  149. package/dist/features/account/hooks/useProfile.d.ts +8 -0
  150. package/dist/features/account/index.d.ts +0 -3
  151. package/dist/features/account/index.js +0 -3
  152. package/dist/features/account/schemas/index.d.ts +0 -92
  153. package/dist/features/account/schemas/index.js +42 -20
  154. package/dist/features/addresses/components/AddressLocationFields.d.ts +13 -0
  155. package/dist/features/addresses/components/AddressLocationFields.js +41 -0
  156. package/dist/features/addresses/hooks/usePostalLookup.d.ts +17 -0
  157. package/dist/features/addresses/hooks/usePostalLookup.js +133 -0
  158. package/dist/features/addresses/schemas/address-form.d.ts +423 -0
  159. package/dist/features/addresses/schemas/address-form.js +212 -0
  160. package/dist/features/addresses/schemas/index.d.ts +1 -0
  161. package/dist/features/addresses/schemas/index.js +8 -0
  162. package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
  163. package/dist/features/admin/actions/index.d.ts +0 -1
  164. package/dist/features/admin/actions/index.js +0 -1
  165. package/dist/features/admin/actions/notification-actions.js +1 -41
  166. package/dist/features/admin/components/AdminActionIndexView.d.ts +32 -0
  167. package/dist/features/admin/components/AdminActionIndexView.js +128 -0
  168. package/dist/features/admin/components/AdminAdEditorView.js +159 -163
  169. package/dist/features/admin/components/AdminAddressEditorView.js +97 -55
  170. package/dist/features/admin/components/AdminBrandEditorView.d.ts +15 -0
  171. package/dist/features/admin/components/AdminBrandEditorView.js +113 -77
  172. package/dist/features/admin/components/AdminBundleEditorView.d.ts +19 -9
  173. package/dist/features/admin/components/AdminBundleEditorView.js +136 -168
  174. package/dist/features/admin/components/AdminCategoryEditorView.js +120 -43
  175. package/dist/features/admin/components/AdminCouponEditorView.js +145 -109
  176. package/dist/features/admin/components/AdminEmployeeEditorView.js +125 -56
  177. package/dist/features/admin/components/AdminFaqEditorView.js +112 -58
  178. package/dist/features/admin/components/AdminFeatureEditorView.js +108 -68
  179. package/dist/features/admin/components/AdminFulfillmentView.js +5 -2
  180. package/dist/features/admin/components/AdminMediaView.js +3 -3
  181. package/dist/features/admin/components/AdminNavEditorView.js +69 -44
  182. package/dist/features/admin/components/AdminOrderEditorView.js +47 -10
  183. package/dist/features/admin/components/AdminPrizeDrawsView.js +16 -2
  184. package/dist/features/admin/components/AdminSidebar.d.ts +11 -7
  185. package/dist/features/admin/components/AdminSiteSettingsView.js +37 -37
  186. package/dist/features/admin/components/AdminStoreEditorView.js +75 -52
  187. package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +71 -30
  188. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +95 -65
  189. package/dist/features/admin/components/BrandQuickCreateForm.d.ts +10 -0
  190. package/dist/features/admin/components/BrandQuickCreateForm.js +49 -26
  191. package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +11 -0
  192. package/dist/features/admin/components/CategoryQuickCreateForm.js +48 -26
  193. package/dist/features/admin/components/index.d.ts +2 -2
  194. package/dist/features/admin/components/index.js +1 -1
  195. package/dist/features/admin/constants/site-settings-tabs.d.ts +120 -0
  196. package/dist/features/admin/constants/site-settings-tabs.js +152 -0
  197. package/dist/features/admin/index.d.ts +0 -3
  198. package/dist/features/admin/index.js +0 -2
  199. package/dist/features/admin/repository/analytics-rollup.repository.d.ts +35 -0
  200. package/dist/features/admin/repository/analytics-rollup.repository.js +30 -0
  201. package/dist/features/admin/schemas/admin-editor-forms.d.ts +56 -57
  202. package/dist/features/admin/schemas/admin-editor-forms.js +97 -54
  203. package/dist/features/admin/schemas/admin-ops-forms.d.ts +57 -5
  204. package/dist/features/admin/schemas/admin-ops-forms.js +104 -20
  205. package/dist/features/admin/schemas/admin-user-form.js +7 -0
  206. package/dist/features/admin/schemas/firestore.d.ts +48 -95
  207. package/dist/features/admin/schemas/firestore.js +15 -151
  208. package/dist/features/admin/schemas/nav-item-form.js +9 -2
  209. package/dist/features/admin/server.d.ts +0 -4
  210. package/dist/features/admin/server.js +0 -2
  211. package/dist/features/admin/types/index.d.ts +0 -7
  212. package/dist/features/analytics/repository/page-views.repository.d.ts +14 -0
  213. package/dist/features/analytics/repository/page-views.repository.js +24 -0
  214. package/dist/features/analytics/types.d.ts +1 -1
  215. package/dist/features/analytics/types.js +13 -0
  216. package/dist/features/auctions/components/AuctionDetailPageView.js +6 -2
  217. package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -1
  218. package/dist/features/auth/actions/index.d.ts +0 -1
  219. package/dist/features/auth/actions/index.js +0 -1
  220. package/dist/features/auth/actions/profile-actions.js +4 -3
  221. package/dist/features/auth/actions/realtime-token-actions.js +1 -12
  222. package/dist/features/auth/auth-helpers.js +5 -7
  223. package/dist/features/auth/components/ForgotPasswordView.js +1 -1
  224. package/dist/features/auth/components/Guards.js +2 -1
  225. package/dist/features/auth/components/LoginForm.d.ts +0 -2
  226. package/dist/features/auth/components/LoginForm.js +2 -4
  227. package/dist/features/auth/components/RegisterForm.js +62 -19
  228. package/dist/features/auth/components/ResetPasswordView.js +1 -1
  229. package/dist/features/auth/hooks/useAuth.js +3 -0
  230. package/dist/features/auth/permissions/constants.d.ts +27 -1
  231. package/dist/features/auth/role-predicates.d.ts +75 -7
  232. package/dist/features/auth/role-predicates.js +28 -2
  233. package/dist/features/auth/schemas/firestore.d.ts +22 -0
  234. package/dist/features/auth/schemas/index.d.ts +1 -1
  235. package/dist/features/auth/schemas/index.js +44 -8
  236. package/dist/features/auth/types/index.d.ts +14 -1
  237. package/dist/features/blog/api/route.js +10 -2
  238. package/dist/features/blog/components/BlogIndexListing.js +1 -1
  239. package/dist/features/blog/hooks/useBlog.js +2 -2
  240. package/dist/features/blog/repository/blog.repository.js +3 -1
  241. package/dist/features/blog/schemas/index.d.ts +4 -0
  242. package/dist/features/blog/schemas/index.js +2 -0
  243. package/dist/features/blog/types/index.d.ts +1 -1
  244. package/dist/features/cart/actions/cart-actions.js +13 -4
  245. package/dist/features/cart/utils/pending-ops.js +1 -1
  246. package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +22 -0
  247. package/dist/features/catalogue/components/CatalogueItemEditorView.js +112 -52
  248. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  249. package/dist/features/catalogue/schemas/validation.js +47 -10
  250. package/dist/features/categories/components/BrandDetailPageView.js +28 -12
  251. package/dist/features/categories/components/CategoryDetailPageView.js +37 -20
  252. package/dist/features/categories/repository/categories.repository.js +3 -1
  253. package/dist/features/categories/schemas/bundle-form.d.ts +142 -0
  254. package/dist/features/categories/schemas/bundle-form.js +149 -0
  255. package/dist/features/checkout/actions/checkout-value-otp-actions.js +10 -1
  256. package/dist/features/classified/components/ClassifiedContactSellerPanel.js +1 -1
  257. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
  258. package/dist/features/classified/components/ClassifiedDetailPageView.js +47 -18
  259. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  260. package/dist/features/consultation/schemas/index.js +34 -10
  261. package/dist/features/corporate/schemas/index.js +36 -15
  262. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -1
  263. package/dist/features/events/components/EventBanner.js +5 -2
  264. package/dist/features/events/components/EventOfferCard.js +3 -1
  265. package/dist/features/events/components/EventPollWidget.js +1 -1
  266. package/dist/features/events/components/SpinWheelView.js +3 -2
  267. package/dist/features/filters/FilterPanel.js +3 -3
  268. package/dist/features/filters/RangeFilter.d.ts +10 -0
  269. package/dist/features/filters/RangeFilter.js +41 -4
  270. package/dist/features/grouped/components/GroupedListingEditorView.js +2 -1
  271. package/dist/features/history/hooks/useHistory.js +29 -27
  272. package/dist/features/homepage/components/AdSlot.js +3 -1
  273. package/dist/features/homepage/components/GoogleReviewsSection.js +8 -2
  274. package/dist/features/homepage/components/MarketplaceHomepageView.js +58 -15
  275. package/dist/features/homepage/components/SocialFeedSection.js +4 -1
  276. package/dist/features/homepage/hooks/useBlogArticles.js +1 -1
  277. package/dist/features/homepage/lib/live-stats.js +8 -1
  278. package/dist/features/homepage/repository/carousel.repository.js +2 -1
  279. package/dist/features/layout/BottomActions.js +84 -11
  280. package/dist/features/layout/BottomActionsContext.d.ts +1 -6
  281. package/dist/features/layout/BottomActionsContext.js +1 -1
  282. package/dist/features/layout/hooks/useBottomActions.js +2 -2
  283. package/dist/features/layout/hooks/useFormBottomActions.d.ts +12 -1
  284. package/dist/features/layout/hooks/useFormBottomActions.js +12 -6
  285. package/dist/features/live/components/LiveItemDetailPageView.js +4 -1
  286. package/dist/features/lottery/schemas/config-write.d.ts +9 -5
  287. package/dist/features/lottery/schemas/config-write.js +69 -9
  288. package/dist/features/media/finalize.js +3 -1
  289. package/dist/features/media/modals/ImageEditor.js +1 -1
  290. package/dist/features/media/modals/VideoThumbnailSelector.js +5 -2
  291. package/dist/features/media/modals/VideoTrimModal.js +5 -2
  292. package/dist/features/media/upload/MediaUploadField.js +2 -2
  293. package/dist/features/messages/hooks/useConversation.js +18 -4
  294. package/dist/features/messages/hooks/useConversations.js +25 -8
  295. package/dist/features/orders/components/RefundRequestView.js +5 -2
  296. package/dist/features/orders/schemas/buyer-forms.d.ts +6 -3
  297. package/dist/features/orders/schemas/buyer-forms.js +31 -3
  298. package/dist/features/orders/schemas/index.d.ts +2 -2
  299. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -1
  300. package/dist/features/pre-orders/components/PreOrderActionsClient.js +1 -1
  301. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -1
  302. package/dist/features/products/components/GroupSettingsPanel.js +3 -1
  303. package/dist/features/products/components/MakeOfferButton.d.ts +13 -2
  304. package/dist/features/products/components/MakeOfferButton.js +33 -11
  305. package/dist/features/products/components/PrizeDrawDetailPageView.js +4 -1
  306. package/dist/features/products/components/ProductDetailActions.js +0 -1
  307. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
  308. package/dist/features/products/components/ProductDetailPageView.js +16 -7
  309. package/dist/features/products/components/ShareButton.js +3 -1
  310. package/dist/features/products/constants/action-defs.d.ts +1 -2
  311. package/dist/features/products/constants/action-defs.js +40 -43
  312. package/dist/features/products/repository/loadProductFeatures.js +10 -2
  313. package/dist/features/products/repository/products.repository.d.ts +5 -1
  314. package/dist/features/products/repository/products.repository.js +25 -2
  315. package/dist/features/products/schemas/firestore.d.ts +7 -3
  316. package/dist/features/products/schemas/product-features.validators.js +3 -0
  317. package/dist/features/promotions/components/CouponCard.js +11 -8
  318. package/dist/features/reviews/actions/review-actions.js +8 -1
  319. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -3
  320. package/dist/features/reviews/components/ReviewDetailShell.js +3 -1
  321. package/dist/features/scams/actions/scam-actions.d.ts +9 -1
  322. package/dist/features/scams/actions/scam-actions.js +52 -12
  323. package/dist/features/scams/components/SellerTrustBadge.d.ts +1 -1
  324. package/dist/features/scams/components/SellerTrustBadge.js +13 -0
  325. package/dist/features/scams/repository/scammer.repository.js +2 -1
  326. package/dist/features/scams/schemas/firestore.d.ts +15 -1
  327. package/dist/features/scams/schemas/report-form.d.ts +5 -5
  328. package/dist/features/scams/schemas/report-form.js +18 -3
  329. package/dist/features/search/action-index/derive.d.ts +49 -0
  330. package/dist/features/search/action-index/derive.js +121 -0
  331. package/dist/features/search/action-index/repository.d.ts +42 -0
  332. package/dist/features/search/action-index/repository.js +100 -0
  333. package/dist/features/search/action-index/settings-entries.d.ts +41 -0
  334. package/dist/features/search/action-index/settings-entries.js +268 -0
  335. package/dist/features/search/action-index/types.d.ts +81 -0
  336. package/dist/features/search/action-index/types.js +102 -0
  337. package/dist/features/search/action-index/validate-entry.d.ts +34 -0
  338. package/dist/features/search/action-index/validate-entry.js +114 -0
  339. package/dist/features/search/hooks/useNavSuggestions.d.ts +5 -1
  340. package/dist/features/search/hooks/useNavSuggestions.js +23 -3
  341. package/dist/features/search/repository/search.repository.js +3 -1
  342. package/dist/features/seller/actions/offer-actions.js +43 -19
  343. package/dist/features/seller/actions/seller-actions.js +29 -5
  344. package/dist/features/seller/components/CategoryChipPicker.d.ts +9 -0
  345. package/dist/features/seller/components/CategoryChipPicker.js +12 -0
  346. package/dist/features/seller/components/FulfillmentView.js +5 -2
  347. package/dist/features/seller/components/PhysicalLocationModal.js +1 -1
  348. package/dist/features/seller/components/PrintCenterView.js +3 -1
  349. package/dist/features/seller/components/SellerAddressesView.js +5 -1
  350. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +83 -43
  351. package/dist/features/seller/components/SellerArtView.d.ts +14 -7
  352. package/dist/features/seller/components/SellerArtView.js +4 -119
  353. package/dist/features/seller/components/SellerBidsView.js +1 -1
  354. package/dist/features/seller/components/SellerClassifiedView.d.ts +14 -7
  355. package/dist/features/seller/components/SellerClassifiedView.js +4 -124
  356. package/dist/features/seller/components/SellerCouponEditorView.d.ts +22 -1
  357. package/dist/features/seller/components/SellerCouponEditorView.js +91 -45
  358. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  359. package/dist/features/seller/components/SellerDigitalCodesView.d.ts +14 -7
  360. package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
  361. package/dist/features/seller/components/SellerGoogleReviewsView.js +2 -2
  362. package/dist/features/seller/components/SellerListingTypeView.d.ts +66 -0
  363. package/dist/features/seller/components/SellerListingTypeView.js +277 -0
  364. package/dist/features/seller/components/SellerLiveView.d.ts +14 -7
  365. package/dist/features/seller/components/SellerLiveView.js +4 -126
  366. package/dist/features/seller/components/SellerOrdersView.js +3 -3
  367. package/dist/features/seller/components/SellerPayoutMethodsView.js +2 -2
  368. package/dist/features/seller/components/SellerProductShell.d.ts +5 -0
  369. package/dist/features/seller/components/SellerProductShell.js +15 -5
  370. package/dist/features/seller/components/SellerProductsView.js +24 -10
  371. package/dist/features/seller/components/SellerReviewsView.js +47 -16
  372. package/dist/features/seller/components/SellerShippingConfigsView.js +5 -4
  373. package/dist/features/seller/components/SellerSidebar.d.ts +3 -6
  374. package/dist/features/seller/components/SellerStickersView.d.ts +14 -7
  375. package/dist/features/seller/components/SellerStickersView.js +4 -119
  376. package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
  377. package/dist/features/seller/components/SellerSupportView.d.ts +31 -0
  378. package/dist/features/seller/components/SellerSupportView.js +100 -0
  379. package/dist/features/seller/components/index.d.ts +4 -8
  380. package/dist/features/seller/components/index.js +2 -4
  381. package/dist/features/seller/index.d.ts +0 -1
  382. package/dist/features/seller/index.js +0 -1
  383. package/dist/features/seller/schemas/coupon-form.d.ts +214 -0
  384. package/dist/features/seller/schemas/coupon-form.js +155 -23
  385. package/dist/features/seller/schemas/offer-forms.d.ts +16 -7
  386. package/dist/features/seller/schemas/offer-forms.js +28 -12
  387. package/dist/features/shell/FormShell.js +2 -2
  388. package/dist/features/shell/QuickFormDrawer.js +2 -2
  389. package/dist/features/shell/SectionForm.d.ts +19 -1
  390. package/dist/features/shell/SectionForm.js +104 -17
  391. package/dist/features/shell/build-sections.d.ts +23 -0
  392. package/dist/features/shell/build-sections.js +106 -8
  393. package/dist/features/shell/field-ui-meta.d.ts +44 -0
  394. package/dist/features/shell/field-ui-meta.js +14 -7
  395. package/dist/features/shell/form-sections.d.ts +46 -0
  396. package/dist/features/shell/form-sections.js +114 -0
  397. package/dist/features/shipments/components/AdminShipmentEditorView.js +87 -64
  398. package/dist/features/shipments/schemas/validation.d.ts +2 -2
  399. package/dist/features/shipments/schemas/validation.js +44 -13
  400. package/dist/features/store-extensions/schemas/custom-role-form.js +6 -2
  401. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +7 -7
  402. package/dist/features/store-extensions/schemas/payout-method-form.js +14 -0
  403. package/dist/features/stores/actions/store-query-actions.js +3 -2
  404. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -1
  405. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -1
  406. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  407. package/dist/features/stores/components/StoreDetailLayoutView.js +12 -3
  408. package/dist/features/support/repository/support.repository.d.ts +21 -0
  409. package/dist/features/support/repository/support.repository.js +63 -0
  410. package/dist/features/support/schemas/firestore.d.ts +27 -2
  411. package/dist/features/support/schemas/firestore.js +2 -0
  412. package/dist/features/support/schemas/ticket-create-form.js +7 -0
  413. package/dist/features/tester/schemas/checklist-item-form.d.ts +43 -0
  414. package/dist/features/tester/schemas/checklist-item-form.js +109 -0
  415. package/dist/features/tester/seed-data/blog-tester-seed-data.js +2 -2
  416. package/dist/features/tester/seed-data/categories-tester-seed-data.js +2 -2
  417. package/dist/features/tester/seed-data/events-tester-seed-data.js +5 -5
  418. package/dist/features/tester/seed-data/orders-tester-seed-data.js +2 -2
  419. package/dist/features/tester/seed-data/products-tester-seed-data.js +48 -49
  420. package/dist/features/tester/seed-data/stores-tester-seed-data.js +3 -3
  421. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +291 -30
  422. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +51 -14
  423. package/dist/features/wishlist/hooks/useWishlistToggle.js +8 -1
  424. package/dist/http/api-handler.js +2 -1
  425. package/dist/index.d.ts +25 -104
  426. package/dist/index.js +38 -143
  427. package/dist/jobs.d.ts +1 -1
  428. package/dist/jobs.js +1 -1
  429. package/dist/monitoring/browser.d.ts +0 -2
  430. package/dist/monitoring/browser.js +12 -1
  431. package/dist/monitoring/index.d.ts +0 -2
  432. package/dist/monitoring/index.js +0 -1
  433. package/dist/next/api/routeHandler.js +9 -4
  434. package/dist/next/index.d.ts +1 -2
  435. package/dist/next/index.js +0 -1
  436. package/dist/next/middleware/index.d.ts +0 -2
  437. package/dist/next/middleware/index.js +0 -1
  438. package/dist/next/routing/route-map.d.ts +8 -7
  439. package/dist/next/routing/route-map.js +10 -3
  440. package/dist/providers/auth-firebase/session.js +3 -1
  441. package/dist/providers/db-firebase/admin-app-lite.js +8 -8
  442. package/dist/providers/db-firebase/admin.js +27 -13
  443. package/dist/providers/db-firebase/browser-stub.d.ts +1 -11
  444. package/dist/providers/db-firebase/browser-stub.js +6 -11
  445. package/dist/providers/db-firebase/index.d.ts +0 -1
  446. package/dist/providers/db-firebase/index.js +0 -1
  447. package/dist/providers/db-firebase/rtdb-paths.d.ts +15 -6
  448. package/dist/providers/db-firebase/rtdb-paths.js +15 -6
  449. package/dist/providers/db-firebase/rtdb-url.d.ts +27 -0
  450. package/dist/providers/db-firebase/rtdb-url.js +50 -0
  451. package/dist/providers/db-firebase/sieve.d.ts +22 -0
  452. package/dist/providers/firebase-client/realtime.d.ts +20 -0
  453. package/dist/providers/firebase-client/realtime.js +34 -1
  454. package/dist/providers.d.ts +1 -1
  455. package/dist/providers.js +1 -1
  456. package/dist/react/hooks/use-action-dispatch.js +8 -2
  457. package/dist/react/hooks/useFormStatePreservation.js +3 -1
  458. package/dist/react/hooks/useListingTypeFlags.d.ts +1 -1
  459. package/dist/react/hooks/useListingTypeFlags.js +1 -1
  460. package/dist/react/hooks/usePendingFilters.js +5 -3
  461. package/dist/react/hooks/usePendingTable.js +15 -3
  462. package/dist/react/hooks/useRealtimeEvent.js +20 -9
  463. package/dist/repositories/index.d.ts +0 -1
  464. package/dist/repositories/index.js +0 -1
  465. package/dist/schemas/registry.d.ts +197 -232
  466. package/dist/schemas/registry.js +5 -6
  467. package/dist/schemas/webhooks/razorpay.d.ts +50 -50
  468. package/dist/security/authorization.d.ts +9 -0
  469. package/dist/security/authorization.js +16 -2
  470. package/dist/security/browser.d.ts +1 -3
  471. package/dist/security/browser.js +5 -2
  472. package/dist/security/index.d.ts +1 -3
  473. package/dist/security/index.js +19 -2
  474. package/dist/security/pii-encrypt.js +16 -0
  475. package/dist/security/pii-schemas.d.ts +0 -14
  476. package/dist/security/pii-schemas.js +7 -15
  477. package/dist/seed/_helpers/category-forest.js +2 -2
  478. package/dist/seed/_helpers/media.d.ts +19 -0
  479. package/dist/seed/_helpers/media.js +75 -0
  480. package/dist/seed/blog-posts-seed-data.js +17 -17
  481. package/dist/seed/carousel-slides-seed-data.js +7 -7
  482. package/dist/seed/cart-seed-data.js +13 -13
  483. package/dist/seed/categories-seed-data.js +10 -10
  484. package/dist/seed/events-seed-data.js +24 -24
  485. package/dist/seed/factories/product.factory.js +4 -4
  486. package/dist/seed/factories/store.factory.js +3 -3
  487. package/dist/seed/factories/user.factory.js +2 -2
  488. package/dist/seed/grouped-listings-seed-data.js +11 -11
  489. package/dist/seed/homepage-sections-seed-data.js +2 -2
  490. package/dist/seed/index.d.ts +0 -1
  491. package/dist/seed/index.js +0 -1
  492. package/dist/seed/manifest.d.ts +1 -1
  493. package/dist/seed/manifest.js +0 -5
  494. package/dist/seed/notifications-seed-data.js +20 -1
  495. package/dist/seed/orders-seed-data.js +2 -2
  496. package/dist/seed/products-art-seed-data.js +16 -16
  497. package/dist/seed/products-auctions-seed-data.js +34 -34
  498. package/dist/seed/products-classifieds-seed-data.js +35 -37
  499. package/dist/seed/products-digital-codes-seed-data.js +20 -20
  500. package/dist/seed/products-live-items-seed-data.js +11 -11
  501. package/dist/seed/products-preorders-seed-data.js +13 -13
  502. package/dist/seed/products-prize-draws-seed-data.js +43 -43
  503. package/dist/seed/products-standard-seed-data.js +54 -54
  504. package/dist/seed/products-stickers-seed-data.js +15 -15
  505. package/dist/seed/reviews-seed-data.js +4 -4
  506. package/dist/seed/scammers-seed-data.js +3 -3
  507. package/dist/seed/site-settings-seed-data.js +11 -24
  508. package/dist/seed/store-extensions-seed-data.js +10 -10
  509. package/dist/seed/stores-seed-data.js +11 -11
  510. package/dist/seed/support-tickets-seed-data.d.ts +14 -0
  511. package/dist/seed/support-tickets-seed-data.js +20 -1
  512. package/dist/seed/users-seed-data.js +20 -20
  513. package/dist/server-entry.d.ts +0 -1
  514. package/dist/server-entry.js +0 -1
  515. package/dist/server.d.ts +9 -6
  516. package/dist/server.js +7 -13
  517. package/dist/styles.css +248 -68
  518. package/dist/tailwind-utilities.css +1 -1
  519. package/dist/tokens/themes/default-dark.js +2 -2
  520. package/dist/tokens/themes/default-light.js +2 -2
  521. package/dist/tokens/tokens.css +24 -4
  522. package/dist/ui/components/ActionRow.d.ts +50 -0
  523. package/dist/ui/components/ActionRow.js +53 -0
  524. package/dist/ui/components/ActionRow.style.css +145 -0
  525. package/dist/ui/components/Drawer.d.ts +10 -0
  526. package/dist/ui/components/Drawer.js +2 -1
  527. package/dist/ui/components/FilterDrawer.js +4 -1
  528. package/dist/ui/components/FilterDrawer.style.css +6 -12
  529. package/dist/ui/components/FormActionBar.js +14 -1
  530. package/dist/ui/components/FormActionBar.style.css +12 -11
  531. package/dist/ui/components/ListingLayout.js +8 -1
  532. package/dist/ui/components/ListingLayout.style.css +6 -13
  533. package/dist/ui/components/Modal.d.ts +15 -1
  534. package/dist/ui/components/Modal.js +17 -3
  535. package/dist/ui/components/QuickCreateModal.js +2 -2
  536. package/dist/ui/components/QuickCreateModal.style.css +78 -84
  537. package/dist/ui/components/RecordDetailModal.js +2 -2
  538. package/dist/ui/components/SideDrawer.d.ts +8 -0
  539. package/dist/ui/components/SideDrawer.js +2 -1
  540. package/dist/ui/components/SideDrawer.style.css +6 -3
  541. package/dist/ui/components/SideModal.d.ts +11 -1
  542. package/dist/ui/components/SideModal.js +3 -2
  543. package/dist/ui/components/SideModal.style.css +14 -0
  544. package/dist/ui/components/Typography.style.css +33 -24
  545. package/dist/ui/components/index.style.css +1 -0
  546. package/dist/ui/components/toolbar-collapse.js +1 -2
  547. package/dist/ui/forms/FormShell.style.css +260 -311
  548. package/dist/ui/index.d.ts +2 -0
  549. package/dist/ui/index.js +1 -0
  550. package/dist/utils/index.d.ts +0 -1
  551. package/dist/utils/index.js +0 -1
  552. package/dist/validation/index.d.ts +1 -1
  553. package/dist/validation/index.js +1 -1
  554. package/dist/validation/schemas.d.ts +0 -19
  555. package/dist/validation/schemas.js +8 -19
  556. package/package.json +1 -1
  557. package/scripts/seed-cli.mjs +3 -6
@@ -0,0 +1,277 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /*
4
+ * WHY: Five seller views — Art, Stickers, Classified, Digital Codes, Live Items
5
+ * — were 1,033 lines of the same component. Identical props, identical
6
+ * delete scaffolding, identical row actions, identical bulk-action map,
7
+ * identical `getTotal`, identical availability scope. What actually
8
+ * differed was a listing-type string, four lines of copy, two routes, and
9
+ * one to three extra columns.
10
+ *
11
+ * Five copies is well past the Duplication Framework's Rule of Three, and
12
+ * it had already drifted: Digital Codes offered four sort options where
13
+ * the other four offered five, and every one hand-wrote a sort array the
14
+ * plugin registry already publishes.
15
+ *
16
+ * 🛑 The deeper point is that this consolidation had ALREADY been done —
17
+ * `buildListingTypeListingConfig` exists, is tagged `pattern:factory`, its
18
+ * header describes this exact problem, and it already accepts
19
+ * `portal: "seller"`. It had FIVE admin callers and ZERO seller ones. The
20
+ * seller half was written by hand next to it. That is the unadopted-layer
21
+ * shape this whole plan exists to close, so this file adopts it rather
22
+ * than starting a third implementation.
23
+ *
24
+ * WHAT: One component. Everything shared lives here; everything per-type lives
25
+ * in `SELLER_LISTING_TYPE_SPECS` below, which is the complete inventory
26
+ * of what genuinely differs.
27
+ *
28
+ * EXPORTS: SellerListingRow, SellerListingTypeSpec, SELLER_LISTING_TYPE_SPECS,
29
+ * SellerListingTypeView, SellerListingTypeViewProps
30
+ *
31
+ * @tag domain:seller,products
32
+ * @tag layer:view
33
+ * @tag pattern:factory
34
+ * @tag access:client
35
+ * @tag consumers:SellerArtView,SellerStickersView,SellerClassifiedView,SellerDigitalCodesView,SellerLiveView
36
+ * @tag sideEffects:none
37
+ */
38
+ import React, { useCallback, useState } from "react";
39
+ import { Badge, ConfirmDeleteModal, RowActionMenu, Span, Text } from "../../../ui";
40
+ import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
41
+ import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
42
+ import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
43
+ import { ROUTES } from "../../../next/routing/route-map";
44
+ import { sortBy } from "../../../constants/sort";
45
+ import { PRODUCT_FIELDS } from "../../../constants/field-names";
46
+ import { SIEVE_OP, sieveFilter } from "../../../utils/sieve-builder";
47
+ import { pluginFor } from "../../../_internal/shared/listing-types/_registry";
48
+ import { toCurrency, toRecordArray, toRelativeDate, toStringValue, } from "../../admin/hooks/useAdminListingData";
49
+ import { DataListingView } from "../../admin/components/DataListingView";
50
+ import { ROW_ACTION_META, SELLER_BULK_ACTIONS } from "../../products/constants/action-defs";
51
+ import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
52
+ /* ── Shared column renderers ─────────────────────────────────────────────── */
53
+ const textCell = (key, header) => ({
54
+ key,
55
+ header,
56
+ render: (row) => (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row[key] || "—" })),
57
+ });
58
+ const numberCell = (key, header) => ({
59
+ key,
60
+ header,
61
+ render: (row) => (_jsx(Text, { className: "tabular-nums", size: "sm", children: row[key] || "0" })),
62
+ });
63
+ export const SELLER_LISTING_TYPE_SPECS = {
64
+ art: {
65
+ editRoute: (id) => String(ROUTES.STORE.ART_EDIT(id)),
66
+ newRoute: String(ROUTES.STORE.ART_NEW),
67
+ createLabel: "New Art Print",
68
+ bulkKey: "art",
69
+ deleteLabel: "Art Listing",
70
+ searchPlaceholder: "Search art prints...",
71
+ emptyLabel: "No art listings yet — list your first print",
72
+ extraFields: (item) => ({
73
+ size: toStringValue(item.printMeta?.size, ""),
74
+ }),
75
+ extraColumns: [textCell("size", "Size")],
76
+ },
77
+ stickers: {
78
+ editRoute: (id) => String(ROUTES.STORE.STICKERS_EDIT(id)),
79
+ newRoute: String(ROUTES.STORE.STICKERS_NEW),
80
+ createLabel: "New Sticker Listing",
81
+ bulkKey: "stickers",
82
+ deleteLabel: "Sticker Listing",
83
+ searchPlaceholder: "Search sticker listings...",
84
+ emptyLabel: "No sticker listings yet — list your first pack",
85
+ extraFields: (item) => ({
86
+ size: toStringValue(item.printMeta?.size, ""),
87
+ }),
88
+ extraColumns: [textCell("size", "Size")],
89
+ },
90
+ classified: {
91
+ editRoute: (id) => String(ROUTES.STORE.CLASSIFIED_EDIT(id)),
92
+ newRoute: String(ROUTES.STORE.CLASSIFIED_NEW),
93
+ createLabel: "New Classified",
94
+ bulkKey: "classified",
95
+ deleteLabel: "Classified Listing",
96
+ searchPlaceholder: "Search classified listings...",
97
+ emptyLabel: "No classified listings yet — post your first buy/sell/trade ad",
98
+ // `title` pinned: the plugin's pluralLabel is "Classifieds", and the page
99
+ // heading has always read "Classified". Kept rather than silently renamed.
100
+ title: "Classified",
101
+ extraFields: (item) => {
102
+ const meta = (item.classified ?? {});
103
+ return {
104
+ location: toStringValue(meta.meetupArea?.city ?? meta.city, ""),
105
+ shipping: meta.acceptsShipping ? "Ships" : "Meetup only",
106
+ };
107
+ },
108
+ extraColumns: [
109
+ textCell("location", "Location"),
110
+ {
111
+ key: "shipping",
112
+ header: "Shipping",
113
+ render: (row) => (_jsx(Badge, { variant: row.shipping === "Ships" ? "active" : "inactive", size: "xs", children: row.shipping })),
114
+ },
115
+ ],
116
+ },
117
+ "digital-code": {
118
+ editRoute: (id) => String(ROUTES.STORE.DIGITAL_CODES_EDIT(id)),
119
+ newRoute: String(ROUTES.STORE.DIGITAL_CODES_NEW),
120
+ createLabel: "New Digital Code",
121
+ bulkKey: "digitalCodes",
122
+ deleteLabel: "Digital Code Listing",
123
+ searchPlaceholder: "Search digital code listings...",
124
+ emptyLabel: "No digital code listings yet",
125
+ titleHeader: "Product",
126
+ deleteSuccess: "Code deleted.",
127
+ extraFields: (item) => {
128
+ const meta = (item.digitalCode ?? {});
129
+ return {
130
+ totalCodes: toStringValue(meta.codePoolSize, "0"),
131
+ available: toStringValue(meta.codesAvailable, "0"),
132
+ delivery: toStringValue(meta.codeDeliveryMethod, "").replace(/-/g, " "),
133
+ };
134
+ },
135
+ extraColumns: [
136
+ numberCell("totalCodes", "Total Codes"),
137
+ numberCell("available", "Available"),
138
+ {
139
+ key: "delivery",
140
+ header: "Delivery",
141
+ render: (row) => (_jsx(Span, { size: "xs", className: "capitalize", padding: "pill-sm", rounded: "full", surface: "subtle", color: "muted", children: row.delivery || "—" })),
142
+ },
143
+ ],
144
+ },
145
+ live: {
146
+ editRoute: (id) => String(ROUTES.STORE.LIVE_ITEMS_EDIT(id)),
147
+ newRoute: String(ROUTES.STORE.LIVE_ITEMS_NEW),
148
+ createLabel: "New Live Item",
149
+ bulkKey: "live",
150
+ deleteLabel: "Live Item Listing",
151
+ searchPlaceholder: "Search live item listings...",
152
+ emptyLabel: "No live item listings yet",
153
+ titleHeader: "Item",
154
+ createdHeader: "Listed",
155
+ extraFields: (item) => {
156
+ const meta = (item.liveItem ?? {});
157
+ return {
158
+ species: toStringValue(meta.species, ""),
159
+ age: meta.ageMonths ? `${meta.ageMonths} mo` : "",
160
+ verified: meta.vendorVerified ? "Verified" : "Unverified",
161
+ };
162
+ },
163
+ extraColumns: [
164
+ textCell("age", "Age"),
165
+ {
166
+ key: "verified",
167
+ header: "Verified",
168
+ render: (row) => (_jsx(Span, { size: "xs", color: row.verified === "Verified" ? "success" : "warning", children: row.verified })),
169
+ },
170
+ ],
171
+ },
172
+ };
173
+ export function SellerListingTypeView({ type, onCreateClick, onEditClick, onDelete, onBulkDelete, }) {
174
+ const spec = SELLER_LISTING_TYPE_SPECS[type];
175
+ const plugin = pluginFor(type);
176
+ const [deleteTargetId, setDeleteTargetId] = useState(null);
177
+ const { deletingId, handleDelete: performDelete } = useEntityDelete({
178
+ endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
179
+ deleteFn: onDelete,
180
+ successMessage: spec.deleteSuccess ?? "Listing deleted.",
181
+ fetchOptions: { credentials: "include" },
182
+ });
183
+ const handleDelete = useCallback(async (id) => {
184
+ await performDelete(id);
185
+ setDeleteTargetId(null);
186
+ }, [performDelete]);
187
+ const handleEdit = useCallback((id) => {
188
+ if (onEditClick)
189
+ onEditClick(id);
190
+ else
191
+ window.location.href = spec.editRoute(id);
192
+ }, [onEditClick, spec]);
193
+ const handleCreate = useCallback(() => {
194
+ if (onCreateClick)
195
+ onCreateClick();
196
+ else
197
+ window.location.href = spec.newRoute;
198
+ }, [onCreateClick, spec]);
199
+ /*
200
+ * 🛑 Unconditional, and before any early return. `SellerPreOrdersView` called
201
+ * this AFTER a conditional return — a rules-of-hooks violation that survived
202
+ * because that view had no page rendering it.
203
+ */
204
+ const scope = useAvailabilityScope(React.useMemo(() => [type], [type]));
205
+ const columns = [
206
+ {
207
+ key: "title",
208
+ header: spec.titleHeader ?? "Listing",
209
+ render: (row) => (_jsxs(_Fragment, { children: [_jsx(Text, { size: "sm", weight: "medium", children: row.title }), row.species ? (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: row.species })) : null] })),
210
+ },
211
+ { key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
212
+ ...(spec.extraColumns ?? []),
213
+ {
214
+ key: "status",
215
+ header: "Status",
216
+ render: (row) => (_jsx(Badge, { variant: row.status === "active" ? "active" : "inactive", size: "xs", className: "capitalize", children: row.status })),
217
+ },
218
+ textCell("createdAt", spec.createdHeader ?? "Created"),
219
+ ];
220
+ const config = {
221
+ portal: "seller",
222
+ title: spec.title ?? plugin.pluralLabel,
223
+ searchPlaceholder: spec.searchPlaceholder,
224
+ emptyLabel: spec.emptyLabel,
225
+ filterKeys: [],
226
+ defaultSort: sortBy(PRODUCT_FIELDS.CREATED_AT, "DESC"),
227
+ queryKey: ["seller", plugin.tabSlug],
228
+ endpoint: SELLER_ENDPOINTS.PRODUCTS,
229
+ // The registry's set, not a hand-copied array. Digital Codes had drifted to
230
+ // four options where its four siblings offered five.
231
+ sortOptions: [...plugin.sortOptions],
232
+ columns,
233
+ mapRows: (response) => toRecordArray(response.products ?? response.items).map((item, index) => ({
234
+ id: toStringValue(item.id, `${type}-${index}`),
235
+ title: toStringValue(item.productTitle ?? item.title, "Untitled"),
236
+ price: toCurrency(item.price),
237
+ status: toStringValue(item.status, "draft"),
238
+ createdAt: toRelativeDate(item.createdAt),
239
+ ...(spec.extraFields?.(item) ?? {}),
240
+ })),
241
+ getTotal: (response, rows) => typeof response.total === "number"
242
+ ? response.total
243
+ : typeof response.meta?.total === "number"
244
+ ? response.meta.total
245
+ : rows.length,
246
+ // `sieveFilter`, not the raw `"listingType==art"` string literal all five
247
+ // originals wrote — a hand-built clause is invisible to every audit that
248
+ // checks field names against the schema.
249
+ buildFilters: () => sieveFilter(PRODUCT_FIELDS.LISTING_TYPE, SIEVE_OP.EQ, type),
250
+ buildExtraParams: () => scope.extraParams,
251
+ renderAboveContent: scope.renderAboveContent,
252
+ primaryAction: { label: spec.createLabel, onClick: handleCreate },
253
+ onRowClick: (row) => handleEdit(row.id),
254
+ // Rule #7 — the preset, never an inline action object.
255
+ buildBulkActions: onBulkDelete
256
+ ? (selection) => SELLER_BULK_ACTIONS[spec.bulkKey].map((id) => ({
257
+ id,
258
+ label: ROW_ACTION_META[id].label,
259
+ destructive: ROW_ACTION_META[id].destructive,
260
+ onClick: async () => {
261
+ await onBulkDelete(selection.selectedIds);
262
+ selection.clearSelection();
263
+ },
264
+ }))
265
+ : undefined,
266
+ renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
267
+ { label: ACTIONS.STORE["edit-listing"].label, onClick: () => handleEdit(row.id) },
268
+ {
269
+ label: ACTIONS.STORE["delete-listing"].label,
270
+ destructive: true,
271
+ onClick: () => setDeleteTargetId(row.id),
272
+ disabled: deletingId === row.id,
273
+ },
274
+ ] })),
275
+ };
276
+ return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), deleteTargetId && (_jsx(ConfirmDeleteModal, { isOpen: true, title: `Delete ${spec.deleteLabel}`, message: `Are you sure you want to delete this ${spec.deleteLabel.toLowerCase()}? This cannot be undone.`, onConfirm: () => handleDelete(deleteTargetId), onClose: () => setDeleteTargetId(null), isDeleting: deletingId === deleteTargetId }))] }));
277
+ }
@@ -1,8 +1,15 @@
1
+ /**
2
+ * SellerLiveView — seller browse/manage of live item listings.
3
+ *
4
+ * A named wrapper, kept so the page, the barrel and every existing import path
5
+ * stay unchanged. All behaviour is `SellerListingTypeView`; everything this
6
+ * type does differently is one entry in `SELLER_LISTING_TYPE_SPECS`.
7
+ *
8
+ * This file was 224 lines of a component that four siblings also contained
9
+ * verbatim — see that file's header for why the duplication mattered rather
10
+ * than merely being untidy.
11
+ */
1
12
  import React from "react";
2
- export interface SellerLiveViewProps {
3
- onCreateClick?: () => void;
4
- onEditClick?: (id: string) => void;
5
- onDelete?: (id: string) => Promise<void>;
6
- onBulkDelete?: (ids: string[]) => Promise<void>;
7
- }
8
- export declare function SellerLiveView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }: SellerLiveViewProps): React.JSX.Element;
13
+ import { type SellerListingTypeViewProps } from "./SellerListingTypeView";
14
+ export type SellerLiveViewProps = SellerListingTypeViewProps;
15
+ export declare function SellerLiveView(props: SellerLiveViewProps): React.JSX.Element;
@@ -1,128 +1,6 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { Badge, Span, sortBy } from "@mohasinac/appkit/client";
4
- import { useState, useCallback } from "react";
5
- import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
6
- import { ConfirmDeleteModal, Div, RowActionMenu, Text } from "../../../ui";
7
- import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
8
- import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
9
- import { ROUTES } from "../../../constants/index";
10
- import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
11
- import { DataListingView } from "../../admin/components/DataListingView";
12
- import { SELLER_BULK_ACTIONS, ROW_ACTION_META } from "../../products/constants/action-defs";
13
- import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
14
- const LISTING_TYPES = ["live"];
15
- const COLUMNS = [
16
- {
17
- key: "title",
18
- header: "Item",
19
- render: (row) => (_jsxs(Div, { children: [_jsx(Text, { size: "sm", weight: "medium", children: row.title }), row.species && (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)] italic", size: "xs", children: row.species }))] })),
20
- },
21
- { key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
22
- {
23
- key: "ageMonths",
24
- header: "Age",
25
- render: (row) => (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.ageMonths !== null ? `${row.ageMonths}mo` : "—" })),
26
- },
27
- {
28
- key: "vendorVerified",
29
- header: "Verified",
30
- render: (row) => (_jsx(Span, { layout: "inline-flex", surface: row.vendorVerified ? "success-surface" : "warning-surface", color: row.vendorVerified ? "success" : "warning", size: "xs", weight: "medium", rounded: "full", padding: "pill-xs", children: row.vendorVerified ? "Verified" : "Pending" })),
31
- },
32
- {
33
- key: "status",
34
- header: "Status",
35
- render: (row) => (_jsx(Badge, { variant: row.status === "active" ? "active" : "inactive", size: "xs", className: "capitalize", children: row.status })),
36
- },
37
- {
38
- key: "createdAt",
39
- header: "Listed",
40
- render: (row) => (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.createdAt })),
41
- },
42
- ];
43
- export function SellerLiveView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }) {
44
- const [deleteTargetId, setDeleteTargetId] = useState(null);
45
- const { deletingId, handleDelete: performDelete } = useEntityDelete({
46
- endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
47
- deleteFn: onDelete,
48
- successMessage: "Listing deleted.",
49
- fetchOptions: { credentials: "include" },
50
- });
51
- const handleDelete = useCallback(async (id) => {
52
- await performDelete(id);
53
- setDeleteTargetId(null);
54
- }, [performDelete]);
55
- const handleEdit = useCallback((id) => {
56
- if (onEditClick)
57
- onEditClick(id);
58
- else
59
- window.location.href = String(ROUTES.STORE.LIVE_ITEMS_EDIT(id));
60
- }, [onEditClick]);
61
- const handleCreate = useCallback(() => {
62
- if (onCreateClick)
63
- onCreateClick();
64
- else
65
- window.location.href = String(ROUTES.STORE.LIVE_ITEMS_NEW);
66
- }, [onCreateClick]);
67
- const scope = useAvailabilityScope(LISTING_TYPES);
68
- const config = {
69
- portal: "seller",
70
- title: "Live Items",
71
- searchPlaceholder: "Search live item listings...",
72
- emptyLabel: "No live item listings yet",
73
- filterKeys: [],
74
- defaultSort: sortBy("createdAt", "DESC"),
75
- queryKey: ["seller", "live-items"],
76
- endpoint: SELLER_ENDPOINTS.PRODUCTS,
77
- sortOptions: [
78
- { value: sortBy("createdAt", "DESC"), label: "Newest" },
79
- { value: sortBy("createdAt", "ASC"), label: "Oldest" },
80
- { value: "title", label: "Name A–Z" },
81
- { value: sortBy("price", "ASC"), label: "Price: Low–High" },
82
- { value: sortBy("price", "DESC"), label: "Price: High–Low" },
83
- ],
84
- columns: COLUMNS,
85
- mapRows: (response) => toRecordArray(response.products).map((item, index) => {
86
- const live = (item.liveItem ?? {});
87
- return {
88
- id: toStringValue(item.id, `live-${index}`),
89
- title: toStringValue(item.productTitle ?? item.title, "Untitled"),
90
- price: toCurrency(item.price),
91
- species: toStringValue(live.species, ""),
92
- ageMonths: typeof live.ageMonths === "number" ? live.ageMonths : null,
93
- vendorVerified: Boolean(live.vendorVerified),
94
- status: toStringValue(item.status, "draft"),
95
- createdAt: toRelativeDate(item.createdAt),
96
- };
97
- }),
98
- getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
99
- buildFilters: () => "listingType==live",
100
- buildExtraParams: () => scope.extraParams,
101
- renderAboveContent: scope.renderAboveContent,
102
- primaryAction: { label: "New Live Item", onClick: () => handleCreate() },
103
- // Mirrors the "Edit" row action below so table rows and cards both navigate on click.
104
- onRowClick: (row) => handleEdit(row.id),
105
- // Rule #7: bulk-action array sourced from the SELLER_BULK_ACTIONS preset.
106
- buildBulkActions: onBulkDelete
107
- ? (selection) => SELLER_BULK_ACTIONS.live.map((id) => ({
108
- id,
109
- label: ROW_ACTION_META[id].label,
110
- destructive: ROW_ACTION_META[id].destructive,
111
- onClick: async () => {
112
- await onBulkDelete(selection.selectedIds);
113
- selection.clearSelection();
114
- },
115
- }))
116
- : undefined,
117
- renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
118
- { label: ACTIONS.STORE["edit-listing"].label, onClick: () => handleEdit(row.id) },
119
- {
120
- label: ACTIONS.STORE["delete-listing"].label,
121
- destructive: true,
122
- onClick: () => setDeleteTargetId(row.id),
123
- disabled: deletingId === row.id,
124
- },
125
- ] })),
126
- };
127
- return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), deleteTargetId && (_jsx(ConfirmDeleteModal, { isOpen: true, title: "Delete Live Item Listing", message: "Are you sure you want to delete this live item listing? This cannot be undone.", onConfirm: () => handleDelete(deleteTargetId), onClose: () => setDeleteTargetId(null), isDeleting: deletingId === deleteTargetId }))] }));
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { SellerListingTypeView, } from "./SellerListingTypeView";
4
+ export function SellerLiveView(props) {
5
+ return _jsx(SellerListingTypeView, { type: "live", ...props });
128
6
  }
@@ -210,7 +210,7 @@ export function SellerOrdersView({ orderDetailApiBase = SELLER_ENDPOINTS.ORDERS,
210
210
  }
211
211
  catch (err) {
212
212
  void normalizeError(err);
213
- showToast(err instanceof Error ? err.message : "Failed to mark order shipped.", "error");
213
+ showToast("Failed to mark order shipped.", "error");
214
214
  }
215
215
  finally {
216
216
  setShippingRowId(null);
@@ -232,7 +232,7 @@ export function SellerOrdersView({ orderDetailApiBase = SELLER_ENDPOINTS.ORDERS,
232
232
  }
233
233
  catch (err) {
234
234
  void normalizeError(err);
235
- showToast(err instanceof Error ? err.message : "Failed to update location.", "error");
235
+ showToast("Failed to update location.", "error");
236
236
  }
237
237
  }, [showToast]);
238
238
  const requestPayoutForSelection = useCallback(async (selection) => {
@@ -253,7 +253,7 @@ export function SellerOrdersView({ orderDetailApiBase = SELLER_ENDPOINTS.ORDERS,
253
253
  }
254
254
  catch (err) {
255
255
  void normalizeError(err);
256
- showToast(err instanceof Error ? err.message : "Failed to request payout.", "error");
256
+ showToast("Failed to request payout.", "error");
257
257
  }
258
258
  }, [showToast]);
259
259
  const [selectedIdsForLocation, setSelectedIdsForLocation] = useState([]);
@@ -57,7 +57,7 @@ export function SellerPayoutMethodsView({ onCreateClick, onEditClick, onDelete,
57
57
  }
58
58
  catch (err) {
59
59
  void normalizeError(err);
60
- showToast(err instanceof Error ? err.message : "Failed to delete payout method", "error");
60
+ showToast("Failed to delete payout method", "error");
61
61
  }
62
62
  setDeleteTargetId(null);
63
63
  }, [performDelete, showToast]);
@@ -79,7 +79,7 @@ export function SellerPayoutMethodsView({ onCreateClick, onEditClick, onDelete,
79
79
  }
80
80
  catch (err) {
81
81
  void normalizeError(err);
82
- showToast(err instanceof Error ? err.message : "Failed to update default.", "error");
82
+ showToast("Failed to update default.", "error");
83
83
  }
84
84
  finally {
85
85
  setSettingDefaultId(null);
@@ -74,6 +74,11 @@ export interface SellerProductDraft {
74
74
  /** Shape returned by `onSave`/`onPublish` — structurally compatible with appkit's `ActionResult<T>` failure/success arms, without importing the server-only type into this client component. */
75
75
  export interface ProductActionResult {
76
76
  ok: boolean;
77
+ /**
78
+ * Stable error code. This is what the failure toast resolves — `error` is the
79
+ * server's own sentence and is reported, never shown (audit-raw-error-text).
80
+ */
81
+ code?: string;
77
82
  error?: string;
78
83
  issues?: unknown[];
79
84
  }
@@ -13,6 +13,7 @@ import { BarcodeField } from "./BarcodeField";
13
13
  import { pluginFor } from "../../../_internal/shared/listing-types/_registry";
14
14
  import { DEFAULT_MIN_OFFER_PERCENT } from "../../../_internal/shared/features/offers/config";
15
15
  import { normalizeError } from "../../../errors/normalize";
16
+ import { toUserMessage } from "../../../errors/error-display-map";
16
17
  /**
17
18
  * "bundle" is a categoryType, not a ListingType, so it can't live in
18
19
  * LISTING_TYPE_REGISTRY — this is the single, explicit escape hatch that
@@ -346,18 +347,25 @@ export function SellerProductShell({ mode, listingType = "standard", initialValu
346
347
  return;
347
348
  }
348
349
  applyZodIssues(result.issues ?? [], setFieldError);
349
- if (!silent)
350
- showToast(result.error || "Fix the highlighted errors and try again.", "error");
350
+ if (!silent) {
351
+ showToast(toUserMessage(result.code, undefined, {
352
+ fallback: "Fix the highlighted errors and try again.",
353
+ }), "error");
354
+ }
351
355
  }
352
356
  catch (err) {
353
357
  void normalizeError(err);
354
358
  if (!silent)
355
- showToast(err instanceof Error ? err.message : "Failed to save.", "error");
359
+ showToast("Failed to save.", "error");
356
360
  }
357
361
  }, [draft, onSave, markClean, clearErrors, setFieldError, showToast]);
358
362
  const handleAutoSave = useCallback(async () => {
359
363
  try {
360
364
  await handleSave(true);
365
+ // handleSave was called with silent=true, which is the whole point of
366
+ // auto-save: it has already applied the field errors and populated
367
+ // FormErrorSummary, so a toast every two seconds while the seller is
368
+ // still typing would be worse than saying nothing at all here.
361
369
  }
362
370
  catch (err) {
363
371
  void normalizeError(err);
@@ -383,11 +391,13 @@ export function SellerProductShell({ mode, listingType = "standard", initialValu
383
391
  return;
384
392
  }
385
393
  applyZodIssues(result.issues ?? [], setFieldError);
386
- showToast(result.error || "Fix the highlighted errors and try again.", "error");
394
+ showToast(toUserMessage(result.code, undefined, {
395
+ fallback: "Fix the highlighted errors and try again.",
396
+ }), "error");
387
397
  }
388
398
  catch (err) {
389
399
  void normalizeError(err);
390
- showToast(err instanceof Error ? err.message : "Failed to publish.", "error");
400
+ showToast("Failed to publish.", "error");
391
401
  }
392
402
  }, [draft, onPublish, markClean, clearErrors, setFieldError, showToast]);
393
403
  const listingTypeLabel = pluginForMode(listingType).typeLabel;
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { normalizeError } from "../../../errors/normalize";
4
+ import { toUserMessage } from "../../../errors/error-display-map";
4
5
  import { SIEVE_OP, Stack, sieveFilter } from "@mohasinac/appkit/client";
5
6
  import { sortBy } from "@mohasinac/appkit/client";
6
7
  import { useState, useCallback } from "react";
@@ -148,15 +149,23 @@ export function SellerProductsView({ onDeleteProduct, onCreateClick, }) {
148
149
  await performDelete(row.id);
149
150
  };
150
151
  const handleDuplicate = async (row) => {
151
- const res = await fetch(SELLER_ENDPOINTS.PRODUCT_DUPLICATE(row.id), {
152
- method: "POST",
153
- }).catch(() => null);
154
- if (res && res.ok) {
152
+ // A swallowed failure here does nothing at all and says nothing — the
153
+ // seller clicks Duplicate and no copy appears, with no way to tell whether
154
+ // the request even left the browser.
155
+ try {
156
+ const res = await fetch(SELLER_ENDPOINTS.PRODUCT_DUPLICATE(row.id), {
157
+ method: "POST",
158
+ });
159
+ if (!res.ok)
160
+ throw new Error(`Duplicate failed (${res.status})`);
155
161
  const json = await res.json().catch(() => null);
156
162
  const newId = json?.data?.id;
157
163
  if (newId)
158
164
  handleEdit({ ...row, id: newId });
159
165
  }
166
+ catch (err) {
167
+ showToast(normalizeError(err).message, "error");
168
+ }
160
169
  };
161
170
  const handleTogglePublish = async (row) => {
162
171
  const currentStatus = statusOverrides.get(row.id) ?? row.status;
@@ -167,10 +176,15 @@ export function SellerProductsView({ onDeleteProduct, onCreateClick, }) {
167
176
  method: "PATCH",
168
177
  headers: { "Content-Type": "application/json" },
169
178
  body: JSON.stringify({ status: newStatus }),
170
- }).catch(() => null);
171
- if (res?.ok) {
172
- setStatusOverrides((prev) => new Map([...prev, [row.id, newStatus]]));
173
- }
179
+ });
180
+ if (!res.ok)
181
+ throw new Error(`Could not change status (${res.status})`);
182
+ setStatusOverrides((prev) => new Map([...prev, [row.id, newStatus]]));
183
+ }
184
+ catch (err) {
185
+ // The row silently snapped back to its old status before this — a seller
186
+ // could not tell a rejected publish from a UI that had not repainted.
187
+ showToast(normalizeError(err).message, "error");
174
188
  }
175
189
  finally {
176
190
  setPublishingId(null);
@@ -191,8 +205,8 @@ export function SellerProductsView({ onDeleteProduct, onCreateClick, }) {
191
205
  setSetLocationOpen(false);
192
206
  }
193
207
  catch (err) {
194
- void normalizeError(err);
195
- showToast(err instanceof Error ? err.message : "Failed to update location.", "error");
208
+ const e = normalizeError(err);
209
+ showToast(toUserMessage(e.code, undefined, { fallback: "Failed to update location." }), "error");
196
210
  }
197
211
  }, [showToast]);
198
212
  const config = {