@mohasinac/appkit 4.30.19 → 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 (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 +1 -2
  313. package/dist/next/index.js +0 -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
@@ -9,6 +9,13 @@ import { getClientRealtimeProvider, } from "./client-realtime";
9
9
  *
10
10
  * WHY THIS EXISTS — two distinct bugs, one cause.
11
11
  *
12
+ * 🛑 Both examples below are HISTORICAL: buyer↔seller messaging was deleted
13
+ * 2026-08-31, so `useConversation` / `useConversations` / `useChat` and the
14
+ * `chats/*` and `chat/*` RTDB paths no longer exist — don't go looking for
15
+ * them. The mechanism is not historical. `auth_events`, `payment_events` and
16
+ * `bulk_events` are all still live, still concurrent, and still each need their
17
+ * own claim scope, which is the whole reason this file is here.
18
+ *
12
19
  * 1. **Nobody signed in for messaging.** `useConversation` and
13
20
  * `useConversations` subscribed to `chats/...` without ever calling
14
21
  * `signInWithToken`, so `auth == null` and both RTDB rules evaluated false.
@@ -8,7 +8,7 @@ export { EventBus, eventBus } from "./EventBus";
8
8
  export type { EventSubscription } from "./EventBus";
9
9
  export { CacheManager, cacheManager } from "./CacheManager";
10
10
  export type { CacheOptions, CacheEntry } from "./CacheManager";
11
- export { SITE_CONFIG, FEATURE_FLAGS, createSiteConfig, resolveSiteConfig, } from "./site-config";
11
+ export { SITE_CONFIG, createSiteConfig, resolveSiteConfig, } from "./site-config";
12
12
  export type { RuntimeSiteConfig } from "./site-config";
13
13
  export { useSiteSettings } from "./hooks/useSiteSettings";
14
14
  export { MUTATION_EVENTS, emitMutation, onMutation, inferMutationEvent, } from "./mutation-events";
@@ -3,7 +3,7 @@ export { Queue } from "./Queue";
3
3
  export { StorageManager, storageManager } from "./StorageManager";
4
4
  export { EventBus, eventBus } from "./EventBus";
5
5
  export { CacheManager, cacheManager } from "./CacheManager";
6
- export { SITE_CONFIG, FEATURE_FLAGS, createSiteConfig, resolveSiteConfig, } from "./site-config";
6
+ export { SITE_CONFIG, createSiteConfig, resolveSiteConfig, } from "./site-config";
7
7
  export { useSiteSettings } from "./hooks/useSiteSettings";
8
8
  export { MUTATION_EVENTS, emitMutation, onMutation, inferMutationEvent, } from "./mutation-events";
9
9
  export { configureMarketDefaults, resetMarketDefaults, getMarketProfile, getDefaultCurrency, getDefaultLocale, getDefaultCountry, getDefaultPhonePrefix, getDefaultTimezone, getDefaultCurrencySymbol, } from "./baseline-resolver";
@@ -14,7 +14,7 @@ export { EventBus, eventBus } from "./EventBus";
14
14
  export type { EventSubscription } from "./EventBus";
15
15
  export { CacheManager, cacheManager } from "./CacheManager";
16
16
  export type { CacheOptions, CacheEntry } from "./CacheManager";
17
- export { SITE_CONFIG, FEATURE_FLAGS, createSiteConfig, resolveSiteConfig, } from "./site-config";
17
+ export { SITE_CONFIG, createSiteConfig, resolveSiteConfig, } from "./site-config";
18
18
  export type { RuntimeSiteConfig } from "./site-config";
19
19
  export { CopilotLogRepository, copilotLogRepository, } from "./copilot-log.repository";
20
20
  export type { CopilotFeedback, CopilotLogDocument, CopilotLogCreateInput, } from "./copilot-log.repository";
@@ -9,7 +9,7 @@ export { Queue } from "./Queue";
9
9
  export { StorageManager, storageManager } from "./StorageManager";
10
10
  export { EventBus, eventBus } from "./EventBus";
11
11
  export { CacheManager, cacheManager } from "./CacheManager";
12
- export { SITE_CONFIG, FEATURE_FLAGS, createSiteConfig, resolveSiteConfig, } from "./site-config";
12
+ export { SITE_CONFIG, createSiteConfig, resolveSiteConfig, } from "./site-config";
13
13
  export { CopilotLogRepository, copilotLogRepository, } from "./copilot-log.repository";
14
14
  export { COPILOT_LOGS_COLLECTION, COPILOT_LOGS_INDEXED_FIELDS, copilotLogQueryHelpers, } from "./copilot-log.repository";
15
15
  export { useSiteSettings } from "./hooks/useSiteSettings";
@@ -26,8 +26,5 @@ export interface RuntimeSiteConfig {
26
26
  };
27
27
  }
