@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.
- package/dist/_internal/client/features/digital-code/CodeRevealPanel.js +5 -2
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +3 -3
- package/dist/_internal/client/features/layout/useSidebarSearch.d.ts +21 -5
- package/dist/_internal/client/features/layout/useSidebarSearch.js +27 -6
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +23 -3
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +106 -86
- package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
- package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
- package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +5 -2
- package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +11 -3
- package/dist/_internal/client/hand-mode/HandModeProvider.js +2 -0
- package/dist/_internal/server/features/auctions/actions.js +14 -3
- package/dist/_internal/server/features/auctions/service.js +1 -1
- package/dist/_internal/server/features/auth/permissions.d.ts +2 -0
- package/dist/_internal/server/features/auth/permissions.js +3 -2
- package/dist/_internal/server/features/blog/data.js +2 -2
- package/dist/_internal/server/features/blog/service.js +3 -3
- package/dist/_internal/server/features/brands/data.js +1 -1
- package/dist/_internal/server/features/brands/service.js +3 -3
- package/dist/_internal/server/features/bundles/actions.js +6 -1
- package/dist/_internal/server/features/bundles/data.js +21 -4
- package/dist/_internal/server/features/cart/data.js +3 -1
- package/dist/_internal/server/features/cart/service.js +13 -2
- package/dist/_internal/server/features/categories/data.js +26 -6
- package/dist/_internal/server/features/classified/index.d.ts +0 -1
- package/dist/_internal/server/features/classified/index.js +0 -1
- package/dist/_internal/server/features/digital-code/index.d.ts +0 -1
- package/dist/_internal/server/features/digital-code/index.js +0 -1
- package/dist/_internal/server/features/events/actions.js +17 -4
- package/dist/_internal/server/features/events/data.js +1 -1
- package/dist/_internal/server/features/events/service.js +1 -1
- package/dist/_internal/server/features/grouped/data.js +7 -2
- package/dist/_internal/server/features/item-requests/data.js +1 -1
- package/dist/_internal/server/features/live/index.d.ts +0 -1
- package/dist/_internal/server/features/live/index.js +0 -1
- package/dist/_internal/server/features/lottery/actions.js +2 -2
- package/dist/_internal/server/features/lottery/data.js +1 -1
- package/dist/_internal/server/features/orders/actions.js +7 -7
- package/dist/_internal/server/features/orders/data.d.ts +1 -1
- package/dist/_internal/server/features/orders/data.js +14 -2
- package/dist/_internal/server/features/orders/service.js +1 -1
- package/dist/_internal/server/features/pre-orders/service.js +1 -1
- package/dist/_internal/server/features/prize-draws/actions.js +1 -1
- package/dist/_internal/server/features/products/data.js +21 -6
- package/dist/_internal/server/features/products/list-public.d.ts +9 -0
- package/dist/_internal/server/features/products/list-public.js +95 -7
- package/dist/_internal/server/features/products/service.js +1 -1
- package/dist/_internal/server/features/promotions/actions.js +1 -1
- package/dist/_internal/server/features/promotions/data.js +1 -1
- package/dist/_internal/server/features/promotions/service.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/reviews/data.js +6 -1
- package/dist/_internal/server/features/reviews/og-data.js +1 -1
- package/dist/_internal/server/features/shared/listing-data-factory.js +7 -2
- package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
- package/dist/_internal/server/features/site-settings/adapters.js +8 -5
- package/dist/_internal/server/features/stores/data.js +1 -1
- package/dist/_internal/server/features/sublisting-categories/data.js +1 -1
- package/dist/_internal/server/features/tester/visibility.d.ts +2 -1
- package/dist/_internal/server/features/tester/visibility.js +2 -2
- package/dist/_internal/server/functions/scheduled.d.ts +3 -1
- package/dist/_internal/server/functions/scheduled.js +27 -1
- package/dist/_internal/server/jobs/core/auctionSettlement.js +6 -1
- package/dist/_internal/server/jobs/core/hardBanCascade.js +4 -0
- package/dist/_internal/server/jobs/core/index.d.ts +2 -0
- package/dist/_internal/server/jobs/core/index.js +2 -0
- package/dist/_internal/server/jobs/core/onOrderStatusChange.js +7 -15
- package/dist/_internal/server/jobs/core/pageViewPrune.d.ts +10 -0
- package/dist/_internal/server/jobs/core/pageViewPrune.js +44 -0
- package/dist/_internal/server/jobs/core/pageViewRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/core/pageViewRollup.js +87 -0
- package/dist/_internal/server/jobs/core/revenueRollup.js +7 -1
- package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/index.js +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewPrune.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewPrune.js +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewRollup.js +2 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +69 -22
- package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -4
- package/dist/_internal/shared/checkout/rules/classified.rule.js +7 -2
- package/dist/_internal/shared/features/layout/matchesNavQuery.d.ts +14 -0
- package/dist/_internal/shared/features/layout/matchesNavQuery.js +72 -0
- package/dist/_internal/shared/features/layout/types.d.ts +37 -1
- package/dist/_internal/shared/features/layout/types.js +19 -1
- package/dist/_internal/shared/features/notifications/action-url.d.ts +9 -1
- package/dist/_internal/shared/features/notifications/action-url.js +47 -0
- package/dist/_internal/shared/features/offers/config.d.ts +65 -0
- package/dist/_internal/shared/features/offers/config.js +73 -2
- package/dist/_internal/shared/features/orders/schema.d.ts +19 -1
- package/dist/_internal/shared/features/orders/schema.js +22 -2
- package/dist/_internal/shared/features/site-settings/types.d.ts +12 -3
- package/dist/_internal/shared/listing-types/capabilities.d.ts +8 -2
- package/dist/_internal/shared/listing-types/capabilities.js +6 -1
- package/dist/_internal/shared/listing-types/classified/ctas.js +6 -1
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +10 -5
- package/dist/_internal/shared/listing-types/feature-flags.js +11 -6
- package/dist/client/api/useApiQuery.js +17 -6
- package/dist/client.d.ts +38 -20
- package/dist/client.js +39 -14
- package/dist/configs/next.js +10 -2
- package/dist/constants/api-endpoints.d.ts +18 -54
- package/dist/constants/api-endpoints.js +6 -26
- package/dist/constants/field-names.d.ts +6 -24
- package/dist/constants/field-names.js +10 -27
- package/dist/constants/geo/countries.d.ts +50 -0
- package/dist/constants/geo/countries.js +129 -0
- package/dist/constants/geo/subdivisions.d.ts +13 -0
- package/dist/constants/geo/subdivisions.js +104 -0
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.js +2 -2
- package/dist/constants/table-keys.d.ts +24 -0
- package/dist/constants/table-keys.js +28 -0
- package/dist/contracts/client-realtime.d.ts +6 -0
- package/dist/contracts/extend.d.ts +0 -9
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/realtime-session.d.ts +12 -12
- package/dist/contracts/realtime-session.js +79 -77
- package/dist/core/browser.d.ts +1 -1
- package/dist/core/browser.js +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/site-config.d.ts +0 -3
- package/dist/core/site-config.js +0 -3
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/errors/messages.d.ts +0 -8
- package/dist/errors/messages.js +0 -9
- package/dist/features/about/components/DeveloperView.js +7 -2
- package/dist/features/about/components/PolicyPageView.js +9 -1
- package/dist/features/about/components/PublicProfileView.js +23 -5
- package/dist/features/about/schemas/index.d.ts +8 -8
- package/dist/features/account/components/AddressFilters.js +32 -11
- package/dist/features/account/components/AddressForm.d.ts +26 -25
- package/dist/features/account/components/AddressForm.js +81 -103
- package/dist/features/account/components/AddressesIndexListing.js +8 -4
- package/dist/features/account/components/NotificationBell.js +4 -3
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOffersPanel.js +1 -1
- package/dist/features/account/components/UserSidebar.d.ts +3 -4
- package/dist/features/account/components/UserSupportView.js +89 -58
- package/dist/features/account/components/index.d.ts +1 -7
- package/dist/features/account/components/index.js +0 -3
- package/dist/features/account/hooks/useAddresses.d.ts +4 -3
- package/dist/features/account/hooks/useAddresses.js +4 -6
- package/dist/features/account/hooks/useCollapsedSections.d.ts +51 -10
- package/dist/features/account/hooks/useCollapsedSections.js +211 -38
- package/dist/features/account/hooks/useProfile.d.ts +8 -0
- package/dist/features/account/index.d.ts +0 -3
- package/dist/features/account/index.js +0 -3
- package/dist/features/account/schemas/index.d.ts +0 -92
- package/dist/features/account/schemas/index.js +42 -20
- package/dist/features/addresses/components/AddressLocationFields.d.ts +13 -0
- package/dist/features/addresses/components/AddressLocationFields.js +41 -0
- package/dist/features/addresses/hooks/usePostalLookup.d.ts +17 -0
- package/dist/features/addresses/hooks/usePostalLookup.js +133 -0
- package/dist/features/addresses/schemas/address-form.d.ts +423 -0
- package/dist/features/addresses/schemas/address-form.js +212 -0
- package/dist/features/addresses/schemas/index.d.ts +1 -0
- package/dist/features/addresses/schemas/index.js +8 -0
- package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
- package/dist/features/admin/actions/index.d.ts +0 -1
- package/dist/features/admin/actions/index.js +0 -1
- package/dist/features/admin/actions/notification-actions.js +1 -41
- package/dist/features/admin/components/AdminActionIndexView.d.ts +32 -0
- package/dist/features/admin/components/AdminActionIndexView.js +128 -0
- package/dist/features/admin/components/AdminAdEditorView.js +159 -163
- package/dist/features/admin/components/AdminAddressEditorView.js +97 -55
- package/dist/features/admin/components/AdminBrandEditorView.d.ts +15 -0
- package/dist/features/admin/components/AdminBrandEditorView.js +113 -77
- package/dist/features/admin/components/AdminBundleEditorView.d.ts +19 -9
- package/dist/features/admin/components/AdminBundleEditorView.js +136 -168
- package/dist/features/admin/components/AdminCategoryEditorView.js +120 -43
- package/dist/features/admin/components/AdminCouponEditorView.js +145 -109
- package/dist/features/admin/components/AdminEmployeeEditorView.js +125 -56
- package/dist/features/admin/components/AdminFaqEditorView.js +112 -58
- package/dist/features/admin/components/AdminFeatureEditorView.js +108 -68
- package/dist/features/admin/components/AdminFulfillmentView.js +5 -2
- package/dist/features/admin/components/AdminMediaView.js +3 -3
- package/dist/features/admin/components/AdminNavEditorView.js +69 -44
- package/dist/features/admin/components/AdminOrderEditorView.js +47 -10
- package/dist/features/admin/components/AdminPrizeDrawsView.js +16 -2
- package/dist/features/admin/components/AdminSidebar.d.ts +11 -7
- package/dist/features/admin/components/AdminSiteSettingsView.js +37 -37
- package/dist/features/admin/components/AdminStoreEditorView.js +75 -52
- package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +71 -30
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +95 -65
- package/dist/features/admin/components/BrandQuickCreateForm.d.ts +10 -0
- package/dist/features/admin/components/BrandQuickCreateForm.js +49 -26
- package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +11 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.js +48 -26
- package/dist/features/admin/components/index.d.ts +2 -2
- package/dist/features/admin/components/index.js +1 -1
- package/dist/features/admin/constants/site-settings-tabs.d.ts +120 -0
- package/dist/features/admin/constants/site-settings-tabs.js +152 -0
- package/dist/features/admin/index.d.ts +0 -3
- package/dist/features/admin/index.js +0 -2
- package/dist/features/admin/repository/analytics-rollup.repository.d.ts +35 -0
- package/dist/features/admin/repository/analytics-rollup.repository.js +30 -0
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +56 -57
- package/dist/features/admin/schemas/admin-editor-forms.js +97 -54
- package/dist/features/admin/schemas/admin-ops-forms.d.ts +57 -5
- package/dist/features/admin/schemas/admin-ops-forms.js +104 -20
- package/dist/features/admin/schemas/admin-user-form.js +7 -0
- package/dist/features/admin/schemas/firestore.d.ts +48 -95
- package/dist/features/admin/schemas/firestore.js +15 -151
- package/dist/features/admin/schemas/nav-item-form.js +9 -2
- package/dist/features/admin/server.d.ts +0 -4
- package/dist/features/admin/server.js +0 -2
- package/dist/features/admin/types/index.d.ts +0 -7
- package/dist/features/analytics/repository/page-views.repository.d.ts +14 -0
- package/dist/features/analytics/repository/page-views.repository.js +24 -0
- package/dist/features/analytics/types.d.ts +1 -1
- package/dist/features/analytics/types.js +13 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +6 -2
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -1
- package/dist/features/auth/actions/index.d.ts +0 -1
- package/dist/features/auth/actions/index.js +0 -1
- package/dist/features/auth/actions/profile-actions.js +4 -3
- package/dist/features/auth/actions/realtime-token-actions.js +1 -12
- package/dist/features/auth/auth-helpers.js +5 -7
- package/dist/features/auth/components/ForgotPasswordView.js +1 -1
- package/dist/features/auth/components/Guards.js +2 -1
- package/dist/features/auth/components/LoginForm.d.ts +0 -2
- package/dist/features/auth/components/LoginForm.js +2 -4
- package/dist/features/auth/components/RegisterForm.js +62 -19
- package/dist/features/auth/components/ResetPasswordView.js +1 -1
- package/dist/features/auth/hooks/useAuth.js +3 -0
- package/dist/features/auth/permissions/constants.d.ts +27 -1
- package/dist/features/auth/role-predicates.d.ts +75 -7
- package/dist/features/auth/role-predicates.js +28 -2
- package/dist/features/auth/schemas/firestore.d.ts +22 -0
- package/dist/features/auth/schemas/index.d.ts +1 -1
- package/dist/features/auth/schemas/index.js +44 -8
- package/dist/features/auth/types/index.d.ts +14 -1
- package/dist/features/blog/api/route.js +10 -2
- package/dist/features/blog/components/BlogIndexListing.js +1 -1
- package/dist/features/blog/hooks/useBlog.js +2 -2
- package/dist/features/blog/repository/blog.repository.js +3 -1
- package/dist/features/blog/schemas/index.d.ts +4 -0
- package/dist/features/blog/schemas/index.js +2 -0
- package/dist/features/blog/types/index.d.ts +1 -1
- package/dist/features/cart/actions/cart-actions.js +13 -4
- package/dist/features/cart/utils/pending-ops.js +1 -1
- package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +22 -0
- package/dist/features/catalogue/components/CatalogueItemEditorView.js +112 -52
- package/dist/features/catalogue/schemas/validation.d.ts +4 -4
- package/dist/features/catalogue/schemas/validation.js +47 -10
- package/dist/features/categories/components/BrandDetailPageView.js +28 -12
- package/dist/features/categories/components/CategoryDetailPageView.js +37 -20
- package/dist/features/categories/repository/categories.repository.js +3 -1
- package/dist/features/categories/schemas/bundle-form.d.ts +142 -0
- package/dist/features/categories/schemas/bundle-form.js +149 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +10 -1
- package/dist/features/classified/components/ClassifiedContactSellerPanel.js +1 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
- package/dist/features/classified/components/ClassifiedDetailPageView.js +47 -18
- package/dist/features/consultation/components/ConsultationForm.js +1 -1
- package/dist/features/consultation/schemas/index.js +34 -10
- package/dist/features/corporate/schemas/index.js +36 -15
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -1
- package/dist/features/events/components/EventBanner.js +5 -2
- package/dist/features/events/components/EventOfferCard.js +3 -1
- package/dist/features/events/components/EventPollWidget.js +1 -1
- package/dist/features/events/components/SpinWheelView.js +3 -2
- package/dist/features/filters/FilterPanel.js +3 -3
- package/dist/features/filters/RangeFilter.d.ts +10 -0
- package/dist/features/filters/RangeFilter.js +41 -4
- package/dist/features/grouped/components/GroupedListingEditorView.js +2 -1
- package/dist/features/history/hooks/useHistory.js +29 -27
- package/dist/features/homepage/components/AdSlot.js +3 -1
- package/dist/features/homepage/components/GoogleReviewsSection.js +8 -2
- package/dist/features/homepage/components/MarketplaceHomepageView.js +58 -15
- package/dist/features/homepage/components/SocialFeedSection.js +4 -1
- package/dist/features/homepage/hooks/useBlogArticles.js +1 -1
- package/dist/features/homepage/lib/live-stats.js +8 -1
- package/dist/features/homepage/repository/carousel.repository.js +2 -1
- package/dist/features/layout/BottomActions.js +84 -11
- package/dist/features/layout/BottomActionsContext.d.ts +1 -6
- package/dist/features/layout/BottomActionsContext.js +1 -1
- package/dist/features/layout/hooks/useBottomActions.js +2 -2
- package/dist/features/layout/hooks/useFormBottomActions.d.ts +12 -1
- package/dist/features/layout/hooks/useFormBottomActions.js +12 -6
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -1
- package/dist/features/lottery/schemas/config-write.d.ts +9 -5
- package/dist/features/lottery/schemas/config-write.js +69 -9
- package/dist/features/media/finalize.js +3 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +5 -2
- package/dist/features/media/modals/VideoTrimModal.js +5 -2
- package/dist/features/media/upload/MediaUploadField.js +2 -2
- package/dist/features/messages/hooks/useConversation.js +18 -4
- package/dist/features/messages/hooks/useConversations.js +25 -8
- package/dist/features/orders/components/RefundRequestView.js +5 -2
- package/dist/features/orders/schemas/buyer-forms.d.ts +6 -3
- package/dist/features/orders/schemas/buyer-forms.js +31 -3
- package/dist/features/orders/schemas/index.d.ts +2 -2
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -1
- package/dist/features/pre-orders/components/PreOrderActionsClient.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -1
- package/dist/features/products/components/GroupSettingsPanel.js +3 -1
- package/dist/features/products/components/MakeOfferButton.d.ts +13 -2
- package/dist/features/products/components/MakeOfferButton.js +33 -11
- package/dist/features/products/components/PrizeDrawDetailPageView.js +4 -1
- package/dist/features/products/components/ProductDetailActions.js +0 -1
- package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
- package/dist/features/products/components/ProductDetailPageView.js +16 -7
- package/dist/features/products/components/ShareButton.js +3 -1
- package/dist/features/products/constants/action-defs.d.ts +1 -2
- package/dist/features/products/constants/action-defs.js +40 -43
- package/dist/features/products/repository/loadProductFeatures.js +10 -2
- package/dist/features/products/repository/products.repository.d.ts +5 -1
- package/dist/features/products/repository/products.repository.js +25 -2
- package/dist/features/products/schemas/firestore.d.ts +7 -3
- package/dist/features/products/schemas/product-features.validators.js +3 -0
- package/dist/features/promotions/components/CouponCard.js +11 -8
- package/dist/features/reviews/actions/review-actions.js +8 -1
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -3
- package/dist/features/reviews/components/ReviewDetailShell.js +3 -1
- package/dist/features/scams/actions/scam-actions.d.ts +9 -1
- package/dist/features/scams/actions/scam-actions.js +52 -12
- package/dist/features/scams/components/SellerTrustBadge.d.ts +1 -1
- package/dist/features/scams/components/SellerTrustBadge.js +13 -0
- package/dist/features/scams/repository/scammer.repository.js +2 -1
- package/dist/features/scams/schemas/firestore.d.ts +15 -1
- package/dist/features/scams/schemas/report-form.d.ts +5 -5
- package/dist/features/scams/schemas/report-form.js +18 -3
- package/dist/features/search/action-index/derive.d.ts +49 -0
- package/dist/features/search/action-index/derive.js +121 -0
- package/dist/features/search/action-index/repository.d.ts +42 -0
- package/dist/features/search/action-index/repository.js +100 -0
- package/dist/features/search/action-index/settings-entries.d.ts +41 -0
- package/dist/features/search/action-index/settings-entries.js +268 -0
- package/dist/features/search/action-index/types.d.ts +81 -0
- package/dist/features/search/action-index/types.js +102 -0
- package/dist/features/search/action-index/validate-entry.d.ts +34 -0
- package/dist/features/search/action-index/validate-entry.js +114 -0
- package/dist/features/search/hooks/useNavSuggestions.d.ts +5 -1
- package/dist/features/search/hooks/useNavSuggestions.js +23 -3
- package/dist/features/search/repository/search.repository.js +3 -1
- package/dist/features/seller/actions/offer-actions.js +43 -19
- package/dist/features/seller/actions/seller-actions.js +29 -5
- package/dist/features/seller/components/CategoryChipPicker.d.ts +9 -0
- package/dist/features/seller/components/CategoryChipPicker.js +12 -0
- package/dist/features/seller/components/FulfillmentView.js +5 -2
- package/dist/features/seller/components/PhysicalLocationModal.js +1 -1
- package/dist/features/seller/components/PrintCenterView.js +3 -1
- package/dist/features/seller/components/SellerAddressesView.js +5 -1
- package/dist/features/seller/components/SellerAnalyticsAlertsView.js +83 -43
- package/dist/features/seller/components/SellerArtView.d.ts +14 -7
- package/dist/features/seller/components/SellerArtView.js +4 -119
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerClassifiedView.d.ts +14 -7
- package/dist/features/seller/components/SellerClassifiedView.js +4 -124
- package/dist/features/seller/components/SellerCouponEditorView.d.ts +22 -1
- package/dist/features/seller/components/SellerCouponEditorView.js +91 -45
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerDigitalCodesView.d.ts +14 -7
- package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
- package/dist/features/seller/components/SellerGoogleReviewsView.js +2 -2
- package/dist/features/seller/components/SellerListingTypeView.d.ts +66 -0
- package/dist/features/seller/components/SellerListingTypeView.js +277 -0
- package/dist/features/seller/components/SellerLiveView.d.ts +14 -7
- package/dist/features/seller/components/SellerLiveView.js +4 -126
- package/dist/features/seller/components/SellerOrdersView.js +3 -3
- package/dist/features/seller/components/SellerPayoutMethodsView.js +2 -2
- package/dist/features/seller/components/SellerProductShell.d.ts +5 -0
- package/dist/features/seller/components/SellerProductShell.js +15 -5
- package/dist/features/seller/components/SellerProductsView.js +24 -10
- package/dist/features/seller/components/SellerReviewsView.js +47 -16
- package/dist/features/seller/components/SellerShippingConfigsView.js +5 -4
- package/dist/features/seller/components/SellerSidebar.d.ts +3 -6
- package/dist/features/seller/components/SellerStickersView.d.ts +14 -7
- package/dist/features/seller/components/SellerStickersView.js +4 -119
- package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
- package/dist/features/seller/components/SellerSupportView.d.ts +31 -0
- package/dist/features/seller/components/SellerSupportView.js +100 -0
- package/dist/features/seller/components/index.d.ts +4 -8
- package/dist/features/seller/components/index.js +2 -4
- package/dist/features/seller/index.d.ts +0 -1
- package/dist/features/seller/index.js +0 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +214 -0
- package/dist/features/seller/schemas/coupon-form.js +155 -23
- package/dist/features/seller/schemas/offer-forms.d.ts +16 -7
- package/dist/features/seller/schemas/offer-forms.js +28 -12
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +2 -2
- package/dist/features/shell/SectionForm.d.ts +19 -1
- package/dist/features/shell/SectionForm.js +104 -17
- package/dist/features/shell/build-sections.d.ts +23 -0
- package/dist/features/shell/build-sections.js +106 -8
- package/dist/features/shell/field-ui-meta.d.ts +44 -0
- package/dist/features/shell/field-ui-meta.js +14 -7
- package/dist/features/shell/form-sections.d.ts +46 -0
- package/dist/features/shell/form-sections.js +114 -0
- package/dist/features/shipments/components/AdminShipmentEditorView.js +87 -64
- package/dist/features/shipments/schemas/validation.d.ts +2 -2
- package/dist/features/shipments/schemas/validation.js +44 -13
- package/dist/features/store-extensions/schemas/custom-role-form.js +6 -2
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +7 -7
- package/dist/features/store-extensions/schemas/payout-method-form.js +14 -0
- package/dist/features/stores/actions/store-query-actions.js +3 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -1
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +12 -3
- package/dist/features/support/repository/support.repository.d.ts +21 -0
- package/dist/features/support/repository/support.repository.js +63 -0
- package/dist/features/support/schemas/firestore.d.ts +27 -2
- package/dist/features/support/schemas/firestore.js +2 -0
- package/dist/features/support/schemas/ticket-create-form.js +7 -0
- package/dist/features/tester/schemas/checklist-item-form.d.ts +43 -0
- package/dist/features/tester/schemas/checklist-item-form.js +109 -0
- package/dist/features/tester/seed-data/blog-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/categories-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/events-tester-seed-data.js +5 -5
- package/dist/features/tester/seed-data/orders-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/products-tester-seed-data.js +48 -49
- package/dist/features/tester/seed-data/stores-tester-seed-data.js +3 -3
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +291 -30
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +51 -14
- package/dist/features/wishlist/hooks/useWishlistToggle.js +8 -1
- package/dist/http/api-handler.js +2 -1
- package/dist/index.d.ts +25 -104
- package/dist/index.js +38 -143
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.js +1 -1
- package/dist/monitoring/browser.d.ts +0 -2
- package/dist/monitoring/browser.js +12 -1
- package/dist/monitoring/index.d.ts +0 -2
- package/dist/monitoring/index.js +0 -1
- package/dist/next/api/routeHandler.js +9 -4
- package/dist/next/index.d.ts +1 -2
- package/dist/next/index.js +0 -1
- package/dist/next/middleware/index.d.ts +0 -2
- package/dist/next/middleware/index.js +0 -1
- package/dist/next/routing/route-map.d.ts +8 -7
- package/dist/next/routing/route-map.js +10 -3
- package/dist/providers/auth-firebase/session.js +3 -1
- package/dist/providers/db-firebase/admin-app-lite.js +8 -8
- package/dist/providers/db-firebase/admin.js +27 -13
- package/dist/providers/db-firebase/browser-stub.d.ts +1 -11
- package/dist/providers/db-firebase/browser-stub.js +6 -11
- package/dist/providers/db-firebase/index.d.ts +0 -1
- package/dist/providers/db-firebase/index.js +0 -1
- package/dist/providers/db-firebase/rtdb-paths.d.ts +15 -6
- package/dist/providers/db-firebase/rtdb-paths.js +15 -6
- package/dist/providers/db-firebase/rtdb-url.d.ts +27 -0
- package/dist/providers/db-firebase/rtdb-url.js +50 -0
- package/dist/providers/db-firebase/sieve.d.ts +22 -0
- package/dist/providers/firebase-client/realtime.d.ts +20 -0
- package/dist/providers/firebase-client/realtime.js +34 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +1 -1
- package/dist/react/hooks/use-action-dispatch.js +8 -2
- package/dist/react/hooks/useFormStatePreservation.js +3 -1
- package/dist/react/hooks/useListingTypeFlags.d.ts +1 -1
- package/dist/react/hooks/useListingTypeFlags.js +1 -1
- package/dist/react/hooks/usePendingFilters.js +5 -3
- package/dist/react/hooks/usePendingTable.js +15 -3
- package/dist/react/hooks/useRealtimeEvent.js +20 -9
- package/dist/repositories/index.d.ts +0 -1
- package/dist/repositories/index.js +0 -1
- package/dist/schemas/registry.d.ts +197 -232
- package/dist/schemas/registry.js +5 -6
- package/dist/schemas/webhooks/razorpay.d.ts +50 -50
- package/dist/security/authorization.d.ts +9 -0
- package/dist/security/authorization.js +16 -2
- package/dist/security/browser.d.ts +1 -3
- package/dist/security/browser.js +5 -2
- package/dist/security/index.d.ts +1 -3
- package/dist/security/index.js +19 -2
- package/dist/security/pii-encrypt.js +16 -0
- package/dist/security/pii-schemas.d.ts +0 -14
- package/dist/security/pii-schemas.js +7 -15
- package/dist/seed/_helpers/category-forest.js +2 -2
- package/dist/seed/_helpers/media.d.ts +19 -0
- package/dist/seed/_helpers/media.js +75 -0
- package/dist/seed/blog-posts-seed-data.js +17 -17
- package/dist/seed/carousel-slides-seed-data.js +7 -7
- package/dist/seed/cart-seed-data.js +13 -13
- package/dist/seed/categories-seed-data.js +10 -10
- package/dist/seed/events-seed-data.js +24 -24
- package/dist/seed/factories/product.factory.js +4 -4
- package/dist/seed/factories/store.factory.js +3 -3
- package/dist/seed/factories/user.factory.js +2 -2
- package/dist/seed/grouped-listings-seed-data.js +11 -11
- package/dist/seed/homepage-sections-seed-data.js +2 -2
- package/dist/seed/index.d.ts +0 -1
- package/dist/seed/index.js +0 -1
- package/dist/seed/manifest.d.ts +1 -1
- package/dist/seed/manifest.js +0 -5
- package/dist/seed/notifications-seed-data.js +20 -1
- package/dist/seed/orders-seed-data.js +2 -2
- package/dist/seed/products-art-seed-data.js +16 -16
- package/dist/seed/products-auctions-seed-data.js +34 -34
- package/dist/seed/products-classifieds-seed-data.js +35 -37
- package/dist/seed/products-digital-codes-seed-data.js +20 -20
- package/dist/seed/products-live-items-seed-data.js +11 -11
- package/dist/seed/products-preorders-seed-data.js +13 -13
- package/dist/seed/products-prize-draws-seed-data.js +43 -43
- package/dist/seed/products-standard-seed-data.js +54 -54
- package/dist/seed/products-stickers-seed-data.js +15 -15
- package/dist/seed/reviews-seed-data.js +4 -4
- package/dist/seed/scammers-seed-data.js +3 -3
- package/dist/seed/site-settings-seed-data.js +11 -24
- package/dist/seed/store-extensions-seed-data.js +10 -10
- package/dist/seed/stores-seed-data.js +11 -11
- package/dist/seed/support-tickets-seed-data.d.ts +14 -0
- package/dist/seed/support-tickets-seed-data.js +20 -1
- package/dist/seed/users-seed-data.js +20 -20
- package/dist/server-entry.d.ts +0 -1
- package/dist/server-entry.js +0 -1
- package/dist/server.d.ts +9 -6
- package/dist/server.js +7 -13
- package/dist/styles.css +248 -68
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +2 -2
- package/dist/tokens/themes/default-light.js +2 -2
- package/dist/tokens/tokens.css +24 -4
- package/dist/ui/components/ActionRow.d.ts +50 -0
- package/dist/ui/components/ActionRow.js +53 -0
- package/dist/ui/components/ActionRow.style.css +145 -0
- package/dist/ui/components/Drawer.d.ts +10 -0
- package/dist/ui/components/Drawer.js +2 -1
- package/dist/ui/components/FilterDrawer.js +4 -1
- package/dist/ui/components/FilterDrawer.style.css +6 -12
- package/dist/ui/components/FormActionBar.js +14 -1
- package/dist/ui/components/FormActionBar.style.css +12 -11
- package/dist/ui/components/ListingLayout.js +8 -1
- package/dist/ui/components/ListingLayout.style.css +6 -13
- package/dist/ui/components/Modal.d.ts +15 -1
- package/dist/ui/components/Modal.js +17 -3
- package/dist/ui/components/QuickCreateModal.js +2 -2
- package/dist/ui/components/QuickCreateModal.style.css +78 -84
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/dist/ui/components/SideDrawer.d.ts +8 -0
- package/dist/ui/components/SideDrawer.js +2 -1
- package/dist/ui/components/SideDrawer.style.css +6 -3
- package/dist/ui/components/SideModal.d.ts +11 -1
- package/dist/ui/components/SideModal.js +3 -2
- package/dist/ui/components/SideModal.style.css +14 -0
- package/dist/ui/components/Typography.style.css +33 -24
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/components/toolbar-collapse.js +1 -2
- package/dist/ui/forms/FormShell.style.css +260 -311
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.js +1 -1
- package/dist/validation/schemas.d.ts +0 -19
- package/dist/validation/schemas.js +8 -19
- package/package.json +1 -1
- 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,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("
|
|
117
|
+
}): Promise<import("../../..").PagedResult<import("../../..").ContactSubmissionDocument>>;
|
|
@@ -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
|
+
}
|