@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
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
4
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
5
|
+
*/
|
|
6
|
+
export declare const shippingConfigFormSchema: z.ZodEffects<z.ZodObject<{
|
|
7
|
+
label: z.ZodString;
|
|
8
|
+
method: z.ZodEnum<["free", "flat", "weight", "express", "pickup", "custom"]>;
|
|
9
|
+
flatRate: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
pricePerKg: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
freeAbove: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
expressSurcharge: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
estimatedDays: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
isDefault: z.ZodBoolean;
|
|
15
|
+
isActive: z.ZodBoolean;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
label: string;
|
|
18
|
+
isDefault: boolean;
|
|
19
|
+
isActive: boolean;
|
|
20
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
21
|
+
estimatedDays?: number | undefined;
|
|
22
|
+
freeAbove?: number | undefined;
|
|
23
|
+
flatRate?: number | undefined;
|
|
24
|
+
pricePerKg?: number | undefined;
|
|
25
|
+
expressSurcharge?: number | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
label: string;
|
|
28
|
+
isDefault: boolean;
|
|
29
|
+
isActive: boolean;
|
|
30
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
31
|
+
estimatedDays?: number | undefined;
|
|
32
|
+
freeAbove?: number | undefined;
|
|
33
|
+
flatRate?: number | undefined;
|
|
34
|
+
pricePerKg?: number | undefined;
|
|
35
|
+
expressSurcharge?: number | undefined;
|
|
36
|
+
}>, {
|
|
37
|
+
label: string;
|
|
38
|
+
isDefault: boolean;
|
|
39
|
+
isActive: boolean;
|
|
40
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
41
|
+
estimatedDays?: number | undefined;
|
|
42
|
+
freeAbove?: number | undefined;
|
|
43
|
+
flatRate?: number | undefined;
|
|
44
|
+
pricePerKg?: number | undefined;
|
|
45
|
+
expressSurcharge?: number | undefined;
|
|
46
|
+
}, {
|
|
47
|
+
label: string;
|
|
48
|
+
isDefault: boolean;
|
|
49
|
+
isActive: boolean;
|
|
50
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
51
|
+
estimatedDays?: number | undefined;
|
|
52
|
+
freeAbove?: number | undefined;
|
|
53
|
+
flatRate?: number | undefined;
|
|
54
|
+
pricePerKg?: number | undefined;
|
|
55
|
+
expressSurcharge?: number | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
export type ShippingConfigFormValues = z.infer<typeof shippingConfigFormSchema>;
|
|
58
|
+
/** `storeId` is absent — the route sets it from the session, never the body. */
|
|
59
|
+
export declare const shippingConfigCreateSchema: z.ZodEffects<z.ZodObject<{
|
|
60
|
+
label: z.ZodString;
|
|
61
|
+
method: z.ZodEnum<["free", "flat", "weight", "express", "pickup", "custom"]>;
|
|
62
|
+
flatRate: z.ZodOptional<z.ZodNumber>;
|
|
63
|
+
pricePerKg: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
freeAbove: z.ZodOptional<z.ZodNumber>;
|
|
65
|
+
expressSurcharge: z.ZodOptional<z.ZodNumber>;
|
|
66
|
+
estimatedDays: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
isDefault: z.ZodBoolean;
|
|
68
|
+
isActive: z.ZodBoolean;
|
|
69
|
+
}, "strip", z.ZodTypeAny, {
|
|
70
|
+
label: string;
|
|
71
|
+
isDefault: boolean;
|
|
72
|
+
isActive: boolean;
|
|
73
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
74
|
+
estimatedDays?: number | undefined;
|
|
75
|
+
freeAbove?: number | undefined;
|
|
76
|
+
flatRate?: number | undefined;
|
|
77
|
+
pricePerKg?: number | undefined;
|
|
78
|
+
expressSurcharge?: number | undefined;
|
|
79
|
+
}, {
|
|
80
|
+
label: string;
|
|
81
|
+
isDefault: boolean;
|
|
82
|
+
isActive: boolean;
|
|
83
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
84
|
+
estimatedDays?: number | undefined;
|
|
85
|
+
freeAbove?: number | undefined;
|
|
86
|
+
flatRate?: number | undefined;
|
|
87
|
+
pricePerKg?: number | undefined;
|
|
88
|
+
expressSurcharge?: number | undefined;
|
|
89
|
+
}>, {
|
|
90
|
+
label: string;
|
|
91
|
+
isDefault: boolean;
|
|
92
|
+
isActive: boolean;
|
|
93
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
94
|
+
estimatedDays?: number | undefined;
|
|
95
|
+
freeAbove?: number | undefined;
|
|
96
|
+
flatRate?: number | undefined;
|
|
97
|
+
pricePerKg?: number | undefined;
|
|
98
|
+
expressSurcharge?: number | undefined;
|
|
99
|
+
}, {
|
|
100
|
+
label: string;
|
|
101
|
+
isDefault: boolean;
|
|
102
|
+
isActive: boolean;
|
|
103
|
+
method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
|
|
104
|
+
estimatedDays?: number | undefined;
|
|
105
|
+
freeAbove?: number | undefined;
|
|
106
|
+
flatRate?: number | undefined;
|
|
107
|
+
pricePerKg?: number | undefined;
|
|
108
|
+
expressSurcharge?: number | undefined;
|
|
109
|
+
}>;
|
|
110
|
+
/**
|
|
111
|
+
* Update contract — partial, and `.strict()` so an unknown key is a 400 rather
|
|
112
|
+
* than a silent write. The per-method completeness rules do not apply: a PATCH
|
|
113
|
+
* may legitimately carry only `isActive`.
|
|
114
|
+
*/
|
|
115
|
+
export declare const shippingConfigUpdateSchema: z.ZodObject<{
|
|
116
|
+
label: z.ZodOptional<z.ZodString>;
|
|
117
|
+
method: z.ZodOptional<z.ZodEnum<["free", "flat", "weight", "express", "pickup", "custom"]>>;
|
|
118
|
+
flatRate: z.ZodOptional<z.ZodNumber>;
|
|
119
|
+
pricePerKg: z.ZodOptional<z.ZodNumber>;
|
|
120
|
+
freeAbove: z.ZodOptional<z.ZodNumber>;
|
|
121
|
+
expressSurcharge: z.ZodOptional<z.ZodNumber>;
|
|
122
|
+
estimatedDays: z.ZodOptional<z.ZodNumber>;
|
|
123
|
+
zones: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
124
|
+
isDefault: z.ZodOptional<z.ZodBoolean>;
|
|
125
|
+
isActive: z.ZodOptional<z.ZodBoolean>;
|
|
126
|
+
}, "strict", z.ZodTypeAny, {
|
|
127
|
+
label?: string | undefined;
|
|
128
|
+
isDefault?: boolean | undefined;
|
|
129
|
+
isActive?: boolean | undefined;
|
|
130
|
+
method?: "flat" | "weight" | "custom" | "free" | "express" | "pickup" | undefined;
|
|
131
|
+
estimatedDays?: number | undefined;
|
|
132
|
+
freeAbove?: number | undefined;
|
|
133
|
+
flatRate?: number | undefined;
|
|
134
|
+
pricePerKg?: number | undefined;
|
|
135
|
+
expressSurcharge?: number | undefined;
|
|
136
|
+
zones?: string[] | undefined;
|
|
137
|
+
}, {
|
|
138
|
+
label?: string | undefined;
|
|
139
|
+
isDefault?: boolean | undefined;
|
|
140
|
+
isActive?: boolean | undefined;
|
|
141
|
+
method?: "flat" | "weight" | "custom" | "free" | "express" | "pickup" | undefined;
|
|
142
|
+
estimatedDays?: number | undefined;
|
|
143
|
+
freeAbove?: number | undefined;
|
|
144
|
+
flatRate?: number | undefined;
|
|
145
|
+
pricePerKg?: number | undefined;
|
|
146
|
+
expressSurcharge?: number | undefined;
|
|
147
|
+
zones?: string[] | undefined;
|
|
148
|
+
}>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `POST /api/store/shipping-configs` spread the raw request body into
|
|
3
|
+
* `.create()` and the PATCH handed it straight to `.update()` — no Zod on
|
|
4
|
+
* either, and neither page validated anything. A shipping rule is money:
|
|
5
|
+
* a `flatRate` of `"abc"`, a negative `freeAbove`, or an invented key are
|
|
6
|
+
* all things that were persisted verbatim.
|
|
7
|
+
* WHAT: One schema for the pages AND the routes.
|
|
8
|
+
*
|
|
9
|
+
* ## The numeric fields are `.coerce` on purpose
|
|
10
|
+
*
|
|
11
|
+
* The pages hold them as strings from `<input type="number">`. Coercing here
|
|
12
|
+
* rather than at each call site means every consumer gets a real number and
|
|
13
|
+
* no page has to remember a `Number()` cast — the kind of per-callsite
|
|
14
|
+
* conversion that produces a `NaN` in Firestore the first time someone forgets.
|
|
15
|
+
*
|
|
16
|
+
* EXPORTS:
|
|
17
|
+
* shippingConfigFormSchema, shippingConfigCreateSchema,
|
|
18
|
+
* shippingConfigUpdateSchema, type ShippingConfigFormValues
|
|
19
|
+
*
|
|
20
|
+
* @tag domain:store-extensions
|
|
21
|
+
* @tag layer:schema
|
|
22
|
+
* @tag pattern:none
|
|
23
|
+
* @tag access:isomorphic
|
|
24
|
+
* @tag consumers:store/shipping-configs pages,/api/store/shipping-configs
|
|
25
|
+
* @tag sideEffects:none
|
|
26
|
+
*/
|
|
27
|
+
import { z } from "zod";
|
|
28
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
29
|
+
/** Mirrors `ShippingMethod` in ./firestore. */
|
|
30
|
+
const shippingMethodSchema = z.enum(["free", "flat", "weight", "express", "pickup", "custom"]);
|
|
31
|
+
/** A non-negative money/threshold amount, coerced from the form's string. */
|
|
32
|
+
const amount = (label) => z.coerce.number({ invalid_type_error: `${label} must be a number.` }).min(0, `${label} cannot be negative.`);
|
|
33
|
+
/**
|
|
34
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
35
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
36
|
+
*/
|
|
37
|
+
export const shippingConfigFormSchema = z
|
|
38
|
+
.object({
|
|
39
|
+
label: annotate(z.string().min(1, "Give this rule a name.").max(80), {
|
|
40
|
+
section: "basics", sectionLabel: "Shipping Rule", sectionRequired: true,
|
|
41
|
+
quick: true, order: 1, row: "pair",
|
|
42
|
+
}),
|
|
43
|
+
method: annotate(shippingMethodSchema, {
|
|
44
|
+
section: "basics", quick: true, order: 2, row: "pair",
|
|
45
|
+
}),
|
|
46
|
+
flatRate: annotate(amount("Flat rate").optional(), {
|
|
47
|
+
section: "rates", sectionLabel: "Rates", order: 1, row: "pair",
|
|
48
|
+
}),
|
|
49
|
+
pricePerKg: annotate(amount("Price per kg").optional(), {
|
|
50
|
+
section: "rates", order: 2, row: "pair",
|
|
51
|
+
}),
|
|
52
|
+
freeAbove: annotate(amount("Free above").optional(), {
|
|
53
|
+
section: "rates", order: 3, row: "pair",
|
|
54
|
+
}),
|
|
55
|
+
expressSurcharge: annotate(amount("Express surcharge").optional(), {
|
|
56
|
+
section: "rates", order: 4, row: "pair",
|
|
57
|
+
}),
|
|
58
|
+
estimatedDays: annotate(z.coerce.number().int("Estimated days must be a whole number.").min(0).max(365).optional(), { section: "rates", order: 5, row: "pair" }),
|
|
59
|
+
isDefault: annotate(z.boolean(), {
|
|
60
|
+
section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
|
|
61
|
+
}),
|
|
62
|
+
isActive: annotate(z.boolean(), {
|
|
63
|
+
section: "visibility", order: 2, row: "quarter",
|
|
64
|
+
}),
|
|
65
|
+
})
|
|
66
|
+
.superRefine((v, ctx) => {
|
|
67
|
+
// A rate rule with no rate is not a rule. Checked per method, because the
|
|
68
|
+
// required field differs and a blanket `.min(1)` would make every rate
|
|
69
|
+
// mandatory for a free/pickup rule that has none.
|
|
70
|
+
const need = (path, label) => {
|
|
71
|
+
if (v[path] == null) {
|
|
72
|
+
ctx.addIssue({
|
|
73
|
+
code: z.ZodIssueCode.custom,
|
|
74
|
+
path: [path],
|
|
75
|
+
message: `A "${label}" rule needs a ${path === "flatRate" ? "flat rate" : "price per kg"}.`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
if (v.method === "flat")
|
|
80
|
+
need("flatRate", "flat");
|
|
81
|
+
if (v.method === "weight")
|
|
82
|
+
need("pricePerKg", "weight");
|
|
83
|
+
});
|
|
84
|
+
/** `storeId` is absent — the route sets it from the session, never the body. */
|
|
85
|
+
export const shippingConfigCreateSchema = shippingConfigFormSchema;
|
|
86
|
+
/**
|
|
87
|
+
* Update contract — partial, and `.strict()` so an unknown key is a 400 rather
|
|
88
|
+
* than a silent write. The per-method completeness rules do not apply: a PATCH
|
|
89
|
+
* may legitimately carry only `isActive`.
|
|
90
|
+
*/
|
|
91
|
+
export const shippingConfigUpdateSchema = z
|
|
92
|
+
.object({
|
|
93
|
+
label: z.string().min(1).max(80).optional(),
|
|
94
|
+
method: shippingMethodSchema.optional(),
|
|
95
|
+
flatRate: amount("Flat rate").optional(),
|
|
96
|
+
pricePerKg: amount("Price per kg").optional(),
|
|
97
|
+
freeAbove: amount("Free above").optional(),
|
|
98
|
+
expressSurcharge: amount("Express surcharge").optional(),
|
|
99
|
+
estimatedDays: z.coerce.number().int().min(0).max(365).optional(),
|
|
100
|
+
zones: z.array(z.string()).optional(),
|
|
101
|
+
isDefault: z.boolean().optional(),
|
|
102
|
+
isActive: z.boolean().optional(),
|
|
103
|
+
})
|
|
104
|
+
.strict();
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
4
|
+
* by schema instance and every zod wrapper returns a new one, so annotating
|
|
5
|
+
* before `.optional()` silently loses the metadata.
|
|
6
|
+
*/
|
|
7
|
+
export declare const storeCategoryFormSchema: z.ZodObject<{
|
|
8
|
+
label: z.ZodString;
|
|
9
|
+
slug: z.ZodOptional<z.ZodString>;
|
|
10
|
+
description: z.ZodOptional<z.ZodString>;
|
|
11
|
+
coverImageUrl: z.ZodOptional<z.ZodString>;
|
|
12
|
+
displayOrder: z.ZodNumber;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
label: string;
|
|
15
|
+
displayOrder: number;
|
|
16
|
+
description?: string | undefined;
|
|
17
|
+
slug?: string | undefined;
|
|
18
|
+
coverImageUrl?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
label: string;
|
|
21
|
+
displayOrder: number;
|
|
22
|
+
description?: string | undefined;
|
|
23
|
+
slug?: string | undefined;
|
|
24
|
+
coverImageUrl?: string | undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export type StoreCategoryFormValues = z.infer<typeof storeCategoryFormSchema>;
|
|
27
|
+
/**
|
|
28
|
+
* The server's create contract.
|
|
29
|
+
*
|
|
30
|
+
* Identical fields, but `slug` is REQUIRED here: the client derives it from
|
|
31
|
+
* the label when blank, and a category with no slug has no URL. Keeping the
|
|
32
|
+
* derivation on the client and the requirement on the server means the route
|
|
33
|
+
* never has to guess what the user meant.
|
|
34
|
+
*/
|
|
35
|
+
export declare const storeCategoryCreateSchema: z.ZodObject<{
|
|
36
|
+
label: z.ZodString;
|
|
37
|
+
description: z.ZodOptional<z.ZodString>;
|
|
38
|
+
coverImageUrl: z.ZodOptional<z.ZodString>;
|
|
39
|
+
displayOrder: z.ZodNumber;
|
|
40
|
+
} & {
|
|
41
|
+
slug: z.ZodString;
|
|
42
|
+
}, "strip", z.ZodTypeAny, {
|
|
43
|
+
label: string;
|
|
44
|
+
slug: string;
|
|
45
|
+
displayOrder: number;
|
|
46
|
+
description?: string | undefined;
|
|
47
|
+
coverImageUrl?: string | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
label: string;
|
|
50
|
+
slug: string;
|
|
51
|
+
displayOrder: number;
|
|
52
|
+
description?: string | undefined;
|
|
53
|
+
coverImageUrl?: string | undefined;
|
|
54
|
+
}>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `/store/categories/new` collected five fields through raw <Input>s with
|
|
3
|
+
* no <Form>, no schema and no check of any kind, and `POST
|
|
4
|
+
* /api/store/categories` spread the raw request body straight into
|
|
5
|
+
* `storeCategoriesRepository.create()`. Neither side validated anything,
|
|
6
|
+
* so an entirely empty storefront category could be created — and any
|
|
7
|
+
* extra key a caller sent was written verbatim into Firestore.
|
|
8
|
+
* WHAT: One schema for both sides. The client parses it to show inline errors
|
|
9
|
+
* before submitting; the route parses it to decide what is allowed to
|
|
10
|
+
* reach the database.
|
|
11
|
+
*
|
|
12
|
+
* ## Why one schema and not two
|
|
13
|
+
*
|
|
14
|
+
* A client copy and a server copy of the same rules is how they come to
|
|
15
|
+
* disagree — and when they do, the client's is the one users see while the
|
|
16
|
+
* server's is the one that decides. The route strips unknown keys BECAUSE it
|
|
17
|
+
* parses this: `storeId` is set from the session, never from the body, so a
|
|
18
|
+
* caller cannot write a category into someone else's store by adding a field.
|
|
19
|
+
*
|
|
20
|
+
* `productIds` and `isActive` are deliberately absent: they are managed after
|
|
21
|
+
* creation (assigning products, toggling visibility), not typed into the
|
|
22
|
+
* create form, and the repository supplies their defaults.
|
|
23
|
+
*
|
|
24
|
+
* EXPORTS:
|
|
25
|
+
* storeCategoryFormSchema, storeCategoryCreateSchema,
|
|
26
|
+
* type StoreCategoryFormValues
|
|
27
|
+
*
|
|
28
|
+
* @tag domain:store-extensions
|
|
29
|
+
* @tag layer:schema
|
|
30
|
+
* @tag pattern:none
|
|
31
|
+
* @tag access:isomorphic
|
|
32
|
+
* @tag consumers:store/categories/new,POST /api/store/categories
|
|
33
|
+
* @tag sideEffects:none
|
|
34
|
+
*/
|
|
35
|
+
import { z } from "zod";
|
|
36
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
37
|
+
/**
|
|
38
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
39
|
+
* by schema instance and every zod wrapper returns a new one, so annotating
|
|
40
|
+
* before `.optional()` silently loses the metadata.
|
|
41
|
+
*/
|
|
42
|
+
export const storeCategoryFormSchema = z.object({
|
|
43
|
+
label: annotate(z.string().min(1, "Label is required").max(80, "Keep the label under 80 characters."), {
|
|
44
|
+
section: "basics", sectionLabel: "Category", sectionRequired: true,
|
|
45
|
+
quick: true, order: 1, row: "full",
|
|
46
|
+
}),
|
|
47
|
+
slug: annotate(z.string().max(80, "Keep the slug under 80 characters.").optional(), {
|
|
48
|
+
section: "basics", order: 2, row: "full",
|
|
49
|
+
// T1 calculated: derived from the label when left blank, then frozen —
|
|
50
|
+
// the same create-only rule every other slug in this codebase follows,
|
|
51
|
+
// because renaming one breaks inbound links.
|
|
52
|
+
tier: "t1-derive",
|
|
53
|
+
help: "Left blank, this is generated from the label.",
|
|
54
|
+
}),
|
|
55
|
+
description: annotate(z.string().max(500, "Keep the description under 500 characters.").optional(), {
|
|
56
|
+
section: "basics", order: 3, row: "full",
|
|
57
|
+
}),
|
|
58
|
+
coverImageUrl: annotate(z.string().optional(), {
|
|
59
|
+
section: "media", sectionLabel: "Media", order: 1, row: "full", kind: "media",
|
|
60
|
+
}),
|
|
61
|
+
displayOrder: annotate(z.coerce.number().int("Display order must be a whole number.").min(0, "Display order cannot be negative."), { section: "visibility", sectionLabel: "Visibility", order: 1, row: "pair" }),
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* The server's create contract.
|
|
65
|
+
*
|
|
66
|
+
* Identical fields, but `slug` is REQUIRED here: the client derives it from
|
|
67
|
+
* the label when blank, and a category with no slug has no URL. Keeping the
|
|
68
|
+
* derivation on the client and the requirement on the server means the route
|
|
69
|
+
* never has to guess what the user meant.
|
|
70
|
+
*/
|
|
71
|
+
export const storeCategoryCreateSchema = storeCategoryFormSchema.extend({
|
|
72
|
+
slug: z.string().min(1, "Slug is required").max(80),
|
|
73
|
+
});
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { NextResponse } from "next/server.js";
|
|
15
15
|
import { getProviders } from "../../../../contracts";
|
|
16
|
+
import { toStoreDetail } from "../../../../_internal/server/features/stores/adapters";
|
|
16
17
|
import { normalizeError } from "../../../../errors/normalize";
|
|
17
18
|
// --- GET /api/stores/[storeSlug] ---------------------------------------------
|
|
18
19
|
export async function GET(_request, context) {
|
|
@@ -33,31 +34,7 @@ export async function GET(_request, context) {
|
|
|
33
34
|
return NextResponse.json({ success: false, error: "Store not found" }, { status: 404 });
|
|
34
35
|
}
|
|
35
36
|
// Map to public-safe StoreDetail shape (strip internal/sensitive fields)
|
|
36
|
-
const store =
|
|
37
|
-
id: raw.id,
|
|
38
|
-
storeSlug: raw.storeSlug,
|
|
39
|
-
ownerId: raw.ownerId,
|
|
40
|
-
storeName: raw.storeName,
|
|
41
|
-
storeDescription: raw.storeDescription,
|
|
42
|
-
storeCategory: raw.storeCategory,
|
|
43
|
-
storeLogoURL: raw.storeLogoURL,
|
|
44
|
-
storeBannerURL: raw.storeBannerURL,
|
|
45
|
-
status: raw.status,
|
|
46
|
-
isPublic: raw.isPublic,
|
|
47
|
-
totalProducts: raw.stats?.totalProducts ?? raw.totalProducts ?? undefined,
|
|
48
|
-
itemsSold: raw.stats?.itemsSold ?? raw.itemsSold ?? undefined,
|
|
49
|
-
totalReviews: raw.stats?.totalReviews ?? raw.totalReviews ?? undefined,
|
|
50
|
-
averageRating: raw.stats?.averageRating ?? raw.averageRating,
|
|
51
|
-
bio: raw.bio,
|
|
52
|
-
location: raw.location,
|
|
53
|
-
website: raw.website,
|
|
54
|
-
socialLinks: raw.socialLinks,
|
|
55
|
-
returnPolicy: raw.returnPolicy,
|
|
56
|
-
shippingPolicy: raw.shippingPolicy,
|
|
57
|
-
isVacationMode: raw.isVacationMode,
|
|
58
|
-
vacationMessage: raw.vacationMessage,
|
|
59
|
-
createdAt: raw.createdAt,
|
|
60
|
-
};
|
|
37
|
+
const store = toStoreDetail(raw);
|
|
61
38
|
return NextResponse.json({ success: true, data: store });
|
|
62
39
|
}
|
|
63
40
|
catch (error) {
|
|
@@ -13,6 +13,10 @@ import { getDefaultCurrency } from "../../../core/baseline-resolver";
|
|
|
13
13
|
import { useGuestWishlist } from "../../wishlist/hooks/useGuestWishlist";
|
|
14
14
|
import { pushWishlistOp } from "../../cart/utils/pending-ops";
|
|
15
15
|
import { AUCTION_PUBLIC_SORT_OPTIONS } from "../../products/constants/sieve";
|
|
16
|
+
import { AvailabilityTabs } from "../../products/components/AvailabilityTabs";
|
|
17
|
+
import { AVAILABILITY_VALUES } from "../../../constants/field-names";
|
|
18
|
+
import { TABLE_KEYS } from "../../../constants/table-keys";
|
|
19
|
+
const STORE_AUCTION_TYPES = ["auction"];
|
|
16
20
|
const __P = {
|
|
17
21
|
p3: "p-[var(--appkit-space-3)]",
|
|
18
22
|
};
|
|
@@ -45,6 +49,12 @@ export function StoreAuctionsListing({ storeId, initialData }) {
|
|
|
45
49
|
const hasActiveState = !!table.get("q") ||
|
|
46
50
|
table.get("sort") !== DEFAULT_SORT ||
|
|
47
51
|
filterActiveCount > 0;
|
|
52
|
+
// Absent means "available" — the same default `listStoreProducts`
|
|
53
|
+
// resolves server-side. These six store tabs sent NO availability
|
|
54
|
+
// param at all until 2026-08-24, while their SSR fetch did apply one,
|
|
55
|
+
// so any client refetch silently widened the list (Root Cause #30).
|
|
56
|
+
const availability = table.get(TABLE_KEYS.AVAILABILITY) ||
|
|
57
|
+
AVAILABILITY_VALUES.AVAILABLE;
|
|
48
58
|
const params = {
|
|
49
59
|
q: table.get("q") || undefined,
|
|
50
60
|
minBid: table.get("minBid") ? Number(table.get("minBid")) : undefined,
|
|
@@ -56,6 +66,7 @@ export function StoreAuctionsListing({ storeId, initialData }) {
|
|
|
56
66
|
perPage: table.getNumber("pageSize", 24),
|
|
57
67
|
storeId: storeId || undefined,
|
|
58
68
|
listingType: "auction",
|
|
69
|
+
availability,
|
|
59
70
|
};
|
|
60
71
|
const { products: rawAuctions, totalPages, page, isLoading } = useProducts(params, { initialData });
|
|
61
72
|
const auctions = rawAuctions.map((p) => ({
|
|
@@ -75,6 +86,9 @@ export function StoreAuctionsListing({ storeId, initialData }) {
|
|
|
75
86
|
status: p.status,
|
|
76
87
|
slug: p.slug,
|
|
77
88
|
buyNowPrice: p.buyNowPrice,
|
|
89
|
+
// Read by isBuyNowAvailable() on the card — without it a sold auction still
|
|
90
|
+
// offers a Buyout chip.
|
|
91
|
+
isSold: p.isSold,
|
|
78
92
|
}));
|
|
79
93
|
const commitSearch = useCallback(() => {
|
|
80
94
|
// table.set("q", v) already resets page to 1 — see root-cause #13.
|
|
@@ -107,7 +121,7 @@ export function StoreAuctionsListing({ storeId, initialData }) {
|
|
|
107
121
|
return;
|
|
108
122
|
setView(v);
|
|
109
123
|
table.set("view", v);
|
|
110
|
-
}, onResetAll: resetAll, hasActiveState: hasActiveState }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: isLoading ? (_jsx(Div, { className: gridClass, children: Array.from({ length: 8 }).map((_, i) => (_jsxs(Div, { className: "overflow-hidden animate-pulse", border: "subtle", rounded: "xl", children: [_jsx(Div, { className: "aspect-square", surface: "subtle" }), _jsxs(Stack, { className: `${__P.p3}`, gap: "sm", children: [_jsx(Div, { className: "h-3 w-3/4", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-4 w-1/2", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-8", surface: "subtle", rounded: "default" })] })] }, i))) })) : (_jsx(MarketplaceAuctionGrid, { auctions: auctions, variant: view === "list" ? "list" : "grid", gridClassName: view === "list" ? "flex flex-col gap-[var(--appkit-space-4)]" : gridClass, wishlistActions: wishlistActions, labels: {
|
|
124
|
+
}, onResetAll: resetAll, hasActiveState: hasActiveState }), _jsx(Div, { padding: "y-sm", children: _jsx(AvailabilityTabs, { types: STORE_AUCTION_TYPES }) }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: isLoading ? (_jsx(Div, { className: gridClass, children: Array.from({ length: 8 }).map((_, i) => (_jsxs(Div, { className: "overflow-hidden animate-pulse", border: "subtle", rounded: "xl", children: [_jsx(Div, { className: "aspect-square", surface: "subtle" }), _jsxs(Stack, { className: `${__P.p3}`, gap: "sm", children: [_jsx(Div, { className: "h-3 w-3/4", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-4 w-1/2", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-8", surface: "subtle", rounded: "default" })] })] }, i))) })) : (_jsx(MarketplaceAuctionGrid, { auctions: auctions, variant: view === "list" ? "list" : "grid", gridClassName: view === "list" ? "flex flex-col gap-[var(--appkit-space-4)]" : gridClass, wishlistActions: wishlistActions, labels: {
|
|
111
125
|
emptyTitle: "No auctions yet",
|
|
112
126
|
emptyDescription: "This store has no active auctions.",
|
|
113
127
|
} })) }), _jsx(FilterDrawer, { open: filterOpen, onOpen: openFilters, onClose: () => setFilterOpen(false), onApply: applyFilters, onReset: onFilterClear, activeCount: filterActiveCount, hideTrigger: true, children: _jsx(AuctionFilters, { table: pendingTable, currencyPrefix: "\u20B9" }) }), _jsx(LoginRequiredModal, { isOpen: modalOpen, onClose: closeModal, message: modalMessage })] }));
|
|
@@ -8,9 +8,12 @@ import { Div, FilterDrawer, ListingToolbar, Pagination, Row, Text, StickyToolbar
|
|
|
8
8
|
import { ClassifiedFilters } from "../../classified/components/ClassifiedFilters";
|
|
9
9
|
import { InteractiveProductCard } from "../../products/components/InteractiveProductCard";
|
|
10
10
|
import { PRODUCT_FIELDS } from "../../../constants/field-names";
|
|
11
|
-
import { TABLE_KEYS } from "../../../constants/table-keys";
|
|
12
11
|
import { sortBy } from "../../../constants/sort";
|
|
13
12
|
import { ROUTES } from "../../../next";
|
|
13
|
+
import { AvailabilityTabs } from "../../products/components/AvailabilityTabs";
|
|
14
|
+
import { AVAILABILITY_VALUES } from "../../../constants/field-names";
|
|
15
|
+
import { TABLE_KEYS } from "../../../constants/table-keys";
|
|
16
|
+
const STORE_CLASSIFIED_TYPES = ["classified"];
|
|
14
17
|
const DEFAULT_SORT = sortBy(PRODUCT_FIELDS.CREATED_AT);
|
|
15
18
|
const SORT_OPTIONS = [
|
|
16
19
|
{ value: sortBy(PRODUCT_FIELDS.CREATED_AT), label: "Newest First" },
|
|
@@ -28,6 +31,12 @@ export function StoreClassifiedsListing({ storeId, initialData }) {
|
|
|
28
31
|
const applyFilters = useCallback(() => { onFilterApply(); setFilterOpen(false); }, [onFilterApply]);
|
|
29
32
|
const resetAll = useCallback(() => { onResetAll({ q: "", sort: "" }); setSearchInput(""); }, [onResetAll]);
|
|
30
33
|
const hasActiveState = !!table.get("q") || table.get("sort") !== DEFAULT_SORT || filterActiveCount > 0;
|
|
34
|
+
// Absent means "available" — the same default `listStoreProducts`
|
|
35
|
+
// resolves server-side. These six store tabs sent NO availability
|
|
36
|
+
// param at all until 2026-08-24, while their SSR fetch did apply one,
|
|
37
|
+
// so any client refetch silently widened the list (Root Cause #30).
|
|
38
|
+
const availability = table.get(TABLE_KEYS.AVAILABILITY) ||
|
|
39
|
+
AVAILABILITY_VALUES.AVAILABLE;
|
|
31
40
|
const params = {
|
|
32
41
|
q: table.get("q") || undefined,
|
|
33
42
|
minPrice: table.get(TABLE_KEYS.MIN_PRICE) ? Number(table.get(TABLE_KEYS.MIN_PRICE)) : undefined,
|
|
@@ -44,10 +53,11 @@ export function StoreClassifiedsListing({ storeId, initialData }) {
|
|
|
44
53
|
[TABLE_KEYS.NEGOTIABLE]: table.get(TABLE_KEYS.NEGOTIABLE),
|
|
45
54
|
[TABLE_KEYS.ACCEPTS_SHIPPING]: table.get(TABLE_KEYS.ACCEPTS_SHIPPING),
|
|
46
55
|
},
|
|
56
|
+
availability,
|
|
47
57
|
};
|
|
48
58
|
const { products, totalPages, page, isLoading } = useProducts(params, { initialData });
|
|
49
59
|
const gridClass = "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-[var(--appkit-space-4)]";
|
|
50
|
-
return (_jsxs(Div, { className: "min-h-[200px]", children: [_jsx(ListingToolbar, { filterCount: filterActiveCount, onFiltersClick: openFilters, searchValue: searchInput, searchPlaceholder: "Search store classifieds\u2026", onSearchChange: setSearchInput, onSearchCommit: () => table.set("q", searchInput.trim()), sortValue: table.get("sort") || DEFAULT_SORT, sortOptions: SORT_OPTIONS, onSortChange: (v) => table.set("sort", v), onResetAll: resetAll, hasActiveState: hasActiveState }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: _jsx(Div, { className: gridClass, children: isLoading
|
|
60
|
+
return (_jsxs(Div, { className: "min-h-[200px]", children: [_jsx(ListingToolbar, { filterCount: filterActiveCount, onFiltersClick: openFilters, searchValue: searchInput, searchPlaceholder: "Search store classifieds\u2026", onSearchChange: setSearchInput, onSearchCommit: () => table.set("q", searchInput.trim()), sortValue: table.get("sort") || DEFAULT_SORT, sortOptions: SORT_OPTIONS, onSortChange: (v) => table.set("sort", v), onResetAll: resetAll, hasActiveState: hasActiveState }), _jsx(Div, { padding: "y-sm", children: _jsx(AvailabilityTabs, { types: STORE_CLASSIFIED_TYPES }) }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: _jsx(Div, { className: gridClass, children: isLoading
|
|
51
61
|
? Array.from({ length: 8 }).map((_, i) => _jsx(Div, { surface: "muted", rounded: "xl", className: "aspect-square animate-pulse" }, i))
|
|
52
62
|
: products.length === 0
|
|
53
63
|
? _jsx(Div, { paddingY: "y-4xl", className: "col-span-full text-left", children: _jsx(Text, { color: "muted", children: "No classified listings in this store yet." }) })
|