@mohasinac/appkit 4.30.19 → 4.31.1

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 (417) hide show
  1. package/dist/_internal/client/features/layout/useSidebarSearch.d.ts +21 -5
  2. package/dist/_internal/client/features/layout/useSidebarSearch.js +27 -6
  3. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +23 -3
  4. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +106 -87
  5. package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
  6. package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
  7. package/dist/_internal/server/features/auth/permissions.d.ts +2 -0
  8. package/dist/_internal/server/features/auth/permissions.js +3 -2
  9. package/dist/_internal/server/features/categories/data.js +15 -4
  10. package/dist/_internal/server/features/classified/index.d.ts +0 -1
  11. package/dist/_internal/server/features/classified/index.js +0 -1
  12. package/dist/_internal/server/features/digital-code/index.d.ts +0 -1
  13. package/dist/_internal/server/features/digital-code/index.js +0 -1
  14. package/dist/_internal/server/features/live/index.d.ts +0 -1
  15. package/dist/_internal/server/features/live/index.js +0 -1
  16. package/dist/_internal/server/features/products/data.js +15 -5
  17. package/dist/_internal/server/features/products/list-public.d.ts +9 -0
  18. package/dist/_internal/server/features/products/list-public.js +95 -7
  19. package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
  20. package/dist/_internal/server/features/site-settings/adapters.js +8 -5
  21. package/dist/_internal/server/features/tester/visibility.d.ts +2 -1
  22. package/dist/_internal/server/features/tester/visibility.js +2 -2
  23. package/dist/_internal/server/functions/scheduled.d.ts +3 -1
  24. package/dist/_internal/server/functions/scheduled.js +27 -1
  25. package/dist/_internal/server/jobs/core/hardBanCascade.js +4 -0
  26. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  27. package/dist/_internal/server/jobs/core/index.js +2 -0
  28. package/dist/_internal/server/jobs/core/pageViewPrune.d.ts +10 -0
  29. package/dist/_internal/server/jobs/core/pageViewPrune.js +44 -0
  30. package/dist/_internal/server/jobs/core/pageViewRollup.d.ts +2 -0
  31. package/dist/_internal/server/jobs/core/pageViewRollup.js +87 -0
  32. package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
  33. package/dist/_internal/server/jobs/handlers/index.js +2 -0
  34. package/dist/_internal/server/jobs/handlers/pageViewPrune.d.ts +2 -0
  35. package/dist/_internal/server/jobs/handlers/pageViewPrune.js +2 -0
  36. package/dist/_internal/server/jobs/handlers/pageViewRollup.d.ts +2 -0
  37. package/dist/_internal/server/jobs/handlers/pageViewRollup.js +2 -0
  38. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  39. package/dist/_internal/shared/actions/action-registry.js +69 -22
  40. package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -4
  41. package/dist/_internal/shared/checkout/rules/classified.rule.js +7 -2
  42. package/dist/_internal/shared/features/layout/matchesNavQuery.d.ts +14 -0
  43. package/dist/_internal/shared/features/layout/matchesNavQuery.js +72 -0
  44. package/dist/_internal/shared/features/layout/types.d.ts +37 -1
  45. package/dist/_internal/shared/features/layout/types.js +19 -1
  46. package/dist/_internal/shared/features/notifications/action-url.d.ts +9 -1
  47. package/dist/_internal/shared/features/notifications/action-url.js +47 -0
  48. package/dist/_internal/shared/features/offers/config.d.ts +65 -0
  49. package/dist/_internal/shared/features/offers/config.js +73 -2
  50. package/dist/_internal/shared/features/orders/schema.d.ts +19 -1
  51. package/dist/_internal/shared/features/orders/schema.js +22 -2
  52. package/dist/_internal/shared/features/site-settings/types.d.ts +12 -3
  53. package/dist/_internal/shared/listing-types/capabilities.d.ts +8 -2
  54. package/dist/_internal/shared/listing-types/capabilities.js +6 -1
  55. package/dist/_internal/shared/listing-types/classified/ctas.js +6 -1
  56. package/dist/_internal/shared/listing-types/feature-flags.d.ts +10 -5
  57. package/dist/_internal/shared/listing-types/feature-flags.js +11 -6
  58. package/dist/client.d.ts +37 -20
  59. package/dist/client.js +36 -14
  60. package/dist/configs/next.js +10 -2
  61. package/dist/constants/api-endpoints.d.ts +18 -54
  62. package/dist/constants/api-endpoints.js +6 -26
  63. package/dist/constants/field-names.d.ts +6 -24
  64. package/dist/constants/field-names.js +10 -27
  65. package/dist/constants/geo/countries.d.ts +50 -0
  66. package/dist/constants/geo/countries.js +129 -0
  67. package/dist/constants/geo/subdivisions.d.ts +13 -0
  68. package/dist/constants/geo/subdivisions.js +104 -0
  69. package/dist/constants/index.d.ts +2 -2
  70. package/dist/constants/index.js +2 -2
  71. package/dist/constants/table-keys.d.ts +24 -0
  72. package/dist/constants/table-keys.js +28 -0
  73. package/dist/contracts/extend.d.ts +0 -9
  74. package/dist/contracts/index.d.ts +1 -1
  75. package/dist/contracts/realtime-session.js +7 -0
  76. package/dist/core/browser.d.ts +1 -1
  77. package/dist/core/browser.js +1 -1
  78. package/dist/core/index.d.ts +1 -1
  79. package/dist/core/index.js +1 -1
  80. package/dist/core/site-config.d.ts +0 -3
  81. package/dist/core/site-config.js +0 -3
  82. package/dist/errors/messages.d.ts +0 -8
  83. package/dist/errors/messages.js +0 -9
  84. package/dist/features/about/schemas/index.d.ts +8 -8
  85. package/dist/features/account/components/AddressFilters.js +32 -11
  86. package/dist/features/account/components/AddressForm.d.ts +26 -25
  87. package/dist/features/account/components/AddressForm.js +81 -103
  88. package/dist/features/account/components/AddressesIndexListing.js +8 -4
  89. package/dist/features/account/components/UserSidebar.d.ts +3 -4
  90. package/dist/features/account/components/UserSupportView.js +89 -58
  91. package/dist/features/account/components/index.d.ts +1 -7
  92. package/dist/features/account/components/index.js +0 -3
  93. package/dist/features/account/hooks/useAddresses.d.ts +4 -3
  94. package/dist/features/account/hooks/useAddresses.js +4 -6
  95. package/dist/features/account/hooks/useCollapsedSections.d.ts +51 -10
  96. package/dist/features/account/hooks/useCollapsedSections.js +211 -38
  97. package/dist/features/account/hooks/useProfile.d.ts +8 -0
  98. package/dist/features/account/index.d.ts +0 -3
  99. package/dist/features/account/index.js +0 -3
  100. package/dist/features/account/schemas/index.d.ts +0 -92
  101. package/dist/features/account/schemas/index.js +42 -20
  102. package/dist/features/addresses/components/AddressLocationFields.d.ts +13 -0
  103. package/dist/features/addresses/components/AddressLocationFields.js +41 -0
  104. package/dist/features/addresses/hooks/usePostalLookup.d.ts +17 -0
  105. package/dist/features/addresses/hooks/usePostalLookup.js +133 -0
  106. package/dist/features/addresses/schemas/address-form.d.ts +423 -0
  107. package/dist/features/addresses/schemas/address-form.js +212 -0
  108. package/dist/features/addresses/schemas/index.d.ts +1 -0
  109. package/dist/features/addresses/schemas/index.js +8 -0
  110. package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
  111. package/dist/features/admin/actions/index.d.ts +0 -1
  112. package/dist/features/admin/actions/index.js +0 -1
  113. package/dist/features/admin/actions/notification-actions.js +1 -41
  114. package/dist/features/admin/components/AdminActionIndexView.d.ts +32 -0
  115. package/dist/features/admin/components/AdminActionIndexView.js +128 -0
  116. package/dist/features/admin/components/AdminAdEditorView.js +159 -163
  117. package/dist/features/admin/components/AdminAddressEditorView.js +97 -55
  118. package/dist/features/admin/components/AdminBrandEditorView.d.ts +15 -0
  119. package/dist/features/admin/components/AdminBrandEditorView.js +113 -77
  120. package/dist/features/admin/components/AdminBundleEditorView.d.ts +19 -9
  121. package/dist/features/admin/components/AdminBundleEditorView.js +136 -168
  122. package/dist/features/admin/components/AdminCategoryEditorView.js +120 -43
  123. package/dist/features/admin/components/AdminCouponEditorView.js +145 -109
  124. package/dist/features/admin/components/AdminEmployeeEditorView.js +125 -56
  125. package/dist/features/admin/components/AdminFaqEditorView.js +112 -58
  126. package/dist/features/admin/components/AdminFeatureEditorView.js +108 -68
  127. package/dist/features/admin/components/AdminNavEditorView.js +69 -44
  128. package/dist/features/admin/components/AdminOrderEditorView.js +47 -10
  129. package/dist/features/admin/components/AdminPrizeDrawsView.js +16 -2
  130. package/dist/features/admin/components/AdminSidebar.d.ts +11 -7
  131. package/dist/features/admin/components/AdminSiteSettingsView.js +37 -37
  132. package/dist/features/admin/components/AdminStoreEditorView.js +75 -52
  133. package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +71 -30
  134. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +95 -65
  135. package/dist/features/admin/components/BrandQuickCreateForm.d.ts +10 -0
  136. package/dist/features/admin/components/BrandQuickCreateForm.js +49 -26
  137. package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +11 -0
  138. package/dist/features/admin/components/CategoryQuickCreateForm.js +48 -26
  139. package/dist/features/admin/components/index.d.ts +2 -2
  140. package/dist/features/admin/components/index.js +1 -1
  141. package/dist/features/admin/constants/site-settings-tabs.d.ts +120 -0
  142. package/dist/features/admin/constants/site-settings-tabs.js +152 -0
  143. package/dist/features/admin/index.d.ts +0 -3
  144. package/dist/features/admin/index.js +0 -2
  145. package/dist/features/admin/repository/analytics-rollup.repository.d.ts +35 -0
  146. package/dist/features/admin/repository/analytics-rollup.repository.js +30 -0
  147. package/dist/features/admin/schemas/admin-editor-forms.d.ts +56 -57
  148. package/dist/features/admin/schemas/admin-editor-forms.js +97 -54
  149. package/dist/features/admin/schemas/admin-ops-forms.d.ts +57 -5
  150. package/dist/features/admin/schemas/admin-ops-forms.js +104 -20
  151. package/dist/features/admin/schemas/admin-user-form.js +7 -0
  152. package/dist/features/admin/schemas/firestore.d.ts +48 -95
  153. package/dist/features/admin/schemas/firestore.js +15 -151
  154. package/dist/features/admin/schemas/nav-item-form.js +9 -2
  155. package/dist/features/admin/server.d.ts +0 -4
  156. package/dist/features/admin/server.js +0 -2
  157. package/dist/features/admin/types/index.d.ts +0 -7
  158. package/dist/features/analytics/repository/page-views.repository.d.ts +14 -0
  159. package/dist/features/analytics/repository/page-views.repository.js +24 -0
  160. package/dist/features/auth/actions/index.d.ts +0 -1
  161. package/dist/features/auth/actions/index.js +0 -1
  162. package/dist/features/auth/actions/realtime-token-actions.js +1 -12
  163. package/dist/features/auth/auth-helpers.js +5 -7
  164. package/dist/features/auth/components/Guards.js +2 -1
  165. package/dist/features/auth/components/LoginForm.d.ts +0 -2
  166. package/dist/features/auth/components/LoginForm.js +1 -3
  167. package/dist/features/auth/components/RegisterForm.js +62 -19
  168. package/dist/features/auth/permissions/constants.d.ts +27 -1
  169. package/dist/features/auth/role-predicates.d.ts +75 -7
  170. package/dist/features/auth/role-predicates.js +28 -2
  171. package/dist/features/auth/schemas/firestore.d.ts +22 -0
  172. package/dist/features/auth/schemas/index.d.ts +1 -1
  173. package/dist/features/auth/schemas/index.js +44 -8
  174. package/dist/features/auth/types/index.d.ts +14 -1
  175. package/dist/features/blog/api/route.js +10 -2
  176. package/dist/features/blog/components/BlogIndexListing.js +1 -1
  177. package/dist/features/blog/hooks/useBlog.js +2 -2
  178. package/dist/features/blog/schemas/index.d.ts +4 -0
  179. package/dist/features/blog/schemas/index.js +2 -0
  180. package/dist/features/blog/types/index.d.ts +1 -1
  181. package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +22 -0
  182. package/dist/features/catalogue/components/CatalogueItemEditorView.js +112 -52
  183. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  184. package/dist/features/catalogue/schemas/validation.js +47 -10
  185. package/dist/features/categories/schemas/bundle-form.d.ts +142 -0
  186. package/dist/features/categories/schemas/bundle-form.js +149 -0
  187. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
  188. package/dist/features/classified/components/ClassifiedDetailPageView.js +37 -16
  189. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  190. package/dist/features/consultation/schemas/index.js +34 -10
  191. package/dist/features/corporate/schemas/index.js +36 -15
  192. package/dist/features/filters/FilterPanel.js +3 -3
  193. package/dist/features/filters/RangeFilter.d.ts +10 -0
  194. package/dist/features/filters/RangeFilter.js +41 -4
  195. package/dist/features/homepage/components/MarketplaceHomepageView.js +24 -5
  196. package/dist/features/homepage/hooks/useBlogArticles.js +1 -1
  197. package/dist/features/layout/BottomActions.js +84 -11
  198. package/dist/features/layout/BottomActionsContext.d.ts +1 -6
  199. package/dist/features/layout/BottomActionsContext.js +1 -1
  200. package/dist/features/layout/hooks/useBottomActions.js +2 -2
  201. package/dist/features/layout/hooks/useFormBottomActions.d.ts +12 -1
  202. package/dist/features/layout/hooks/useFormBottomActions.js +12 -6
  203. package/dist/features/lottery/schemas/config-write.d.ts +9 -5
  204. package/dist/features/lottery/schemas/config-write.js +69 -9
  205. package/dist/features/orders/schemas/buyer-forms.d.ts +6 -3
  206. package/dist/features/orders/schemas/buyer-forms.js +31 -3
  207. package/dist/features/orders/schemas/index.d.ts +2 -2
  208. package/dist/features/products/components/GroupSettingsPanel.js +3 -1
  209. package/dist/features/products/components/MakeOfferButton.d.ts +13 -2
  210. package/dist/features/products/components/MakeOfferButton.js +33 -11
  211. package/dist/features/products/components/ProductDetailActions.js +0 -1
  212. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
  213. package/dist/features/products/components/ProductDetailPageView.js +8 -5
  214. package/dist/features/products/constants/action-defs.d.ts +1 -2
  215. package/dist/features/products/constants/action-defs.js +40 -43
  216. package/dist/features/products/repository/products.repository.d.ts +5 -1
  217. package/dist/features/products/repository/products.repository.js +23 -1
  218. package/dist/features/products/schemas/firestore.d.ts +7 -3
  219. package/dist/features/products/schemas/product-features.validators.js +3 -0
  220. package/dist/features/promotions/components/CouponCard.js +8 -7
  221. package/dist/features/scams/schemas/firestore.d.ts +15 -1
  222. package/dist/features/scams/schemas/report-form.d.ts +5 -5
  223. package/dist/features/scams/schemas/report-form.js +18 -3
  224. package/dist/features/search/action-index/derive.d.ts +49 -0
  225. package/dist/features/search/action-index/derive.js +121 -0
  226. package/dist/features/search/action-index/repository.d.ts +42 -0
  227. package/dist/features/search/action-index/repository.js +100 -0
  228. package/dist/features/search/action-index/settings-entries.d.ts +41 -0
  229. package/dist/features/search/action-index/settings-entries.js +268 -0
  230. package/dist/features/search/action-index/types.d.ts +81 -0
  231. package/dist/features/search/action-index/types.js +102 -0
  232. package/dist/features/search/action-index/validate-entry.d.ts +34 -0
  233. package/dist/features/search/action-index/validate-entry.js +114 -0
  234. package/dist/features/search/hooks/useNavSuggestions.d.ts +5 -1
  235. package/dist/features/search/hooks/useNavSuggestions.js +23 -3
  236. package/dist/features/search/repository/search.repository.js +3 -1
  237. package/dist/features/seller/actions/offer-actions.js +43 -24
  238. package/dist/features/seller/actions/seller-actions.js +29 -5
  239. package/dist/features/seller/components/CategoryChipPicker.d.ts +9 -0
  240. package/dist/features/seller/components/CategoryChipPicker.js +12 -0
  241. package/dist/features/seller/components/SellerAddressesView.js +5 -1
  242. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +83 -43
  243. package/dist/features/seller/components/SellerArtView.d.ts +14 -7
  244. package/dist/features/seller/components/SellerArtView.js +4 -119
  245. package/dist/features/seller/components/SellerClassifiedView.d.ts +14 -7
  246. package/dist/features/seller/components/SellerClassifiedView.js +4 -124
  247. package/dist/features/seller/components/SellerCouponEditorView.d.ts +22 -1
  248. package/dist/features/seller/components/SellerCouponEditorView.js +91 -45
  249. package/dist/features/seller/components/SellerDigitalCodesView.d.ts +14 -7
  250. package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
  251. package/dist/features/seller/components/SellerListingTypeView.d.ts +66 -0
  252. package/dist/features/seller/components/SellerListingTypeView.js +277 -0
  253. package/dist/features/seller/components/SellerLiveView.d.ts +14 -7
  254. package/dist/features/seller/components/SellerLiveView.js +4 -126
  255. package/dist/features/seller/components/SellerSidebar.d.ts +3 -6
  256. package/dist/features/seller/components/SellerStickersView.d.ts +14 -7
  257. package/dist/features/seller/components/SellerStickersView.js +4 -119
  258. package/dist/features/seller/components/SellerSupportView.d.ts +31 -0
  259. package/dist/features/seller/components/SellerSupportView.js +100 -0
  260. package/dist/features/seller/components/index.d.ts +4 -8
  261. package/dist/features/seller/components/index.js +2 -4
  262. package/dist/features/seller/index.d.ts +0 -1
  263. package/dist/features/seller/index.js +0 -1
  264. package/dist/features/seller/schemas/coupon-form.d.ts +214 -0
  265. package/dist/features/seller/schemas/coupon-form.js +155 -23
  266. package/dist/features/seller/schemas/offer-forms.d.ts +16 -7
  267. package/dist/features/seller/schemas/offer-forms.js +28 -12
  268. package/dist/features/shell/FormShell.js +2 -2
  269. package/dist/features/shell/QuickFormDrawer.js +2 -2
  270. package/dist/features/shell/SectionForm.d.ts +19 -1
  271. package/dist/features/shell/SectionForm.js +104 -17
  272. package/dist/features/shell/build-sections.d.ts +23 -0
  273. package/dist/features/shell/build-sections.js +106 -8
  274. package/dist/features/shell/field-ui-meta.d.ts +44 -0
  275. package/dist/features/shell/field-ui-meta.js +14 -7
  276. package/dist/features/shell/form-sections.d.ts +46 -0
  277. package/dist/features/shell/form-sections.js +114 -0
  278. package/dist/features/shipments/components/AdminShipmentEditorView.js +87 -64
  279. package/dist/features/shipments/schemas/validation.d.ts +2 -2
  280. package/dist/features/shipments/schemas/validation.js +44 -13
  281. package/dist/features/store-extensions/schemas/custom-role-form.js +6 -2
  282. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +7 -7
  283. package/dist/features/store-extensions/schemas/payout-method-form.js +14 -0
  284. package/dist/features/stores/actions/store-query-actions.js +3 -2
  285. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -1
  286. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -1
  287. package/dist/features/support/repository/support.repository.d.ts +21 -0
  288. package/dist/features/support/repository/support.repository.js +63 -0
  289. package/dist/features/support/schemas/firestore.d.ts +27 -2
  290. package/dist/features/support/schemas/firestore.js +2 -0
  291. package/dist/features/support/schemas/ticket-create-form.js +7 -0
  292. package/dist/features/tester/schemas/checklist-item-form.d.ts +43 -0
  293. package/dist/features/tester/schemas/checklist-item-form.js +109 -0
  294. package/dist/features/tester/seed-data/blog-tester-seed-data.js +2 -2
  295. package/dist/features/tester/seed-data/categories-tester-seed-data.js +2 -2
  296. package/dist/features/tester/seed-data/events-tester-seed-data.js +5 -5
  297. package/dist/features/tester/seed-data/orders-tester-seed-data.js +2 -2
  298. package/dist/features/tester/seed-data/products-tester-seed-data.js +48 -49
  299. package/dist/features/tester/seed-data/stores-tester-seed-data.js +3 -3
  300. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +275 -29
  301. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +48 -12
  302. package/dist/http/api-handler.js +2 -1
  303. package/dist/index.d.ts +24 -103
  304. package/dist/index.js +33 -141
  305. package/dist/jobs.d.ts +1 -1
  306. package/dist/jobs.js +1 -1
  307. package/dist/monitoring/browser.d.ts +0 -2
  308. package/dist/monitoring/browser.js +12 -1
  309. package/dist/monitoring/index.d.ts +0 -2
  310. package/dist/monitoring/index.js +0 -1
  311. package/dist/next/api/routeHandler.js +6 -3
  312. package/dist/next/index.d.ts +7 -2
  313. package/dist/next/index.js +36 -1
  314. package/dist/next/middleware/index.d.ts +0 -2
  315. package/dist/next/middleware/index.js +0 -1
  316. package/dist/next/routing/route-map.d.ts +8 -7
  317. package/dist/next/routing/route-map.js +10 -3
  318. package/dist/providers/db-firebase/admin.js +15 -1
  319. package/dist/providers/db-firebase/sieve.d.ts +22 -0
  320. package/dist/react/hooks/useListingTypeFlags.d.ts +1 -1
  321. package/dist/react/hooks/useListingTypeFlags.js +1 -1
  322. package/dist/react/hooks/usePendingFilters.js +5 -3
  323. package/dist/react/hooks/usePendingTable.js +15 -3
  324. package/dist/repositories/index.d.ts +0 -1
  325. package/dist/repositories/index.js +0 -1
  326. package/dist/schemas/registry.d.ts +197 -232
  327. package/dist/schemas/registry.js +5 -6
  328. package/dist/schemas/webhooks/razorpay.d.ts +50 -50
  329. package/dist/security/authorization.d.ts +9 -0
  330. package/dist/security/authorization.js +16 -2
  331. package/dist/security/browser.d.ts +1 -3
  332. package/dist/security/browser.js +5 -2
  333. package/dist/security/index.d.ts +1 -3
  334. package/dist/security/index.js +19 -2
  335. package/dist/security/pii-encrypt.js +16 -0
  336. package/dist/security/pii-schemas.d.ts +0 -14
  337. package/dist/security/pii-schemas.js +7 -15
  338. package/dist/seed/_helpers/category-forest.js +2 -2
  339. package/dist/seed/_helpers/media.d.ts +19 -0
  340. package/dist/seed/_helpers/media.js +75 -0
  341. package/dist/seed/blog-posts-seed-data.js +17 -17
  342. package/dist/seed/carousel-slides-seed-data.js +7 -7
  343. package/dist/seed/cart-seed-data.js +13 -13
  344. package/dist/seed/categories-seed-data.js +10 -10
  345. package/dist/seed/events-seed-data.js +24 -24
  346. package/dist/seed/factories/product.factory.js +4 -4
  347. package/dist/seed/factories/store.factory.js +3 -3
  348. package/dist/seed/factories/user.factory.js +2 -2
  349. package/dist/seed/grouped-listings-seed-data.js +11 -11
  350. package/dist/seed/homepage-sections-seed-data.js +2 -2
  351. package/dist/seed/index.d.ts +0 -1
  352. package/dist/seed/index.js +0 -1
  353. package/dist/seed/manifest.d.ts +1 -1
  354. package/dist/seed/manifest.js +0 -5
  355. package/dist/seed/notifications-seed-data.js +20 -1
  356. package/dist/seed/orders-seed-data.js +2 -2
  357. package/dist/seed/products-art-seed-data.js +16 -16
  358. package/dist/seed/products-auctions-seed-data.js +34 -34
  359. package/dist/seed/products-classifieds-seed-data.js +35 -37
  360. package/dist/seed/products-digital-codes-seed-data.js +20 -20
  361. package/dist/seed/products-live-items-seed-data.js +11 -11
  362. package/dist/seed/products-preorders-seed-data.js +13 -13
  363. package/dist/seed/products-prize-draws-seed-data.js +43 -43
  364. package/dist/seed/products-standard-seed-data.js +54 -54
  365. package/dist/seed/products-stickers-seed-data.js +15 -15
  366. package/dist/seed/reviews-seed-data.js +4 -4
  367. package/dist/seed/scammers-seed-data.js +3 -3
  368. package/dist/seed/site-settings-seed-data.js +11 -24
  369. package/dist/seed/store-extensions-seed-data.js +10 -10
  370. package/dist/seed/stores-seed-data.js +11 -11
  371. package/dist/seed/support-tickets-seed-data.d.ts +14 -0
  372. package/dist/seed/support-tickets-seed-data.js +20 -1
  373. package/dist/seed/users-seed-data.js +20 -20
  374. package/dist/server-entry.d.ts +0 -1
  375. package/dist/server-entry.js +0 -1
  376. package/dist/server.d.ts +9 -6
  377. package/dist/server.js +7 -13
  378. package/dist/styles.css +248 -68
  379. package/dist/tailwind-utilities.css +1 -1
  380. package/dist/tokens/themes/default-dark.js +2 -2
  381. package/dist/tokens/themes/default-light.js +2 -2
  382. package/dist/tokens/tokens.css +24 -4
  383. package/dist/ui/components/ActionRow.d.ts +50 -0
  384. package/dist/ui/components/ActionRow.js +53 -0
  385. package/dist/ui/components/ActionRow.style.css +145 -0
  386. package/dist/ui/components/Drawer.d.ts +10 -0
  387. package/dist/ui/components/Drawer.js +2 -1
  388. package/dist/ui/components/FilterDrawer.js +4 -1
  389. package/dist/ui/components/FilterDrawer.style.css +6 -12
  390. package/dist/ui/components/FormActionBar.js +14 -1
  391. package/dist/ui/components/FormActionBar.style.css +12 -11
  392. package/dist/ui/components/ListingLayout.js +8 -1
  393. package/dist/ui/components/ListingLayout.style.css +6 -13
  394. package/dist/ui/components/Modal.d.ts +15 -1
  395. package/dist/ui/components/Modal.js +17 -3
  396. package/dist/ui/components/QuickCreateModal.js +2 -2
  397. package/dist/ui/components/QuickCreateModal.style.css +78 -84
  398. package/dist/ui/components/RecordDetailModal.js +2 -2
  399. package/dist/ui/components/SideDrawer.d.ts +8 -0
  400. package/dist/ui/components/SideDrawer.js +2 -1
  401. package/dist/ui/components/SideDrawer.style.css +6 -3
  402. package/dist/ui/components/SideModal.d.ts +11 -1
  403. package/dist/ui/components/SideModal.js +3 -2
  404. package/dist/ui/components/SideModal.style.css +14 -0
  405. package/dist/ui/components/Typography.style.css +33 -24
  406. package/dist/ui/components/index.style.css +1 -0
  407. package/dist/ui/forms/FormShell.style.css +260 -311
  408. package/dist/ui/index.d.ts +2 -0
  409. package/dist/ui/index.js +1 -0
  410. package/dist/utils/index.d.ts +0 -1
  411. package/dist/utils/index.js +0 -1
  412. package/dist/validation/index.d.ts +1 -1
  413. package/dist/validation/index.js +1 -1
  414. package/dist/validation/schemas.d.ts +0 -19
  415. package/dist/validation/schemas.js +8 -19
  416. package/package.json +1 -1
  417. 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
  }
