@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,212 @@
1
+ /*
2
+ * WHY: There were **eleven** address field shapes in the tree and three
3
+ * separate naming schisms across them — `postalCode` vs `pincode`,
4
+ * `phone` vs `phoneNumber`, `addressLine1` vs `line1` — plus **fifteen**
5
+ * postal rules that disagreed with each other, two of them server-side
6
+ * rules on the same entity. The client said `.min(1)` and the server said
7
+ * `/^\d{6}$/`, so `abc` passed every check the user could see and came
8
+ * back a 400 with nothing on the field.
9
+ * WHAT: One address shape, one postal rule, used by every form and every
10
+ * route that writes an address.
11
+ *
12
+ * ## The shape is `AddressDocument`, not a new one
13
+ *
14
+ * `postalCode` / `phone` / `addressLine1` — the stored names win, because the
15
+ * alternative is a mapping layer at every boundary and that is precisely how
16
+ * eleven shapes happened.
17
+ *
18
+ * ## The postal rule is per COUNTRY, and that was the real defect
19
+ *
20
+ * `country` is free text, so an India-only `/^\d{6}$/` was being applied to
21
+ * Canadian addresses. `isValidPostalCode` resolves the rule from the country
22
+ * on the same record, and falls back to a permissive length bound when the
23
+ * country is one we do not enumerate — an unknown country must never block a
24
+ * save.
25
+ *
26
+ * EXPORTS:
27
+ * refineAddressPostal, addressFormSchema, addressUpdateSchema,
28
+ * adminAddressCreateSchema, adminAddressUpdateSchema, and their value types
29
+ *
30
+ * @tag domain:addresses
31
+ * @tag layer:schema
32
+ * @tag pattern:none
33
+ * @tag access:isomorphic
34
+ * @tag consumers:AddressForm,AdminAddressEditorView,UserAddressesClient,address routes
35
+ * @tag sideEffects:none
36
+ */
37
+ import { z } from "zod";
38
+ import { annotate } from "../../shell/field-ui-meta";
39
+ import { DEFAULT_COUNTRY, countryFor, isValidPostalCode, postalLabelFor, } from "../../../constants/geo/countries";
40
+ /**
41
+ * The ONE postal rule.
42
+ *
43
+ * Fifteen used to disagree — two of them server-side rules on the same
44
+ * entity — and this is the only one now, shared by every form and every route
45
+ * that writes an address.
46
+ *
47
+ * The message names what the country itself calls the field, so a Canadian
48
+ * address is never told to enter a "PIN code". An unknown country falls back
49
+ * to a length bound inside `isValidPostalCode`, because a postal rule exists
50
+ * to catch a typo and must never block a save.
51
+ */
52
+ export function refineAddressPostal(v, ctx) {
53
+ if (!v.postalCode)
54
+ return;
55
+ const country = v.country ?? DEFAULT_COUNTRY;
56
+ if (isValidPostalCode(country, v.postalCode))
57
+ return;
58
+ const known = countryFor(country);
59
+ ctx.addIssue({
60
+ code: z.ZodIssueCode.custom,
61
+ path: ["postalCode"],
62
+ message: known
63
+ ? `That is not a valid ${postalLabelFor(country)} for ${known.name}.`
64
+ : "That does not look like a postal code.",
65
+ });
66
+ }
67
+ /**
68
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
69
+ * by schema instance and every zod wrapper returns a new one.
70
+ */
71
+ export const addressFormSchema = z
72
+ .object({
73
+ /*
74
+ * Required, because `AddressDocument.label` is `string` and not
75
+ * `string | undefined` — four of the six server schemas already had
76
+ * `.min(1)` and the buyer form had it optional, which is one of the eleven
77
+ * shapes this collapses.
78
+ */
79
+ label: annotate(z.string().trim().min(1, "Give the address a label.").max(60), {
80
+ section: "address", sectionLabel: "Address", sectionRequired: true,
81
+ quick: true, order: 1, row: "pair", label: "Label",
82
+ help: "Home, Work, Warehouse — whatever helps you pick it at checkout.",
83
+ }),
84
+ fullName: annotate(z.string().trim().min(2, "Enter the recipient's full name.").max(120), {
85
+ section: "address", quick: true, order: 2, row: "pair",
86
+ label: "Full name",
87
+ }),
88
+ /*
89
+ * Digits, spaces and the usual separators, 7–15 long — E.164's own bound.
90
+ * It was `.min(1)` on one surface and unchecked on two others, so a phone
91
+ * number of "x" reached the courier.
92
+ */
93
+ phone: annotate(z
94
+ .string()
95
+ .trim()
96
+ .regex(/^[+\d][\d\s\-()]{6,19}$/, "Enter a phone number the courier can call."), {
97
+ section: "address", quick: true, order: 3, row: "pair",
98
+ label: "Phone", inputType: "tel",
99
+ }),
100
+ addressLine1: annotate(z.string().trim().min(3, "Enter the street address.").max(200), {
101
+ section: "location", sectionLabel: "Where", sectionRequired: true,
102
+ order: 1, row: "full", label: "Address line 1",
103
+ }),
104
+ addressLine2: annotate(z.string().trim().max(200).optional().or(z.literal("")), {
105
+ section: "location", order: 2, row: "full", label: "Address line 2",
106
+ }),
107
+ landmark: annotate(z.string().trim().max(120).optional().or(z.literal("")), {
108
+ section: "location", order: 3, row: "pair", label: "Landmark",
109
+ }),
110
+ city: annotate(z.string().trim().min(2, "Enter the city.").max(120), {
111
+ section: "location", order: 4, row: "pair", label: "City",
112
+ }),
113
+ /*
114
+ * A picker where the country enumerates its subdivisions, free text where
115
+ * it does not — the form decides that from `hasStates`. It was free text
116
+ * on two surfaces and a 36-option `INDIAN_STATES` select on a third, all
117
+ * writing the same field.
118
+ */
119
+ state: annotate(z.string().trim().min(2, "Enter the state or region.").max(120), {
120
+ section: "location", order: 5, row: "pair", label: "State / region",
121
+ }),
122
+ /*
123
+ * Only checked for emptiness HERE; the real rule is the country-aware one
124
+ * in the `superRefine`, because a per-field rule cannot see `country`.
125
+ */
126
+ postalCode: annotate(z.string().trim().min(1, "Enter the postal code."), {
127
+ section: "location", order: 6, row: "pair", label: "Postal code",
128
+ }),
129
+ country: annotate(z.string().trim().min(2, "Choose a country.").default(DEFAULT_COUNTRY), {
130
+ section: "location", order: 7, row: "pair", kind: "select", label: "Country",
131
+ }),
132
+ /*
133
+ * `.default(false)` rather than `.optional()`: `AddressDocument.isDefault`
134
+ * is `boolean`, so a create that omits it has to mean "not default"
135
+ * somewhere — and four of the six server schemas were supplying that
136
+ * default themselves, each in its own way.
137
+ */
138
+ isDefault: annotate(z.boolean().default(false), {
139
+ section: "visibility", sectionLabel: "Preferences", order: 1, row: "full",
140
+ label: "Use as my default address",
141
+ }),
142
+ })
143
+ .superRefine(refineAddressPostal);
144
+ /**
145
+ * A partial update.
146
+ *
147
+ * `.partial()` on the inner object, then the same refinement — an edit that
148
+ * changes only the label must not be told its postal code is missing, but an
149
+ * edit that changes the postal code must still be checked against the country.
150
+ */
151
+ export const addressUpdateSchema = addressFormSchema.innerType()
152
+ .partial()
153
+ .superRefine(refineAddressPostal);
154
+ /**
155
+ * An address as an ADMIN writes it — the shared shape plus the owner it
156
+ * belongs to, which only an admin may choose.
157
+ *
158
+ * Extended from the same base rather than restated. It was restated: the admin
159
+ * route declared its own eleven fields with `postalCode: z.string().min(6).max(6)`
160
+ * — a LENGTH check with no character class, so `"abcdef"` was a valid Indian
161
+ * PIN code as far as that route was concerned.
162
+ */
163
+ export const adminAddressCreateSchema = addressFormSchema.innerType()
164
+ .extend({
165
+ ownerType: z.enum(["user", "store"]),
166
+ ownerId: z.string().trim().min(1, "Choose who this address belongs to."),
167
+ })
168
+ .superRefine(refineAddressPostal);
169
+ export const adminAddressUpdateSchema = adminAddressCreateSchema.innerType()
170
+ .partial()
171
+ .superRefine(refineAddressPostal);
172
+ /**
173
+ * The admin PATCH body — an address edit OR a moderation verb.
174
+ *
175
+ * 🛑 Declared HERE rather than `.extend()`-ed at the route, because the
176
+ * consumer is on zod 4 and appkit compiles against zod 3 (the two-zod split
177
+ * documented in `field-ui-meta.ts`). Extending an appkit schema with
178
+ * consumer-side `z` produces a type error at best and two incompatible
179
+ * validator instances at worst.
180
+ *
181
+ * `action` and `banReason` are not address FIELDS — an admin banning an
182
+ * address is not editing it — which is why they sit alongside the shape
183
+ * rather than inside it.
184
+ */
185
+ export const adminAddressPatchSchema = adminAddressCreateSchema.innerType()
186
+ .partial()
187
+ .extend({
188
+ action: z.enum(["ban", "approve_unban", "reject_unban"]).optional(),
189
+ banReason: z.string().trim().max(500).optional(),
190
+ })
191
+ .superRefine(refineAddressPostal);
192
+ /**
193
+ * A buyer's request that a banned address be restored.
194
+ *
195
+ * 🛑 Lives in appkit, not beside its drawer in the consumer: appkit compiles
196
+ * against zod 3 and the app is on zod 4, so a consumer-built schema handed to
197
+ * `useFormShellState` is a type error and two incompatible validator
198
+ * instances. Every schema a form primitive parses has to be declared on this
199
+ * side of that split.
200
+ *
201
+ * A floor of 20 characters, higher than the 10 an admin ban REASON carries.
202
+ * The asymmetry is deliberate: a ban is written by staff who also have the
203
+ * audit log and the flagged order in front of them, while this note is the
204
+ * only thing a reviewer has. "please unban" costs them a round trip.
205
+ */
206
+ export const addressUnbanRequestSchema = z.object({
207
+ note: z
208
+ .string()
209
+ .trim()
210
+ .min(20, "Explain what happened — at least 20 characters. This is all the reviewer sees.")
211
+ .max(1000, "Keep it under 1000 characters."),
212
+ });
@@ -1,4 +1,5 @@
1
1
  export * from "./firestore";
