@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.
- 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 -87
- package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
- package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
- 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/categories/data.js +15 -4
- 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/live/index.d.ts +0 -1
- package/dist/_internal/server/features/live/index.js +0 -1
- package/dist/_internal/server/features/products/data.js +15 -5
- 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/site-settings/adapters.d.ts +2 -2
- package/dist/_internal/server/features/site-settings/adapters.js +8 -5
- 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/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/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/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.d.ts +37 -20
- package/dist/client.js +36 -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/extend.d.ts +0 -9
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/realtime-session.js +7 -0
- 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/messages.d.ts +0 -8
- package/dist/errors/messages.js +0 -9
- 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/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/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/auth/actions/index.d.ts +0 -1
- package/dist/features/auth/actions/index.js +0 -1
- 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/Guards.js +2 -1
- package/dist/features/auth/components/LoginForm.d.ts +0 -2
- package/dist/features/auth/components/LoginForm.js +1 -3
- package/dist/features/auth/components/RegisterForm.js +62 -19
- 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/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/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/schemas/bundle-form.d.ts +142 -0
- package/dist/features/categories/schemas/bundle-form.js +149 -0
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
- package/dist/features/classified/components/ClassifiedDetailPageView.js +37 -16
- 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/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/homepage/components/MarketplaceHomepageView.js +24 -5
- package/dist/features/homepage/hooks/useBlogArticles.js +1 -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/lottery/schemas/config-write.d.ts +9 -5
- package/dist/features/lottery/schemas/config-write.js +69 -9
- 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/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/ProductDetailActions.js +0 -1
- package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
- package/dist/features/products/components/ProductDetailPageView.js +8 -5
- 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/products.repository.d.ts +5 -1
- package/dist/features/products/repository/products.repository.js +23 -1
- 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 +8 -7
- 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 -24
- 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/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/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/SellerDigitalCodesView.d.ts +14 -7
- package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
- 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/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/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/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 +275 -29
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +48 -12
- package/dist/http/api-handler.js +2 -1
- package/dist/index.d.ts +24 -103
- package/dist/index.js +33 -141
- 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 +6 -3
- 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/db-firebase/admin.js +15 -1
- package/dist/providers/db-firebase/sieve.d.ts +22 -0
- 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/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/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,277 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/*
|
|
4
|
+
* WHY: Five seller views — Art, Stickers, Classified, Digital Codes, Live Items
|
|
5
|
+
* — were 1,033 lines of the same component. Identical props, identical
|
|
6
|
+
* delete scaffolding, identical row actions, identical bulk-action map,
|
|
7
|
+
* identical `getTotal`, identical availability scope. What actually
|
|
8
|
+
* differed was a listing-type string, four lines of copy, two routes, and
|
|
9
|
+
* one to three extra columns.
|
|
10
|
+
*
|
|
11
|
+
* Five copies is well past the Duplication Framework's Rule of Three, and
|
|
12
|
+
* it had already drifted: Digital Codes offered four sort options where
|
|
13
|
+
* the other four offered five, and every one hand-wrote a sort array the
|
|
14
|
+
* plugin registry already publishes.
|
|
15
|
+
*
|
|
16
|
+
* 🛑 The deeper point is that this consolidation had ALREADY been done —
|
|
17
|
+
* `buildListingTypeListingConfig` exists, is tagged `pattern:factory`, its
|
|
18
|
+
* header describes this exact problem, and it already accepts
|
|
19
|
+
* `portal: "seller"`. It had FIVE admin callers and ZERO seller ones. The
|
|
20
|
+
* seller half was written by hand next to it. That is the unadopted-layer
|
|
21
|
+
* shape this whole plan exists to close, so this file adopts it rather
|
|
22
|
+
* than starting a third implementation.
|
|
23
|
+
*
|
|
24
|
+
* WHAT: One component. Everything shared lives here; everything per-type lives
|
|
25
|
+
* in `SELLER_LISTING_TYPE_SPECS` below, which is the complete inventory
|
|
26
|
+
* of what genuinely differs.
|
|
27
|
+
*
|
|
28
|
+
* EXPORTS: SellerListingRow, SellerListingTypeSpec, SELLER_LISTING_TYPE_SPECS,
|
|
29
|
+
* SellerListingTypeView, SellerListingTypeViewProps
|
|
30
|
+
*
|
|
31
|
+
* @tag domain:seller,products
|
|
32
|
+
* @tag layer:view
|
|
33
|
+
* @tag pattern:factory
|
|
34
|
+
* @tag access:client
|
|
35
|
+
* @tag consumers:SellerArtView,SellerStickersView,SellerClassifiedView,SellerDigitalCodesView,SellerLiveView
|
|
36
|
+
* @tag sideEffects:none
|
|
37
|
+
*/
|
|
38
|
+
import React, { useCallback, useState } from "react";
|
|
39
|
+
import { Badge, ConfirmDeleteModal, RowActionMenu, Span, Text } from "../../../ui";
|
|
40
|
+
import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
|
|
41
|
+
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
42
|
+
import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
|
|
43
|
+
import { ROUTES } from "../../../next/routing/route-map";
|
|
44
|
+
import { sortBy } from "../../../constants/sort";
|
|
45
|
+
import { PRODUCT_FIELDS } from "../../../constants/field-names";
|
|
46
|
+
import { SIEVE_OP, sieveFilter } from "../../../utils/sieve-builder";
|
|
47
|
+
import { pluginFor } from "../../../_internal/shared/listing-types/_registry";
|
|
48
|
+
import { toCurrency, toRecordArray, toRelativeDate, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
49
|
+
import { DataListingView } from "../../admin/components/DataListingView";
|
|
50
|
+
import { ROW_ACTION_META, SELLER_BULK_ACTIONS } from "../../products/constants/action-defs";
|
|
51
|
+
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
52
|
+
/* ── Shared column renderers ─────────────────────────────────────────────── */
|
|
53
|
+
const textCell = (key, header) => ({
|
|
54
|
+
key,
|
|
55
|
+
header,
|
|
56
|
+
render: (row) => (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row[key] || "—" })),
|
|
57
|
+
});
|
|
58
|
+
const numberCell = (key, header) => ({
|
|
59
|
+
key,
|
|
60
|
+
header,
|
|
61
|
+
render: (row) => (_jsx(Text, { className: "tabular-nums", size: "sm", children: row[key] || "0" })),
|
|
62
|
+
});
|
|
63
|
+
export const SELLER_LISTING_TYPE_SPECS = {
|
|
64
|
+
art: {
|
|
65
|
+
editRoute: (id) => String(ROUTES.STORE.ART_EDIT(id)),
|
|
66
|
+
newRoute: String(ROUTES.STORE.ART_NEW),
|
|
67
|
+
createLabel: "New Art Print",
|
|
68
|
+
bulkKey: "art",
|
|
69
|
+
deleteLabel: "Art Listing",
|
|
70
|
+
searchPlaceholder: "Search art prints...",
|
|
71
|
+
emptyLabel: "No art listings yet — list your first print",
|
|
72
|
+
extraFields: (item) => ({
|
|
73
|
+
size: toStringValue(item.printMeta?.size, ""),
|
|
74
|
+
}),
|
|
75
|
+
extraColumns: [textCell("size", "Size")],
|
|
76
|
+
},
|
|
77
|
+
stickers: {
|
|
78
|
+
editRoute: (id) => String(ROUTES.STORE.STICKERS_EDIT(id)),
|
|
79
|
+
newRoute: String(ROUTES.STORE.STICKERS_NEW),
|
|
80
|
+
createLabel: "New Sticker Listing",
|
|
81
|
+
bulkKey: "stickers",
|
|
82
|
+
deleteLabel: "Sticker Listing",
|
|
83
|
+
searchPlaceholder: "Search sticker listings...",
|
|
84
|
+
emptyLabel: "No sticker listings yet — list your first pack",
|
|
85
|
+
extraFields: (item) => ({
|
|
86
|
+
size: toStringValue(item.printMeta?.size, ""),
|
|
87
|
+
}),
|
|
88
|
+
extraColumns: [textCell("size", "Size")],
|
|
89
|
+
},
|
|
90
|
+
classified: {
|
|
91
|
+
editRoute: (id) => String(ROUTES.STORE.CLASSIFIED_EDIT(id)),
|
|
92
|
+
newRoute: String(ROUTES.STORE.CLASSIFIED_NEW),
|
|
93
|
+
createLabel: "New Classified",
|
|
94
|
+
bulkKey: "classified",
|
|
95
|
+
deleteLabel: "Classified Listing",
|
|
96
|
+
searchPlaceholder: "Search classified listings...",
|
|
97
|
+
emptyLabel: "No classified listings yet — post your first buy/sell/trade ad",
|
|
98
|
+
// `title` pinned: the plugin's pluralLabel is "Classifieds", and the page
|
|
99
|
+
// heading has always read "Classified". Kept rather than silently renamed.
|
|
100
|
+
title: "Classified",
|
|
101
|
+
extraFields: (item) => {
|
|
102
|
+
const meta = (item.classified ?? {});
|
|
103
|
+
return {
|
|
104
|
+
location: toStringValue(meta.meetupArea?.city ?? meta.city, ""),
|
|
105
|
+
shipping: meta.acceptsShipping ? "Ships" : "Meetup only",
|
|
106
|
+
};
|
|
107
|
+
},
|
|
108
|
+
extraColumns: [
|
|
109
|
+
textCell("location", "Location"),
|
|
110
|
+
{
|
|
111
|
+
key: "shipping",
|
|
112
|
+
header: "Shipping",
|
|
113
|
+
render: (row) => (_jsx(Badge, { variant: row.shipping === "Ships" ? "active" : "inactive", size: "xs", children: row.shipping })),
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
"digital-code": {
|
|
118
|
+
editRoute: (id) => String(ROUTES.STORE.DIGITAL_CODES_EDIT(id)),
|
|
119
|
+
newRoute: String(ROUTES.STORE.DIGITAL_CODES_NEW),
|
|
120
|
+
createLabel: "New Digital Code",
|
|
121
|
+
bulkKey: "digitalCodes",
|
|
122
|
+
deleteLabel: "Digital Code Listing",
|
|
123
|
+
searchPlaceholder: "Search digital code listings...",
|
|
124
|
+
emptyLabel: "No digital code listings yet",
|
|
125
|
+
titleHeader: "Product",
|
|
126
|
+
deleteSuccess: "Code deleted.",
|
|
127
|
+
extraFields: (item) => {
|
|
128
|
+
const meta = (item.digitalCode ?? {});
|
|
129
|
+
return {
|
|
130
|
+
totalCodes: toStringValue(meta.codePoolSize, "0"),
|
|
131
|
+
available: toStringValue(meta.codesAvailable, "0"),
|
|
132
|
+
delivery: toStringValue(meta.codeDeliveryMethod, "").replace(/-/g, " "),
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
extraColumns: [
|
|
136
|
+
numberCell("totalCodes", "Total Codes"),
|
|
137
|
+
numberCell("available", "Available"),
|
|
138
|
+
{
|
|
139
|
+
key: "delivery",
|
|
140
|
+
header: "Delivery",
|
|
141
|
+
render: (row) => (_jsx(Span, { size: "xs", className: "capitalize", padding: "pill-sm", rounded: "full", surface: "subtle", color: "muted", children: row.delivery || "—" })),
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
live: {
|
|
146
|
+
editRoute: (id) => String(ROUTES.STORE.LIVE_ITEMS_EDIT(id)),
|
|
147
|
+
newRoute: String(ROUTES.STORE.LIVE_ITEMS_NEW),
|
|
148
|
+
createLabel: "New Live Item",
|
|
149
|
+
bulkKey: "live",
|
|
150
|
+
deleteLabel: "Live Item Listing",
|
|
151
|
+
searchPlaceholder: "Search live item listings...",
|
|
152
|
+
emptyLabel: "No live item listings yet",
|
|
153
|
+
titleHeader: "Item",
|
|
154
|
+
createdHeader: "Listed",
|
|
155
|
+
extraFields: (item) => {
|
|
156
|
+
const meta = (item.liveItem ?? {});
|
|
157
|
+
return {
|
|
158
|
+
species: toStringValue(meta.species, ""),
|
|
159
|
+
age: meta.ageMonths ? `${meta.ageMonths} mo` : "",
|
|
160
|
+
verified: meta.vendorVerified ? "Verified" : "Unverified",
|
|
161
|
+
};
|
|
162
|
+
},
|
|
163
|
+
extraColumns: [
|
|
164
|
+
textCell("age", "Age"),
|
|
165
|
+
{
|
|
166
|
+
key: "verified",
|
|
167
|
+
header: "Verified",
|
|
168
|
+
render: (row) => (_jsx(Span, { size: "xs", color: row.verified === "Verified" ? "success" : "warning", children: row.verified })),
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
export function SellerListingTypeView({ type, onCreateClick, onEditClick, onDelete, onBulkDelete, }) {
|
|
174
|
+
const spec = SELLER_LISTING_TYPE_SPECS[type];
|
|
175
|
+
const plugin = pluginFor(type);
|
|
176
|
+
const [deleteTargetId, setDeleteTargetId] = useState(null);
|
|
177
|
+
const { deletingId, handleDelete: performDelete } = useEntityDelete({
|
|
178
|
+
endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
|
|
179
|
+
deleteFn: onDelete,
|
|
180
|
+
successMessage: spec.deleteSuccess ?? "Listing deleted.",
|
|
181
|
+
fetchOptions: { credentials: "include" },
|
|
182
|
+
});
|
|
183
|
+
const handleDelete = useCallback(async (id) => {
|
|
184
|
+
await performDelete(id);
|
|
185
|
+
setDeleteTargetId(null);
|
|
186
|
+
}, [performDelete]);
|
|
187
|
+
const handleEdit = useCallback((id) => {
|
|
188
|
+
if (onEditClick)
|
|
189
|
+
onEditClick(id);
|
|
190
|
+
else
|
|
191
|
+
window.location.href = spec.editRoute(id);
|
|
192
|
+
}, [onEditClick, spec]);
|
|
193
|
+
const handleCreate = useCallback(() => {
|
|
194
|
+
if (onCreateClick)
|
|
195
|
+
onCreateClick();
|
|
196
|
+
else
|
|
197
|
+
window.location.href = spec.newRoute;
|
|
198
|
+
}, [onCreateClick, spec]);
|
|
199
|
+
/*
|
|
200
|
+
* 🛑 Unconditional, and before any early return. `SellerPreOrdersView` called
|
|
201
|
+
* this AFTER a conditional return — a rules-of-hooks violation that survived
|
|
202
|
+
* because that view had no page rendering it.
|
|
203
|
+
*/
|
|
204
|
+
const scope = useAvailabilityScope(React.useMemo(() => [type], [type]));
|
|
205
|
+
const columns = [
|
|
206
|
+
{
|
|
207
|
+
key: "title",
|
|
208
|
+
header: spec.titleHeader ?? "Listing",
|
|
209
|
+
render: (row) => (_jsxs(_Fragment, { children: [_jsx(Text, { size: "sm", weight: "medium", children: row.title }), row.species ? (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: row.species })) : null] })),
|
|
210
|
+
},
|
|
211
|
+
{ key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
|
|
212
|
+
...(spec.extraColumns ?? []),
|
|
213
|
+
{
|
|
214
|
+
key: "status",
|
|
215
|
+
header: "Status",
|
|
216
|
+
render: (row) => (_jsx(Badge, { variant: row.status === "active" ? "active" : "inactive", size: "xs", className: "capitalize", children: row.status })),
|
|
217
|
+
},
|
|
218
|
+
textCell("createdAt", spec.createdHeader ?? "Created"),
|
|
219
|
+
];
|
|
220
|
+
const config = {
|
|
221
|
+
portal: "seller",
|
|
222
|
+
title: spec.title ?? plugin.pluralLabel,
|
|
223
|
+
searchPlaceholder: spec.searchPlaceholder,
|
|
224
|
+
emptyLabel: spec.emptyLabel,
|
|
225
|
+
filterKeys: [],
|
|
226
|
+
defaultSort: sortBy(PRODUCT_FIELDS.CREATED_AT, "DESC"),
|
|
227
|
+
queryKey: ["seller", plugin.tabSlug],
|
|
228
|
+
endpoint: SELLER_ENDPOINTS.PRODUCTS,
|
|
229
|
+
// The registry's set, not a hand-copied array. Digital Codes had drifted to
|
|
230
|
+
// four options where its four siblings offered five.
|
|
231
|
+
sortOptions: [...plugin.sortOptions],
|
|
232
|
+
columns,
|
|
233
|
+
mapRows: (response) => toRecordArray(response.products ?? response.items).map((item, index) => ({
|
|
234
|
+
id: toStringValue(item.id, `${type}-${index}`),
|
|
235
|
+
title: toStringValue(item.productTitle ?? item.title, "Untitled"),
|
|
236
|
+
price: toCurrency(item.price),
|
|
237
|
+
status: toStringValue(item.status, "draft"),
|
|
238
|
+
createdAt: toRelativeDate(item.createdAt),
|
|
239
|
+
...(spec.extraFields?.(item) ?? {}),
|
|
240
|
+
})),
|
|
241
|
+
getTotal: (response, rows) => typeof response.total === "number"
|
|
242
|
+
? response.total
|
|
243
|
+
: typeof response.meta?.total === "number"
|
|
244
|
+
? response.meta.total
|
|
245
|
+
: rows.length,
|
|
246
|
+
// `sieveFilter`, not the raw `"listingType==art"` string literal all five
|
|
247
|
+
// originals wrote — a hand-built clause is invisible to every audit that
|
|
248
|
+
// checks field names against the schema.
|
|
249
|
+
buildFilters: () => sieveFilter(PRODUCT_FIELDS.LISTING_TYPE, SIEVE_OP.EQ, type),
|
|
250
|
+
buildExtraParams: () => scope.extraParams,
|
|
251
|
+
renderAboveContent: scope.renderAboveContent,
|
|
252
|
+
primaryAction: { label: spec.createLabel, onClick: handleCreate },
|
|
253
|
+
onRowClick: (row) => handleEdit(row.id),
|
|
254
|
+
// Rule #7 — the preset, never an inline action object.
|
|
255
|
+
buildBulkActions: onBulkDelete
|
|
256
|
+
? (selection) => SELLER_BULK_ACTIONS[spec.bulkKey].map((id) => ({
|
|
257
|
+
id,
|
|
258
|
+
label: ROW_ACTION_META[id].label,
|
|
259
|
+
destructive: ROW_ACTION_META[id].destructive,
|
|
260
|
+
onClick: async () => {
|
|
261
|
+
await onBulkDelete(selection.selectedIds);
|
|
262
|
+
selection.clearSelection();
|
|
263
|
+
},
|
|
264
|
+
}))
|
|
265
|
+
: undefined,
|
|
266
|
+
renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
|
|
267
|
+
{ label: ACTIONS.STORE["edit-listing"].label, onClick: () => handleEdit(row.id) },
|
|
268
|
+
{
|
|
269
|
+
label: ACTIONS.STORE["delete-listing"].label,
|
|
270
|
+
destructive: true,
|
|
271
|
+
onClick: () => setDeleteTargetId(row.id),
|
|
272
|
+
disabled: deletingId === row.id,
|
|
273
|
+
},
|
|
274
|
+
] })),
|
|
275
|
+
};
|
|
276
|
+
return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), deleteTargetId && (_jsx(ConfirmDeleteModal, { isOpen: true, title: `Delete ${spec.deleteLabel}`, message: `Are you sure you want to delete this ${spec.deleteLabel.toLowerCase()}? This cannot be undone.`, onConfirm: () => handleDelete(deleteTargetId), onClose: () => setDeleteTargetId(null), isDeleting: deletingId === deleteTargetId }))] }));
|
|
277
|
+
}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SellerLiveView — seller browse/manage of live item listings.
|
|
3
|
+
*
|
|
4
|
+
* A named wrapper, kept so the page, the barrel and every existing import path
|
|
5
|
+
* stay unchanged. All behaviour is `SellerListingTypeView`; everything this
|
|
6
|
+
* type does differently is one entry in `SELLER_LISTING_TYPE_SPECS`.
|
|
7
|
+
*
|
|
8
|
+
* This file was 224 lines of a component that four siblings also contained
|
|
9
|
+
* verbatim — see that file's header for why the duplication mattered rather
|
|
10
|
+
* than merely being untidy.
|
|
11
|
+
*/
|
|
1
12
|
import React from "react";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
onDelete?: (id: string) => Promise<void>;
|
|
6
|
-
onBulkDelete?: (ids: string[]) => Promise<void>;
|
|
7
|
-
}
|
|
8
|
-
export declare function SellerLiveView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }: SellerLiveViewProps): React.JSX.Element;
|
|
13
|
+
import { type SellerListingTypeViewProps } from "./SellerListingTypeView";
|
|
14
|
+
export type SellerLiveViewProps = SellerListingTypeViewProps;
|
|
15
|
+
export declare function SellerLiveView(props: SellerLiveViewProps): React.JSX.Element;
|
|
@@ -1,128 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { ConfirmDeleteModal, Div, RowActionMenu, Text } from "../../../ui";
|
|
7
|
-
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
8
|
-
import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
|
|
9
|
-
import { ROUTES } from "../../../constants/index";
|
|
10
|
-
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
11
|
-
import { DataListingView } from "../../admin/components/DataListingView";
|
|
12
|
-
import { SELLER_BULK_ACTIONS, ROW_ACTION_META } from "../../products/constants/action-defs";
|
|
13
|
-
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
14
|
-
const LISTING_TYPES = ["live"];
|
|
15
|
-
const COLUMNS = [
|
|
16
|
-
{
|
|
17
|
-
key: "title",
|
|
18
|
-
header: "Item",
|
|
19
|
-
render: (row) => (_jsxs(Div, { children: [_jsx(Text, { size: "sm", weight: "medium", children: row.title }), row.species && (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)] italic", size: "xs", children: row.species }))] })),
|
|
20
|
-
},
|
|
21
|
-
{ key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
|
|
22
|
-
{
|
|
23
|
-
key: "ageMonths",
|
|
24
|
-
header: "Age",
|
|
25
|
-
render: (row) => (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.ageMonths !== null ? `${row.ageMonths}mo` : "—" })),
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
key: "vendorVerified",
|
|
29
|
-
header: "Verified",
|
|
30
|
-
render: (row) => (_jsx(Span, { layout: "inline-flex", surface: row.vendorVerified ? "success-surface" : "warning-surface", color: row.vendorVerified ? "success" : "warning", size: "xs", weight: "medium", rounded: "full", padding: "pill-xs", children: row.vendorVerified ? "Verified" : "Pending" })),
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
key: "status",
|
|
34
|
-
header: "Status",
|
|
35
|
-
render: (row) => (_jsx(Badge, { variant: row.status === "active" ? "active" : "inactive", size: "xs", className: "capitalize", children: row.status })),
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
key: "createdAt",
|
|
39
|
-
header: "Listed",
|
|
40
|
-
render: (row) => (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.createdAt })),
|
|
41
|
-
},
|
|
42
|
-
];
|
|
43
|
-
export function SellerLiveView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }) {
|
|
44
|
-
const [deleteTargetId, setDeleteTargetId] = useState(null);
|
|
45
|
-
const { deletingId, handleDelete: performDelete } = useEntityDelete({
|
|
46
|
-
endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
|
|
47
|
-
deleteFn: onDelete,
|
|
48
|
-
successMessage: "Listing deleted.",
|
|
49
|
-
fetchOptions: { credentials: "include" },
|
|
50
|
-
});
|
|
51
|
-
const handleDelete = useCallback(async (id) => {
|
|
52
|
-
await performDelete(id);
|
|
53
|
-
setDeleteTargetId(null);
|
|
54
|
-
}, [performDelete]);
|
|
55
|
-
const handleEdit = useCallback((id) => {
|
|
56
|
-
if (onEditClick)
|
|
57
|
-
onEditClick(id);
|
|
58
|
-
else
|
|
59
|
-
window.location.href = String(ROUTES.STORE.LIVE_ITEMS_EDIT(id));
|
|
60
|
-
}, [onEditClick]);
|
|
61
|
-
const handleCreate = useCallback(() => {
|
|
62
|
-
if (onCreateClick)
|
|
63
|
-
onCreateClick();
|
|
64
|
-
else
|
|
65
|
-
window.location.href = String(ROUTES.STORE.LIVE_ITEMS_NEW);
|
|
66
|
-
}, [onCreateClick]);
|
|
67
|
-
const scope = useAvailabilityScope(LISTING_TYPES);
|
|
68
|
-
const config = {
|
|
69
|
-
portal: "seller",
|
|
70
|
-
title: "Live Items",
|
|
71
|
-
searchPlaceholder: "Search live item listings...",
|
|
72
|
-
emptyLabel: "No live item listings yet",
|
|
73
|
-
filterKeys: [],
|
|
74
|
-
defaultSort: sortBy("createdAt", "DESC"),
|
|
75
|
-
queryKey: ["seller", "live-items"],
|
|
76
|
-
endpoint: SELLER_ENDPOINTS.PRODUCTS,
|
|
77
|
-
sortOptions: [
|
|
78
|
-
{ value: sortBy("createdAt", "DESC"), label: "Newest" },
|
|
79
|
-
{ value: sortBy("createdAt", "ASC"), label: "Oldest" },
|
|
80
|
-
{ value: "title", label: "Name A–Z" },
|
|
81
|
-
{ value: sortBy("price", "ASC"), label: "Price: Low–High" },
|
|
82
|
-
{ value: sortBy("price", "DESC"), label: "Price: High–Low" },
|
|
83
|
-
],
|
|
84
|
-
columns: COLUMNS,
|
|
85
|
-
mapRows: (response) => toRecordArray(response.products).map((item, index) => {
|
|
86
|
-
const live = (item.liveItem ?? {});
|
|
87
|
-
return {
|
|
88
|
-
id: toStringValue(item.id, `live-${index}`),
|
|
89
|
-
title: toStringValue(item.productTitle ?? item.title, "Untitled"),
|
|
90
|
-
price: toCurrency(item.price),
|
|
91
|
-
species: toStringValue(live.species, ""),
|
|
92
|
-
ageMonths: typeof live.ageMonths === "number" ? live.ageMonths : null,
|
|
93
|
-
vendorVerified: Boolean(live.vendorVerified),
|
|
94
|
-
status: toStringValue(item.status, "draft"),
|
|
95
|
-
createdAt: toRelativeDate(item.createdAt),
|
|
96
|
-
};
|
|
97
|
-
}),
|
|
98
|
-
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
99
|
-
buildFilters: () => "listingType==live",
|
|
100
|
-
buildExtraParams: () => scope.extraParams,
|
|
101
|
-
renderAboveContent: scope.renderAboveContent,
|
|
102
|
-
primaryAction: { label: "New Live Item", onClick: () => handleCreate() },
|
|
103
|
-
// Mirrors the "Edit" row action below so table rows and cards both navigate on click.
|
|
104
|
-
onRowClick: (row) => handleEdit(row.id),
|
|
105
|
-
// Rule #7: bulk-action array sourced from the SELLER_BULK_ACTIONS preset.
|
|
106
|
-
buildBulkActions: onBulkDelete
|
|
107
|
-
? (selection) => SELLER_BULK_ACTIONS.live.map((id) => ({
|
|
108
|
-
id,
|
|
109
|
-
label: ROW_ACTION_META[id].label,
|
|
110
|
-
destructive: ROW_ACTION_META[id].destructive,
|
|
111
|
-
onClick: async () => {
|
|
112
|
-
await onBulkDelete(selection.selectedIds);
|
|
113
|
-
selection.clearSelection();
|
|
114
|
-
},
|
|
115
|
-
}))
|
|
116
|
-
: undefined,
|
|
117
|
-
renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
|
|
118
|
-
{ label: ACTIONS.STORE["edit-listing"].label, onClick: () => handleEdit(row.id) },
|
|
119
|
-
{
|
|
120
|
-
label: ACTIONS.STORE["delete-listing"].label,
|
|
121
|
-
destructive: true,
|
|
122
|
-
onClick: () => setDeleteTargetId(row.id),
|
|
123
|
-
disabled: deletingId === row.id,
|
|
124
|
-
},
|
|
125
|
-
] })),
|
|
126
|
-
};
|
|
127
|
-
return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), deleteTargetId && (_jsx(ConfirmDeleteModal, { isOpen: true, title: "Delete Live Item Listing", message: "Are you sure you want to delete this live item listing? This cannot be undone.", onConfirm: () => handleDelete(deleteTargetId), onClose: () => setDeleteTargetId(null), isDeleting: deletingId === deleteTargetId }))] }));
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { SellerListingTypeView, } from "./SellerListingTypeView";
|
|
4
|
+
export function SellerLiveView(props) {
|
|
5
|
+
return _jsx(SellerListingTypeView, { type: "live", ...props });
|
|
128
6
|
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
+
import type { SidebarNavItem } from "../../../_internal/shared/features/layout/types";
|
|
1
2
|
import React from "react";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
label: string;
|
|
5
|
-
icon?: React.ReactNode;
|
|
6
|
-
badge?: number;
|
|
7
|
-
}
|
|
3
|
+
/** A store sidebar entry. `badge` comes from `SidebarNavItem`. */
|
|
4
|
+
export type StoreNavItem = SidebarNavItem;
|
|
8
5
|
export interface StoreNavGroup {
|
|
9
6
|
title: string;
|
|
10
7
|
items: StoreNavItem[];
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SellerStickersView — seller browse/manage of sticker listings.
|
|
3
|
+
*
|
|
4
|
+
* A named wrapper, kept so the page, the barrel and every existing import path
|
|
5
|
+
* stay unchanged. All behaviour is `SellerListingTypeView`; everything this
|
|
6
|
+
* type does differently is one entry in `SELLER_LISTING_TYPE_SPECS`.
|
|
7
|
+
*
|
|
8
|
+
* This file was 194 lines of a component that four siblings also contained
|
|
9
|
+
* verbatim — see that file's header for why the duplication mattered rather
|
|
10
|
+
* than merely being untidy.
|
|
11
|
+
*/
|
|
1
12
|
import React from "react";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
onDelete?: (id: string) => Promise<void>;
|
|
6
|
-
onBulkDelete?: (ids: string[]) => Promise<void>;
|
|
7
|
-
}
|
|
8
|
-
export declare function SellerStickersView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }: SellerStickersViewProps): React.JSX.Element;
|
|
13
|
+
import { type SellerListingTypeViewProps } from "./SellerListingTypeView";
|
|
14
|
+
export type SellerStickersViewProps = SellerListingTypeViewProps;
|
|
15
|
+
export declare function SellerStickersView(props: SellerStickersViewProps): React.JSX.Element;
|
|
@@ -1,121 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
import { Badge, sortBy } from "@mohasinac/appkit/client";
|
|
8
|
-
import { useState, useCallback } from "react";
|
|
9
|
-
import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
|
|
10
|
-
import { ConfirmDeleteModal, RowActionMenu, Text } from "../../../ui";
|
|
11
|
-
import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
12
|
-
import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
|
|
13
|
-
import { ROUTES } from "../../../constants/index";
|
|
14
|
-
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
15
|
-
import { DataListingView } from "../../admin/components/DataListingView";
|
|
16
|
-
import { SELLER_BULK_ACTIONS, ROW_ACTION_META } from "../../products/constants/action-defs";
|
|
17
|
-
import { useAvailabilityScope } from "../../products/hooks/useAvailabilityScope";
|
|
18
|
-
const LISTING_TYPES = ["stickers"];
|
|
19
|
-
const COLUMNS = [
|
|
20
|
-
{ key: "title", header: "Listing", render: (row) => _jsx(Text, { size: "sm", weight: "medium", children: row.title }) },
|
|
21
|
-
{ key: "price", header: "Price", render: (row) => _jsx(Text, { className: "tabular-nums", size: "sm", children: row.price }) },
|
|
22
|
-
{
|
|
23
|
-
key: "size",
|
|
24
|
-
header: "Size",
|
|
25
|
-
render: (row) => _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.size || "—" }),
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
key: "status",
|
|
29
|
-
header: "Status",
|
|
30
|
-
render: (row) => (_jsx(Badge, { variant: row.status === "active" ? "active" : "inactive", size: "xs", className: "capitalize", children: row.status })),
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
key: "createdAt",
|
|
34
|
-
header: "Created",
|
|
35
|
-
render: (row) => _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "sm", children: row.createdAt }),
|
|
36
|
-
},
|
|
37
|
-
];
|
|
38
|
-
export function SellerStickersView({ onCreateClick, onEditClick, onDelete, onBulkDelete, }) {
|
|
39
|
-
const [deleteTargetId, setDeleteTargetId] = useState(null);
|
|
40
|
-
const { deletingId, handleDelete: performDelete } = useEntityDelete({
|
|
41
|
-
endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
|
|
42
|
-
deleteFn: onDelete,
|
|
43
|
-
successMessage: "Listing deleted.",
|
|
44
|
-
fetchOptions: { credentials: "include" },
|
|
45
|
-
});
|
|
46
|
-
const handleDelete = useCallback(async (id) => {
|
|
47
|
-
await performDelete(id);
|
|
48
|
-
setDeleteTargetId(null);
|
|
49
|
-
}, [performDelete]);
|
|
50
|
-
const handleEdit = useCallback((id) => {
|
|
51
|
-
if (onEditClick)
|
|
52
|
-
onEditClick(id);
|
|
53
|
-
else
|
|
54
|
-
window.location.href = String(ROUTES.STORE.STICKERS_EDIT(id));
|
|
55
|
-
}, [onEditClick]);
|
|
56
|
-
const handleCreate = useCallback(() => {
|
|
57
|
-
if (onCreateClick)
|
|
58
|
-
onCreateClick();
|
|
59
|
-
else
|
|
60
|
-
window.location.href = String(ROUTES.STORE.STICKERS_NEW);
|
|
61
|
-
}, [onCreateClick]);
|
|
62
|
-
const scope = useAvailabilityScope(LISTING_TYPES);
|
|
63
|
-
const config = {
|
|
64
|
-
portal: "seller",
|
|
65
|
-
title: "Stickers",
|
|
66
|
-
searchPlaceholder: "Search sticker listings...",
|
|
67
|
-
emptyLabel: "No sticker listings yet — list your first pack",
|
|
68
|
-
filterKeys: [],
|
|
69
|
-
defaultSort: sortBy("createdAt", "DESC"),
|
|
70
|
-
queryKey: ["seller", "stickers"],
|
|
71
|
-
endpoint: SELLER_ENDPOINTS.PRODUCTS,
|
|
72
|
-
sortOptions: [
|
|
73
|
-
{ value: sortBy("createdAt", "DESC"), label: "Newest" },
|
|
74
|
-
{ value: sortBy("createdAt", "ASC"), label: "Oldest" },
|
|
75
|
-
{ value: "title", label: "Name A–Z" },
|
|
76
|
-
{ value: sortBy("price", "ASC"), label: "Price: Low–High" },
|
|
77
|
-
{ value: sortBy("price", "DESC"), label: "Price: High–Low" },
|
|
78
|
-
],
|
|
79
|
-
columns: COLUMNS,
|
|
80
|
-
mapRows: (response) => toRecordArray(response.products).map((item, index) => {
|
|
81
|
-
const printMeta = (item.printMeta ?? {});
|
|
82
|
-
return {
|
|
83
|
-
id: toStringValue(item.id, `stickers-${index}`),
|
|
84
|
-
title: toStringValue(item.productTitle ?? item.title, "Untitled"),
|
|
85
|
-
price: toCurrency(item.price),
|
|
86
|
-
size: toStringValue(printMeta.size, ""),
|
|
87
|
-
status: toStringValue(item.status, "draft"),
|
|
88
|
-
createdAt: toRelativeDate(item.createdAt),
|
|
89
|
-
};
|
|
90
|
-
}),
|
|
91
|
-
getTotal: (response, mappedRows) => typeof response.meta?.total === "number" ? response.meta.total : mappedRows.length,
|
|
92
|
-
buildFilters: () => "listingType==stickers",
|
|
93
|
-
buildExtraParams: () => scope.extraParams,
|
|
94
|
-
renderAboveContent: scope.renderAboveContent,
|
|
95
|
-
primaryAction: { label: "New Sticker Listing", onClick: () => handleCreate() },
|
|
96
|
-
// Mirrors the "Edit" row action below so table rows and cards both navigate on click.
|
|
97
|
-
onRowClick: (row) => handleEdit(row.id),
|
|
98
|
-
// Rule #7: bulk-action array sourced from the SELLER_BULK_ACTIONS preset.
|
|
99
|
-
buildBulkActions: onBulkDelete
|
|
100
|
-
? (selection) => SELLER_BULK_ACTIONS.stickers.map((id) => ({
|
|
101
|
-
id,
|
|
102
|
-
label: ROW_ACTION_META[id].label,
|
|
103
|
-
destructive: ROW_ACTION_META[id].destructive,
|
|
104
|
-
onClick: async () => {
|
|
105
|
-
await onBulkDelete(selection.selectedIds);
|
|
106
|
-
selection.clearSelection();
|
|
107
|
-
},
|
|
108
|
-
}))
|
|
109
|
-
: undefined,
|
|
110
|
-
renderRowActions: (row) => (_jsx(RowActionMenu, { actions: [
|
|
111
|
-
{ label: ACTIONS.STORE["edit-listing"].label, onClick: () => handleEdit(row.id) },
|
|
112
|
-
{
|
|
113
|
-
label: ACTIONS.STORE["delete-listing"].label,
|
|
114
|
-
destructive: true,
|
|
115
|
-
onClick: () => setDeleteTargetId(row.id),
|
|
116
|
-
disabled: deletingId === row.id,
|
|
117
|
-
},
|
|
118
|
-
] })),
|
|
119
|
-
};
|
|
120
|
-
return (_jsxs(_Fragment, { children: [_jsx(DataListingView, { config: config }), deleteTargetId && (_jsx(ConfirmDeleteModal, { isOpen: true, title: "Delete Sticker Listing", message: "Are you sure you want to delete this sticker listing? This cannot be undone.", onConfirm: () => handleDelete(deleteTargetId), onClose: () => setDeleteTargetId(null), isDeleting: deletingId === deleteTargetId }))] }));
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { SellerListingTypeView, } from "./SellerListingTypeView";
|
|
4
|
+
export function SellerStickersView(props) {
|
|
5
|
+
return _jsx(SellerListingTypeView, { type: "stickers", ...props });
|
|
121
6
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SellerSupportView — the tickets raised about this seller's store.
|
|
3
|
+
*
|
|
4
|
+
* ## Why there was nothing here before
|
|
5
|
+
*
|
|
6
|
+
* Support has always had a buyer surface and an admin surface and no seller
|
|
7
|
+
* one — no page, no API route, not even a `ROUTES.STORE.SUPPORT` constant.
|
|
8
|
+
* The reason was structural rather than an oversight: `SupportTicketDocument`
|
|
9
|
+
* had no queryable `storeId`, so "the tickets about my store" was not a
|
|
10
|
+
* question the data could answer.
|
|
11
|
+
*
|
|
12
|
+
* There is a category called `store_change_request` — sellers asking an admin
|
|
13
|
+
* to change a store field they cannot edit themselves — which a seller could
|
|
14
|
+
* only ever file through the BUYER surface, and then never see again from the
|
|
15
|
+
* store dashboard.
|
|
16
|
+
*
|
|
17
|
+
* ## Read-only, deliberately
|
|
18
|
+
*
|
|
19
|
+
* A seller can see and follow a ticket about their store; replying goes
|
|
20
|
+
* through the ticket thread the buyer and admin already share, and status is
|
|
21
|
+
* an admin decision. Giving a seller a status control here would let them
|
|
22
|
+
* close a complaint made against them.
|
|
23
|
+
*/
|
|
24
|
+
import React from "react";
|
|
25
|
+
import type { StackedViewShellProps } from "../../../ui";
|
|
26
|
+
export interface SellerSupportViewProps extends Omit<StackedViewShellProps, "sections"> {
|
|
27
|
+
labels?: {
|
|
28
|
+
title?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare function SellerSupportView({ labels }: SellerSupportViewProps): React.JSX.Element;
|