@mohasinac/appkit 4.13.1 → 4.14.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 +6 -0
- 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/checkout/actions.js +6 -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/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/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 +45 -9
- 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 +15 -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/blog/schema.d.ts +2 -2
- package/dist/_internal/shared/features/cart/schema.d.ts +12 -12
- 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 +32 -32
- 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 +66 -0
- package/dist/_internal/shared/history/history.js +158 -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 +7 -5
- package/dist/client.js +2 -2
- package/dist/constants/api-endpoints.d.ts +6 -0
- package/dist/constants/api-endpoints.js +2 -0
- package/dist/constants/field-names.d.ts +49 -2
- package/dist/constants/field-names.js +53 -2
- 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/UserOrdersView.js +7 -0
- 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/AdminClassifiedView.js +8 -3
- package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
- package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
- package/dist/features/admin/components/AdminLiveView.js +8 -3
- package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
- package/dist/features/admin/components/AdminOffersView.js +186 -0
- package/dist/features/admin/components/AdminOrdersView.js +10 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
- package/dist/features/admin/components/AdminProductsView.js +16 -29
- 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/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +86 -0
- package/dist/features/admin/constants/filter-tabs.js +55 -0
- package/dist/features/admin/schemas/firestore.d.ts +122 -3
- package/dist/features/admin/schemas/firestore.js +1 -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/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/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/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/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/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/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/index.d.ts +4 -4
- 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 +2 -2
- 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/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 +116 -22
- package/dist/features/orders/schemas/firestore.d.ts +117 -0
- package/dist/features/orders/schemas/firestore.js +30 -0
- package/dist/features/orders/schemas/index.d.ts +18 -18
- 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/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 +66 -66
- package/dist/features/products/schemas/product-features.validators.d.ts +6 -6
- 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/search/schemas/index.d.ts +4 -4
- package/dist/features/seller/actions/offer-actions.js +25 -2
- package/dist/features/seller/components/SellerArtView.js +5 -0
- package/dist/features/seller/components/SellerAuctionsView.js +13 -15
- package/dist/features/seller/components/SellerClassifiedView.js +5 -0
- package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
- package/dist/features/seller/components/SellerLiveView.js +5 -0
- package/dist/features/seller/components/SellerOrdersView.js +31 -9
- package/dist/features/seller/components/SellerPayoutSettingsView.js +19 -18
- 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 +73 -16
- package/dist/features/seller/repository/offer.repository.js +38 -3
- package/dist/features/seller/schemas/index.d.ts +2 -2
- package/dist/features/seller/schemas/offer-forms.d.ts +25 -0
- package/dist/features/seller/schemas/offer-forms.js +21 -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/entity-form.d.ts +109 -0
- package/dist/features/shell/entity-form.js +96 -0
- package/dist/features/shell/index.d.ts +4 -0
- package/dist/features/shell/index.js +2 -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 +105 -1
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/index.d.ts +13 -10
- package/dist/index.js +14 -9
- package/dist/next/routing/route-map.d.ts +7 -1
- package/dist/next/routing/route-map.js +5 -0
- 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/registry.d.ts +68 -68
- 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/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 +32 -27
- package/dist/seed/products-art-seed-data.js +50 -12
- package/dist/seed/products-auctions-seed-data.js +97 -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 +4 -3
- package/dist/server.js +8 -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/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 +1 -1
|
@@ -35,9 +35,6 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
35
35
|
tags: string[];
|
|
36
36
|
features?: string[] | undefined;
|
|
37
37
|
description?: string | undefined;
|
|
38
|
-
seoTitle?: string | undefined;
|
|
39
|
-
seoDescription?: string | undefined;
|
|
40
|
-
seoKeywords?: string[] | undefined;
|
|
41
38
|
brandSlug?: string | undefined;
|
|
42
39
|
shippingInfo?: string | undefined;
|
|
43
40
|
returnPolicy?: string | undefined;
|
|
@@ -45,6 +42,9 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
45
42
|
insurance?: boolean | undefined;
|
|
46
43
|
insuranceCost?: number | undefined;
|
|
47
44
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
45
|
+
seoTitle?: string | undefined;
|
|
46
|
+
seoDescription?: string | undefined;
|
|
47
|
+
seoKeywords?: string[] | undefined;
|
|
48
48
|
allowOffers?: boolean | undefined;
|
|
49
49
|
minOfferPercent?: number | undefined;
|
|
50
50
|
}, {
|
|
@@ -55,9 +55,6 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
55
55
|
currency?: string | undefined;
|
|
56
56
|
features?: string[] | undefined;
|
|
57
57
|
description?: string | undefined;
|
|
58
|
-
seoTitle?: string | undefined;
|
|
59
|
-
seoDescription?: string | undefined;
|
|
60
|
-
seoKeywords?: string[] | undefined;
|
|
61
58
|
brandSlug?: string | undefined;
|
|
62
59
|
stockQuantity?: number | undefined;
|
|
63
60
|
availableQuantity?: number | undefined;
|
|
@@ -69,6 +66,9 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
69
66
|
insurance?: boolean | undefined;
|
|
70
67
|
insuranceCost?: number | undefined;
|
|
71
68
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
69
|
+
seoTitle?: string | undefined;
|
|
70
|
+
seoDescription?: string | undefined;
|
|
71
|
+
seoKeywords?: string[] | undefined;
|
|
72
72
|
allowOffers?: boolean | undefined;
|
|
73
73
|
minOfferPercent?: number | undefined;
|
|
74
74
|
}>;
|
|
@@ -100,11 +100,8 @@ export declare const productUpdateSchema: z.ZodObject<{
|
|
|
100
100
|
currency?: string | undefined;
|
|
101
101
|
title?: string | undefined;
|
|
102
102
|
features?: string[] | undefined;
|
|
103
|
-
category?: string | undefined;
|
|
104
103
|
description?: string | undefined;
|
|
105
|
-
|
|
106
|
-
seoDescription?: string | undefined;
|
|
107
|
-
seoKeywords?: string[] | undefined;
|
|
104
|
+
category?: string | undefined;
|
|
108
105
|
brandSlug?: string | undefined;
|
|
109
106
|
price?: number | undefined;
|
|
110
107
|
stockQuantity?: number | undefined;
|
|
@@ -118,17 +115,17 @@ export declare const productUpdateSchema: z.ZodObject<{
|
|
|
118
115
|
insurance?: boolean | undefined;
|
|
119
116
|
insuranceCost?: number | undefined;
|
|
120
117
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
118
|
+
seoTitle?: string | undefined;
|
|
119
|
+
seoDescription?: string | undefined;
|
|
120
|
+
seoKeywords?: string[] | undefined;
|
|
121
121
|
allowOffers?: boolean | undefined;
|
|
122
122
|
minOfferPercent?: number | undefined;
|
|
123
123
|
}, {
|
|
124
124
|
currency?: string | undefined;
|
|
125
125
|
title?: string | undefined;
|
|
126
126
|
features?: string[] | undefined;
|
|
127
|
-
category?: string | undefined;
|
|
128
127
|
description?: string | undefined;
|
|
129
|
-
|
|
130
|
-
seoDescription?: string | undefined;
|
|
131
|
-
seoKeywords?: string[] | undefined;
|
|
128
|
+
category?: string | undefined;
|
|
132
129
|
brandSlug?: string | undefined;
|
|
133
130
|
price?: number | undefined;
|
|
134
131
|
stockQuantity?: number | undefined;
|
|
@@ -142,6 +139,9 @@ export declare const productUpdateSchema: z.ZodObject<{
|
|
|
142
139
|
insurance?: boolean | undefined;
|
|
143
140
|
insuranceCost?: number | undefined;
|
|
144
141
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
142
|
+
seoTitle?: string | undefined;
|
|
143
|
+
seoDescription?: string | undefined;
|
|
144
|
+
seoKeywords?: string[] | undefined;
|
|
145
145
|
allowOffers?: boolean | undefined;
|
|
146
146
|
minOfferPercent?: number | undefined;
|
|
147
147
|
}>;
|
|
@@ -183,21 +183,18 @@ export declare const auctionInputSchema: z.ZodObject<{
|
|
|
183
183
|
currency: string;
|
|
184
184
|
title: string;
|
|
185
185
|
category: string;
|
|
186
|
-
listingType: "auction";
|
|
187
186
|
price: number;
|
|
188
187
|
stockQuantity: number;
|
|
189
188
|
availableQuantity: number;
|
|
190
189
|
mainImage: string;
|
|
191
190
|
images: string[];
|
|
192
191
|
tags: string[];
|
|
192
|
+
listingType: "auction";
|
|
193
193
|
auctionEndDate: string;
|
|
194
194
|
startingBid: number;
|
|
195
195
|
autoExtendable: boolean;
|
|
196
196
|
features?: string[] | undefined;
|
|
197
197
|
description?: string | undefined;
|
|
198
|
-
seoTitle?: string | undefined;
|
|
199
|
-
seoDescription?: string | undefined;
|
|
200
|
-
seoKeywords?: string[] | undefined;
|
|
201
198
|
brandSlug?: string | undefined;
|
|
202
199
|
shippingInfo?: string | undefined;
|
|
203
200
|
returnPolicy?: string | undefined;
|
|
@@ -210,22 +207,22 @@ export declare const auctionInputSchema: z.ZodObject<{
|
|
|
210
207
|
minBidIncrement?: number | undefined;
|
|
211
208
|
auctionExtensionMinutes?: number | undefined;
|
|
212
209
|
auctionShippingPaidBy?: "seller" | "winner" | undefined;
|
|
210
|
+
seoTitle?: string | undefined;
|
|
211
|
+
seoDescription?: string | undefined;
|
|
212
|
+
seoKeywords?: string[] | undefined;
|
|
213
213
|
allowOffers?: boolean | undefined;
|
|
214
214
|
minOfferPercent?: number | undefined;
|
|
215
215
|
}, {
|
|
216
216
|
title: string;
|
|
217
217
|
category: string;
|
|
218
|
-
listingType: "auction";
|
|
219
218
|
price: number;
|
|
220
219
|
mainImage: string;
|
|
220
|
+
listingType: "auction";
|
|
221
221
|
auctionEndDate: string;
|
|
222
222
|
startingBid: number;
|
|
223
223
|
currency?: string | undefined;
|
|
224
224
|
features?: string[] | undefined;
|
|
225
225
|
description?: string | undefined;
|
|
226
|
-
seoTitle?: string | undefined;
|
|
227
|
-
seoDescription?: string | undefined;
|
|
228
|
-
seoKeywords?: string[] | undefined;
|
|
229
226
|
brandSlug?: string | undefined;
|
|
230
227
|
stockQuantity?: number | undefined;
|
|
231
228
|
availableQuantity?: number | undefined;
|
|
@@ -243,6 +240,9 @@ export declare const auctionInputSchema: z.ZodObject<{
|
|
|
243
240
|
autoExtendable?: boolean | undefined;
|
|
244
241
|
auctionExtensionMinutes?: number | undefined;
|
|
245
242
|
auctionShippingPaidBy?: "seller" | "winner" | undefined;
|
|
243
|
+
seoTitle?: string | undefined;
|
|
244
|
+
seoDescription?: string | undefined;
|
|
245
|
+
seoKeywords?: string[] | undefined;
|
|
246
246
|
allowOffers?: boolean | undefined;
|
|
247
247
|
minOfferPercent?: number | undefined;
|
|
248
248
|
}>;
|
|
@@ -281,21 +281,18 @@ export declare const preOrderInputSchema: z.ZodObject<{
|
|
|
281
281
|
currency: string;
|
|
282
282
|
title: string;
|
|
283
283
|
category: string;
|
|
284
|
-
listingType: "pre-order";
|
|
285
284
|
price: number;
|
|
286
285
|
stockQuantity: number;
|
|
287
286
|
availableQuantity: number;
|
|
288
287
|
mainImage: string;
|
|
289
288
|
images: string[];
|
|
290
289
|
tags: string[];
|
|
290
|
+
listingType: "pre-order";
|
|
291
291
|
preOrderDeliveryDate: string;
|
|
292
|
-
preOrderProductionStatus: "
|
|
292
|
+
preOrderProductionStatus: "in_production" | "upcoming" | "ready_to_ship";
|
|
293
293
|
preOrderCancellable: boolean;
|
|
294
294
|
features?: string[] | undefined;
|
|
295
295
|
description?: string | undefined;
|
|
296
|
-
seoTitle?: string | undefined;
|
|
297
|
-
seoDescription?: string | undefined;
|
|
298
|
-
seoKeywords?: string[] | undefined;
|
|
299
296
|
brandSlug?: string | undefined;
|
|
300
297
|
shippingInfo?: string | undefined;
|
|
301
298
|
returnPolicy?: string | undefined;
|
|
@@ -305,21 +302,21 @@ export declare const preOrderInputSchema: z.ZodObject<{
|
|
|
305
302
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
306
303
|
preOrderDepositPercent?: number | undefined;
|
|
307
304
|
preOrderMaxQuantity?: number | undefined;
|
|
305
|
+
seoTitle?: string | undefined;
|
|
306
|
+
seoDescription?: string | undefined;
|
|
307
|
+
seoKeywords?: string[] | undefined;
|
|
308
308
|
allowOffers?: boolean | undefined;
|
|
309
309
|
minOfferPercent?: number | undefined;
|
|
310
310
|
}, {
|
|
311
311
|
title: string;
|
|
312
312
|
category: string;
|
|
313
|
-
listingType: "pre-order";
|
|
314
313
|
price: number;
|
|
315
314
|
mainImage: string;
|
|
315
|
+
listingType: "pre-order";
|
|
316
316
|
preOrderDeliveryDate: string;
|
|
317
317
|
currency?: string | undefined;
|
|
318
318
|
features?: string[] | undefined;
|
|
319
319
|
description?: string | undefined;
|
|
320
|
-
seoTitle?: string | undefined;
|
|
321
|
-
seoDescription?: string | undefined;
|
|
322
|
-
seoKeywords?: string[] | undefined;
|
|
323
320
|
brandSlug?: string | undefined;
|
|
324
321
|
stockQuantity?: number | undefined;
|
|
325
322
|
availableQuantity?: number | undefined;
|
|
@@ -333,8 +330,11 @@ export declare const preOrderInputSchema: z.ZodObject<{
|
|
|
333
330
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
334
331
|
preOrderDepositPercent?: number | undefined;
|
|
335
332
|
preOrderMaxQuantity?: number | undefined;
|
|
336
|
-
preOrderProductionStatus?: "
|
|
333
|
+
preOrderProductionStatus?: "in_production" | "upcoming" | "ready_to_ship" | undefined;
|
|
337
334
|
preOrderCancellable?: boolean | undefined;
|
|
335
|
+
seoTitle?: string | undefined;
|
|
336
|
+
seoDescription?: string | undefined;
|
|
337
|
+
seoKeywords?: string[] | undefined;
|
|
338
338
|
allowOffers?: boolean | undefined;
|
|
339
339
|
minOfferPercent?: number | undefined;
|
|
340
340
|
}>;
|
|
@@ -41,5 +41,11 @@ export function toProductItem(doc) {
|
|
|
41
41
|
// when listingType is missing) — same bug class as the Phase 1 routing
|
|
42
42
|
// fix, one hop further downstream in the related-items card link path.
|
|
43
43
|
listingType: doc.listingType ?? undefined,
|
|
44
|
+
// Same reasoning as `listingType` directly above, on the offers axis: the
|
|
45
|
+
// card grid renders a "Taking Offers" pill from this flag, so dropping it
|
|
46
|
+
// here made every related-item / grouped-listing card claim the seller
|
|
47
|
+
// doesn't negotiate — regardless of whether they do.
|
|
48
|
+
allowOffers: doc.allowOffers === true ? true : undefined,
|
|
49
|
+
minOfferPercent: typeof doc.minOfferPercent === "number" ? doc.minOfferPercent : undefined,
|
|
44
50
|
};
|
|
45
51
|
}
|
|
@@ -12,15 +12,15 @@ export declare const createReviewSchema: z.ZodObject<{
|
|
|
12
12
|
body: string;
|
|
13
13
|
storeId: string;
|
|
14
14
|
images: string[];
|
|
15
|
-
rating: number;
|
|
16
15
|
productId: string;
|
|
16
|
+
rating: number;
|
|
17
17
|
orderId?: string | undefined;
|
|
18
18
|
}, {
|
|
19
19
|
title: string;
|
|
20
20
|
body: string;
|
|
21
21
|
storeId: string;
|
|
22
|
-
rating: number;
|
|
23
22
|
productId: string;
|
|
23
|
+
rating: number;
|
|
24
24
|
orderId?: string | undefined;
|
|
25
25
|
images?: string[] | undefined;
|
|
26
26
|
}>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buyer-facing projections of `siteSettings.commissions` / `siteSettings.emi`.
|
|
3
|
+
*
|
|
4
|
+
* The commissions block holds 25 fields, most of which describe internal
|
|
5
|
+
* economics — `gatewayFeePercent`, `sellerShippingFixed`,
|
|
6
|
+
* `platformShippingPercent`, `payoutHoldDays`, `minPayoutAmount`,
|
|
7
|
+
* `autoPayoutWindowDays`, and the listing/featured/promoted slot fees. Ten of
|
|
8
|
+
* them price something the buyer actually chooses, and only those ten belong
|
|
9
|
+
* in a browser.
|
|
10
|
+
*
|
|
11
|
+
* Why a projection rather than a type: the cart and checkout client props were
|
|
12
|
+
* ALREADY typed narrowly (`StoreAddonsRates`, `CodHandlingFeeRates & …`), but
|
|
13
|
+
* the SSR pages passed `settings.commissions` whole. TypeScript's structural
|
|
14
|
+
* typing accepts a wider object without complaint, so every one of the 25
|
|
15
|
+
* fields was serialised into the page's HTML regardless of what the prop type
|
|
16
|
+
* said. A type alone cannot strip fields at runtime — this function can.
|
|
17
|
+
*
|
|
18
|
+
* Use this for BOTH the cart/checkout SSR props and any future public API that
|
|
19
|
+
* needs fee data, so there is exactly one definition of "buyer-facing fee".
|
|
20
|
+
*/
|
|
21
|
+
import type { SiteSettingsDocument } from "../../../../features/admin/schemas/firestore";
|
|
22
|
+
import type { EmiSettings } from "../emi/schedule";
|
|
23
|
+
/**
|
|
24
|
+
* = `StoreAddonsRates` ∪ `CodHandlingFeeRates` ∪ `{ codDepositPercent }` —
|
|
25
|
+
* the union of what `StoreAddonsPicker` and the checkout COD block read.
|
|
26
|
+
* Every field is optional because older `siteSettings` documents predate them
|
|
27
|
+
* and each `compute*Fee` helper carries its own default.
|
|
28
|
+
*/
|
|
29
|
+
export interface BuyerFacingFees {
|
|
30
|
+
whatsappNotifyFeeEnabled?: boolean;
|
|
31
|
+
whatsappNotifyFee?: number;
|
|
32
|
+
giftWrapFeeEnabled?: boolean;
|
|
33
|
+
giftWrapFee?: number;
|
|
34
|
+
shipmentProtectionFeeEnabled?: boolean;
|
|
35
|
+
shipmentProtectionFeePercent?: number;
|
|
36
|
+
shipmentProtectionFeeMin?: number;
|
|
37
|
+
codHandlingFeeMin?: number;
|
|
38
|
+
codHandlingFeePercent?: number;
|
|
39
|
+
codDepositPercent?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Withheld on purpose (15 of 25): platformFeePercent, gstPercent,
|
|
43
|
+
* minimumTransactionFee, platformFeeMax, gatewayFeePercent,
|
|
44
|
+
* sellerShippingFixed, platformShippingPercent, platformShippingFixedMin,
|
|
45
|
+
* autoPayoutWindowDays, payoutHoldDays, minPayoutAmount, auctionListingFee,
|
|
46
|
+
* preOrderListingFee, featuredSlotFee, promotedSlotFee.
|
|
47
|
+
*
|
|
48
|
+
* The buyer still SEES the platform fee and GST — as computed amounts in the
|
|
49
|
+
* server pricing preview (`CartPriceBreakdownData`), never as the rates that
|
|
50
|
+
* produced them.
|
|
51
|
+
*/
|
|
52
|
+
export declare function toBuyerFacingFees(commissions: SiteSettingsDocument["commissions"] | null | undefined): BuyerFacingFees | null;
|
|
53
|
+
/**
|
|
54
|
+
* EMI settings minus `surchargeSellerSharePercent` — how the surcharge is
|
|
55
|
+
* split between platform and seller is a commercial term, not something the
|
|
56
|
+
* buyer's browser needs. Pair with `computeBuyerEmiQuote`, which is typed to
|
|
57
|
+
* accept exactly this shape.
|
|
58
|
+
*/
|
|
59
|
+
export type BuyerEmiSettings = Omit<EmiSettings, "surchargeSellerSharePercent">;
|
|
60
|
+
export declare function toBuyerEmiSettings(emi: SiteSettingsDocument["emi"] | null | undefined): BuyerEmiSettings | null;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Withheld on purpose (15 of 25): platformFeePercent, gstPercent,
|
|
3
|
+
* minimumTransactionFee, platformFeeMax, gatewayFeePercent,
|
|
4
|
+
* sellerShippingFixed, platformShippingPercent, platformShippingFixedMin,
|
|
5
|
+
* autoPayoutWindowDays, payoutHoldDays, minPayoutAmount, auctionListingFee,
|
|
6
|
+
* preOrderListingFee, featuredSlotFee, promotedSlotFee.
|
|
7
|
+
*
|
|
8
|
+
* The buyer still SEES the platform fee and GST — as computed amounts in the
|
|
9
|
+
* server pricing preview (`CartPriceBreakdownData`), never as the rates that
|
|
10
|
+
* produced them.
|
|
11
|
+
*/
|
|
12
|
+
export function toBuyerFacingFees(commissions) {
|
|
13
|
+
if (!commissions)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
whatsappNotifyFeeEnabled: commissions.whatsappNotifyFeeEnabled,
|
|
17
|
+
whatsappNotifyFee: commissions.whatsappNotifyFee,
|
|
18
|
+
giftWrapFeeEnabled: commissions.giftWrapFeeEnabled,
|
|
19
|
+
giftWrapFee: commissions.giftWrapFee,
|
|
20
|
+
shipmentProtectionFeeEnabled: commissions.shipmentProtectionFeeEnabled,
|
|
21
|
+
shipmentProtectionFeePercent: commissions.shipmentProtectionFeePercent,
|
|
22
|
+
shipmentProtectionFeeMin: commissions.shipmentProtectionFeeMin,
|
|
23
|
+
codHandlingFeeMin: commissions.codHandlingFeeMin,
|
|
24
|
+
codHandlingFeePercent: commissions.codHandlingFeePercent,
|
|
25
|
+
codDepositPercent: commissions.codDepositPercent,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function toBuyerEmiSettings(emi) {
|
|
29
|
+
if (!emi)
|
|
30
|
+
return null;
|
|
31
|
+
return {
|
|
32
|
+
enabled: emi.enabled,
|
|
33
|
+
minOrderValue: emi.minOrderValue,
|
|
34
|
+
tenureOptions: emi.tenureOptions,
|
|
35
|
+
tokenPercent: emi.tokenPercent,
|
|
36
|
+
billingDay: emi.billingDay,
|
|
37
|
+
surchargePercentPerMonth: emi.surchargePercentPerMonth,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The public shape of site settings — the ONLY fields
|
|
3
|
+
* `GET /api/site-settings` may return to an unauthenticated caller.
|
|
4
|
+
*
|
|
5
|
+
* This type lives under `_internal/shared/` rather than beside the server
|
|
6
|
+
* adapter because client code consumes it (`useSiteSettings<PublicSiteSettings>()`),
|
|
7
|
+
* and client files must not import from `_internal/server`.
|
|
8
|
+
*
|
|
9
|
+
* Additive by explicit triage only: see `PUBLIC_SITE_SETTINGS_FIELDS` /
|
|
10
|
+
* `PRIVATE_SITE_SETTINGS_FIELDS` in
|
|
11
|
+
* `../../../server/features/site-settings/adapters.ts`, enforced by
|
|
12
|
+
* `scripts/audit-public-projection-parity.mjs`. Adding a field here without a
|
|
13
|
+
* proven client reader is how the endpoint drifted in the first place.
|
|
14
|
+
*/
|
|
15
|
+
import type { NotificationChannelConfig, SiteSettingsDocument } from "../../../../features/admin/schemas/firestore";
|
|
16
|
+
import type { MediaVideoWatermark } from "../../../../features/media/MediaVideo";
|
|
17
|
+
export interface PublicSiteSettings {
|
|
18
|
+
/** Support channels shown to buyers. Deliberately NOT the full `contact` — `address` and `upiVpa` stay server-side. */
|
|
19
|
+
contact: {
|
|
20
|
+
email: string;
|
|
21
|
+
phone: string;
|
|
22
|
+
whatsappNumber: string;
|
|
23
|
+
};
|
|
24
|
+
/** Deliberately NOT the full `payment` block — only the checkout OTP threshold has a client reader. */
|
|
25
|
+
payment: {
|
|
26
|
+
otpCheckoutThreshold?: number;
|
|
27
|
+
};
|
|
28
|
+
/** Deliberately NOT the full `featureFlags` — `adminCheckoutBypass` must never be advertised publicly. */
|
|
29
|
+
featureFlags: {
|
|
30
|
+
listingTypes?: SiteSettingsDocument["featureFlags"]["listingTypes"];
|
|
31
|
+
};
|
|
32
|
+
notificationChannels?: NotificationChannelConfig;
|
|
33
|
+
announcementBar?: SiteSettingsDocument["announcementBar"];
|
|
34
|
+
navConfig?: SiteSettingsDocument["navConfig"];
|
|
35
|
+
actionConfig?: SiteSettingsDocument["actionConfig"];
|
|
36
|
+
background?: SiteSettingsDocument["background"];
|
|
37
|
+
watermark?: SiteSettingsDocument["watermark"];
|
|
38
|
+
/** Derived, not a stored field — the resolved marker → wordmark → text chain. */
|
|
39
|
+
effectiveWatermark?: MediaVideoWatermark;
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracked-field diffing and capped append for entity status history.
|
|
3
|
+
*
|
|
4
|
+
* These are deliberately plain functions rather than a `BaseRepository`
|
|
5
|
+
* override: the repository method that owns a transition already knows the
|
|
6
|
+
* actor and the trigger, and a generic hook would have to guess both. The
|
|
7
|
+
* repository calls `buildHistoryEntry` + `appendHistoryEntry` inside its own
|
|
8
|
+
* write primitive — which is the point, since that is what keeps the 32
|
|
9
|
+
* call sites above it unchanged.
|
|
10
|
+
*/
|
|
11
|
+
import type { FirestoreDocument } from "../../../schemas/types";
|
|
12
|
+
import { type AppendHistoryResult, type FieldChange, type HistoryActor, type StatusChangeEntry } from "./types";
|
|
13
|
+
/**
|
|
14
|
+
* Diff only the fields an entity declares as tracked.
|
|
15
|
+
*
|
|
16
|
+
* The tracked list is explicit per entity, never "every field": a whole-
|
|
17
|
+
* document diff would record the `updatedAt` bump on every single write and
|
|
18
|
+
* exhaust the 50-entry cap within days, burying the transitions anyone
|
|
19
|
+
* actually wants to read.
|
|
20
|
+
*
|
|
21
|
+
* A field absent from `patch` is untouched — this diffs the patch against
|
|
22
|
+
* the current document, not two full documents.
|
|
23
|
+
*/
|
|
24
|
+
export declare function diffTrackedFields(current: FirestoreDocument | undefined, patch: FirestoreDocument, tracked: readonly string[]): Record<string, FieldChange>;
|
|
25
|
+
export interface BuildHistoryEntryInput {
|
|
26
|
+
actor: HistoryActor;
|
|
27
|
+
trigger: string;
|
|
28
|
+
changes: Record<string, FieldChange>;
|
|
29
|
+
reason?: string;
|
|
30
|
+
note?: string;
|
|
31
|
+
/** Injectable for deterministic tests and seed fixtures. */
|
|
32
|
+
now?: Date;
|
|
33
|
+
}
|
|
34
|
+
export declare function buildHistoryEntry(input: BuildHistoryEntryInput): StatusChangeEntry;
|
|
35
|
+
/**
|
|
36
|
+
* Append with a FIFO cap. Returns the new array plus the running count of
|
|
37
|
+
* entries dropped over the document's lifetime, so the caller can persist it
|
|
38
|
+
* and the UI can be honest about what it is not showing.
|
|
39
|
+
*/
|
|
40
|
+
export declare function appendHistoryEntry(existing: readonly StatusChangeEntry[] | undefined, entry: StatusChangeEntry, previousTruncatedCount?: number, cap?: number): AppendHistoryResult;
|
|
41
|
+
/**
|
|
42
|
+
* The whole flow in one call: diff, and return the patch additions needed to
|
|
43
|
+
* record it. Returns `null` when no tracked field changed — the caller then
|
|
44
|
+
* writes its patch unchanged, so an untracked update never grows the array.
|
|
45
|
+
*/
|
|
46
|
+
export declare function withHistory<TPatch extends FirestoreDocument>(current: FirestoreDocument | undefined, patch: TPatch, opts: {
|
|
47
|
+
tracked: readonly string[];
|
|
48
|
+
actor: HistoryActor;
|
|
49
|
+
trigger: string;
|
|
50
|
+
reason?: string;
|
|
51
|
+
note?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Changes the field diff cannot express, merged over the diffed ones.
|
|
54
|
+
*
|
|
55
|
+
* Needed for append-to-array events: a refund posted to `refunds[]`
|
|
56
|
+
* shows up in a raw diff as "an array of 1 became an array of 2", which
|
|
57
|
+
* is true and useless. The caller instead contributes
|
|
58
|
+
* `{ refund: { from: null, to: { amount, type, reason } } }` — the thing
|
|
59
|
+
* a reader actually wants on the timeline.
|
|
60
|
+
*/
|
|
61
|
+
extraChanges?: Record<string, FieldChange>;
|
|
62
|
+
historyField?: string;
|
|
63
|
+
truncatedField?: string;
|
|
64
|
+
now?: Date;
|
|
65
|
+
cap?: number;
|
|
66
|
+
}): (TPatch & FirestoreDocument) | null;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracked-field diffing and capped append for entity status history.
|
|
3
|
+
*
|
|
4
|
+
* These are deliberately plain functions rather than a `BaseRepository`
|
|
5
|
+
* override: the repository method that owns a transition already knows the
|
|
6
|
+
* actor and the trigger, and a generic hook would have to guess both. The
|
|
7
|
+
* repository calls `buildHistoryEntry` + `appendHistoryEntry` inside its own
|
|
8
|
+
* write primitive — which is the point, since that is what keeps the 32
|
|
9
|
+
* call sites above it unchanged.
|
|
10
|
+
*/
|
|
11
|
+
import { normalizeError } from "../../../errors/normalize";
|
|
12
|
+
import { STATUS_HISTORY_MAX, } from "./types";
|
|
13
|
+
/**
|
|
14
|
+
* Structural equality for field values.
|
|
15
|
+
*
|
|
16
|
+
* Tracked fields are not all scalars, so identity comparison would flag an
|
|
17
|
+
* unchanged object as changed on every write. Dates compare by instant,
|
|
18
|
+
* because Firestore hands back a fresh object on every read — without this,
|
|
19
|
+
* re-saving a document with no edits would append a history entry.
|
|
20
|
+
*/
|
|
21
|
+
function isSameValue(a, b) {
|
|
22
|
+
if (a === b)
|
|
23
|
+
return true;
|
|
24
|
+
if (a == null || b == null)
|
|
25
|
+
return a == null && b == null;
|
|
26
|
+
const aDate = toDateOrNull(a);
|
|
27
|
+
const bDate = toDateOrNull(b);
|
|
28
|
+
if (aDate && bDate)
|
|
29
|
+
return aDate.getTime() === bDate.getTime();
|
|
30
|
+
if (aDate || bDate)
|
|
31
|
+
return false;
|
|
32
|
+
if (typeof a !== "object" || typeof b !== "object")
|
|
33
|
+
return false;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
void normalizeError(err);
|
|
39
|
+
// Circular or non-serialisable — treat as changed rather than throwing
|
|
40
|
+
// inside a write path.
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Firestore Timestamps expose `toDate()`; plain Dates are used directly. */
|
|
45
|
+
function toDateOrNull(v) {
|
|
46
|
+
if (v instanceof Date)
|
|
47
|
+
return v;
|
|
48
|
+
if (typeof v === "object" && v !== null && typeof v.toDate === "function") {
|
|
49
|
+
try {
|
|
50
|
+
return v.toDate();
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
void normalizeError(err);
|
|
54
|
+
// A Timestamp-like object whose toDate() threw is not a usable date;
|
|
55
|
+
// the caller treats null as "not a date" and falls through to structural
|
|
56
|
+
// comparison, so there is nothing to report.
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/** Read a possibly-dotted path (`emiInstallments.0.status`) off an object. */
|
|
63
|
+
function readPath(source, path) {
|
|
64
|
+
if (!source)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (!path.includes("."))
|
|
67
|
+
return source[path];
|
|
68
|
+
let cursor = source;
|
|
69
|
+
for (const segment of path.split(".")) {
|
|
70
|
+
if (cursor == null || typeof cursor !== "object")
|
|
71
|
+
return undefined;
|
|
72
|
+
cursor = cursor[segment];
|
|
73
|
+
}
|
|
74
|
+
return cursor;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Diff only the fields an entity declares as tracked.
|
|
78
|
+
*
|
|
79
|
+
* The tracked list is explicit per entity, never "every field": a whole-
|
|
80
|
+
* document diff would record the `updatedAt` bump on every single write and
|
|
81
|
+
* exhaust the 50-entry cap within days, burying the transitions anyone
|
|
82
|
+
* actually wants to read.
|
|
83
|
+
*
|
|
84
|
+
* A field absent from `patch` is untouched — this diffs the patch against
|
|
85
|
+
* the current document, not two full documents.
|
|
86
|
+
*/
|
|
87
|
+
export function diffTrackedFields(current, patch, tracked) {
|
|
88
|
+
const changes = {};
|
|
89
|
+
for (const field of tracked) {
|
|
90
|
+
if (!(field in patch) && !field.includes("."))
|
|
91
|
+
continue;
|
|
92
|
+
const to = readPath(patch, field);
|
|
93
|
+
if (to === undefined)
|
|
94
|
+
continue;
|
|
95
|
+
const from = readPath(current, field);
|
|
96
|
+
if (isSameValue(from, to))
|
|
97
|
+
continue;
|
|
98
|
+
changes[field] = { from: from ?? null, to };
|
|
99
|
+
}
|
|
100
|
+
return changes;
|
|
101
|
+
}
|
|
102
|
+
export function buildHistoryEntry(input) {
|
|
103
|
+
const entry = {
|
|
104
|
+
at: input.now ?? new Date(),
|
|
105
|
+
actorRole: input.actor.role,
|
|
106
|
+
changes: input.changes,
|
|
107
|
+
trigger: input.trigger,
|
|
108
|
+
};
|
|
109
|
+
if (input.actor.uid)
|
|
110
|
+
entry.actorUid = input.actor.uid;
|
|
111
|
+
if (input.reason)
|
|
112
|
+
entry.reason = input.reason;
|
|
113
|
+
if (input.note)
|
|
114
|
+
entry.note = input.note;
|
|
115
|
+
return entry;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Append with a FIFO cap. Returns the new array plus the running count of
|
|
119
|
+
* entries dropped over the document's lifetime, so the caller can persist it
|
|
120
|
+
* and the UI can be honest about what it is not showing.
|
|
121
|
+
*/
|
|
122
|
+
export function appendHistoryEntry(existing, entry, previousTruncatedCount = 0, cap = STATUS_HISTORY_MAX) {
|
|
123
|
+
const next = [...(existing ?? []), entry];
|
|
124
|
+
if (next.length <= cap) {
|
|
125
|
+
return { history: next, truncatedCount: previousTruncatedCount };
|
|
126
|
+
}
|
|
127
|
+
const overflow = next.length - cap;
|
|
128
|
+
return {
|
|
129
|
+
history: next.slice(overflow),
|
|
130
|
+
truncatedCount: previousTruncatedCount + overflow,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The whole flow in one call: diff, and return the patch additions needed to
|
|
135
|
+
* record it. Returns `null` when no tracked field changed — the caller then
|
|
136
|
+
* writes its patch unchanged, so an untracked update never grows the array.
|
|
137
|
+
*/
|
|
138
|
+
export function withHistory(current, patch, opts) {
|
|
139
|
+
const changes = { ...diffTrackedFields(current, patch, opts.tracked), ...opts.extraChanges };
|
|
140
|
+
if (Object.keys(changes).length === 0)
|
|
141
|
+
return null;
|
|
142
|
+
const historyField = opts.historyField ?? "statusHistory";
|
|
143
|
+
const truncatedField = opts.truncatedField ?? "statusHistoryTruncated";
|
|
144
|
+
const entry = buildHistoryEntry({
|
|
145
|
+
actor: opts.actor,
|
|
146
|
+
trigger: opts.trigger,
|
|
147
|
+
changes,
|
|
148
|
+
reason: opts.reason,
|
|
149
|
+
note: opts.note,
|
|
150
|
+
now: opts.now,
|
|
151
|
+
});
|
|
152
|
+
const { history, truncatedCount } = appendHistoryEntry(readPath(current, historyField) ?? [], entry, readPath(current, truncatedField) ?? 0, opts.cap);
|
|
153
|
+
return {
|
|
154
|
+
...patch,
|
|
155
|
+
[historyField]: history,
|
|
156
|
+
...(truncatedCount > 0 ? { [truncatedField]: truncatedCount } : {}),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { HistoryActorRole, HistoryActor, FieldChange, StatusChangeEntry, AppendHistoryResult, } from "./types";
|
|
2
|
+
export { STATUS_HISTORY_MAX } from "./types";
|
|
3
|
+
export type { BuildHistoryEntryInput } from "./history";
|
|
4
|
+
export { diffTrackedFields, buildHistoryEntry, appendHistoryEntry, withHistory, } from "./history";
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { FirestoreValue } from "../../../schemas/types";
|
|
2
|
+
/**
|
|
3
|
+
* Generic entity status history — the shape shared by every entity that
|
|
4
|
+
* records how it got to its current state.
|
|
5
|
+
*
|
|
6
|
+
* Built for orders first (W2) and adopted by stores, payouts, offers, bids,
|
|
7
|
+
* support tickets, scammer profiles, catalogue approvals, shipments and
|
|
8
|
+
* returns in W15. Before this existed, exactly ONE of ~40 status-bearing
|
|
9
|
+
* entities had any history at all — `ads`, built inline in a route handler
|
|
10
|
+
* with no type and no reuse.
|
|
11
|
+
*/
|
|
12
|
+
export type HistoryActorRole = "buyer" | "seller" | "admin" | "system";
|
|
13
|
+
export interface HistoryActor {
|
|
14
|
+
/** Firebase Auth uid. Absent for `system` (cron jobs, Firestore triggers). */
|
|
15
|
+
uid?: string;
|
|
16
|
+
role: HistoryActorRole;
|
|
17
|
+
}
|
|
18
|
+
/** A single field's before/after. `from` is `null` on the creation entry. */
|
|
19
|
+
export interface FieldChange {
|
|
20
|
+
from: FirestoreValue;
|
|
21
|
+
to: FirestoreValue;
|
|
22
|
+
}
|
|
23
|
+
export interface StatusChangeEntry {
|
|
24
|
+
at: Date;
|
|
25
|
+
actorUid?: string;
|
|
26
|
+
actorRole: HistoryActorRole;
|
|
27
|
+
/**
|
|
28
|
+
* DELTA ONLY — the tracked fields that actually changed, never a copy of
|
|
29
|
+
* the whole document. A full snapshot per transition would duplicate the
|
|
30
|
+
* record on every status change; the whole point of this shape is that it
|
|
31
|
+
* does not.
|
|
32
|
+
*/
|
|
33
|
+
changes: Record<string, FieldChange>;
|
|
34
|
+
/** Why, when a human supplied a reason (cancellation, rejection). */
|
|
35
|
+
reason?: string;
|
|
36
|
+
/** Free-text note from an admin/seller action. */
|
|
37
|
+
note?: string;
|
|
38
|
+
/**
|
|
39
|
+
* The function, route or job that caused the change — `"customShipOrder"`,
|
|
40
|
+
* `"paymentWindowTimeout"`, `"adminVerifyPayment"`. This is what the
|
|
41
|
+
* timeline renders by, which is why per-path events (proof uploaded,
|
|
42
|
+
* installment paid, winner revealed) need NO new status values.
|
|
43
|
+
*/
|
|
44
|
+
trigger: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Cap for any history array. Matches `HISTORY_MAX`'s reasoning: an unbounded
|
|
48
|
+
* array on a hot document inflates every read of that document (Rule #6), and
|
|
49
|
+
* an order that changes status more than this has a different problem.
|
|
50
|
+
*/
|
|
51
|
+
export declare const STATUS_HISTORY_MAX = 50;
|
|
52
|
+
export interface AppendHistoryResult {
|
|
53
|
+
history: StatusChangeEntry[];
|
|
54
|
+
/**
|
|
55
|
+
* How many entries have been dropped off the front across the document's
|
|
56
|
+
* lifetime. Surfaced so the UI can say "earlier history trimmed" instead
|
|
57
|
+
* of implying none existed — silent truncation reads as "this is all of
|
|
58
|
+
* it", which is the same lie as a silently dropped field.
|
|
59
|
+
*/
|
|
60
|
+
truncatedCount: number;
|
|
61
|
+
}
|