@mohasinac/appkit 4.13.1 → 4.15.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/DashboardLayoutClient.js +14 -5
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
- package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
- package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
- package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
- package/dist/_internal/server/features/auctions/actions.js +8 -2
- package/dist/_internal/server/features/bundles/data.d.ts +16 -0
- package/dist/_internal/server/features/bundles/data.js +26 -0
- package/dist/_internal/server/features/bundles/index.d.ts +1 -1
- package/dist/_internal/server/features/bundles/index.js +1 -1
- package/dist/_internal/server/features/cart/service.d.ts +3 -3
- package/dist/_internal/server/features/checkout/actions.js +25 -0
- package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
- package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
- package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
- package/dist/_internal/server/features/checkout/source-context.js +157 -0
- package/dist/_internal/server/features/homepage/index.d.ts +0 -1
- package/dist/_internal/server/features/homepage/index.js +7 -1
- package/dist/_internal/server/features/lottery/adapters.js +4 -0
- package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
- package/dist/_internal/server/features/offers/adapters.js +88 -0
- package/dist/_internal/server/features/offers/index.d.ts +2 -0
- package/dist/_internal/server/features/offers/index.js +1 -0
- package/dist/_internal/server/features/orders/adapters.js +24 -0
- package/dist/_internal/server/features/products/data.js +15 -37
- package/dist/_internal/server/features/products/index.d.ts +1 -1
- package/dist/_internal/server/features/products/index.js +1 -1
- package/dist/_internal/server/features/products/list-public.d.ts +46 -20
- package/dist/_internal/server/features/products/list-public.js +266 -90
- package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
- package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
- package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
- package/dist/_internal/server/features/site-settings/adapters.js +75 -0
- package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
- package/dist/_internal/server/features/site-settings/index.js +1 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
- package/dist/_internal/server/features/stores/adapters.js +91 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/jobs/core/auctionSettlement.js +56 -2
- package/dist/_internal/server/jobs/core/offerExpiry.js +55 -19
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
- package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
- package/dist/_internal/server/jobs/handlers/messages.js +10 -0
- package/dist/_internal/shared/actions/action-registry.js +17 -1
- package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
- package/dist/_internal/shared/checkout/lanes.js +26 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
- package/dist/_internal/shared/features/auctions/config.js +27 -0
- package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
- package/dist/_internal/shared/features/auctions/schema.js +13 -1
- package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
- package/dist/_internal/shared/features/cart/schema.d.ts +20 -15
- package/dist/_internal/shared/features/cart/schema.js +15 -0
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
- package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
- package/dist/_internal/shared/features/emi/schedule.js +20 -5
- package/dist/_internal/shared/features/events/schema.d.ts +2 -2
- package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
- package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
- package/dist/_internal/shared/features/offers/config.d.ts +30 -0
- package/dist/_internal/shared/features/offers/config.js +59 -0
- package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
- package/dist/_internal/shared/features/products/schema.d.ts +30 -30
- package/dist/_internal/shared/features/products/to-product-item.js +6 -0
- package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
- package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
- package/dist/_internal/shared/features/site-settings/fees.js +39 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
- package/dist/_internal/shared/features/site-settings/types.js +1 -0
- package/dist/_internal/shared/history/history.d.ts +88 -0
- package/dist/_internal/shared/history/history.js +198 -0
- package/dist/_internal/shared/history/index.d.ts +4 -0
- package/dist/_internal/shared/history/index.js +2 -0
- package/dist/_internal/shared/history/types.d.ts +61 -0
- package/dist/_internal/shared/history/types.js +6 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
- package/dist/_internal/shared/listing-types/_registry.js +67 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/art/config.js +5 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
- package/dist/_internal/shared/listing-types/auction/config.js +21 -0
- package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
- package/dist/_internal/shared/listing-types/availability.js +104 -0
- package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
- package/dist/_internal/shared/listing-types/capabilities.js +12 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/classified/config.js +5 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
- package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/live/config.js +5 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/standard/config.js +5 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
- package/dist/client.d.ts +20 -7
- package/dist/client.js +22 -4
- package/dist/constants/api-endpoints.d.ts +6 -0
- package/dist/constants/api-endpoints.js +2 -0
- package/dist/constants/field-names.d.ts +57 -8
- package/dist/constants/field-names.js +101 -8
- package/dist/constants/table-keys.d.ts +17 -0
- package/dist/constants/table-keys.js +17 -0
- package/dist/errors/error-codes.d.ts +13 -1
- package/dist/errors/error-codes.js +13 -1
- package/dist/errors/error-display-map.js +12 -3
- package/dist/errors/messages.d.ts +10 -2
- package/dist/errors/messages.js +10 -2
- package/dist/features/about/components/AboutView.d.ts +3 -0
- package/dist/features/about/components/AboutView.js +3 -2
- package/dist/features/about/components/PolicyPageView.d.ts +2 -1
- package/dist/features/about/components/PolicyPageView.js +61 -23
- package/dist/features/about/components/PublicProfileView.js +5 -0
- package/dist/features/about/schemas/firestore.d.ts +3 -0
- package/dist/features/account/components/UserBidsView.js +12 -4
- package/dist/features/account/components/UserOrdersView.js +7 -0
- package/dist/features/account/components/UserReturnsView.d.ts +3 -0
- package/dist/features/account/components/UserReturnsView.js +17 -1
- package/dist/features/account/components/index.d.ts +0 -2
- package/dist/features/account/components/index.js +0 -1
- package/dist/features/account/schemas/index.d.ts +2 -2
- package/dist/features/account/types/index.d.ts +21 -2
- package/dist/features/addresses/schemas/index.d.ts +4 -4
- package/dist/features/admin/components/AdminArtView.js +8 -3
- package/dist/features/admin/components/AdminAuditLogView.js +1 -0
- package/dist/features/admin/components/AdminBidsView.js +15 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
- package/dist/features/admin/components/AdminClassifiedView.js +8 -3
- package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
- package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
- package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
- package/dist/features/admin/components/AdminLiveView.js +8 -3
- package/dist/features/admin/components/AdminNavEditorView.js +15 -5
- package/dist/features/admin/components/AdminNewsletterView.js +18 -2
- package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
- package/dist/features/admin/components/AdminOffersView.js +230 -0
- package/dist/features/admin/components/AdminOrdersView.js +10 -1
- package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
- package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
- package/dist/features/admin/components/AdminProductsView.js +16 -29
- package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
- package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
- package/dist/features/admin/components/AdminScammersView.js +3 -8
- package/dist/features/admin/components/AdminSectionsView.js +32 -23
- package/dist/features/admin/components/AdminSessionsView.js +17 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
- package/dist/features/admin/components/AdminSiteView.js +6 -2
- package/dist/features/admin/components/AdminStickersView.js +8 -3
- package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
- package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
- package/dist/features/admin/constants/filter-tabs.d.ts +89 -0
- package/dist/features/admin/constants/filter-tabs.js +56 -0
- package/dist/features/admin/schemas/firestore.d.ts +122 -3
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
- package/dist/features/admin/schemas/homepage-section-form.js +68 -0
- package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
- package/dist/features/admin/schemas/nav-item-form.js +72 -0
- package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
- package/dist/features/auctions/actions/bid-actions.js +93 -20
- package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
- package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
- package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
- package/dist/features/auctions/components/AuctionsListView.js +5 -6
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
- package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
- package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
- package/dist/features/auctions/components/bid-detail-fields.js +103 -0
- package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
- package/dist/features/auctions/repository/bid.repository.js +23 -0
- package/dist/features/auctions/schemas/firestore.d.ts +17 -0
- package/dist/features/auctions/schemas/index.d.ts +12 -12
- package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
- package/dist/features/audit-log/schemas/firestore.js +7 -0
- package/dist/features/auth/permissions/constants.d.ts +1 -1
- package/dist/features/auth/permissions/constants.js +10 -1
- package/dist/features/blog/actions/blog-actions.d.ts +7 -7
- package/dist/features/blog/schemas/blog-form.d.ts +80 -0
- package/dist/features/blog/schemas/blog-form.js +100 -0
- package/dist/features/blog/schemas/index.d.ts +6 -6
- package/dist/features/cart/repository/cart.repository.js +1 -0
- package/dist/features/cart/schemas/firestore.d.ts +15 -0
- package/dist/features/catalogue/schemas/validation.d.ts +4 -4
- package/dist/features/categories/components/BrandDetailPageView.js +23 -40
- package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
- package/dist/features/categories/components/BrandDetailTabs.js +8 -12
- package/dist/features/categories/components/BundleCollage.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
- package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
- package/dist/features/categories/components/CategoryProductsListing.js +11 -1
- package/dist/features/categories/components/ConcernCard.js +7 -1
- package/dist/features/categories/schemas/firestore.d.ts +13 -0
- package/dist/features/categories/schemas/index.d.ts +26 -26
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
- package/dist/features/events/components/AdminEventEditorView.js +32 -54
- package/dist/features/events/components/AdminEventEntriesView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +15 -11
- package/dist/features/events/components/EventFilters.d.ts +9 -1
- package/dist/features/events/components/EventFilters.js +45 -21
- package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
- package/dist/features/events/components/EventsIndexListing.js +2 -2
- package/dist/features/events/components/EventsListPageView.js +13 -4
- package/dist/features/events/repository/events.repository.d.ts +17 -0
- package/dist/features/events/repository/events.repository.js +27 -0
- package/dist/features/events/schemas/event-form.d.ts +113 -0
- package/dist/features/events/schemas/event-form.js +82 -0
- package/dist/features/events/schemas/firestore.d.ts +12 -0
- package/dist/features/events/schemas/firestore.js +12 -0
- package/dist/features/events/schemas/index.d.ts +50 -50
- package/dist/features/events/types/index.d.ts +11 -0
- package/dist/features/events/types/index.js +57 -1
- package/dist/features/faq/actions/faq-actions.d.ts +12 -12
- package/dist/features/faq/schemas/index.d.ts +8 -8
- package/dist/features/filters/FilterFacetSection.d.ts +7 -1
- package/dist/features/filters/FilterFacetSection.js +11 -3
- package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
- package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
- package/dist/features/grouped/schemas/index.d.ts +4 -4
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
- package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
- package/dist/features/homepage/components/AnnouncementBar.js +3 -3
- package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
- package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
- package/dist/features/homepage/hooks/homepage-query.js +45 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
- package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
- package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
- package/dist/features/homepage/schemas/index.d.ts +33 -2
- package/dist/features/homepage/schemas/index.js +24 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -1
- package/dist/features/layout/AppLayoutShell.js +15 -14
- package/dist/features/layout/BackToTop.d.ts +9 -0
- package/dist/features/layout/BackToTop.js +10 -1
- package/dist/features/layout/BottomActions.js +28 -25
- package/dist/features/layout/BottomChrome.d.ts +34 -0
- package/dist/features/layout/BottomChrome.js +55 -0
- package/dist/features/layout/BottomNavLayout.d.ts +6 -0
- package/dist/features/layout/BottomNavLayout.js +7 -1
- package/dist/features/layout/BottomNavbar.js +15 -2
- package/dist/features/layout/FooterLayout.js +11 -1
- package/dist/features/layout/NavbarLayout.js +1 -1
- package/dist/features/layout/TitleBarLayout.d.ts +7 -0
- package/dist/features/layout/TitleBarLayout.js +28 -5
- package/dist/features/layout/index.d.ts +2 -0
- package/dist/features/layout/index.js +1 -0
- package/dist/features/lottery/types/index.d.ts +3 -0
- package/dist/features/media/MediaPickerModal.js +5 -1
- package/dist/features/messages/schemas/index.d.ts +2 -2
- package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
- package/dist/features/orders/components/OrderScopeTabs.js +31 -0
- package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
- package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
- package/dist/features/orders/constants/order-scope.d.ts +48 -0
- package/dist/features/orders/constants/order-scope.js +111 -0
- package/dist/features/orders/repository/orders.repository.d.ts +54 -7
- package/dist/features/orders/repository/orders.repository.js +121 -22
- package/dist/features/orders/schemas/firestore.d.ts +152 -0
- package/dist/features/orders/schemas/firestore.js +30 -0
- package/dist/features/orders/schemas/index.d.ts +18 -18
- package/dist/features/orders/types/index.d.ts +35 -7
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
- package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
- package/dist/features/pre-orders/schemas/index.d.ts +1 -1
- package/dist/features/products/actions/product-actions.d.ts +14 -0
- package/dist/features/products/actions/product-actions.js +49 -11
- package/dist/features/products/api/route.d.ts +12 -0
- package/dist/features/products/api/route.js +42 -100
- package/dist/features/products/components/ArtStickersListView.js +2 -2
- package/dist/features/products/components/AuctionsIndexListing.js +13 -11
- package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
- package/dist/features/products/components/AvailabilityTabs.js +47 -0
- package/dist/features/products/components/GroupSettingsPanel.js +5 -1
- package/dist/features/products/components/MakeOfferButton.js +48 -49
- package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
- package/dist/features/products/components/PrizeDrawCollage.js +9 -1
- package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
- package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
- package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
- package/dist/features/products/components/PrizeDrawsSection.js +23 -18
- package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +5 -2
- package/dist/features/products/components/ProductGrid.js +6 -1
- package/dist/features/products/components/ProductsIndexListing.js +22 -32
- package/dist/features/products/components/ProductsIndexPageView.js +6 -9
- package/dist/features/products/components/index.d.ts +2 -2
- package/dist/features/products/components/index.js +1 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
- package/dist/features/products/config/listing-type-listing-config.js +22 -10
- package/dist/features/products/constants/action-defs.d.ts +2 -0
- package/dist/features/products/constants/action-defs.js +6 -0
- package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
- package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
- package/dist/features/products/hooks/useProducts.d.ts +5 -0
- package/dist/features/products/hooks/useProducts.js +13 -2
- package/dist/features/products/repository/products.repository.d.ts +31 -2
- package/dist/features/products/repository/products.repository.js +53 -21
- package/dist/features/products/schemas/firestore.d.ts +17 -3
- package/dist/features/products/schemas/firestore.js +7 -2
- package/dist/features/products/schemas/index.d.ts +64 -64
- package/dist/features/products/schemas/product-features.validators.d.ts +79 -6
- package/dist/features/products/schemas/product-features.validators.js +63 -0
- package/dist/features/products/types/index.d.ts +16 -1
- package/dist/features/promotions/schemas/index.d.ts +2 -2
- package/dist/features/reviews/schemas/index.d.ts +16 -16
- package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
- package/dist/features/scams/constants/scammer-status-display.js +79 -0
- package/dist/features/search/schemas/index.d.ts +4 -4
- package/dist/features/seller/actions/offer-actions.js +57 -4
- package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
- package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
- package/dist/features/seller/components/SellerArtView.js +5 -0
- package/dist/features/seller/components/SellerAuctionsView.js +13 -15
- package/dist/features/seller/components/SellerBidsView.js +11 -4
- package/dist/features/seller/components/SellerClassifiedView.js +5 -0
- package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
- package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
- package/dist/features/seller/components/SellerLiveView.js +5 -0
- package/dist/features/seller/components/SellerOffersView.js +2 -1
- package/dist/features/seller/components/SellerOrdersView.js +31 -9
- package/dist/features/seller/components/SellerPayoutSettingsView.js +56 -31
- package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
- package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
- package/dist/features/seller/components/SellerProductShell.js +7 -1
- package/dist/features/seller/components/SellerProductsView.js +11 -8
- package/dist/features/seller/components/SellerStickersView.js +5 -0
- package/dist/features/seller/components/index.d.ts +0 -2
- package/dist/features/seller/components/index.js +0 -1
- package/dist/features/seller/repository/offer.repository.d.ts +142 -24
- package/dist/features/seller/repository/offer.repository.js +165 -26
- package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
- package/dist/features/seller/schemas/coupon-form.js +116 -0
- package/dist/features/seller/schemas/firestore.d.ts +56 -2
- package/dist/features/seller/schemas/firestore.js +27 -0
- package/dist/features/seller/schemas/index.d.ts +2 -2
- package/dist/features/seller/schemas/offer-forms.d.ts +46 -0
- package/dist/features/seller/schemas/offer-forms.js +42 -0
- package/dist/features/seller/server.d.ts +0 -1
- package/dist/features/seller/server.js +0 -1
- package/dist/features/shell/SectionForm.d.ts +99 -0
- package/dist/features/shell/SectionForm.js +128 -0
- package/dist/features/shell/build-sections.d.ts +63 -0
- package/dist/features/shell/build-sections.js +207 -0
- package/dist/features/shell/entity-form.d.ts +109 -0
- package/dist/features/shell/entity-form.js +96 -0
- package/dist/features/shell/field-ui-meta.d.ts +115 -0
- package/dist/features/shell/field-ui-meta.js +324 -0
- package/dist/features/shell/index.d.ts +8 -0
- package/dist/features/shell/index.js +4 -0
- package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
- package/dist/features/status-history/components/StatusTimeline.js +46 -0
- package/dist/features/status-history/index.d.ts +11 -0
- package/dist/features/status-history/index.js +10 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
- package/dist/features/store-extensions/index.d.ts +12 -0
- package/dist/features/store-extensions/index.js +12 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
- package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
- package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
- package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
- package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
- package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
- package/dist/features/store-extensions/schemas/firestore.js +60 -0
- package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
- package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
- package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
- package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
- package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
- package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
- package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
- package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
- package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
- package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
- package/dist/features/stores/api/[storeSlug]/route.js +2 -25
- package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
- package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
- package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
- package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
- package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
- package/dist/features/stores/components/StoreProductsListing.js +11 -1
- package/dist/features/stores/repository/store.repository.js +6 -0
- package/dist/features/stores/schemas/index.d.ts +6 -6
- package/dist/features/support/schemas/index.d.ts +4 -4
- package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
- package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
- package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +431 -1
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/index.d.ts +25 -12
- package/dist/index.js +26 -11
- package/dist/next/routing/route-map.d.ts +23 -3
- package/dist/next/routing/route-map.js +14 -2
- package/dist/providers/db-firebase/base.repository.d.ts +30 -0
- package/dist/providers/db-firebase/base.repository.js +50 -1
- package/dist/providers/db-firebase/index.d.ts +1 -1
- package/dist/providers/db-firebase/index.js +1 -1
- package/dist/providers/db-firebase/sieve.d.ts +25 -0
- package/dist/providers/db-firebase/sieve.js +52 -18
- package/dist/react/hooks/useUrlTable.js +10 -1
- package/dist/schemas/firestore-value.d.ts +8 -0
- package/dist/schemas/firestore-value.js +44 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/registry.d.ts +702 -69
- package/dist/schemas/registry.js +64 -1
- package/dist/seed/_helpers/category-forest.d.ts +2 -0
- package/dist/seed/_helpers/category-forest.js +309 -0
- package/dist/seed/_helpers/category-tree.d.ts +27 -0
- package/dist/seed/_helpers/category-tree.js +103 -0
- package/dist/seed/bids-seed-data.js +30 -0
- package/dist/seed/catalogue-seed-data.js +12 -12
- package/dist/seed/categories-seed-data.js +177 -162
- package/dist/seed/events-seed-data.js +61 -10
- package/dist/seed/homepage-sections-seed-data.js +5 -1
- package/dist/seed/offers-seed-data.js +244 -34
- package/dist/seed/orders-seed-data.js +336 -1
- package/dist/seed/products-art-seed-data.js +50 -12
- package/dist/seed/products-auctions-seed-data.js +138 -18
- package/dist/seed/products-classifieds-seed-data.js +80 -16
- package/dist/seed/products-digital-codes-seed-data.js +66 -18
- package/dist/seed/products-live-items-seed-data.js +64 -13
- package/dist/seed/products-preorders-seed-data.d.ts +0 -1
- package/dist/seed/products-preorders-seed-data.js +52 -13
- package/dist/seed/products-prize-draws-seed-data.js +63 -14
- package/dist/seed/products-standard-seed-data.js +99 -26
- package/dist/seed/products-stickers-seed-data.js +47 -12
- package/dist/seed/reviews-seed-data.js +6 -1
- package/dist/seed/site-settings-seed-data.d.ts +1 -38
- package/dist/seed/site-settings-seed-data.js +38 -76
- package/dist/seed/stores-seed-data.js +71 -1
- package/dist/seed/users-seed-data.js +15 -5
- package/dist/server-entry.d.ts +1 -2
- package/dist/server-entry.js +4 -3
- package/dist/server.d.ts +6 -3
- package/dist/server.js +13 -4
- package/dist/styles.css +78 -12
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.style.css +19 -4
- package/dist/ui/components/CollapsibleSection.d.ts +17 -1
- package/dist/ui/components/CollapsibleSection.js +6 -2
- package/dist/ui/components/FilterChipGroup.d.ts +25 -1
- package/dist/ui/components/FilterChipGroup.js +21 -4
- package/dist/ui/components/HandMode.style.css +47 -0
- package/dist/ui/components/Layout.d.ts +9 -2
- package/dist/ui/components/Layout.js +1 -1
- package/dist/ui/components/ListingLayout.js +8 -8
- package/dist/ui/components/ListingLayout.style.css +8 -7
- package/dist/ui/components/RecordDetailModal.d.ts +10 -1
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/dist/ui/components/StickyToolbar.d.ts +3 -1
- package/dist/ui/components/StickyToolbar.js +62 -20
- package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
- package/dist/ui/components/bottom-chrome-slot.js +29 -0
- package/dist/ui/components/index.style.css +3 -0
- package/dist/ui/forms/FormShell.d.ts +43 -13
- package/dist/ui/forms/FormShell.js +22 -11
- package/dist/ui/forms/index.d.ts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/package.json +2 -1
- package/scripts/node-esm-loader.mjs +65 -0
- package/scripts/seed-cli-loader.mjs +6 -49
- package/scripts/seed-cli.mjs +1 -1
|
@@ -7,28 +7,25 @@ import { PRODUCT_FIELDS } from "../../../constants/field-names";
|
|
|
7
7
|
import { TABLE_KEYS } from "../../../constants/table-keys";
|
|
8
8
|
import { sortBy } from "../../../constants/sort";
|
|
9
9
|
import { GENERIC_PRODUCT_LISTING_TYPES } from "../constants/listing-tabs";
|
|
10
|
-
import { listPublicProducts, parsePublicProductParams,
|
|
10
|
+
import { listPublicProducts, parsePublicProductParams, defaultAvailabilityForListingTypes, } from "../../../_internal/server/features/products/list-public";
|
|
11
11
|
import { parseSelectedListingTypes } from "../utils/listing-type";
|
|
12
12
|
const DEFAULT_PAGE_SIZE = 24;
|
|
13
13
|
const DEFAULT_SORT = sortBy(PRODUCT_FIELDS.CREATED_AT);
|
|
14
14
|
export async function ProductsIndexPageView({ searchParams = {} }) {
|
|
15
|
-
// The
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
// would freeze that disagreement (Root Cause #30).
|
|
15
|
+
// The availability scope is derived from the same helper the client reads
|
|
16
|
+
// its default from — a hardcoded default here would disagree with the
|
|
17
|
+
// client, and `staleTime: Infinity` would freeze that disagreement
|
|
18
|
+
// (Root Cause #30).
|
|
20
19
|
const raw = searchParams[TABLE_KEYS.LISTING_TYPE];
|
|
21
20
|
const selectedTypes = parseSelectedListingTypes(Array.isArray(raw) ? raw[0] : raw);
|
|
22
21
|
const effectiveTypes = selectedTypes.length > 0 ? selectedTypes : GENERIC_PRODUCT_LISTING_TYPES;
|
|
23
|
-
const { hideSoldByDefault, hideEndedByDefault } = defaultTogglesForListingTypes(effectiveTypes);
|
|
24
22
|
// See ArtStickersListView — one shared filter implementation with
|
|
25
23
|
// /api/products, so SSR and the client refetch agree by construction.
|
|
26
24
|
const products = await listPublicProducts(parsePublicProductParams(searchParams, {
|
|
27
25
|
listingTypes: GENERIC_PRODUCT_LISTING_TYPES,
|
|
28
26
|
pageSize: DEFAULT_PAGE_SIZE,
|
|
29
27
|
sorts: DEFAULT_SORT,
|
|
30
|
-
|
|
31
|
-
hideEndedByDefault,
|
|
28
|
+
...defaultAvailabilityForListingTypes(effectiveTypes),
|
|
32
29
|
}));
|
|
33
30
|
return (_jsxs(Main, { children: [_jsx(Section, { border: "bottom-subtle", paddingY: "b-md", padding: "t-xl", children: _jsxs(Container, { size: "xl", children: [_jsx(Heading, { level: 1, size: "3xl", weight: "bold", color: "primary", children: "Products" }), _jsx(Text, { className: "mt-1", color: "muted", size: "sm", children: "Discover amazing products and deals" }), _jsx(Div, { className: "mt-3", children: _jsx(TextLink, { variant: "bare", href: String(ROUTES.PUBLIC.AUCTIONS), rounded: "full", paddingX: "sm", paddingY: "2xs", size: "xs", weight: "medium", layout: "inline-flex", align: "center", gap: "sm", className: "border border-primary/30 bg-primary/10 text-primary-700 dark:text-primary-400 hover:bg-primary/15 transition-colors", children: "\uD83C\uDFF7\uFE0F Looking for unique deals? Browse Auctions \u2192" }) })] }) }), _jsxs(Container, { size: "xl", padding: "x-md", children: [_jsx(AdSlot, { id: "listing-sidebar-top", className: "mb-4 mt-4" }), _jsx(ProductsIndexListing, { initialData: products }), _jsx(AdSlot, { id: "listing-sidebar-bottom", className: "mt-8" })] })] }));
|
|
34
31
|
}
|
|
@@ -21,6 +21,8 @@ export { MarketplaceBundleCard } from "./MarketplaceBundleCard";
|
|
|
21
21
|
export type { MarketplaceBundleCardProps, MarketplaceBundleCardData, MarketplaceBundleCardLabels, } from "./MarketplaceBundleCard";
|
|
22
22
|
export { PrizeDrawsIndexListing } from "./PrizeDrawsIndexListing";
|
|
23
23
|
export type { PrizeDrawsIndexListingProps } from "./PrizeDrawsIndexListing";
|
|
24
|
+
export { AvailabilityTabs } from "./AvailabilityTabs";
|
|
25
|
+
export type { AvailabilityTabsProps } from "./AvailabilityTabs";
|
|
24
26
|
export { PrizeDrawEntryActions } from "./PrizeDrawEntryActions";
|
|
25
27
|
export type { PrizeDrawEntryActionsProps } from "./PrizeDrawEntryActions";
|
|
26
28
|
export { ProductFeaturesSelector } from "./ProductFeaturesSelector";
|
|
@@ -46,8 +48,6 @@ export { BidHistory } from "./BidHistory";
|
|
|
46
48
|
export type { BidHistoryProps, BidHistoryEntry } from "./BidHistory";
|
|
47
49
|
export { PlaceBidForm } from "./PlaceBidForm";
|
|
48
50
|
export type { PlaceBidFormProps } from "./PlaceBidForm";
|
|
49
|
-
export { MakeOfferForm } from "./MakeOfferForm";
|
|
50
|
-
export type { MakeOfferFormProps } from "./MakeOfferForm";
|
|
51
51
|
export { MakeOfferButton } from "./MakeOfferButton";
|
|
52
52
|
export type { MakeOfferButtonProps } from "./MakeOfferButton";
|
|
53
53
|
export { RelatedProducts } from "./RelatedProducts";
|
|
@@ -10,6 +10,7 @@ export { PrizeDrawWinnerMappingView } from "./PrizeDrawWinnerMappingView";
|
|
|
10
10
|
export { MarketplacePrizeDrawCard } from "./MarketplacePrizeDrawCard";
|
|
11
11
|
export { MarketplaceBundleCard } from "./MarketplaceBundleCard";
|
|
12
12
|
export { PrizeDrawsIndexListing } from "./PrizeDrawsIndexListing";
|
|
13
|
+
export { AvailabilityTabs } from "./AvailabilityTabs";
|
|
13
14
|
// PrizeDrawsListingView + PrizeDrawDetailPageView are server components that
|
|
14
15
|
// import productRepository (→ firebase-admin). Re-exporting them from this
|
|
15
16
|
// client-mixed barrel pulls firebase-admin into client bundles via webpack/
|
|
@@ -28,7 +29,6 @@ export { ProductInfo } from "./ProductInfo";
|
|
|
28
29
|
export { ProductTabs } from "./ProductTabs";
|
|
29
30
|
export { BidHistory } from "./BidHistory";
|
|
30
31
|
export { PlaceBidForm } from "./PlaceBidForm";
|
|
31
|
-
export { MakeOfferForm } from "./MakeOfferForm";
|
|
32
32
|
export { MakeOfferButton } from "./MakeOfferButton";
|
|
33
33
|
export { RelatedProducts } from "./RelatedProducts";
|
|
34
34
|
export { ProductGalleryClient } from "./ProductGalleryClient";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { JsonArray } from "../../../schemas/types";
|
|
2
|
+
import type { AvailabilityScope } from "../hooks/useAvailabilityScope";
|
|
2
3
|
import type { ListingType } from "../types";
|
|
3
4
|
import type { ListingViewConfig } from "../../admin/components/DataListingView";
|
|
4
5
|
export interface ListingTypeListingRow {
|
|
@@ -10,14 +11,33 @@ export interface ListingTypeListingRow {
|
|
|
10
11
|
image?: string;
|
|
11
12
|
}
|
|
12
13
|
interface ListingTypeListingResponse {
|
|
14
|
+
/** Admin route shape. */
|
|
13
15
|
items?: JsonArray;
|
|
14
16
|
total?: number;
|
|
17
|
+
/** Seller route shape. */
|
|
18
|
+
products?: JsonArray;
|
|
19
|
+
meta?: {
|
|
20
|
+
total?: number;
|
|
21
|
+
};
|
|
15
22
|
}
|
|
16
23
|
export interface BuildListingTypeListingOptions {
|
|
17
24
|
/** Override the page heading; defaults to the type's registered plural label. */
|
|
18
25
|
title?: string;
|
|
19
26
|
searchPlaceholder?: string;
|
|
20
27
|
emptyLabel?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Which dashboard this config is for. `"seller"` swaps the endpoint and the
|
|
30
|
+
* row href for the store-scoped equivalents; the store identity itself is
|
|
31
|
+
* resolved server-side from the session, never passed here.
|
|
32
|
+
*/
|
|
33
|
+
portal?: "admin" | "seller";
|
|
34
|
+
/**
|
|
35
|
+
* The availability scope, from `useAvailabilityScope(...)` in the calling
|
|
36
|
+
* component. Passed in rather than called here because this is a plain
|
|
37
|
+
* factory function, not a component — a hook call would break the rules of
|
|
38
|
+
* hooks the moment a caller invoked it conditionally.
|
|
39
|
+
*/
|
|
40
|
+
scope?: AvailabilityScope;
|
|
21
41
|
}
|
|
22
42
|
/**
|
|
23
43
|
* Admin browse config for one listing type.
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
import { SIEVE_OP, sieveAnd, sieveFilter } from "../../../utils/sieve-builder";
|
|
26
26
|
import { sortBy } from "../../../constants/sort";
|
|
27
27
|
import { PRODUCT_FIELDS } from "../../../constants/field-names";
|
|
28
|
-
import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
28
|
+
import { ADMIN_ENDPOINTS, SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
29
29
|
import { ROUTES } from "../../../next/routing/route-map";
|
|
30
30
|
import { pluginFor } from "../../../_internal/shared/listing-types/_registry";
|
|
31
31
|
import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../../admin/hooks/useAdminListingData";
|
|
@@ -40,19 +40,23 @@ import { toRecordArray, toRelativeDate, toCurrency, toStringValue, } from "../..
|
|
|
40
40
|
export function buildListingTypeListingConfig(type, opts = {}) {
|
|
41
41
|
const plugin = pluginFor(type);
|
|
42
42
|
const label = opts.title ?? plugin.pluralLabel;
|
|
43
|
+
const portal = opts.portal ?? "admin";
|
|
44
|
+
const isSeller = portal === "seller";
|
|
43
45
|
return {
|
|
44
|
-
portal
|
|
46
|
+
portal,
|
|
45
47
|
title: label,
|
|
46
48
|
searchPlaceholder: opts.searchPlaceholder ?? `Search ${label.toLowerCase()} by name or seller`,
|
|
47
49
|
emptyLabel: opts.emptyLabel ?? `No ${label.toLowerCase()} listings`,
|
|
48
50
|
filterKeys: ["status"],
|
|
49
51
|
defaultSort: sortBy(PRODUCT_FIELDS.CREATED_AT),
|
|
50
|
-
// Keyed on the canonical type
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
// Keyed on the canonical type AND the portal so an admin's all-stores list
|
|
53
|
+
// and a seller's own-store list can never share a cache entry.
|
|
54
|
+
queryKey: [portal, "listing-type", type],
|
|
55
|
+
endpoint: isSeller ? SELLER_ENDPOINTS.PRODUCTS : ADMIN_ENDPOINTS.PRODUCTS,
|
|
53
56
|
// The type's own sort set, not a copy-pasted three-option array.
|
|
54
57
|
sortOptions: [...plugin.sortOptions],
|
|
55
|
-
|
|
58
|
+
// The seller route returns `{ products }`, the admin route `{ items }`.
|
|
59
|
+
mapRows: (response) => toRecordArray(response.items ?? response.products).map((item, index) => ({
|
|
56
60
|
id: toStringValue(item.id, `${type}-${index}`),
|
|
57
61
|
primary: toStringValue(item.title ?? item.productTitle, "Untitled listing"),
|
|
58
62
|
secondary: [
|
|
@@ -63,12 +67,20 @@ export function buildListingTypeListingConfig(type, opts = {}) {
|
|
|
63
67
|
updatedAt: toRelativeDate(item.updatedAt ?? item.createdAt),
|
|
64
68
|
image: toStringValue(item.mainImage, "") || undefined,
|
|
65
69
|
})),
|
|
66
|
-
getTotal: (response, mappedRows) => typeof response.total === "number"
|
|
70
|
+
getTotal: (response, mappedRows) => typeof response.total === "number"
|
|
71
|
+
? response.total
|
|
72
|
+
: typeof response.meta?.total === "number"
|
|
73
|
+
? response.meta.total
|
|
74
|
+
: mappedRows.length,
|
|
67
75
|
buildFilters: (state) => sieveAnd(sieveFilter(PRODUCT_FIELDS.LISTING_TYPE, SIEVE_OP.EQ, type), state.status && state.status !== "All"
|
|
68
76
|
? sieveFilter(PRODUCT_FIELDS.STATUS, SIEVE_OP.EQ, state.status)
|
|
69
77
|
: "") || undefined,
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
|
|
78
|
+
// The availability scope, when the caller supplies one. Optional so the
|
|
79
|
+
// factory stays usable from a non-component context.
|
|
80
|
+
buildExtraParams: opts.scope ? () => opts.scope.extraParams : undefined,
|
|
81
|
+
renderAboveContent: opts.scope?.renderAboveContent,
|
|
82
|
+
// These are products filtered by listingType — reuse the real product
|
|
83
|
+
// editor rather than leaving rows non-navigable.
|
|
84
|
+
rowHrefTemplate: String(isSeller ? ROUTES.STORE.PRODUCTS_EDIT("{id}") : ROUTES.ADMIN.PRODUCTS_EDIT("{id}")),
|
|
73
85
|
};
|
|
74
86
|
}
|
|
@@ -192,6 +192,7 @@ export declare const ADMIN_ROW_ACTIONS: {
|
|
|
192
192
|
readonly blog: readonly ["row-view", "row-edit", "row-publish", "row-draft", "row-delete"];
|
|
193
193
|
readonly faqs: readonly ["row-edit", "row-archive", "row-delete"];
|
|
194
194
|
readonly bids: readonly ["row-view", "row-cancel"];
|
|
195
|
+
readonly offers: readonly ["row-view", "row-cancel"];
|
|
195
196
|
readonly notifications: readonly ["row-resend", "row-delete"];
|
|
196
197
|
readonly sessions: readonly ["row-revoke"];
|
|
197
198
|
readonly bundles: readonly ["row-view", "row-edit", "row-activate", "row-deactivate", "row-delete"];
|
|
@@ -356,6 +357,7 @@ export declare const ADMIN_BULK_ACTIONS: {
|
|
|
356
357
|
readonly blog: readonly ["row-publish", "row-draft", "row-delete"];
|
|
357
358
|
readonly faqs: readonly ["row-archive", "row-delete"];
|
|
358
359
|
readonly bids: readonly ["row-cancel"];
|
|
360
|
+
readonly offers: readonly ["row-cancel"];
|
|
359
361
|
readonly notifications: readonly ["row-mark-read", "row-delete"];
|
|
360
362
|
readonly sessions: readonly ["row-revoke"];
|
|
361
363
|
readonly payouts: readonly ["row-mark-paid"];
|
|
@@ -255,6 +255,11 @@ export const ADMIN_ROW_ACTIONS = {
|
|
|
255
255
|
blog: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.EDIT, ROW_ACTION_ID.PUBLISH, ROW_ACTION_ID.DRAFT, ROW_ACTION_ID.DELETE],
|
|
256
256
|
faqs: [ROW_ACTION_ID.EDIT, ROW_ACTION_ID.ARCHIVE, ROW_ACTION_ID.DELETE],
|
|
257
257
|
bids: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.CANCEL],
|
|
258
|
+
// View + Cancel only, deliberately. Admin does NOT get accept/counter/reject
|
|
259
|
+
// (which the seller preset below has) — negotiating a price on a seller's
|
|
260
|
+
// behalf is an authority nobody asked for. Admin's job here is to read the
|
|
261
|
+
// record and kill a bad one.
|
|
262
|
+
offers: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.CANCEL],
|
|
258
263
|
notifications: [ROW_ACTION_ID.RESEND, ROW_ACTION_ID.DELETE],
|
|
259
264
|
sessions: [ROW_ACTION_ID.REVOKE],
|
|
260
265
|
bundles: [ROW_ACTION_ID.VIEW, ROW_ACTION_ID.EDIT, ROW_ACTION_ID.ACTIVATE, ROW_ACTION_ID.DEACTIVATE, ROW_ACTION_ID.DELETE],
|
|
@@ -521,6 +526,7 @@ export const ADMIN_BULK_ACTIONS = {
|
|
|
521
526
|
blog: [ROW_ACTION_ID.PUBLISH, ROW_ACTION_ID.DRAFT, ROW_ACTION_ID.DELETE],
|
|
522
527
|
faqs: [ROW_ACTION_ID.ARCHIVE, ROW_ACTION_ID.DELETE],
|
|
523
528
|
bids: [ROW_ACTION_ID.CANCEL],
|
|
529
|
+
offers: [ROW_ACTION_ID.CANCEL],
|
|
524
530
|
notifications: [ROW_ACTION_ID.MARK_READ, ROW_ACTION_ID.DELETE],
|
|
525
531
|
sessions: [ROW_ACTION_ID.REVOKE],
|
|
526
532
|
payouts: [ROW_ACTION_ID.MARK_PAID],
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type AvailabilityFilter } from "../../../constants/field-names";
|
|
3
|
+
import type { ListingType } from "../types";
|
|
4
|
+
export interface AvailabilityScope {
|
|
5
|
+
availability: AvailabilityFilter;
|
|
6
|
+
/** Spread into `ListingViewConfig.buildExtraParams`'s return value. */
|
|
7
|
+
extraParams: {
|
|
8
|
+
availability: AvailabilityFilter;
|
|
9
|
+
};
|
|
10
|
+
/** Assign to `ListingViewConfig.renderAboveContent`. */
|
|
11
|
+
renderAboveContent: () => React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare function useAvailabilityScope(types: readonly ListingType[]): AvailabilityScope;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useUrlTable } from "../../../react/hooks/useUrlTable";
|
|
4
|
+
import { TABLE_KEYS } from "../../../constants/table-keys";
|
|
5
|
+
import { AVAILABILITY_VALUES } from "../../../constants/field-names";
|
|
6
|
+
import { AvailabilityTabs } from "../components/AvailabilityTabs";
|
|
7
|
+
export function useAvailabilityScope(types) {
|
|
8
|
+
// A second, independent `useUrlTable()` against the same URL as
|
|
9
|
+
// DataListingView's own instance. Safe by design — the hook holds no local
|
|
10
|
+
// state, so both instances read the same searchParams and stay in sync.
|
|
11
|
+
const table = useUrlTable();
|
|
12
|
+
const availability = table.get(TABLE_KEYS.AVAILABILITY) ||
|
|
13
|
+
AVAILABILITY_VALUES.AVAILABLE;
|
|
14
|
+
return {
|
|
15
|
+
availability,
|
|
16
|
+
extraParams: { availability },
|
|
17
|
+
renderAboveContent: () => _jsx(AvailabilityTabs, { types: types }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -26,6 +26,11 @@ export declare function useProducts<T extends ProductItem = ProductItem>(params?
|
|
|
26
26
|
totalPages: number;
|
|
27
27
|
page: number;
|
|
28
28
|
hasMore: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* A bounded fetch hit its ceiling, so `total` is a floor. Render it as
|
|
31
|
+
* "50+", never as an exact count, and never derive a final page from it.
|
|
32
|
+
*/
|
|
33
|
+
truncated: boolean;
|
|
29
34
|
isLoading: boolean;
|
|
30
35
|
error: Error | null;
|
|
31
36
|
warning: string | undefined;
|
|
@@ -21,8 +21,14 @@ export function useProducts(params = {}, opts) {
|
|
|
21
21
|
sp.set("minPrice", String(params.minPrice));
|
|
22
22
|
if (params.maxPrice !== undefined)
|
|
23
23
|
sp.set("maxPrice", String(params.maxPrice));
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
// ALWAYS sent when the caller has a scope, including the default
|
|
25
|
+
// "available". `/api/products` leaves `availability` unset (= all) so that
|
|
26
|
+
// non-browse callers are unaffected — which means a browse component that
|
|
27
|
+
// stopped sending it would filter on the SSR paint and NOT on the refetch,
|
|
28
|
+
// and `staleTime: Infinity` would freeze that disagreement (Root Cause #30).
|
|
29
|
+
// `audit-listing-filter-parity` asserts every listing component sends it.
|
|
30
|
+
if (params.availability)
|
|
31
|
+
sp.set("availability", params.availability);
|
|
26
32
|
// SB1-G Phase 4 — canonical `listingType` URL param only.
|
|
27
33
|
if (params.listingType !== undefined)
|
|
28
34
|
sp.set("listingType", params.listingType);
|
|
@@ -87,6 +93,11 @@ export function useProducts(params = {}, opts) {
|
|
|
87
93
|
totalPages: query.data?.totalPages ?? 1,
|
|
88
94
|
page: query.data?.page ?? 1,
|
|
89
95
|
hasMore: query.data?.hasMore ?? false,
|
|
96
|
+
/**
|
|
97
|
+
* A bounded fetch hit its ceiling, so `total` is a floor. Render it as
|
|
98
|
+
* "50+", never as an exact count, and never derive a final page from it.
|
|
99
|
+
*/
|
|
100
|
+
truncated: query.data?.truncated ?? false,
|
|
90
101
|
isLoading: query.isLoading,
|
|
91
102
|
error: query.error,
|
|
92
103
|
warning,
|
|
@@ -35,14 +35,12 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
|
|
|
35
35
|
listByIds(ids: string[]): Promise<ProductDocument[]>;
|
|
36
36
|
findAuctions(): Promise<ProductDocument[]>;
|
|
37
37
|
findPreOrders(): Promise<ProductDocument[]>;
|
|
38
|
-
findActivePreOrders(): Promise<ProductDocument[]>;
|
|
39
38
|
findPromoted(): Promise<ProductDocument[]>;
|
|
40
39
|
updateProduct(productId: string, data: ProductUpdateInput): Promise<ProductDocument>;
|
|
41
40
|
updateAvailableQuantity(productId: string, quantity: number): Promise<void>;
|
|
42
41
|
updateBid(productId: string, bidAmount: number, bidCount: number): Promise<void>;
|
|
43
42
|
findAvailable(): Promise<ProductDocument[]>;
|
|
44
43
|
findByGroupId(groupId: string): Promise<ProductDocument[]>;
|
|
45
|
-
findActiveAuctions(): Promise<ProductDocument[]>;
|
|
46
44
|
startGroup(productId: string, slug: string): Promise<void>;
|
|
47
45
|
updateGroupTitle(productId: string, groupTitle: string): Promise<void>;
|
|
48
46
|
dissolveGroup(groupId: string): Promise<void>;
|
|
@@ -329,12 +327,43 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
|
|
|
329
327
|
* is called from — Vercel routes, listingProcessor, server-action views.
|
|
330
328
|
*/
|
|
331
329
|
static readonly FILTER_ALIASES: SieveFilterAliases;
|
|
330
|
+
/**
|
|
331
|
+
* Firestore's ceiling for `array-contains-any` / `in` comparison values.
|
|
332
|
+
* Exceeding it throws `INVALID_ARGUMENT`, and every caller of `list()` wraps
|
|
333
|
+
* the call in `.catch(() => null)`, so the throw would surface as a silently
|
|
334
|
+
* empty page rather than an error (Root Cause #59).
|
|
335
|
+
*/
|
|
336
|
+
private static readonly MAX_ARRAY_CONTAINS_ANY;
|
|
337
|
+
/**
|
|
338
|
+
* Shared scope construction for `list()` and `countBy*()` — both must narrow
|
|
339
|
+
* by exactly the same store/status/category/search predicates or a tab's
|
|
340
|
+
* count would disagree with the rows behind it.
|
|
341
|
+
*/
|
|
342
|
+
private buildScopedQuery;
|
|
332
343
|
list(model: SieveModel, opts?: {
|
|
333
344
|
storeId?: string;
|
|
334
345
|
status?: string;
|
|
335
346
|
categoriesIn?: string[];
|
|
336
347
|
search?: string;
|
|
337
348
|
}): Promise<FirebaseSieveResult<ProductDocument>>;
|
|
349
|
+
/**
|
|
350
|
+
* How many products of each listing type exist within a scope — the numbers
|
|
351
|
+
* behind every listing-type tab bar and filter chip group.
|
|
352
|
+
*
|
|
353
|
+
* `types` entries are passed through verbatim, so a pipe-joined OR-group
|
|
354
|
+
* (`"art|stickers"`, the combined Art & Stickers tab) is counted as one
|
|
355
|
+
* bucket, matching how the tab itself queries.
|
|
356
|
+
*
|
|
357
|
+
* A type whose count query fails maps to `undefined`, not 0 — callers hide a
|
|
358
|
+
* tab at zero, and a swallowed failure reading as "none exist" would hide a
|
|
359
|
+
* tab holding real inventory (Root Cause #59).
|
|
360
|
+
*/
|
|
361
|
+
countByListingTypes(types: readonly string[], opts?: {
|
|
362
|
+
storeId?: string;
|
|
363
|
+
status?: string;
|
|
364
|
+
categoriesIn?: string[];
|
|
365
|
+
brandName?: string;
|
|
366
|
+
}): Promise<Record<string, number | undefined>>;
|
|
338
367
|
incrementViewCount(productId: string): Promise<void>;
|
|
339
368
|
/**
|
|
340
369
|
* Cloud Functions: find published auctions whose end date has already passed.
|
|
@@ -206,15 +206,6 @@ export class ProductRepository extends BaseRepository {
|
|
|
206
206
|
async findPreOrders() {
|
|
207
207
|
return this.findBy(PRODUCT_FIELDS.LISTING_TYPE, LISTING_TYPE_VALUES.PRE_ORDER);
|
|
208
208
|
}
|
|
209
|
-
async findActivePreOrders() {
|
|
210
|
-
const now = new Date();
|
|
211
|
-
const snapshot = await this.db
|
|
212
|
-
.collection(this.collection)
|
|
213
|
-
.where(PRODUCT_FIELDS.LISTING_TYPE, "==", LISTING_TYPE_VALUES.PRE_ORDER)
|
|
214
|
-
.where(PRODUCT_FIELDS.PRE_ORDER_DELIVERY_DATE, ">=", now)
|
|
215
|
-
.get();
|
|
216
|
-
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
217
|
-
}
|
|
218
209
|
async findPromoted() {
|
|
219
210
|
return this.findBy(PRODUCT_FIELDS.IS_PROMOTED, true);
|
|
220
211
|
}
|
|
@@ -255,15 +246,6 @@ export class ProductRepository extends BaseRepository {
|
|
|
255
246
|
.get();
|
|
256
247
|
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
257
248
|
}
|
|
258
|
-
async findActiveAuctions() {
|
|
259
|
-
const now = new Date();
|
|
260
|
-
const snapshot = await this.db
|
|
261
|
-
.collection(this.collection)
|
|
262
|
-
.where(PRODUCT_FIELDS.LISTING_TYPE, "==", LISTING_TYPE_VALUES.AUCTION)
|
|
263
|
-
.where(PRODUCT_FIELDS.AUCTION_END_DATE, ">=", now)
|
|
264
|
-
.get();
|
|
265
|
-
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
266
|
-
}
|
|
267
249
|
async startGroup(productId, slug) {
|
|
268
250
|
await this.getCollection().doc(productId).update({
|
|
269
251
|
groupId: slug,
|
|
@@ -358,8 +340,19 @@ export class ProductRepository extends BaseRepository {
|
|
|
358
340
|
this.cacheInvalidateForId(id);
|
|
359
341
|
return super.delete(id);
|
|
360
342
|
}
|
|
361
|
-
|
|
343
|
+
/**
|
|
344
|
+
* Shared scope construction for `list()` and `countBy*()` — both must narrow
|
|
345
|
+
* by exactly the same store/status/category/search predicates or a tab's
|
|
346
|
+
* count would disagree with the rows behind it.
|
|
347
|
+
*/
|
|
348
|
+
buildScopedQuery(opts) {
|
|
362
349
|
let baseQuery = this.getCollection();
|
|
350
|
+
if (opts?.brandName) {
|
|
351
|
+
// The free-text display name, NOT brandSlug — BrandDetailPageView filters
|
|
352
|
+
// products this way, so a count keyed on brandSlug would disagree with
|
|
353
|
+
// the rows the tab goes on to show.
|
|
354
|
+
baseQuery = baseQuery.where(PRODUCT_FIELDS.BRAND, "==", opts.brandName);
|
|
355
|
+
}
|
|
363
356
|
if (opts?.status) {
|
|
364
357
|
baseQuery = baseQuery.where(PRODUCT_FIELDS.STATUS, "==", opts.status);
|
|
365
358
|
}
|
|
@@ -377,15 +370,47 @@ export class ProductRepository extends BaseRepository {
|
|
|
377
370
|
baseQuery = baseQuery.where(PRODUCT_FIELDS.SEARCH_TOKENS, "array-contains-any", searchTokens);
|
|
378
371
|
}
|
|
379
372
|
if (searchTokens.length === 0 && opts?.categoriesIn && opts.categoriesIn.length > 0) {
|
|
380
|
-
|
|
373
|
+
let categoriesIn = opts.categoriesIn;
|
|
374
|
+
if (categoriesIn.length > ProductRepository.MAX_ARRAY_CONTAINS_ANY) {
|
|
375
|
+
// Products carry their FULL ancestor chain in `categorySlugs`, so a
|
|
376
|
+
// category page only ever needs to pass its own id — a list this long
|
|
377
|
+
// means a caller is still expanding descendants. Truncating keeps the
|
|
378
|
+
// query legal (an over-long list throws INVALID_ARGUMENT, which every
|
|
379
|
+
// caller's `.catch(() => null)` would turn into a blank page), and the
|
|
380
|
+
// warning names the real bug instead of hiding it.
|
|
381
|
+
serverLogger.warn(`productRepository: categoriesIn had ${categoriesIn.length} values, above Firestore's ${ProductRepository.MAX_ARRAY_CONTAINS_ANY} limit — truncating. Pass only the category's own id; products are tagged with their full ancestor chain.`);
|
|
382
|
+
categoriesIn = categoriesIn.slice(0, ProductRepository.MAX_ARRAY_CONTAINS_ANY);
|
|
383
|
+
}
|
|
384
|
+
baseQuery = baseQuery.where(PRODUCT_FIELDS.CATEGORY_SLUGS, "array-contains-any", categoriesIn);
|
|
381
385
|
}
|
|
386
|
+
return baseQuery;
|
|
387
|
+
}
|
|
388
|
+
async list(model, opts) {
|
|
382
389
|
return this.sieveQuery(model, ProductRepository.SIEVE_FIELDS, {
|
|
383
|
-
baseQuery,
|
|
390
|
+
baseQuery: this.buildScopedQuery(opts),
|
|
384
391
|
defaultPageSize: 20,
|
|
385
392
|
maxPageSize: 100,
|
|
386
393
|
aliases: ProductRepository.FILTER_ALIASES,
|
|
387
394
|
});
|
|
388
395
|
}
|
|
396
|
+
/**
|
|
397
|
+
* How many products of each listing type exist within a scope — the numbers
|
|
398
|
+
* behind every listing-type tab bar and filter chip group.
|
|
399
|
+
*
|
|
400
|
+
* `types` entries are passed through verbatim, so a pipe-joined OR-group
|
|
401
|
+
* (`"art|stickers"`, the combined Art & Stickers tab) is counted as one
|
|
402
|
+
* bucket, matching how the tab itself queries.
|
|
403
|
+
*
|
|
404
|
+
* A type whose count query fails maps to `undefined`, not 0 — callers hide a
|
|
405
|
+
* tab at zero, and a swallowed failure reading as "none exist" would hide a
|
|
406
|
+
* tab holding real inventory (Root Cause #59).
|
|
407
|
+
*/
|
|
408
|
+
async countByListingTypes(types, opts) {
|
|
409
|
+
return this.facetCounts(PRODUCT_FIELDS.LISTING_TYPE, types, ProductRepository.SIEVE_FIELDS, {
|
|
410
|
+
baseQuery: this.buildScopedQuery(opts),
|
|
411
|
+
aliases: ProductRepository.FILTER_ALIASES,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
389
414
|
async incrementViewCount(productId) {
|
|
390
415
|
try {
|
|
391
416
|
await this.db
|
|
@@ -672,4 +697,11 @@ ProductRepository.FILTER_ALIASES = {
|
|
|
672
697
|
].join(",");
|
|
673
698
|
},
|
|
674
699
|
};
|
|
700
|
+
/**
|
|
701
|
+
* Firestore's ceiling for `array-contains-any` / `in` comparison values.
|
|
702
|
+
* Exceeding it throws `INVALID_ARGUMENT`, and every caller of `list()` wraps
|
|
703
|
+
* the call in `.catch(() => null)`, so the throw would surface as a silently
|
|
704
|
+
* empty page rather than an error (Root Cause #59).
|
|
705
|
+
*/
|
|
706
|
+
ProductRepository.MAX_ARRAY_CONTAINS_ANY = 30;
|
|
675
707
|
export const productRepository = new ProductRepository();
|
|
@@ -178,7 +178,21 @@ export interface ProductDocument extends BaseDocument {
|
|
|
178
178
|
auctionExtensionMinutes?: number;
|
|
179
179
|
auctionOriginalEndDate?: Date;
|
|
180
180
|
auctionShippingPaidBy?: "seller" | "winner";
|
|
181
|
-
|
|
181
|
+
/**
|
|
182
|
+
* True once anybody has bid. Written by `placeBid`, never reset.
|
|
183
|
+
*
|
|
184
|
+
* It no longer gates Buy Now. The original SB-UNI-H design copied eBay's rule
|
|
185
|
+
* — BIN vanishes the moment the first bid lands — which in practice hid the
|
|
186
|
+
* button on nearly every real auction (3 of 4 seeded BIN fixtures had it
|
|
187
|
+
* hidden), while the PDP went on advertising the BIN *price* right above the
|
|
188
|
+
* missing button. Availability is now `buyNowPrice > currentBid`, via
|
|
189
|
+
* `isBuyNowAvailable()`; this field survives as a plain filterable fact about
|
|
190
|
+
* the auction.
|
|
191
|
+
*
|
|
192
|
+
* (A `buyItNowPrice` field used to sit alongside this one, documented as THE
|
|
193
|
+
* BIN price while every consumer actually read `buyNowPrice` above. Deleted
|
|
194
|
+
* 2026-08-24 — it had no readers and had already caused one seed-data bug.)
|
|
195
|
+
*/
|
|
182
196
|
bidsHaveStarted?: boolean;
|
|
183
197
|
grading?: ProductGrading;
|
|
184
198
|
card?: ProductCardMetadata;
|
|
@@ -369,8 +383,8 @@ export declare const ProductStatusValues: {
|
|
|
369
383
|
export declare const PRODUCT_COLLECTION: "products";
|
|
370
384
|
export declare const PRODUCT_INDEXED_FIELDS: readonly ["storeId", "status", "category", "featured", "listingType", "isPromoted", "isOnSale", "isSold", "searchTokens", "createdAt", "barcodeId"];
|
|
371
385
|
export declare const DEFAULT_PRODUCT_DATA: Partial<ProductDocument>;
|
|
372
|
-
export declare const PRODUCT_PUBLIC_FIELDS: readonly ["id", "title", "description", "category", "subcategory", "brand", "price", "currency", "stockQuantity", "availableQuantity", "images", "status", "storeName", "featured", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "listingType", "auctionEndDate", "startingBid", "currentBid", "bidCount", "reservePrice", "buyNowPrice", "minBidIncrement", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "
|
|
373
|
-
export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "subcategory", "brand", "price", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "
|
|
386
|
+
export declare const PRODUCT_PUBLIC_FIELDS: readonly ["allowOffers", "minOfferPercent", "id", "title", "description", "category", "subcategory", "brand", "price", "currency", "stockQuantity", "availableQuantity", "images", "status", "storeName", "featured", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "listingType", "auctionEndDate", "startingBid", "currentBid", "bidCount", "reservePrice", "buyNowPrice", "minBidIncrement", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderCurrentCount", "preOrderProductionStatus", "preOrderCancellable", "condition", "insurance", "insuranceCost", "shippingPaidBy", "isPromoted", "isOnSale", "isSold", "slug", "seoTitle", "seoDescription", "seoKeywords", "viewCount", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "createdAt"];
|
|
387
|
+
export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "subcategory", "brand", "price", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "listingType", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderProductionStatus", "preOrderCancellable", "isOnSale", "isSold", "allowShipBeforeEmiComplete", "printMeta", "seoTitle", "seoDescription", "seoKeywords", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "barcodeId"];
|
|
374
388
|
export type ProductCreateInput = Omit<ProductDocument, "id" | "createdAt" | "updatedAt" | "availableQuantity" | "bidCount" | "currentBid" | "auctionOriginalEndDate">;
|
|
375
389
|
export type ProductUpdateInput = Partial<Pick<ProductDocument, (typeof PRODUCT_UPDATABLE_FIELDS)[number]>>;
|
|
376
390
|
export type ProductAdminUpdateInput = Partial<Omit<ProductDocument, "id" | "createdAt">>;
|
|
@@ -46,6 +46,13 @@ export const DEFAULT_PRODUCT_DATA = {
|
|
|
46
46
|
auctionShippingPaidBy: "winner",
|
|
47
47
|
};
|
|
48
48
|
export const PRODUCT_PUBLIC_FIELDS = [
|
|
49
|
+
// Public-facing offer signals: the card grid renders a "Taking Offers" pill
|
|
50
|
+
// from `allowOffers`, and the detail-page form seeds its minimum from
|
|
51
|
+
// `minOfferPercent`. Listed here prophylactically — this array currently has
|
|
52
|
+
// no consumers, so their absence was not a live bug, but it would become one
|
|
53
|
+
// the moment something starts projecting through it.
|
|
54
|
+
"allowOffers",
|
|
55
|
+
"minOfferPercent",
|
|
49
56
|
"id",
|
|
50
57
|
"title",
|
|
51
58
|
"description",
|
|
@@ -77,7 +84,6 @@ export const PRODUCT_PUBLIC_FIELDS = [
|
|
|
77
84
|
"auctionExtensionMinutes",
|
|
78
85
|
"auctionShippingPaidBy",
|
|
79
86
|
// SB-UNI-H 2026-05-13 — eBay hybrid BIN.
|
|
80
|
-
"buyItNowPrice",
|
|
81
87
|
"bidsHaveStarted",
|
|
82
88
|
// SB-UNI-G 2026-05-13 — TCGPlayer grading + card metadata.
|
|
83
89
|
"grading",
|
|
@@ -143,7 +149,6 @@ export const PRODUCT_UPDATABLE_FIELDS = [
|
|
|
143
149
|
"buyNowPrice",
|
|
144
150
|
"minBidIncrement",
|
|
145
151
|
// SB-UNI-H 2026-05-13 — eBay hybrid BIN updatable.
|
|
146
|
-
"buyItNowPrice",
|
|
147
152
|
"bidsHaveStarted",
|
|
148
153
|
// SB-UNI-G 2026-05-13 — TCGPlayer grading + card metadata updatable.
|
|
149
154
|
"grading",
|