@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
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { type GenerateOfferIdInput } from "../../../utils/id-generators";
|
|
5
5
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
6
|
+
import type { StatusChangeEntry } from "../../../_internal/shared/history/index";
|
|
6
7
|
export type OfferStatus = "pending" | "accepted" | "declined" | "countered" | "expired" | "withdrawn" | "paid";
|
|
7
8
|
/** Runtime-accessible offer status values — use instead of bare string literals. */
|
|
8
9
|
export declare const OfferStatusValues: {
|
|
@@ -39,7 +40,52 @@ export interface OfferDocument extends BaseDocument {
|
|
|
39
40
|
/** Set by `markPaid` once the buyer's order exists — makes "paid" auditable. */
|
|
40
41
|
paidOrderId?: string;
|
|
41
42
|
paidAt?: Date;
|
|
43
|
+
/**
|
|
44
|
+
* Append-only delta log — the canonical record of when things happened to
|
|
45
|
+
* this offer. Shares `StatusChangeEntry` with `OrderDocument`; an offer is
|
|
46
|
+
* an order with more phases in front of it.
|
|
47
|
+
*
|
|
48
|
+
* `respondedAt` is deliberately kept but NOT extended: it means four
|
|
49
|
+
* different events (seller-accept, seller-decline, seller-counter,
|
|
50
|
+
* buyer-withdraw) and survives only as the legacy fallback for offers
|
|
51
|
+
* written before this field existed.
|
|
52
|
+
*/
|
|
53
|
+
statusHistory?: StatusChangeEntry[];
|
|
54
|
+
/** Entries dropped off the front — so the UI never implies "this is all of it". */
|
|
55
|
+
statusHistoryTruncated?: number;
|
|
56
|
+
/**
|
|
57
|
+
* The multi-round chain. A counter-offer is a NEW document, so without
|
|
58
|
+
* these three a three-round negotiation is three unrelated records —
|
|
59
|
+
* which is what it is today: `previousOfferId` currently exists only
|
|
60
|
+
* inside a `serverLogger.info` call and never reaches Firestore.
|
|
61
|
+
*/
|
|
62
|
+
previousOfferId?: string;
|
|
63
|
+
supersededByOfferId?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Denormalised root of the chain (the root stores its own id) so a list row
|
|
66
|
+
* renders "Round 2" with ZERO extra reads, and `findChain` is a single-field
|
|
67
|
+
* equality served by the automatic index — no composite index needed.
|
|
68
|
+
*/
|
|
69
|
+
chainRootOfferId?: string;
|
|
70
|
+
/** 1-based. Absent means round 1. */
|
|
71
|
+
counterRound?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Admin escalation. The store keeps sole authority to accept/counter/
|
|
74
|
+
* decline; an admin may only cancel, with a reason, and it is recorded
|
|
75
|
+
* here as well as in `adminAuditLog`.
|
|
76
|
+
*/
|
|
77
|
+
cancelledByAdminUid?: string;
|
|
78
|
+
cancelReason?: string;
|
|
42
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Fields whose changes are recorded in an offer's `statusHistory`.
|
|
82
|
+
*
|
|
83
|
+
* Excludes `buyerName`/`buyerEmail` (PII — `encryptPiiFields` never descends
|
|
84
|
+
* into arrays, so they would persist in plaintext inside the history),
|
|
85
|
+
* `buyerNote`/`sellerNote` (they ride in the entry's `note`), and
|
|
86
|
+
* `updatedAt`/`respondedAt` (noise that would burn the FIFO cap).
|
|
87
|
+
*/
|
|
88
|
+
export declare const OFFER_TRACKED_FIELDS: readonly ["status", "offerAmount", "counterAmount", "lockedPrice", "checkoutDeadline", "paidOrderId", "supersededByOfferId", "previousOfferId"];
|
|
43
89
|
export declare const OFFER_COLLECTION: "offers";
|
|
44
90
|
export declare const OFFER_INDEXED_FIELDS: readonly ["buyerUid", "storeId", "productId", "status", "createdAt", "expiresAt", "checkoutDeadline"];
|
|
45
91
|
export declare const OFFER_FIELDS: {
|
|
@@ -67,9 +113,17 @@ export declare const OFFER_FIELDS: {
|
|
|
67
113
|
readonly PAID_AT: "paidAt";
|
|
68
114
|
readonly CREATED_AT: "createdAt";
|
|
69
115
|
readonly UPDATED_AT: "updatedAt";
|
|
116
|
+
readonly STATUS_HISTORY: "statusHistory";
|
|
117
|
+
readonly STATUS_HISTORY_TRUNCATED: "statusHistoryTruncated";
|
|
118
|
+
readonly PREVIOUS_OFFER_ID: "previousOfferId";
|
|
119
|
+
readonly SUPERSEDED_BY_OFFER_ID: "supersededByOfferId";
|
|
120
|
+
readonly CHAIN_ROOT_OFFER_ID: "chainRootOfferId";
|
|
121
|
+
readonly COUNTER_ROUND: "counterRound";
|
|
122
|
+
readonly CANCELLED_BY_ADMIN_UID: "cancelledByAdminUid";
|
|
123
|
+
readonly CANCEL_REASON: "cancelReason";
|
|
70
124
|
};
|
|
71
|
-
export type OfferCreateInput = Pick<OfferDocument, "productId" | "productTitle" | "productSlug" | "productImageUrl" | "buyerUid" | "buyerName" | "buyerEmail" | "storeId" | "storeName" | "offerAmount" | "listedPrice" | "currency" | "buyerNote">;
|
|
72
|
-
export type OfferUpdateInput = Partial<Pick<OfferDocument, "status" | "counterAmount" | "lockedPrice" | "sellerNote" | "acceptedAt" | "checkoutDeadline" | "respondedAt" | "paidOrderId" | "paidAt" | "updatedAt">>;
|
|
125
|
+
export type OfferCreateInput = Pick<OfferDocument, "productId" | "productTitle" | "productSlug" | "productImageUrl" | "buyerUid" | "buyerName" | "buyerEmail" | "storeId" | "storeName" | "offerAmount" | "listedPrice" | "currency" | "buyerNote" | "previousOfferId" | "chainRootOfferId" | "counterRound">;
|
|
126
|
+
export type OfferUpdateInput = Partial<Pick<OfferDocument, "status" | "counterAmount" | "lockedPrice" | "sellerNote" | "acceptedAt" | "checkoutDeadline" | "respondedAt" | "paidOrderId" | "paidAt" | "updatedAt" | "statusHistory" | "statusHistoryTruncated" | "supersededByOfferId" | "cancelledByAdminUid" | "cancelReason">>;
|
|
73
127
|
export declare const offerQueryHelpers: {
|
|
74
128
|
readonly byBuyer: (buyerUid: string) => readonly ["buyerUid", "==", string];
|
|
75
129
|
readonly byStore: (storeId: string) => readonly ["storeId", "==", string];
|
|
@@ -12,6 +12,24 @@ export const OfferStatusValues = {
|
|
|
12
12
|
WITHDRAWN: "withdrawn",
|
|
13
13
|
PAID: "paid",
|
|
14
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Fields whose changes are recorded in an offer's `statusHistory`.
|
|
17
|
+
*
|
|
18
|
+
* Excludes `buyerName`/`buyerEmail` (PII — `encryptPiiFields` never descends
|
|
19
|
+
* into arrays, so they would persist in plaintext inside the history),
|
|
20
|
+
* `buyerNote`/`sellerNote` (they ride in the entry's `note`), and
|
|
21
|
+
* `updatedAt`/`respondedAt` (noise that would burn the FIFO cap).
|
|
22
|
+
*/
|
|
23
|
+
export const OFFER_TRACKED_FIELDS = [
|
|
24
|
+
"status",
|
|
25
|
+
"offerAmount",
|
|
26
|
+
"counterAmount",
|
|
27
|
+
"lockedPrice",
|
|
28
|
+
"checkoutDeadline",
|
|
29
|
+
"paidOrderId",
|
|
30
|
+
"supersededByOfferId",
|
|
31
|
+
"previousOfferId",
|
|
32
|
+
];
|
|
15
33
|
export const OFFER_COLLECTION = "offers";
|
|
16
34
|
export const OFFER_INDEXED_FIELDS = [
|
|
17
35
|
"buyerUid",
|
|
@@ -47,6 +65,15 @@ export const OFFER_FIELDS = {
|
|
|
47
65
|
PAID_AT: "paidAt",
|
|
48
66
|
CREATED_AT: "createdAt",
|
|
49
67
|
UPDATED_AT: "updatedAt",
|
|
68
|
+
// Negotiation history + chain (W2)
|
|
69
|
+
STATUS_HISTORY: "statusHistory",
|
|
70
|
+
STATUS_HISTORY_TRUNCATED: "statusHistoryTruncated",
|
|
71
|
+
PREVIOUS_OFFER_ID: "previousOfferId",
|
|
72
|
+
SUPERSEDED_BY_OFFER_ID: "supersededByOfferId",
|
|
73
|
+
CHAIN_ROOT_OFFER_ID: "chainRootOfferId",
|
|
74
|
+
COUNTER_ROUND: "counterRound",
|
|
75
|
+
CANCELLED_BY_ADMIN_UID: "cancelledByAdminUid",
|
|
76
|
+
CANCEL_REASON: "cancelReason",
|
|
50
77
|
};
|
|
51
78
|
export const offerQueryHelpers = {
|
|
52
79
|
byBuyer: (buyerUid) => ["buyerUid", "==", buyerUid],
|
|
@@ -89,8 +89,8 @@ export declare const sellerStoreSchema: z.ZodObject<{
|
|
|
89
89
|
id: string;
|
|
90
90
|
createdAt: string;
|
|
91
91
|
updatedAt: string;
|
|
92
|
-
storeName: string;
|
|
93
92
|
ownerId: string;
|
|
93
|
+
storeName: string;
|
|
94
94
|
storeSlug: string;
|
|
95
95
|
isPublic: boolean;
|
|
96
96
|
location?: string | undefined;
|
|
@@ -121,8 +121,8 @@ export declare const sellerStoreSchema: z.ZodObject<{
|
|
|
121
121
|
id: string;
|
|
122
122
|
createdAt: string;
|
|
123
123
|
updatedAt: string;
|
|
124
|
-
storeName: string;
|
|
125
124
|
ownerId: string;
|
|
125
|
+
storeName: string;
|
|
126
126
|
storeSlug: string;
|
|
127
127
|
isPublic: boolean;
|
|
128
128
|
location?: string | undefined;
|
|
@@ -10,3 +10,49 @@ export declare const counterOfferFormSchema: z.ZodObject<{
|
|
|
10
10
|
sellerNote?: string | undefined;
|
|
11
11
|
}>;
|
|
12
12
|
export type CounterOfferFormValues = z.infer<typeof counterOfferFormSchema>;
|
|
13
|
+
/**
|
|
14
|
+
* Buyer-side Make-an-Offer form.
|
|
15
|
+
*
|
|
16
|
+
* A factory rather than a constant because both bounds depend on the listing:
|
|
17
|
+
* the floor is `minOfferAmount(listedPrice, minOfferPercent)` and the ceiling is
|
|
18
|
+
* the listed price itself. Both are re-checked server-side in `makeOffer` — this
|
|
19
|
+
* exists so the buyer is told before submitting, using the SAME
|
|
20
|
+
* `minOfferAmount()` the server uses, rather than a second rounding rule that
|
|
21
|
+
* could disagree by a rupee.
|
|
22
|
+
*/
|
|
23
|
+
export declare function makeOfferFormSchema(opts: {
|
|
24
|
+
listedPrice: number;
|
|
25
|
+
minOffer: number;
|
|
26
|
+
formatAmount: (n: number) => string;
|
|
27
|
+
}): z.ZodObject<{
|
|
28
|
+
offerAmount: z.ZodNumber;
|
|
29
|
+
buyerNote: z.ZodOptional<z.ZodString>;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
offerAmount: number;
|
|
32
|
+
buyerNote?: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
offerAmount: number;
|
|
35
|
+
buyerNote?: string | undefined;
|
|
36
|
+
}>;
|
|
37
|
+
export type MakeOfferFormValues = z.infer<ReturnType<typeof makeOfferFormSchema>>;
|
|
38
|
+
/**
|
|
39
|
+
* Admin cancel-offer form.
|
|
40
|
+
*
|
|
41
|
+
* A bare confirm dialog was the wrong control here. Admin cancel is an
|
|
42
|
+
* escalation over the store's own authority, and it lands in three permanent
|
|
43
|
+
* places at once — the buyer's notification, the offer's own status history,
|
|
44
|
+
* and `adminAuditLog`. All three are useless without a reason, and the route
|
|
45
|
+
* used to accept an optional one and never read it.
|
|
46
|
+
*
|
|
47
|
+
* The 10-character floor mirrors the server schema exactly. Stating it in both
|
|
48
|
+
* places is deliberate: the client bound exists so the admin is told before
|
|
49
|
+
* submitting, not so the server can trust it.
|
|
50
|
+
*/
|
|
51
|
+
export declare const cancelOfferFormSchema: z.ZodObject<{
|
|
52
|
+
reason: z.ZodString;
|
|
53
|
+
}, "strip", z.ZodTypeAny, {
|
|
54
|
+
reason: string;
|
|
55
|
+
}, {
|
|
56
|
+
reason: string;
|
|
57
|
+
}>;
|
|
58
|
+
export type CancelOfferFormValues = z.infer<typeof cancelOfferFormSchema>;
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* EXPORTS:
|
|
13
13
|
* counterOfferFormSchema, type CounterOfferFormValues
|
|
14
|
+
* makeOfferFormSchema, type MakeOfferFormValues
|
|
15
|
+
* cancelOfferFormSchema, type CancelOfferFormValues
|
|
14
16
|
*
|
|
15
17
|
* @tag domain:seller,offers
|
|
16
18
|
* @tag layer:schema
|
|
@@ -26,3 +28,43 @@ export const counterOfferFormSchema = z.object({
|
|
|
26
28
|
.positive("Counter amount must be greater than zero."),
|
|
27
29
|
sellerNote: z.string().max(500, "Keep your note under 500 characters.").optional(),
|
|
28
30
|
});
|
|
31
|
+
/**
|
|
32
|
+
* Buyer-side Make-an-Offer form.
|
|
33
|
+
*
|
|
34
|
+
* A factory rather than a constant because both bounds depend on the listing:
|
|
35
|
+
* the floor is `minOfferAmount(listedPrice, minOfferPercent)` and the ceiling is
|
|
36
|
+
* the listed price itself. Both are re-checked server-side in `makeOffer` — this
|
|
37
|
+
* exists so the buyer is told before submitting, using the SAME
|
|
38
|
+
* `minOfferAmount()` the server uses, rather than a second rounding rule that
|
|
39
|
+
* could disagree by a rupee.
|
|
40
|
+
*/
|
|
41
|
+
export function makeOfferFormSchema(opts) {
|
|
42
|
+
const { listedPrice, minOffer, formatAmount } = opts;
|
|
43
|
+
return z.object({
|
|
44
|
+
offerAmount: z.coerce
|
|
45
|
+
.number({ invalid_type_error: "Enter an offer amount." })
|
|
46
|
+
.positive("Offer amount must be greater than zero.")
|
|
47
|
+
.min(minOffer, `Minimum offer is ${formatAmount(minOffer)}.`)
|
|
48
|
+
.max(listedPrice - 0.01, `Offer must be below the listed price of ${formatAmount(listedPrice)} — use Add to Cart to buy at that price.`),
|
|
49
|
+
buyerNote: z.string().max(300, "Keep your note under 300 characters.").optional(),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Admin cancel-offer form.
|
|
54
|
+
*
|
|
55
|
+
* A bare confirm dialog was the wrong control here. Admin cancel is an
|
|
56
|
+
* escalation over the store's own authority, and it lands in three permanent
|
|
57
|
+
* places at once — the buyer's notification, the offer's own status history,
|
|
58
|
+
* and `adminAuditLog`. All three are useless without a reason, and the route
|
|
59
|
+
* used to accept an optional one and never read it.
|
|
60
|
+
*
|
|
61
|
+
* The 10-character floor mirrors the server schema exactly. Stating it in both
|
|
62
|
+
* places is deliberate: the client bound exists so the admin is told before
|
|
63
|
+
* submitting, not so the server can trust it.
|
|
64
|
+
*/
|
|
65
|
+
export const cancelOfferFormSchema = z.object({
|
|
66
|
+
reason: z
|
|
67
|
+
.string()
|
|
68
|
+
.min(10, "Give a reason of at least 10 characters — the buyer sees this.")
|
|
69
|
+
.max(300, "Keep the reason under 300 characters."),
|
|
70
|
+
});
|
|
@@ -8,4 +8,3 @@ export { OfferRepository, offerRepository, } from "./repository/offer.repository
|
|
|
8
8
|
export { GET as sellerProductsGET } from "./api/products/route";
|
|
9
9
|
export { GET as sellerStoreGET } from "./api/store/route";
|
|
10
10
|
export { GET as sellerCouponsGET } from "./api/coupons/route";
|
|
11
|
-
export { GET as sellerOffersGET } from "./api/offers/route";
|
|
@@ -8,4 +8,3 @@ export { OfferRepository, offerRepository, } from "./repository/offer.repository
|
|
|
8
8
|
export { GET as sellerProductsGET } from "./api/products/route";
|
|
9
9
|
export { GET as sellerStoreGET } from "./api/store/route";
|
|
10
10
|
export { GET as sellerCouponsGET } from "./api/coupons/route";
|
|
11
|
-
export { GET as sellerOffersGET } from "./api/offers/route";
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { JsonValue } from "@mohasinac/appkit/client";
|
|
3
|
+
import type { ZodTypeAny } from "zod";
|
|
4
|
+
import type { FormShellStep } from "../../ui/forms/FormShell";
|
|
5
|
+
/**
|
|
6
|
+
* A collapsible form segment. Replaces `StepDef` — the differences are the
|
|
7
|
+
* point, not incidental:
|
|
8
|
+
*
|
|
9
|
+
* - there is no `goNext` gate, so a section can never block access to a
|
|
10
|
+
* later one. Everything is reachable at all times;
|
|
11
|
+
* - `required` sections sort first and open on mount;
|
|
12
|
+
* - one shared submit at the bottom, never per-section.
|
|
13
|
+
*/
|
|
14
|
+
export interface SectionDef<T extends object = Record<string, JsonValue>> {
|
|
15
|
+
/** Stable, URL-safe. Becomes the `?section=` value and the DOM anchor id. */
|
|
16
|
+
id: string;
|
|
17
|
+
label: string;
|
|
18
|
+
/** Longer heading for the open panel. Defaults to `label`. */
|
|
19
|
+
heading?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Mandatory section: sorted first, open on mount, and its header renders
|
|
22
|
+
* without a collapse control so it can't be hidden.
|
|
23
|
+
*/
|
|
24
|
+
required?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* This section's fields belong to quick mode. Consumed by
|
|
27
|
+
* `deriveQuickFields` in `entity-form.ts`, not by SectionForm itself.
|
|
28
|
+
*/
|
|
29
|
+
quick?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Keep the panel mounted while collapsed. Set on any section holding
|
|
32
|
+
* uncommitted state — media uploads, rich-text buffers. See
|
|
33
|
+
* `CollapsibleSection.keepMounted`.
|
|
34
|
+
*/
|
|
35
|
+
keepMounted?: boolean;
|
|
36
|
+
render: (props: {
|
|
37
|
+
values: T;
|
|
38
|
+
onChange: (partial: Partial<T>) => void;
|
|
39
|
+
errors: Record<string, string>;
|
|
40
|
+
}) => ReactNode;
|
|
41
|
+
/**
|
|
42
|
+
* Schema field names this section owns — drives error→section attribution
|
|
43
|
+
* so `<FormErrorSummary>` can offer a jump link.
|
|
44
|
+
*/
|
|
45
|
+
fields?: string[];
|
|
46
|
+
/** Per-section schema. Falls back to `schema`, then `FormSchemaContext`. */
|
|
47
|
+
schema?: ZodTypeAny;
|
|
48
|
+
/** Hide the section entirely (conditional per-type sections). */
|
|
49
|
+
when?: (values: T) => boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface SectionFormProps<T extends object = Record<string, JsonValue>> {
|
|
52
|
+
sections: SectionDef<T>[];
|
|
53
|
+
values: T;
|
|
54
|
+
onChange: (partial: Partial<T>) => void;
|
|
55
|
+
onSubmit: () => void | Promise<void>;
|
|
56
|
+
submitLabel?: string;
|
|
57
|
+
isLoading?: boolean;
|
|
58
|
+
/** Whole-form schema for sections that don't declare their own. */
|
|
59
|
+
schema?: ZodTypeAny;
|
|
60
|
+
/** Controlled open set. Omit to let SectionForm own it. */
|
|
61
|
+
openIds?: string[];
|
|
62
|
+
onOpenChange?: (ids: string[]) => void;
|
|
63
|
+
/** `"single"` = accordion. Default `"multi"` — independent sections. */
|
|
64
|
+
expandMode?: "single" | "multi";
|
|
65
|
+
/** Suppress the built-in submit row (a FormShell footer owns it instead). */
|
|
66
|
+
hideActions?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Fires whenever live validation recomputes. SectionForm deliberately does
|
|
69
|
+
* NOT mount its own `FormShellContext.Provider` — the owning view keeps the
|
|
70
|
+
* single provider and composes these in, exactly as StepForm did, so a
|
|
71
|
+
* second provider can never shadow the real one.
|
|
72
|
+
*/
|
|
73
|
+
onValidationChange?: (fieldErrors: Record<string, string>, fieldToSectionIndex: Record<string, number>) => void;
|
|
74
|
+
}
|
|
75
|
+
/** Sections in render order: required first, original order preserved within each group. */
|
|
76
|
+
export declare function orderSections<T extends object>(sections: SectionDef<T>[]): SectionDef<T>[];
|
|
77
|
+
/** `fieldName -> index into the ORDERED section list`. */
|
|
78
|
+
export declare function buildFieldToSectionIndex<T extends object>(ordered: SectionDef<T>[]): Record<string, number>;
|
|
79
|
+
export interface UseSectionFormNavResult<T extends object> {
|
|
80
|
+
/** Sections in render order — required first. */
|
|
81
|
+
ordered: SectionDef<T>[];
|
|
82
|
+
openIds: string[];
|
|
83
|
+
setOpenIds: (ids: string[]) => void;
|
|
84
|
+
/** Expand section `index`, then scroll it into view. */
|
|
85
|
+
goToSection: (index: number) => void;
|
|
86
|
+
fieldToSectionIndex: Record<string, number>;
|
|
87
|
+
/** Descriptors for `useFormShellState`'s `nav.sections`. */
|
|
88
|
+
sectionMeta: FormShellStep[];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Navigation state for a `<SectionForm>`. Feed `sectionMeta`/`goToSection`/
|
|
92
|
+
* `fieldToSectionIndex` into `useFormShellState(schema, nav)` and `openIds`
|
|
93
|
+
* back into `<SectionForm>`.
|
|
94
|
+
*/
|
|
95
|
+
export declare function useSectionFormNav<T extends object = Record<string, JsonValue>>(sections: SectionDef<T>[], values?: T): UseSectionFormNavResult<T>;
|
|
96
|
+
/** DOM id for a section panel — kept in one place so nav and render agree. */
|
|
97
|
+
export declare function sectionAnchorId(id: string): string;
|
|
98
|
+
export declare function SectionForm<T extends object = Record<string, JsonValue>>({ sections, values, onChange, onSubmit, submitLabel, isLoading, schema, openIds: controlledOpenIds, onOpenChange, expandMode, hideActions, onValidationChange, }: SectionFormProps<T>): import("react").JSX.Element;
|
|
99
|
+
export default SectionForm;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { Button } from "../../ui/components/Button";
|
|
5
|
+
import { CollapsibleSection } from "../../ui/components/CollapsibleSection";
|
|
6
|
+
import { Badge } from "../../ui/components/Badge";
|
|
7
|
+
import { Row, Span, Stack } from "../../ui";
|
|
8
|
+
import { FormSchemaContext } from "./FormShell";
|
|
9
|
+
/** Sections in render order: required first, original order preserved within each group. */
|
|
10
|
+
export function orderSections(sections) {
|
|
11
|
+
return [...sections.filter((s) => s.required), ...sections.filter((s) => !s.required)];
|
|
12
|
+
}
|
|
13
|
+
/** `fieldName -> index into the ORDERED section list`. */
|
|
14
|
+
export function buildFieldToSectionIndex(ordered) {
|
|
15
|
+
const map = {};
|
|
16
|
+
ordered.forEach((section, i) => {
|
|
17
|
+
section.fields?.forEach((field) => { map[field] = i; });
|
|
18
|
+
});
|
|
19
|
+
return map;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Navigation state for a `<SectionForm>`. Feed `sectionMeta`/`goToSection`/
|
|
23
|
+
* `fieldToSectionIndex` into `useFormShellState(schema, nav)` and `openIds`
|
|
24
|
+
* back into `<SectionForm>`.
|
|
25
|
+
*/
|
|
26
|
+
export function useSectionFormNav(sections, values) {
|
|
27
|
+
const ordered = useMemo(() => {
|
|
28
|
+
const visible = values
|
|
29
|
+
? sections.filter((s) => (s.when ? s.when(values) : true))
|
|
30
|
+
: sections;
|
|
31
|
+
return orderSections(visible);
|
|
32
|
+
}, [sections, values]);
|
|
33
|
+
const [openIds, setOpenIds] = useState(() => orderSections(sections).filter((s) => s.required).map((s) => s.id));
|
|
34
|
+
const fieldToSectionIndex = useMemo(() => buildFieldToSectionIndex(ordered), [ordered]);
|
|
35
|
+
const sectionMeta = useMemo(() => ordered.map((s) => ({ id: s.id, label: s.label, requiredFields: s.fields })), [ordered]);
|
|
36
|
+
const goToSection = useCallback((index) => {
|
|
37
|
+
const target = ordered[index];
|
|
38
|
+
if (!target)
|
|
39
|
+
return;
|
|
40
|
+
setOpenIds((prev) => (prev.includes(target.id) ? prev : [...prev, target.id]));
|
|
41
|
+
// The panel must MOUNT before it can be scrolled to — expanding is a state
|
|
42
|
+
// update, so defer a frame. Without this the scroll lands on a zero-height
|
|
43
|
+
// collapsed header and the offending field stays off-screen.
|
|
44
|
+
requestAnimationFrame(() => {
|
|
45
|
+
const el = document.getElementById(sectionAnchorId(target.id));
|
|
46
|
+
el?.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
47
|
+
el?.querySelector("[aria-invalid='true']")?.focus();
|
|
48
|
+
});
|
|
49
|
+
}, [ordered]);
|
|
50
|
+
return { ordered, openIds, setOpenIds, goToSection, fieldToSectionIndex, sectionMeta };
|
|
51
|
+
}
|
|
52
|
+
/** DOM id for a section panel — kept in one place so nav and render agree. */
|
|
53
|
+
export function sectionAnchorId(id) {
|
|
54
|
+
return `section-${id}`;
|
|
55
|
+
}
|
|
56
|
+
export function SectionForm({ sections, values, onChange, onSubmit, submitLabel = "Save", isLoading = false, schema, openIds: controlledOpenIds, onOpenChange, expandMode = "multi", hideActions = false, onValidationChange, }) {
|
|
57
|
+
const inheritedSchema = useContext(FormSchemaContext);
|
|
58
|
+
const [fieldErrors, setFieldErrors] = useState({});
|
|
59
|
+
const [uncontrolledOpenIds, setUncontrolledOpenIds] = useState(() => orderSections(sections).filter((s) => s.required).map((s) => s.id));
|
|
60
|
+
const ordered = useMemo(() => orderSections(sections.filter((s) => (s.when ? s.when(values) : true))), [sections, values]);
|
|
61
|
+
const openIds = controlledOpenIds ?? uncontrolledOpenIds;
|
|
62
|
+
const setOpenIds = useCallback((ids) => {
|
|
63
|
+
if (!controlledOpenIds)
|
|
64
|
+
setUncontrolledOpenIds(ids);
|
|
65
|
+
onOpenChange?.(ids);
|
|
66
|
+
}, [controlledOpenIds, onOpenChange]);
|
|
67
|
+
const fieldToSectionIndex = useMemo(() => buildFieldToSectionIndex(ordered), [ordered]);
|
|
68
|
+
// Keep the latest callback without making runValidation depend on it — the
|
|
69
|
+
// caller usually passes an inline arrow, which would otherwise rebuild the
|
|
70
|
+
// validator on every render and re-fire the effect below in a loop.
|
|
71
|
+
const onValidationChangeRef = useRef(onValidationChange);
|
|
72
|
+
onValidationChangeRef.current = onValidationChange;
|
|
73
|
+
const runValidation = useCallback((nextValues) => {
|
|
74
|
+
const activeSchema = schema ?? inheritedSchema;
|
|
75
|
+
if (!activeSchema)
|
|
76
|
+
return;
|
|
77
|
+
// audit-unvalidated-safeparse-ok: bulk-replaces fieldErrors from the full
|
|
78
|
+
// parse result so a field that just became valid is cleared — which
|
|
79
|
+
// applyZodIssues' incremental setFieldError-per-issue cannot do.
|
|
80
|
+
const parsed = activeSchema.safeParse(nextValues);
|
|
81
|
+
if (parsed.success) {
|
|
82
|
+
setFieldErrors({});
|
|
83
|
+
onValidationChangeRef.current?.({}, fieldToSectionIndex);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const next = {};
|
|
87
|
+
for (const issue of parsed.error.issues) {
|
|
88
|
+
if (!issue.path || issue.path.length === 0)
|
|
89
|
+
continue;
|
|
90
|
+
next[issue.path.map(String).join(".")] = issue.message;
|
|
91
|
+
}
|
|
92
|
+
setFieldErrors(next);
|
|
93
|
+
onValidationChangeRef.current?.(next, fieldToSectionIndex);
|
|
94
|
+
}, [schema, inheritedSchema, fieldToSectionIndex]);
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
runValidation(values);
|
|
97
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
98
|
+
}, [schema, inheritedSchema, fieldToSectionIndex]);
|
|
99
|
+
const handleFieldChange = useCallback((partial) => {
|
|
100
|
+
onChange(partial);
|
|
101
|
+
runValidation({ ...values, ...partial });
|
|
102
|
+
}, [values, onChange, runValidation]);
|
|
103
|
+
const toggle = useCallback((id) => {
|
|
104
|
+
const isOpen = openIds.includes(id);
|
|
105
|
+
if (expandMode === "single") {
|
|
106
|
+
setOpenIds(isOpen ? [] : [id]);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
setOpenIds(isOpen ? openIds.filter((x) => x !== id) : [...openIds, id]);
|
|
110
|
+
}, [openIds, expandMode, setOpenIds]);
|
|
111
|
+
const errorCountFor = useCallback((section) => {
|
|
112
|
+
if (!section.fields?.length)
|
|
113
|
+
return 0;
|
|
114
|
+
return section.fields.filter((f) => Object.keys(fieldErrors).some((k) => k === f || k.startsWith(`${f}.`))).length;
|
|
115
|
+
}, [fieldErrors]);
|
|
116
|
+
return (_jsxs(Stack, { gap: "md", children: [ordered.map((section) => {
|
|
117
|
+
const isRequired = section.required === true;
|
|
118
|
+
// A required section is always open — it holds the fields without
|
|
119
|
+
// which the record cannot be saved, so hiding it is never useful.
|
|
120
|
+
const isCollapsed = isRequired ? false : !openIds.includes(section.id);
|
|
121
|
+
const errorCount = errorCountFor(section);
|
|
122
|
+
return (_jsx(CollapsibleSection, { id: sectionAnchorId(section.id), title: _jsxs(Row, { align: "center", gap: "xs", children: [_jsx(Span, { weight: "semibold", size: "sm", children: section.heading ?? section.label }), isRequired && _jsx(Span, { size: "xs", color: "muted", children: "Required" })] }), isCollapsed: isCollapsed, onToggle: () => { if (!isRequired)
|
|
123
|
+
toggle(section.id); }, keepMounted: section.keepMounted, renderHeaderExtra: errorCount > 0
|
|
124
|
+
? () => (_jsxs(Badge, { variant: "danger", children: [errorCount, " ", errorCount === 1 ? "issue" : "issues"] }))
|
|
125
|
+
: undefined, children: section.render({ values, onChange: handleFieldChange, errors: fieldErrors }) }, section.id));
|
|
126
|
+
}), !hideActions && (_jsx(Row, { justify: "end", paddingY: "y-sm", children: _jsx(Button, { variant: "primary", type: "submit", onClick: () => void onSubmit(), isLoading: isLoading, disabled: isLoading, children: submitLabel }) }))] }));
|
|
127
|
+
}
|
|
128
|
+
export default SectionForm;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { ZodTypeAny } from "zod";
|
|
3
|
+
import type { SectionDef } from "./SectionForm";
|
|
4
|
+
import { type FieldUiMeta } from "./field-ui-meta";
|
|
5
|
+
/** One field, resolved: its name, its schema, and its final metadata. */
|
|
6
|
+
export interface ResolvedField {
|
|
7
|
+
name: string;
|
|
8
|
+
schema: ZodTypeAny;
|
|
9
|
+
meta: FieldUiMeta;
|
|
10
|
+
required: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Per-field JSX override. Receives everything the derived control would get. */
|
|
13
|
+
export type FieldRenderer<T extends object> = (props: {
|
|
14
|
+
field: ResolvedField;
|
|
15
|
+
values: T;
|
|
16
|
+
onChange: (partial: Partial<T>) => void;
|
|
17
|
+
errors: Record<string, string>;
|
|
18
|
+
}) => ReactNode;
|
|
19
|
+
export interface BuildSectionsOptions<T extends object> {
|
|
20
|
+
/** Per-field JSX overrides, keyed by field name. */
|
|
21
|
+
renderers?: Record<string, FieldRenderer<T>>;
|
|
22
|
+
/** Option lists for `kind: "select"` fields that aren't Zod enums. */
|
|
23
|
+
options?: Record<string, {
|
|
24
|
+
value: string;
|
|
25
|
+
label: string;
|
|
26
|
+
}[]>;
|
|
27
|
+
/** Section id → label, when no field declared `sectionLabel`. */
|
|
28
|
+
sectionLabels?: Record<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Section ids in the order they should appear. Sections not listed follow,
|
|
31
|
+
* in first-declaration order. `sectionRequired` still sorts first regardless.
|
|
32
|
+
*/
|
|
33
|
+
sectionOrder?: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve every field in a schema's shape.
|
|
37
|
+
*
|
|
38
|
+
* Fields with no registration are still returned, carrying inferred metadata
|
|
39
|
+
* and a `section` of `""`. Dropping them silently would hide the exact defect
|
|
40
|
+
* `audit-field-ui-meta` is meant to report — an unregistered field, or one
|
|
41
|
+
* whose `.register()` was not the last call in the chain and was therefore
|
|
42
|
+
* discarded by a subsequent `.optional()`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveFields(schema: ZodTypeAny): ResolvedField[];
|
|
45
|
+
/** Group resolved fields by section, preserving declaration order within each. */
|
|
46
|
+
export declare function groupFieldsBySection(fields: ResolvedField[]): Map<string, ResolvedField[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Pack consecutive fields into rows by their span.
|
|
49
|
+
*
|
|
50
|
+
* A `full` field always breaks the current row — that is what stops a media
|
|
51
|
+
* upload or a textarea being squeezed alongside a short input. Mixed spans
|
|
52
|
+
* start a new row too, rather than being crammed together: two `pair` fields
|
|
53
|
+
* make a clean 2-up, a `pair` next to a `quarter` makes neither.
|
|
54
|
+
*/
|
|
55
|
+
export declare function packRows(fields: ResolvedField[]): ResolvedField[][];
|
|
56
|
+
/**
|
|
57
|
+
* Build the `SectionDef[]` a `<SectionForm>` renders.
|
|
58
|
+
*
|
|
59
|
+
* Section order: `sectionRequired` first (there is normally exactly one — the
|
|
60
|
+
* fields without which the record cannot be saved), then `sectionOrder`, then
|
|
61
|
+
* first-declaration order.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildSectionsFromSchema<T extends object>(schema: ZodTypeAny, opts?: BuildSectionsOptions<T>): SectionDef<T>[];
|