2
+ export * from "./address-form";
2
3
  import { z } from "zod";
3
4
  export declare const addressOwnerTypeSchema: z.ZodEnum<["user", "store"]>;
4
5
  export declare const addressFirestoreSchema: z.ZodObject<{
@@ -1,9 +1,17 @@
1
1
  export * from "./firestore";
2
+ export * from "./address-form";
2
3
  // ─── Firestore document schema (W2) ───────────────────────────────────────────
3
4
  // Mirrors AddressDocument in ./firestore.ts. Registered into SCHEMAS.firestore.addresses.
4
5
  import { z } from "zod";
5
6
  import { auditTimestampsShape } from "../../../schemas/firestore-helpers";
6
7
  export const addressOwnerTypeSchema = z.enum(["user", "store"]);
8
+ /*
9
+ * The stored DOCUMENT, not a form. It carries `id`, `ownerType`, `ownerId` and
10
+ * the audit timestamps that no form collects, and it is what
11
+ * `SCHEMAS.firestore.addresses` validates a read against — a different job
12
+ * from `addressFormSchema`, which validates what a human typed.
13
+ */
14
+ // audit-address-shape-ok: the Firestore document mirror, registered in SCHEMAS.firestore
7
15
  export const addressFirestoreSchema = z.object({
8
16
  id: z.string(),
9
17
  ownerType: addressOwnerTypeSchema,
@@ -114,4 +114,4 @@ export declare function listAdminContactSubmissions(params?: {
114
114
  sorts?: string;
115
115
  page?: number;
116
116
  pageSize?: number;
117
- }): Promise<import("../../..").PagedResult<import("../server").ContactSubmissionDocument>>;
117
+ }): Promise<import("../../..").PagedResult<import("../../..").ContactSubmissionDocument>>;
@@ -1,5 +1,4 @@
1
1
  export * from "./notification-actions";
2
- export * from "./chat-actions";
3
2
  export * from "./site-settings-actions";
4
3
  export * from "./admin-actions";
5
4
  export * from "./admin-read-actions";
@@ -1,5 +1,4 @@
1
1
  export * from "./notification-actions";
2
- export * from "./chat-actions";
3
2
  export * from "./site-settings-actions";
4
3
  export * from "./admin-actions";
5
4
  export * from "./admin-read-actions";
@@ -7,7 +7,7 @@ import { isChannelHealthy, withChannelRetry } from "../../../_internal/server/no
7
7
  import { enqueueJob } from "../../jobs/actions/enqueue-job";
8
8
  import { serverLogger } from "../../../monitoring";
9
9
  import { decryptPii } from "../../../security/index";
10
- import { resolveNotificationActionUrl, } from "../../../_internal/shared/features/notifications/action-url";
10
+ import { resolveNotificationActionUrl, TYPE_AUDIENCE, } from "../../../_internal/shared/features/notifications/action-url";
11
11
  import { renderNotificationEmail } from "../../email/notification-templates";
12
12
  /**
13
13
  * A notification's `actionUrl` is a site-relative path — correct for the
@@ -100,46 +100,6 @@ export async function listNotifications(userId, limit = 20) {
100
100
  export async function getUnreadNotificationCount(userId) {
101
101
  return notificationRepository.getUnreadCount(userId);
102
102
  }
103
- /**
104
- * Which portal each notification type belongs to.
105
- *
106
- * `Record<NotificationType, …>`, so a new type cannot compile without an
107
- * answer — the same discipline `typeToPrefsKey` needed after it silently
108
- * omitted three types and ignored those users' opt-outs.
109
- */
110
- const TYPE_AUDIENCE = {
111
- // Buyer-facing: the order lifecycle they are waiting on.
112
- order_placed: "buyer",
113
- order_confirmed: "buyer",
114
- order_shipped: "buyer",
115
- order_delivered: "buyer",
116
- order_cancelled: "buyer",
117
- refund_initiated: "buyer",
118
- payment_review: "buyer",
119
- emi_installment_due_soon: "buyer",
120
- emi_installment_overdue: "buyer",
121
- prize_won: "buyer",
122
- prize_reveal_expired: "buyer",
123
- product_available: "buyer",
124
- bid_placed: "buyer",
125
- bid_outbid: "buyer",
126
- bid_won: "buyer",
127
- bid_lost: "buyer",
128
- offer_responded: "buyer",
129
- offer_counter_accepted: "buyer",
130
- offer_expired: "buyer",
131
- review_replied: "buyer",
132
- catalogue_images_stale: "buyer",
133
- // Seller-facing.
134
- auction_ended: "seller", // "your auction closed with no winner"
135
- offer_received: "seller",
136
- review_approved: "seller",
137
- // Account-level, which lives in the user portal for everyone.
138
- welcome: "buyer",
139
- account_action: "buyer",
140
- system: "buyer",
141
- promotion: "buyer",
142
- };
143
103
  /**
144
104
  * Create an in-app notification and fan out to enabled external channels.
145
105
  *
@@ -0,0 +1,32 @@
1
+ /**
2
+ * AdminActionIndexView — the one control plane for "what can a user do here,
3
+ * and where is it" (D7).
4
+ *
5
+ * ## It absorbs two editors that reached nothing
6
+ *
7
+ * `/admin/navigation` (CRUD over a Firestore collection) and
8
+ * `/admin/settings/navigation` (toggles over `siteSettings.navConfig`, seeded
9
+ * from an 11-item hardcoded array) both existed, and **neither one's data
10
+ * reached any sidebar** — because `filterNavItems` short-circuits on a missing
11
+ * `id` and no nav item had one until W6. Two admin screens editing settings
12
+ * nothing read.
13
+ *
14
+ * This screen lists every entry with its kind, portal, route, deep link and
15
+ * required permission, and the toggle here does reach the sidebar.
16
+ *
17
+ * ## What an admin may change, and what they may not
18
+ *
19
+ * Label, description, keywords, weight and enabled — content. Not `href`, not
20
+ * `kind`, not any permission field: repointing a built-in route is routing,
21
+ * and relaxing a permission is access control. An admin-authored entry brings
22
+ * its own href and is validated at SAVE time, because the audit runs on CI and
23
+ * a runtime-written bad link would 404 until the next run.
24
+ */
25
+ import React from "react";
26
+ import type { StackedViewShellProps } from "../../../ui";
27
+ export interface AdminActionIndexViewProps extends Omit<StackedViewShellProps, "sections"> {
28
+ labels?: {
29
+ title?: string;
30
+ };
31
+ }
32
+ export declare function AdminActionIndexView({ labels }: AdminActionIndexViewProps): React.JSX.Element;
@@ -0,0 +1,128 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * AdminActionIndexView — the one control plane for "what can a user do here,
5
+ * and where is it" (D7).
6
+ *
7
+ * ## It absorbs two editors that reached nothing
8
+ *
9
+ * `/admin/navigation` (CRUD over a Firestore collection) and
10
+ * `/admin/settings/navigation` (toggles over `siteSettings.navConfig`, seeded
11
+ * from an 11-item hardcoded array) both existed, and **neither one's data
12
+ * reached any sidebar** — because `filterNavItems` short-circuits on a missing
13
+ * `id` and no nav item had one until W6. Two admin screens editing settings
14
+ * nothing read.
15
+ *
16
+ * This screen lists every entry with its kind, portal, route, deep link and
17
+ * required permission, and the toggle here does reach the sidebar.
18
+ *
19
+ * ## What an admin may change, and what they may not
20
+ *
21
+ * Label, description, keywords, weight and enabled — content. Not `href`, not
22
+ * `kind`, not any permission field: repointing a built-in route is routing,
23
+ * and relaxing a permission is access control. An admin-authored entry brings
24
+ * its own href and is validated at SAVE time, because the audit runs on CI and
25
+ * a runtime-written bad link would 404 until the next run.
26
+ */
27
+ import React from "react";
28
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
29
+ import { useApiMutation } from "@mohasinac/appkit/client";
30
+ import { Alert, Badge, Row, Span, Stack, Text, Toggle, useToast } from "../../../ui";
31
+ import { apiClient } from "../../../http";
32
+ import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints";
33
+ import { DataListingView } from "./DataListingView";
34
+ const ENDPOINT = ADMIN_ENDPOINTS.ACTION_INDEX;
35
+ export function AdminActionIndexView({ labels = {} }) {
36
+ const queryClient = useQueryClient();
37
+ const { showToast } = useToast();
38
+ const query = useQuery({
39
+ queryKey: ["admin", "action-index"],
40
+ queryFn: () => apiClient.get(ENDPOINT),
41
+ staleTime: 60000,
42
+ });
43
+ const payload = query.data?.data;
44
+ const overrides = payload?.control?.entries ?? {};
45
+ const toggleMutation = useApiMutation({
46
+ errorMessage: "Could not update that entry.",
47
+ mutationFn: async (vars) => apiClient.patch(ENDPOINT, {
48
+ entryId: vars.entryId,
49
+ override: { ...overrides[vars.entryId], enabled: vars.enabled },
50
+ }),
51
+ onSuccess: () => {
52
+ showToast("Saved.", "success");
53
+ void queryClient.invalidateQueries({ queryKey: ["admin", "action-index"] });
54
+ },
55
+ });
56
+ /*
57
+ * Ordered by weight, then label — the same ranking `matchesNavQuery` gives
58
+ * the search, so the admin reading this list sees entries in the order a
59
+ * user would meet them.
60
+ */
61
+ const rows = React.useMemo(() => [...(payload?.entries ?? [])]
62
+ .sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0) || a.label.localeCompare(b.label))
63
+ .map((entry) => ({
64
+ id: entry.id,
65
+ primary: entry.label,
66
+ secondary: entry.description ?? entry.sectionPath ?? "",
67
+ kind: entry.kind,
68
+ portal: entry.portal,
69
+ href: `${entry.href}${entry.deepLink ?? ""}`,
70
+ permission: entry.requiredPermission ?? "—",
71
+ enabled: overrides[entry.id]?.enabled !== false,
72
+ })), [payload?.entries, overrides]);
73
+ const sync = payload?.sync;
74
+ return (_jsxs(Stack, { gap: "md", children: [sync && sync.orphanedOverrides.length > 0 && (_jsxs(Alert, { variant: "warning", title: "Overrides with no entry", children: [sync.orphanedOverrides.length, " saved override", sync.orphanedOverrides.length === 1 ? "" : "s", " point at entries the code no longer has (", sync.orphanedOverrides.slice(0, 4).join(", "), sync.orphanedOverrides.length > 4 ? "…" : "", "). They are ignored \u2014 clear them when convenient."] })), _jsx(DataListingView, { config: {
75
+ portal: "admin",
76
+ title: labels.title ?? "Action index",
77
+ subtitle: "Every page, setting and toggle a user can reach — and what the search finds them by.",
78
+ search: {
79
+ placeholder: "Search by label, description or keyword…",
80
+ mode: "partial",
81
+ fields: ["label", "description", "keywords"],
82
+ commit: "debounce",
83
+ },
84
+ emptyLabel: "No entries match.",
85
+ queryKey: ["admin", "action-index", "listing"],
86
+ endpoint: ENDPOINT,
87
+ filterKeys: ["portal", "kind"],
88
+ defaultSort: "",
89
+ /*
90
+ * 🛑 No sort dropdown, on purpose.
91
+ *
92
+ * This endpoint returns ONE document — the whole index, ~380 entries
93
+ * — and does not sort. Offering a dropdown here would be Root Cause
94
+ * #63 exactly: an option whose field the query never applies, so the
95
+ * control reorders nothing and says nothing about it. The rows are
96
+ * ordered by weight then label below, which is the ranking the
97
+ * search itself uses.
98
+ */
99
+ sortOptions: [],
100
+ mapRows: () => rows,
101
+ getTotal: () => rows.length,
102
+ buildFilters: () => undefined,
103
+ columns: [
104
+ { key: "primary", header: "Entry" },
105
+ {
106
+ key: "kind",
107
+ header: "Kind",
108
+ render: (row) => _jsx(Badge, { variant: "default", children: row.kind }),
109
+ },
110
+ { key: "portal", header: "Portal" },
111
+ {
112
+ key: "href",
113
+ header: "Goes to",
114
+ render: (row) => (_jsx(Span, { size: "xs", family: "mono", color: "muted", children: row.href })),
115
+ },
116
+ {
117
+ key: "permission",
118
+ header: "Needs",
119
+ render: (row) => (_jsx(Span, { size: "xs", color: "muted", children: row.permission })),
120
+ },
121
+ {
122
+ key: "enabled",
123
+ header: "Shown",
124
+ render: (row) => (_jsx(Row, { align: "center", gap: "sm", children: _jsx(Toggle, { checked: row.enabled, size: "sm", "aria-label": `Show ${row.primary}`, onChange: (next) => toggleMutation.mutate({ entryId: row.id, enabled: next }) }) })),
125
+ },
126
+ ],
127
+ } }), _jsx(Text, { size: "xs", color: "muted", children: "Hiding an entry removes it from the sidebar, the header search and the command palette at once. Labels, descriptions and keywords can be edited here; a route and its required permission belong to the code." })] }));
128
+ }