28
28
  export declare const SITE_CONFIG: RuntimeSiteConfig;
29
- export declare const FEATURE_FLAGS: {
30
- readonly CHAT_ENABLED: false;
31
- };
32
29
  export declare function createSiteConfig(overrides: Partial<RuntimeSiteConfig>): RuntimeSiteConfig;
33
30
  export declare function resolveSiteConfig(resolver?: () => Promise<Partial<RuntimeSiteConfig>>): Promise<RuntimeSiteConfig>;
@@ -51,9 +51,6 @@ export const SITE_CONFIG = {
51
51
  keywords: "ssr, appkit, webapp",
52
52
  },
53
53
  };
54
- export const FEATURE_FLAGS = {
55
- CHAT_ENABLED: false,
56
- };
57
54
  export function createSiteConfig(overrides) {
58
55
  return {
59
56
  ...SITE_CONFIG,
@@ -329,14 +329,6 @@ export declare const ERROR_MESSAGES: {
329
329
  readonly NOT_OWNED_BY_STORE: "This feature is not owned by your store";
330
330
  readonly NO_STORE: "No store found for this account";
331
331
  };
332
- readonly CONVERSATIONS: {
333
- readonly NOT_FOUND: "Conversation not found";
334
- readonly FETCH_FAILED: "Failed to load conversations";
335
- readonly SEND_FAILED: "Failed to send message";
336
- readonly BODY_REQUIRED: "Message body is required";
337
- readonly BODY_TOO_LONG: "Message too long";
338
- readonly NOT_PARTICIPANT: "You are not a participant of this conversation";
339
- };
340
332
  readonly BID: {
341
333
  readonly FETCH_FAILED: "Failed to load bids";
342
334
  readonly CREATE_FAILED: "Failed to place bid";
@@ -355,15 +355,6 @@ export const ERROR_MESSAGES = {
355
355
  NOT_OWNED_BY_STORE: "This feature is not owned by your store",
356
356
  NO_STORE: "No store found for this account",
357
357
  },
358
- // Buyer ↔ seller conversations (D5 + VC7)
359
- CONVERSATIONS: {
360
- NOT_FOUND: "Conversation not found",
361
- FETCH_FAILED: "Failed to load conversations",
362
- SEND_FAILED: "Failed to send message",
363
- BODY_REQUIRED: "Message body is required",
364
- BODY_TOO_LONG: "Message too long",
365
- NOT_PARTICIPANT: "You are not a participant of this conversation",
366
- },
367
358
  BID: {
368
359
  FETCH_FAILED: "Failed to load bids",
369
360
  CREATE_FAILED: "Failed to place bid",
@@ -138,6 +138,10 @@ export declare const aboutContentSchema: z.ZodObject<{
138
138
  }, "strip", z.ZodTypeAny, {
139
139
  title: string;
140
140
  subtitle: string;
141
+ milestones: {
142
+ text: string;
143
+ year: string;
144
+ }[];
141
145
  missionTitle: string;
142
146
  missionText: string;
143
147
  howItWorksTitle: string;
@@ -159,10 +163,6 @@ export declare const aboutContentSchema: z.ZodObject<{
159
163
  text: string;
160
164
  icon: string;
161
165
  }[];
162
- milestones: {
163
- text: string;
164
- year: string;
165
- }[];
166
166
  teamMembers: {
167
167
  role: string;
168
168
  name: string;
@@ -174,6 +174,10 @@ export declare const aboutContentSchema: z.ZodObject<{
174
174
  }, {
175
175
  title: string;
176
176
  subtitle: string;
177
+ milestones: {
178
+ text: string;
179
+ year: string;
180
+ }[];
177
181
  missionTitle: string;
178
182
  missionText: string;
179
183
  howItWorksTitle: string;
@@ -195,10 +199,6 @@ export declare const aboutContentSchema: z.ZodObject<{
195
199
  text: string;
196
200
  icon: string;
197
201
  }[];
198
- milestones: {
199
- text: string;
200
- year: string;
201
- }[];
202
202
  teamMembers: {
203
203
  role: string;
204
204
  name: string;
@@ -1,21 +1,42 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /*
4
+ * WHY: All THREE facets here filtered on fields `AddressDocument` does not
5
+ * have. `addressType` shipped a hardcoded six-option list (which did not
6
+ * even match the three-option `ADDRESS_TYPES` constant it was presumably
7
+ * copied from), `verified` read `a.verified` and `activeOnly` read
8
+ * `a.active` — and the route reached all three through `as any` casts, so
9
+ * the comparison was always against `""`.
10
+ *
11
+ * Facets that render, count toward the filter-drawer badge, and can never
12
+ * match a single row. Root Cause #62's shape one layer up: not a broken
13
+ * link in the chain, a chain attached to nothing.
14
+ * WHAT: Two facets that read fields the document actually has.
15
+ *
16
+ * `isDefault` and `banStatus` are the only two worth filtering on: the rest of
17
+ * `AddressDocument` is free text a search box covers better than a facet.
18
+ *
19
+ * @tag domain:addresses
20
+ * @tag layer:component
21
+ * @tag pattern:none
22
+ * @tag access:client
23
+ * @tag consumers:AddressesIndexListing
24
+ * @tag sideEffects:none
25
+ */
3
26
  import { useTranslations } from "next-intl";
4
27
  import { FilterFacetSection } from "../../filters/FilterFacetSection";
5
28
  import { SwitchFilter } from "../../filters/SwitchFilter";
6
29
  import { Div } from "../../../ui";
30
+ /** Mirrors `AddressBanStatus`. Absent means "in good standing". */
31
+ const BAN_STATUS_OPTIONS = [
32
+ { value: "banned", label: "Banned" },
33
+ { value: "unban_requested", label: "Unban requested" },
34
+ { value: "suspicious", label: "Flagged as suspicious" },
35
+ ];
7
36
  export function AddressFilters({ table }) {
8
37
  const t = useTranslations("filters");
9
- const typeOptions = [
10
- { value: "home", label: t("addressTypeHome") },
11
- { value: "work", label: t("addressTypeWork") },
12
- { value: "shipping", label: t("addressTypeShipping") },
13
- { value: "billing", label: t("addressTypeBilling") },
14
- { value: "business", label: t("addressTypeBusiness") },
15
- { value: "other", label: t("addressTypeOther") },
16
- ];
17
- const selectedTypes = table.get("addressType")
18
- ? table.get("addressType").split("|").filter(Boolean)
38
+ const selectedBanStatus = table.get("banStatus")
39
+ ? table.get("banStatus").split("|").filter(Boolean)
19
40
  : [];
20
- return (_jsxs(Div, { children: [_jsx(FilterFacetSection, { title: t("addressType"), options: typeOptions, selected: selectedTypes, onChange: (vals) => table.set("addressType", vals.join("|")), searchable: false, defaultCollapsed: false }), _jsx(SwitchFilter, { title: t("addressVerified"), label: t("showVerifiedAddressOnly"), checked: table.get("verified") === "true", onChange: (v) => table.set("verified", v ? "true" : ""), defaultCollapsed: true }), _jsx(SwitchFilter, { title: t("addressActive"), label: t("showActiveAddressOnly"), checked: table.get("activeOnly") === "true", onChange: (v) => table.set("activeOnly", v ? "true" : ""), defaultCollapsed: true })] }));
41
+ return (_jsxs(Div, { children: [_jsx(SwitchFilter, { title: t("addressDefault"), label: t("showDefaultAddressOnly"), checked: table.get("defaultOnly") === "true", onChange: (v) => table.set("defaultOnly", v ? "true" : ""), defaultCollapsed: false }), _jsx(FilterFacetSection, { title: t("addressBanStatus"), options: BAN_STATUS_OPTIONS, selected: selectedBanStatus, onChange: (vals) => table.set("banStatus", vals.join("|")), searchable: false, defaultCollapsed: true })] }));
21
42
  }
@@ -1,32 +1,34 @@
1
+ /**
2
+ * The buyer's address form — sectionised, and on the shared address shape,
3
+ * 2026-08-30 (W5 / D19).
4
+ *
5
+ * ## What it was
6
+ *
7
+ * A local `addressFormSchema` declared right here, one of **eleven** address
8
+ * field shapes in the tree, with `postalCode: z.string().min(1)` — so `abc`
9
+ * passed every check the buyer could see and came back a server 400 with
10
+ * nothing on the field. `state` was a free-text input writing the same
11
+ * `AddressDocument.state` that the admin editor filled from a 36-option
12
+ * `INDIAN_STATES` select, and `country` was free text while the server's
13
+ * postal rule was India-only.
14
+ *
15
+ * All of that now comes from `addressFormSchema` in
16
+ * `features/addresses/schemas/address-form.ts`, whose postal rule is
17
+ * `COUNTRIES[country].postalPattern` and is the same rule the routes run.
18
+ *
19
+ * ## The lookup
20
+ *
21
+ * A complete postal code fills city and state — only when they are EMPTY. It
22
+ * never corrects what the buyer typed, and a miss or a network failure is a
23
+ * non-event: the fields stay editable and the submit is never blocked.
24
+ */
25
+ import * as React from "react";
1
26
  import type { AddressFormData } from "../hooks/useAddresses";
2
27
  export interface AddressFormLabels {
3
- label: string;
4
- fullName: string;
5
- phone: string;
6
- addressLine1: string;
7
- addressLine2: string;
8
- landmark: string;
9
- city: string;
10
- state: string;
11
- postalCode: string;
12
- country: string;
13
- setDefault: string;
14
28
  cancel: string;
15
29
  save: string;
16
30
  loading: string;
17
31
  }
18
- export interface AddressFormPlaceholders {
19
- label: string;
20
- fullName: string;
21
- phone: string;
22
- addressLine1: string;
23
- addressLine2: string;
24
- landmark: string;
25
- city: string;
26
- state: string;
27
- postalCode: string;
28
- country: string;
29
- }
30
32
  interface AddressFormProps {
31
33
  initialData?: Partial<AddressFormData>;
32
34
  onSubmit: (data: AddressFormData) => void | Promise<void>;
@@ -35,7 +37,6 @@ interface AddressFormProps {
35
37
  submitLabel?: string;
36
38
  defaultCountry?: string;
37
39
  labels?: Partial<AddressFormLabels>;
38
- placeholders?: Partial<AddressFormPlaceholders>;
39
40
  }
40
- export declare function AddressForm({ initialData, onSubmit, onCancel, isLoading, submitLabel, defaultCountry, labels, placeholders, }: AddressFormProps): import("react").JSX.Element;
41
+ export declare function AddressForm({ initialData, onSubmit, onCancel, isLoading, submitLabel, defaultCountry, labels, }: AddressFormProps): React.JSX.Element;
41
42
  export {};
@@ -1,61 +1,45 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { normalizeError } from "../../../errors/normalize";
4
- import { useCallback, useEffect, useState } from "react";
5
- import { z } from "zod";
6
- import { Button, Checkbox, FormField, FormGroup, Row, useToast } from "../../../ui";
7
- import { Form } from "../../../ui/components/Form";
8
- import { useFormShellState, FormErrorSummary } from "../../../ui/forms";
9
- // Local form-input schema — `userAddressSchema` (account schemas) uses
10
- // different field names (`line1`/`line2`, no `fullName`) and a required
11
- // `id`, since it models the stored Firestore shape, not this form's input.
12
- const addressFormSchema = z.object({
13
- label: z.string().optional(),
14
- fullName: z.string().min(1, "Full name is required"),
15
- phone: z.string().min(1, "Phone number is required"),
16
- addressLine1: z.string().min(1, "Address is required"),
17
- addressLine2: z.string().optional(),
18
- landmark: z.string().max(100, "Keep the landmark under 100 characters.").optional(),
19
- city: z.string().min(1, "City is required"),
20
- state: z.string().min(1, "State is required"),
21
- postalCode: z.string().min(1, "Postal code is required"),
22
- country: z.string().optional(),
23
- isDefault: z.boolean().optional(),
24
- });
25
- const DEFAULT_LABELS = {
26
- label: "Address Label",
27
- fullName: "Full Name",
28
- phone: "Phone Number",
29
- addressLine1: "Address Line 1",
30
- addressLine2: "Address Line 2",
31
- landmark: "Landmark",
32
- city: "City",
33
- state: "State",
34
- postalCode: "Postal Code",
35
- country: "Country",
36
- setDefault: "Set as default address",
37
- cancel: "Cancel",
38
- save: "Save",
39
- loading: "Saving...",
40
- };
41
- const DEFAULT_PLACEHOLDERS = {
42
- label: "Home, Office, etc.",
43
- fullName: "Recipient's full name",
44
- phone: "Enter phone number",
45
- addressLine1: "Street address, P.O. box",
46
- addressLine2: "Apartment, suite, unit, building, floor, etc.",
47
- landmark: "Opposite the Metro station, next to the temple, etc.",
48
- city: "City",
49
- state: "State/Province",
50
- postalCode: "Postal/ZIP code",
51
- country: "Country",
52
- };
53
- export function AddressForm({ initialData, onSubmit, onCancel, isLoading = false, submitLabel, defaultCountry = "India", labels, placeholders, }) {
54
- const { showToast } = useToast();
55
- const mergedLabels = { ...DEFAULT_LABELS, ...labels };
56
- const mergedPlaceholders = { ...DEFAULT_PLACEHOLDERS, ...placeholders };
57
- const effectiveSubmitLabel = submitLabel ?? mergedLabels.save;
58
- const [formData, setFormData] = useState({
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * The buyer's address form — sectionised, and on the shared address shape,
5
+ * 2026-08-30 (W5 / D19).
6
+ *
7
+ * ## What it was
8
+ *
9
+ * A local `addressFormSchema` declared right here, one of **eleven** address
10
+ * field shapes in the tree, with `postalCode: z.string().min(1)` — so `abc`
11
+ * passed every check the buyer could see and came back a server 400 with
12
+ * nothing on the field. `state` was a free-text input writing the same
13
+ * `AddressDocument.state` that the admin editor filled from a 36-option
14
+ * `INDIAN_STATES` select, and `country` was free text while the server's
15
+ * postal rule was India-only.
16
+ *
17
+ * All of that now comes from `addressFormSchema` in
18
+ * `features/addresses/schemas/address-form.ts`, whose postal rule is
19
+ * `COUNTRIES[country].postalPattern` and is the same rule the routes run.
20
+ *
21
+ * ## The lookup
22
+ *
23
+ * A complete postal code fills city and state — only when they are EMPTY. It
24
+ * never corrects what the buyer typed, and a miss or a network failure is a
25
+ * non-event: the fields stay editable and the submit is never blocked.
26
+ */
27
+ import * as React from "react";
28
+ import { Stack } from "../../../ui";
29
+ import { FormErrorSummary, applyZodIssues } from "../../../ui/forms";
30
+ import { FormShellContext, useFormShellState } from "../../../ui/forms/FormShell";
31
+ import { buildSectionsFromSchema, visibleValues } from "../../shell/build-sections";
32
+ import { SectionForm, useSectionFormNav } from "../../shell/SectionForm";
33
+ import { addressFormSchema } from "../../addresses/schemas/address-form";
34
+ import { usePostalLookup } from "../../addresses/hooks/usePostalLookup";
35
+ import { AddressLocationFields } from "../../addresses/components/AddressLocationFields";
36
+ import { COUNTRIES, DEFAULT_COUNTRY } from "../../../constants/geo/countries";
37
+ const COUNTRY_OPTIONS = Object.values(COUNTRIES).map((c) => ({
38
+ value: c.code,
39
+ label: c.name,
40
+ }));
41
+ export function AddressForm({ initialData, onSubmit, onCancel, isLoading = false, submitLabel = "Save", defaultCountry = DEFAULT_COUNTRY, labels, }) {
42
+ const [form, setForm] = React.useState({
59
43
  label: initialData?.label || "",
60
44
  fullName: initialData?.fullName || "",
61
45
  phone: initialData?.phone || "",
@@ -68,55 +52,49 @@ export function AddressForm({ initialData, onSubmit, onCancel, isLoading = false
68
52
  country: initialData?.country || defaultCountry,
69
53
  isDefault: initialData?.isDefault || false,
70
54
  });
71
- const { shellCtx, validate, setFieldError, clearErrors, markSubmitAttempted } = useFormShellState(addressFormSchema);
55
+ const patch = (partial) => setForm((prev) => Object.assign({}, prev, partial));
72
56
  /*
73
- * ONE submit path, shared by the inline Save button and the pinned mobile
74
- * bar. Two copies would be two chances for the bar to skip a check the
75
- * button performs — and the bar is the one a phone user actually presses,
76
- * since the inline row sits below the fold on a form this long.
57
+ * 🛑 Autofill lands only in an EMPTY field. Correcting an address the buyer
58
+ * deliberately typed is a bug they cannot report — they watch their own
59
+ * typing vanish and have no idea what did it.
77
60
  */
78
- const submitAddress = useCallback(async (h) => {
79
- const setErr = h?.setFieldError ?? setFieldError;
80
- const clear = h?.clearErrors ?? clearErrors;
81
- markSubmitAttempted();
82
- clear();
83
- const errs = {};
84
- if (!formData.fullName.trim())
85
- errs["fullName"] = "Full name is required";
86
- if (!formData.phone.trim())
87
- errs["phone"] = "Phone number is required";
88
- if (!formData.addressLine1.trim())
89
- errs["addressLine1"] = "Address is required";
90
- if (!formData.city.trim())
91
- errs["city"] = "City is required";
92
- if (!formData.state.trim())
93
- errs["state"] = "State is required";
94
- if (!formData.postalCode.trim())
95
- errs["postalCode"] = "Postal code is required";
96
- if (Object.keys(errs).length > 0) {
97
- Object.entries(errs).forEach(([k, v]) => setErr(k, v));
61
+ const { lookup, isLooking } = usePostalLookup({
62
+ onResolved: ({ city, state }) => setForm((prev) => ({
63
+ ...prev,
64
+ city: prev.city.trim() ? prev.city : city,
65
+ state: prev.state.trim() ? prev.state : state,
66
+ })),
67
+ enabled: !isLoading,
68
+ });
69
+ const sections = React.useMemo(() => buildSectionsFromSchema(addressFormSchema, {
70
+ options: { country: COUNTRY_OPTIONS },
71
+ renderers: {
72
+ /*
73
+ * State, postal code and country move together: the country decides
74
+ * whether state is a picker or free text AND what a valid postal
75
+ * code looks like, so one component owns all three rather than three
76
+ * renderers each re-deriving the same country.
77
+ */
78
+ state: ({ values, onChange, errors }) => (_jsx(AddressLocationFields, { country: values.country, state: values.state, postalCode: values.postalCode, errors: errors, isLooking: isLooking, onChange: onChange, onPostalSettled: lookup })),
79
+ // Rendered by the component above.
80
+ postalCode: () => null,
81
+ country: () => null,
82
+ },
83
+ }), [isLooking, lookup]);
84
+ const nav = useSectionFormNav(sections, form, { scope: "user:address" });
85
+ const { shellCtx, setFieldError, clearErrors } = useFormShellState(addressFormSchema, {
86
+ sections: nav.sectionMeta,
87
+ onGoToSection: nav.goToSection,
88
+ fieldToSectionIndex: nav.fieldToSectionIndex,
89
+ });
90
+ const submitAddress = async () => {
91
+ clearErrors();
92
+ const parsed = addressFormSchema.safeParse(visibleValues(addressFormSchema, form));
93
+ if (!parsed.success) {
94
+ applyZodIssues(parsed.error.issues, setFieldError);
98
95
  return;
99
96
  }
100
- try {
101
- await onSubmit(formData);
102
- }
103
- catch (err) {
104
- void normalizeError(err);
105
- showToast("Failed to save address", "error");
106
- }
107
- }, [formData, onSubmit, showToast, setFieldError, clearErrors, markSubmitAttempted]);
108
- useEffect(() => {
109
- validate(formData);
110
- // eslint-disable-next-line react-hooks/exhaustive-deps
111
- }, [formData, validate]);
112
- const handleChange = (field, value) => {
113
- setFormData((prev) => ({ ...prev, [field]: value }));
97
+ await onSubmit(form);
114
98
  };
115
- return (_jsx(Form, { onSubmit: (e) => e.preventDefault(), spacing: "md", shellCtx: shellCtx, bottomBar: {
116
- onSubmit: submitAddress,
117
- onCancel,
118
- submitLabel: effectiveSubmitLabel,
119
- cancelLabel: mergedLabels.cancel,
120
- isLoading,
121
- }, children: ({ setFieldError, clearErrors }) => (_jsxs(_Fragment, { children: [_jsx(FormField, { label: mergedLabels.label, name: "label", type: "text", value: formData.label, onChange: (value) => handleChange("label", value), placeholder: mergedPlaceholders.label, required: true }), _jsx(FormField, { label: mergedLabels.fullName, name: "fullName", type: "text", value: formData.fullName, onChange: (value) => handleChange("fullName", value), placeholder: mergedPlaceholders.fullName, required: true }), _jsx(FormField, { label: mergedLabels.phone, name: "phone", type: "tel", value: formData.phone, onChange: (value) => handleChange("phone", value), placeholder: mergedPlaceholders.phone, required: true }), _jsx(FormField, { label: mergedLabels.addressLine1, name: "addressLine1", type: "text", value: formData.addressLine1, onChange: (value) => handleChange("addressLine1", value), placeholder: mergedPlaceholders.addressLine1, required: true }), _jsx(FormField, { label: mergedLabels.addressLine2, name: "addressLine2", type: "text", value: formData.addressLine2, onChange: (value) => handleChange("addressLine2", value), placeholder: mergedPlaceholders.addressLine2 }), _jsx(FormField, { label: mergedLabels.landmark, name: "landmark", type: "text", value: formData.landmark ?? "", onChange: (value) => handleChange("landmark", value), placeholder: mergedPlaceholders.landmark }), _jsxs(FormGroup, { columns: 3, children: [_jsx(FormField, { label: mergedLabels.city, name: "city", type: "text", value: formData.city, onChange: (value) => handleChange("city", value), placeholder: mergedPlaceholders.city, required: true }), _jsx(FormField, { label: mergedLabels.state, name: "state", type: "text", value: formData.state, onChange: (value) => handleChange("state", value), placeholder: mergedPlaceholders.state, required: true }), _jsx(FormField, { label: mergedLabels.postalCode, name: "postalCode", type: "text", value: formData.postalCode, onChange: (value) => handleChange("postalCode", value), placeholder: mergedPlaceholders.postalCode, required: true })] }), _jsx(FormField, { label: mergedLabels.country, name: "country", type: "text", value: formData.country, onChange: (value) => handleChange("country", value), placeholder: mergedPlaceholders.country, required: true }), _jsx(Checkbox, { checked: formData.isDefault, onChange: (e) => handleChange("isDefault", e.target.checked), label: mergedLabels.setDefault }), _jsx(FormErrorSummary, {}), _jsxs(Row, { padding: "t-xs", align: "center", justify: "start", gap: "xs", children: [_jsx(Button, { type: "button", variant: "outline", onClick: onCancel, disabled: isLoading, children: mergedLabels.cancel }), _jsx(Button, { type: "submit", variant: "primary", disabled: isLoading, isLoading: isLoading, onClick: () => void submitAddress({ setFieldError, clearErrors }), children: isLoading ? mergedLabels.loading : effectiveSubmitLabel })] })] })) }));
99
+ return (_jsx(Stack, { gap: "md", children: _jsxs(FormShellContext.Provider, { value: shellCtx, children: [_jsx(FormErrorSummary, {}), _jsx(SectionForm, { sections: sections, values: form, onChange: patch, onSubmit: () => void submitAddress(), schema: addressFormSchema, openIds: nav.openIds, onOpenChange: nav.setOpenIds, isLoading: isLoading, submitLabel: submitLabel, onCancel: onCancel, cancelLabel: labels?.cancel ?? "Cancel" })] }) }));
122
100
  }
@@ -7,7 +7,12 @@ import { Div, Grid, ListingFilterDrawer, ListingToolbar, Stack, Text } from "../
7
7
  import { AddressBook } from "./AddressBook";
8
8
  import { AddressFilters } from "./AddressFilters";
9
9
  import { TABLE_KEYS, VIEW_MODE } from "../../../constants/table-keys";
10
- const FILTER_KEYS = ["addressType", "verified", "activeOnly"];
10
+ /*
11
+ * The two facets that read fields `AddressDocument` actually has. It was
12
+ * `["addressType", "verified", "activeOnly"]` — three keys the document has
13
+ * never carried, so every one of them inflated this badge and matched nothing.
14
+ */
15
+ const FILTER_KEYS = ["defaultOnly", "banStatus"];
11
16
  export function AddressesIndexListing({ onAdd, onEdit, onDelete, }) {
12
17
  const table = useUrlTable({ defaults: {} });
13
18
  const [view, setView] = useState(table.get(TABLE_KEYS.VIEW) || VIEW_MODE.GRID);
@@ -68,9 +73,8 @@ export function AddressesIndexListing({ onAdd, onEdit, onDelete, }) {
68
73
  const { data: addresses = [], isLoading } = useAddresses({
69
74
  filters: {
70
75
  q: table.get(TABLE_KEYS.QUERY) || undefined,
71
- addressType: table.get("addressType") || undefined,
72
- verified: table.get("verified") === "true" || undefined,
73
- activeOnly: table.get("activeOnly") === "true" || undefined,
76
+ defaultOnly: table.get("defaultOnly") === "true" || undefined,
77
+ banStatus: table.get("banStatus") || undefined,
74
78
  },
75
79
  });
76
80
  return (_jsxs(Stack, { gap: "md", children: [_jsx(ListingToolbar, { filterCount: activeFilterCount, onFiltersClick: openFilters, searchValue: searchInput, searchPlaceholder: "Search by address, postcode or label...", onSearchChange: setSearchInput, onSearchCommit: commitSearch, view: view, onViewChange: (v) => { if (v === "table")
@@ -1,8 +1,7 @@
1
+ import type { SidebarNavItem } from "../../../_internal/shared/features/layout/types";
1
2
  import React from "react";
2
- export interface UserNavItem {
3
- href: string;
4
- label: string;
5
- icon?: React.ReactNode;
3
+ /** A user sidebar entry, plus the one field only this portal has. */
4
+ export interface UserNavItem extends SidebarNavItem {
6
5
  /** When set, intercepts navigation with a confirmation prompt. */
7
6
  confirm?: {
8
7
  title?: string;