@@ -1,10 +1,7 @@
1
+ import type { SidebarNavItem } from "../../../_internal/shared/features/layout/types";
1
2
  import React from "react";
2
- export interface StoreNavItem {
3
- href: string;
4
- label: string;
5
- icon?: React.ReactNode;
6
- badge?: number;
7
- }
3
+ /** A store sidebar entry. `badge` comes from `SidebarNavItem`. */
4
+ export type StoreNavItem = SidebarNavItem;
8
5
  export interface StoreNavGroup {
9
6
  title: string;
10
7
  items: StoreNavItem[];
@@ -1,8 +1,15 @@
1
+ /**
2
+ * SellerStickersView — seller browse/manage of sticker 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 194 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 SellerStickersViewProps {
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 SellerStickersView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }: SellerStickersViewProps): React.JSX.Element;
13
+ import { type SellerListingTypeViewProps } from "./SellerListingTypeView";
14
+ export type SellerStickersViewProps = SellerListingTypeViewProps;
15
+ export declare function SellerStickersView(props: SellerStickersViewProps): React.JSX.Element;
@@ -1,121 +1,6 @@
1
1
  "use client";
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- /**
4
- * SellerStickersView — seller browse/manage of sticker listings
5
- * (EMI/art-stickers session). Mirrors SellerClassifiedView's pattern.
6
- */
7
- import { Badge, sortBy } from "@mohasinac/appkit/client";
8
- import { useState, useCallback } from "react";
9
- import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
10
- import { ConfirmDeleteModal, RowActionMenu, Text } from "../../../ui";
11
- import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
12
- import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
13
- import { ROUTES } from "../../../constants/index";
14
- import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
15
- import { DataListingView } from "../../admin/components/DataListingView";
16
- import { SELLER_BULK_ACTIONS, ROW_ACTION_META } from "../../products/constants/action-defs";
17
- import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
18
- const LISTING_TYPES = ["stickers"];
19
- const COLUMNS = [
20
- { key: "title", header: "Listing", render: (row) => _jsx(Text, { size: "sm", weight: "medium", children: row.title }) },
21
- { key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
22
- {
23
- key: "size",
24
- header: "Size",
25
- render: (row) => _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.size || "—" }),
26
- },
27
- {
28
- key: "status",
29
- header: "Status",
30
- render: (row) => (_jsx(Badge, { variant: row.status === "active" ? "active" : "inactive", size: "xs", className: "capitalize", children: row.status })),
31
- },
32
- {
33
- key: "createdAt",
34
- header: "Created",
35
- render: (row) => _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.createdAt }),
36
- },
37
- ];
38
- export function SellerStickersView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }) {
39
- const [deleteTargetId, setDeleteTargetId] = useState(null);
40
- const { deletingId, handleDelete: performDelete } = useEntityDelete({
41
- endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
42
- deleteFn: onDelete,
43
- successMessage: "Listing deleted.",
44
- fetchOptions: { credentials: "include" },
45
- });
46
- const handleDelete = useCallback(async (id) => {
47
- await performDelete(id);
48
- setDeleteTargetId(null);
49
- }, [performDelete]);
50
- const handleEdit = useCallback((id) => {
51
- if (onEditClick)
52
- onEditClick(id);
53
- else
54
- window.location.href = String(ROUTES.STORE.STICKERS_EDIT(id));
55
- }, [onEditClick]);
56
- const handleCreate = useCallback(() => {
57
- if (onCreateClick)
58
- onCreateClick();
59
- else
60
- window.location.href = String(ROUTES.STORE.STICKERS_NEW);
61
- }, [onCreateClick]);
62
- const scope = useAvailabilityScope(LISTING_TYPES);
63
- const config = {
64
- portal: "seller",
65
- title: "Stickers",
66
- searchPlaceholder: "Search sticker listings...",
67
- emptyLabel: "No sticker listings yet — list your first pack",
68
- filterKeys: [],
69
- defaultSort: sortBy("createdAt", "DESC"),
70
- queryKey: ["seller", "stickers"],
71
- endpoint: SELLER_ENDPOINTS.PRODUCTS,
72
- sortOptions: [
73
- { value: sortBy("createdAt", "DESC"), label: "Newest" },
74
- { value: sortBy("createdAt", "ASC"), label: "Oldest" },
75
- { value: "title", label: "Name A–Z" },
76
- { value: sortBy("price", "ASC"), label: "Price: Low–High" },
77
- { value: sortBy("price", "DESC"), label: "Price: High–Low" },
78
- ],
79
- columns: COLUMNS,
80
- mapRows: (response) => toRecordArray(response.products).map((item, index) => {
81
- const printMeta = (item.printMeta ?? {});
82
- return {
83
- id: toStringValue(item.id, `stickers-${index}`),
84
- title: toStringValue(item.productTitle ?? item.title, "Untitled"),
85
- price: toCurrency(item.price),
86
- size: toStringValue(printMeta.size, ""),
87
- status: toStringValue(item.status, "draft"),
88
- createdAt: toRelativeDate(item.createdAt),
89
- };
90
- }),
91
- getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
92
- buildFilters: () => "listingType==stickers",
93
- buildExtraParams: () => scope.extraParams,
94
- renderAboveContent: scope.renderAboveContent,
95
- primaryAction: { label: "New Sticker Listing", onClick: () => handleCreate() },
96
- // Mirrors the "Edit" row action below so table rows and cards both navigate on click.
97
- onRowClick: (row) => handleEdit(row.id),
98
- // Rule #7: bulk-action array sourced from the SELLER_BULK_ACTIONS preset.
99
- buildBulkActions: onBulkDelete
100
- ? (selection) => SELLER_BULK_ACTIONS.stickers.map((id) => ({
101
- id,
102
- label: ROW_ACTION_META[id].label,
103
- destructive: ROW_ACTION_META[id].destructive,
104
- onClick: async () => {
105
- await onBulkDelete(selection.selectedIds);
106
- selection.clearSelection();
107
- },
108
- }))
109
- : undefined,
110
- renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
111
- { label: ACTIONS.STORE["edit-listing"].label, onClick: () => handleEdit(row.id) },
112
- {
113
- label: ACTIONS.STORE["delete-listing"].label,
114
- destructive: true,
115
- onClick: () => setDeleteTargetId(row.id),
116
- disabled: deletingId === row.id,
117
- },
118
- ] })),
119
- };
120
- return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), deleteTargetId && (_jsx(ConfirmDeleteModal, { isOpen: true, title: "Delete Sticker Listing", message: "Are you sure you want to delete this sticker 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 SellerStickersView(props) {
5
+ return _jsx(SellerListingTypeView, { type: "stickers", ...props });
121
6
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * SellerSupportView — the tickets raised about this seller's store.
3
+ *
4
+ * ## Why there was nothing here before
5
+ *
6
+ * Support has always had a buyer surface and an admin surface and no seller
7
+ * one — no page, no API route, not even a `ROUTES.STORE.SUPPORT` constant.
8
+ * The reason was structural rather than an oversight: `SupportTicketDocument`
9
+ * had no queryable `storeId`, so "the tickets about my store" was not a
10
+ * question the data could answer.
11
+ *
12
+ * There is a category called `store_change_request` — sellers asking an admin
13
+ * to change a store field they cannot edit themselves — which a seller could
14
+ * only ever file through the BUYER surface, and then never see again from the
15
+ * store dashboard.
16
+ *
17
+ * ## Read-only, deliberately
18
+ *
19
+ * A seller can see and follow a ticket about their store; replying goes
20
+ * through the ticket thread the buyer and admin already share, and status is
21
+ * an admin decision. Giving a seller a status control here would let them
22
+ * close a complaint made against them.
23
+ */
24
+ import React from "react";
25
+ import type { StackedViewShellProps } from "../../../ui";
26
+ export interface SellerSupportViewProps extends Omit<StackedViewShellProps, "sections"> {
27
+ labels?: {
28
+ title?: string;
29
+ };
30
+ }
31
+ export declare function SellerSupportView({ labels }: SellerSupportViewProps): React.JSX.Element;