@mohasinac/appkit 3.8.2 → 3.9.1
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/live/LiveItemDetailView.js +2 -2
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +4 -4
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +8 -8
- package/dist/_internal/client/features/lottery/LotteryAdminSlotView.d.ts +1 -1
- package/dist/_internal/client/features/lottery/LotteryAdminSlotView.js +2 -2
- package/dist/_internal/server/features/bundles/actions.js +2 -2
- package/dist/_internal/server/features/bundles/og.d.ts +1 -1
- package/dist/_internal/server/features/bundles/og.js +4 -5
- package/dist/_internal/server/features/checkout/actions.js +57 -21
- package/dist/_internal/server/features/checkout/stock-restore.d.ts +19 -0
- package/dist/_internal/server/features/checkout/stock-restore.js +80 -0
- package/dist/_internal/server/features/checkout/upi-resolution.d.ts +11 -0
- package/dist/_internal/server/features/checkout/upi-resolution.js +28 -0
- package/dist/_internal/server/features/classified/og.js +1 -1
- package/dist/_internal/server/features/digital-code/og.js +1 -1
- package/dist/_internal/server/features/item-requests/og.d.ts +2 -2
- package/dist/_internal/server/features/item-requests/og.js +4 -5
- package/dist/_internal/server/features/live/og.js +1 -1
- package/dist/_internal/server/features/lottery/adapters.d.ts +2 -2
- package/dist/_internal/server/features/lottery/adapters.js +1 -1
- package/dist/_internal/server/features/orders/actions.d.ts +28 -0
- package/dist/_internal/server/features/orders/actions.js +239 -4
- package/dist/_internal/server/features/orders/adapters.js +3 -0
- package/dist/_internal/server/features/payments/data.js +3 -2
- package/dist/_internal/server/features/payouts/actions.d.ts +2 -2
- package/dist/_internal/server/features/payouts/actions.js +4 -3
- package/dist/_internal/server/features/pre-orders/service.d.ts +1 -1
- package/dist/_internal/server/features/pre-orders/service.js +3 -2
- package/dist/_internal/server/features/prize-draws/og.js +5 -5
- package/dist/_internal/server/features/products/og.js +1 -1
- package/dist/_internal/server/features/promotions/service.js +3 -1
- package/dist/_internal/server/features/refunds/actions.d.ts +2 -2
- package/dist/_internal/server/features/refunds/actions.js +7 -6
- package/dist/_internal/server/functions/firestore.js +1 -1
- package/dist/_internal/server/functions/scheduled.d.ts +4 -1
- package/dist/_internal/server/functions/scheduled.js +26 -2
- package/dist/_internal/server/jobs/core/emiInstallmentReminder.js +1 -1
- package/dist/_internal/server/jobs/core/hardBanCascade.d.ts +4 -0
- package/dist/_internal/server/jobs/core/hardBanCascade.js +15 -4
- package/dist/_internal/server/jobs/core/hardBanReinstatement.d.ts +16 -0
- package/dist/_internal/server/jobs/core/hardBanReinstatement.js +63 -0
- package/dist/_internal/server/jobs/core/jobRunners.js +3 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +1 -1
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +10 -0
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +60 -0
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.d.ts +15 -0
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +59 -0
- package/dist/_internal/server/jobs/core/pendingOrderTimeout.d.ts +7 -0
- package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +32 -6
- package/dist/_internal/server/jobs/handlers/hardBanReinstatement.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/hardBanReinstatement.js +2 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +3 -0
- package/dist/_internal/server/jobs/handlers/index.js +3 -0
- package/dist/_internal/server/jobs/handlers/messages.d.ts +4 -0
- package/dist/_internal/server/jobs/handlers/messages.js +4 -0
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.d.ts +3 -3
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +12 -12
- package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.js +5 -5
- package/dist/_internal/server/jobs/handlers/paymentReviewAutoApprove.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/paymentReviewAutoApprove.js +2 -0
- package/dist/_internal/server/jobs/handlers/paymentWindowTimeout.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/paymentWindowTimeout.js +2 -0
- package/dist/_internal/shared/actions/action-registry.js +27 -0
- package/dist/_internal/shared/checkout/order-math.js +3 -2
- package/dist/_internal/shared/checkout/rules/_defaults.js +1 -0
- package/dist/_internal/shared/checkout/rules/preorder.rule.js +7 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +7 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +11 -0
- package/dist/_internal/shared/features/auctions/errors.js +1 -1
- package/dist/_internal/shared/features/categories/bundle-copy.d.ts +0 -1
- package/dist/_internal/shared/features/categories/bundle-copy.js +0 -1
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +6 -6
- package/dist/_internal/shared/features/categories/bundle-schemas.js +2 -2
- package/dist/_internal/shared/features/checkout/config.d.ts +3 -3
- package/dist/_internal/shared/features/checkout/config.js +3 -3
- package/dist/_internal/shared/features/emi/schedule.d.ts +6 -6
- package/dist/_internal/shared/features/emi/schedule.js +10 -9
- package/dist/_internal/shared/features/promotions/errors.js +1 -1
- package/dist/_internal/shared/fees/calculator.d.ts +5 -5
- package/dist/_internal/shared/fees/calculator.js +19 -19
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/constants/api-endpoints.d.ts +9 -0
- package/dist/constants/api-endpoints.js +3 -0
- package/dist/constants/field-names.d.ts +4 -0
- package/dist/constants/field-names.js +4 -0
- package/dist/features/admin/components/AdminArtView.js +2 -2
- package/dist/features/admin/components/AdminBidsView.js +2 -2
- package/dist/features/admin/components/AdminBundleEditorView.d.ts +1 -1
- package/dist/features/admin/components/AdminBundleEditorView.js +8 -8
- package/dist/features/admin/components/AdminBundlesView.js +6 -6
- package/dist/features/admin/components/AdminClassifiedView.js +2 -2
- package/dist/features/admin/components/AdminDigitalCodesView.js +2 -2
- package/dist/features/admin/components/AdminLiveView.js +2 -2
- package/dist/features/admin/components/AdminOrderEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminOrderEditorView.js +45 -5
- package/dist/features/admin/components/AdminOrdersView.js +8 -3
- package/dist/features/admin/components/AdminPayoutsView.js +2 -2
- package/dist/features/admin/components/AdminPrizeDrawsView.js +2 -2
- package/dist/features/admin/components/AdminReturnRequestsView.js +2 -2
- package/dist/features/admin/components/AdminSectionsView.js +4 -4
- package/dist/features/admin/components/AdminSiteSettingsView.js +11 -11
- package/dist/features/admin/components/AdminStickersView.js +2 -2
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
- package/dist/features/admin/components/sections/adminSectionsBuildParse.js +13 -5
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +9 -5
- package/dist/features/admin/hooks/useAdminListingData.d.ts +1 -1
- package/dist/features/admin/hooks/useAdminListingData.js +3 -2
- package/dist/features/admin/schemas/firestore.d.ts +9 -7
- package/dist/features/admin/schemas/firestore.js +4 -3
- package/dist/features/auctions/components/AuctionBidsTable.js +3 -3
- package/dist/features/auth/checkout-value-otp.d.ts +46 -0
- package/dist/features/auth/checkout-value-otp.js +73 -0
- package/dist/features/auth/repository/user.repository.d.ts +6 -0
- package/dist/features/auth/repository/user.repository.js +19 -0
- package/dist/features/auth/schemas/firestore.d.ts +10 -0
- package/dist/features/auth/schemas/firestore.js +2 -0
- package/dist/features/cart/actions/cart-actions.d.ts +1 -1
- package/dist/features/cart/actions/cart-actions.js +4 -4
- package/dist/features/cart/components/CartView.d.ts +2 -2
- package/dist/features/cart/components/ShippingPicker.d.ts +4 -4
- package/dist/features/cart/components/ShippingPicker.js +11 -11
- package/dist/features/cart/repository/cart.repository.d.ts +1 -1
- package/dist/features/cart/repository/cart.repository.js +2 -2
- package/dist/features/cart/schemas/firestore.d.ts +2 -2
- package/dist/features/catalogue/components/CatalogueItemEditorView.js +3 -3
- package/dist/features/catalogue/components/PublicCatalogueView.js +2 -2
- package/dist/features/catalogue/schemas/validation.js +1 -1
- package/dist/features/categories/components/BundleCollage.js +2 -2
- package/dist/features/categories/components/BundleDetailView.js +2 -2
- package/dist/features/categories/components/BundleItemsPicker.d.ts +1 -1
- package/dist/features/categories/components/BundleItemsPicker.js +2 -2
- package/dist/features/categories/components/CategoryBundlesListing.js +2 -2
- package/dist/features/categories/schemas/firestore.d.ts +1 -1
- package/dist/features/categories/schemas/index.d.ts +3 -3
- package/dist/features/categories/schemas/index.js +2 -2
- package/dist/features/checkout/actions/checkout-value-otp-actions.d.ts +16 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +83 -0
- package/dist/features/checkout/actions/index.d.ts +1 -0
- package/dist/features/checkout/actions/index.js +1 -0
- package/dist/features/checkout/schemas/firestore.d.ts +1 -1
- package/dist/features/classified/components/index.d.ts +0 -4
- package/dist/features/classified/components/index.js +0 -2
- package/dist/features/digital-codes/components/index.d.ts +0 -4
- package/dist/features/digital-codes/components/index.js +0 -2
- package/dist/features/events/schemas/index.d.ts +1 -1
- package/dist/features/events/schemas/index.js +1 -1
- package/dist/features/homepage/components/BrandsSection.d.ts +4 -1
- package/dist/features/homepage/components/BrandsSection.js +2 -2
- package/dist/features/homepage/components/CustomCardsSection.js +3 -3
- package/dist/features/homepage/components/CustomerReviewsSection.d.ts +4 -1
- package/dist/features/homepage/components/CustomerReviewsSection.js +2 -2
- package/dist/features/homepage/components/EventsSection.d.ts +4 -1
- package/dist/features/homepage/components/EventsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +2 -1
- package/dist/features/homepage/components/FeaturedAuctionsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedBundlesSection.js +2 -2
- package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +2 -1
- package/dist/features/homepage/components/FeaturedPreOrdersSection.js +2 -2
- package/dist/features/homepage/components/FeaturedProductsSection.d.ts +2 -1
- package/dist/features/homepage/components/FeaturedProductsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedStoresSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedStoresSection.js +2 -2
- package/dist/features/homepage/components/HomepageCustomerReviewsSection.d.ts +4 -1
- package/dist/features/homepage/components/HomepageCustomerReviewsSection.js +2 -2
- package/dist/features/homepage/components/SectionCarousel.d.ts +3 -1
- package/dist/features/homepage/components/SectionCarousel.js +2 -2
- package/dist/features/homepage/components/ShopByCategorySection.d.ts +4 -1
- package/dist/features/homepage/components/ShopByCategorySection.js +2 -2
- package/dist/features/homepage/lib/section-renderer.js +9 -9
- package/dist/features/homepage/schemas/firestore.d.ts +8 -0
- package/dist/features/live/components/index.d.ts +0 -4
- package/dist/features/live/components/index.js +0 -2
- package/dist/features/lottery/types/index.d.ts +3 -3
- package/dist/features/lottery/types/index.js +5 -5
- package/dist/features/orders/components/OrderPaymentSummary.js +2 -2
- package/dist/features/orders/components/OrderSiblingPayments.js +1 -1
- package/dist/features/orders/components/RefundHistoryTable.js +1 -1
- package/dist/features/orders/components/RefundRequestView.js +1 -1
- package/dist/features/orders/constants/payment-window.d.ts +10 -0
- package/dist/features/orders/constants/payment-window.js +10 -0
- package/dist/features/orders/repository/orders.repository.d.ts +25 -0
- package/dist/features/orders/repository/orders.repository.js +50 -1
- package/dist/features/orders/schemas/firestore.d.ts +50 -2
- package/dist/features/orders/schemas/index.d.ts +24 -24
- package/dist/features/orders/schemas/index.js +20 -20
- package/dist/features/orders/types/index.d.ts +4 -0
- package/dist/features/orders/utils/bundle-grouping.d.ts +1 -1
- package/dist/features/orders/utils/bundle-grouping.js +1 -1
- package/dist/features/payments/schemas/index.d.ts +10 -10
- package/dist/features/payments/schemas/index.js +9 -9
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +2 -2
- package/dist/features/products/components/ArtStickersListView.d.ts +7 -0
- package/dist/features/products/components/ArtStickersListView.js +57 -0
- package/dist/features/products/components/GroupSettingsPanel.js +1 -1
- package/dist/features/products/components/MakeOfferButton.js +3 -3
- package/dist/features/products/components/MarketplaceBundleCard.d.ts +1 -1
- package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
- package/dist/features/products/components/PrizeDrawCollage.js +2 -2
- package/dist/features/products/components/PrizeDrawItemsEditor.js +2 -2
- package/dist/features/products/components/PrizeRevealModal.js +1 -1
- package/dist/features/products/components/ProductDetailPageView.js +2 -9
- package/dist/features/products/components/ProductForm.js +2 -2
- package/dist/features/products/components/ProductGrid.js +2 -2
- package/dist/features/products/components/ProductsIndexListing.d.ts +13 -1
- package/dist/features/products/components/ProductsIndexListing.js +7 -5
- package/dist/features/products/components/ProductsIndexPageView.js +6 -1
- package/dist/features/products/constants/listing-tabs.d.ts +42 -17
- package/dist/features/products/constants/listing-tabs.js +25 -6
- package/dist/features/products/schemas/catalog-product.d.ts +5 -5
- package/dist/features/products/schemas/catalog-product.js +1 -1
- package/dist/features/products/schemas/firestore.d.ts +5 -5
- package/dist/features/products/schemas/firestore.js +2 -2
- package/dist/features/products/types/index.d.ts +5 -2
- package/dist/features/promotions/components/CouponCard.js +2 -2
- package/dist/features/promotions/schemas/firestore.d.ts +2 -0
- package/dist/features/promotions/schemas/firestore.js +1 -0
- package/dist/features/promotions/schemas/index.d.ts +14 -14
- package/dist/features/promotions/schemas/index.js +6 -6
- package/dist/features/scams/components/ScamProfileView.js +3 -7
- package/dist/features/scams/components/ScamRegistryView.js +2 -6
- package/dist/features/scams/schemas/firestore.d.ts +1 -1
- package/dist/features/search/components/Search.d.ts +1 -1
- package/dist/features/seller/actions/offer-actions.js +1 -1
- package/dist/features/seller/components/PrintCenterView.js +2 -2
- package/dist/features/seller/components/QuickProductForm.js +5 -5
- package/dist/features/seller/components/SellerArtView.js +2 -2
- package/dist/features/seller/components/SellerAuctionsView.js +2 -2
- package/dist/features/seller/components/SellerBidsView.js +2 -2
- package/dist/features/seller/components/SellerBundlesView.js +6 -6
- package/dist/features/seller/components/SellerClassifiedView.js +2 -2
- package/dist/features/seller/components/SellerDigitalCodesView.js +2 -2
- package/dist/features/seller/components/SellerLiveView.js +2 -2
- package/dist/features/seller/components/SellerOffersView.js +2 -2
- package/dist/features/seller/components/SellerOrdersView.js +3 -3
- package/dist/features/seller/components/SellerPayoutRequestView.js +2 -2
- package/dist/features/seller/components/SellerPayoutSettingsView.js +2 -2
- package/dist/features/seller/components/SellerPayoutsView.js +2 -2
- package/dist/features/seller/components/SellerPreOrdersView.js +2 -2
- package/dist/features/seller/components/SellerPrizeDrawsView.js +2 -2
- package/dist/features/seller/components/SellerProductShell.js +8 -8
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +6 -6
- package/dist/features/seller/components/SellerStickersView.js +2 -2
- package/dist/features/seller/hooks/useSellerListingData.d.ts +1 -1
- package/dist/features/seller/hooks/useSellerListingData.js +3 -2
- package/dist/features/shipments/components/AdminShipmentEditorView.js +10 -10
- package/dist/features/shipments/components/AdminShipmentLotItemsView.js +4 -4
- package/dist/features/shipments/components/AdminShipmentProjectionsView.js +5 -5
- package/dist/features/shipments/components/AdminShipmentsView.js +4 -4
- package/dist/features/shipments/repository/shipment-lots.repository.d.ts +2 -2
- package/dist/features/shipments/repository/shipment-lots.repository.js +8 -8
- package/dist/features/shipments/schemas/firestore.d.ts +21 -21
- package/dist/features/shipments/schemas/firestore.js +9 -9
- package/dist/features/shipments/schemas/validation.d.ts +30 -30
- package/dist/features/shipments/schemas/validation.js +6 -6
- package/dist/features/shipments/utils/cost-allocation.d.ts +5 -5
- package/dist/features/shipments/utils/cost-allocation.js +39 -38
- package/dist/features/store-extensions/schemas/firestore.d.ts +5 -5
- package/dist/features/stores/components/StoreDetailLayoutView.js +9 -13
- package/dist/features/stores/schemas/firestore.d.ts +7 -7
- package/dist/features/stores/schemas/index.d.ts +84 -84
- package/dist/features/stores/schemas/index.js +5 -5
- package/dist/features/tester/seed-data/categories-tester-seed-data.js +1 -1
- package/dist/features/tester/seed-data/products-tester-seed-data.js +6 -6
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +9 -2
- package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +8 -1
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +13 -2
- package/dist/features/whatsapp-bot/types/index.d.ts +9 -1
- package/dist/index.d.ts +3 -7
- package/dist/index.js +7 -5
- package/dist/next/routing/route-map.d.ts +2 -0
- package/dist/next/routing/route-map.js +6 -0
- package/dist/schemas/firestore-helpers.d.ts +2 -2
- package/dist/schemas/firestore-helpers.js +2 -2
- package/dist/schemas/registry.d.ts +73 -73
- package/dist/seed/bids-seed-data.js +6 -6
- package/dist/seed/blog-posts-seed-data.js +1 -0
- package/dist/seed/cart-seed-data.js +13 -13
- package/dist/seed/catalogue-seed-data.js +6 -6
- package/dist/seed/categories-seed-data.js +5 -5
- package/dist/seed/claimed-coupons-seed-data.js +3 -3
- package/dist/seed/coupons-seed-data.js +20 -20
- package/dist/seed/events-seed-data.js +27 -27
- package/dist/seed/factories/bid.factory.js +1 -1
- package/dist/seed/faq-seed-data.js +20 -1
- package/dist/seed/grouped-listings-seed-data.d.ts +2 -2
- package/dist/seed/grouped-listings-seed-data.js +3 -3
- package/dist/seed/homepage-sections-seed-data.js +10 -0
- package/dist/seed/offers-seed-data.js +19 -19
- package/dist/seed/orders-seed-data.js +29 -29
- package/dist/seed/payouts-seed-data.js +7 -7
- package/dist/seed/products-auctions-seed-data.js +6 -6
- package/dist/seed/products-preorders-seed-data.d.ts +2 -2
- package/dist/seed/products-preorders-seed-data.js +1 -1
- package/dist/seed/products-standard-seed-data.js +8 -8
- package/dist/seed/scammers-seed-data.js +2 -2
- package/dist/seed/shipments-seed-data.js +29 -29
- package/dist/seed/site-settings-seed-data.js +3 -2
- package/dist/seed/store-extensions-seed-data.js +8 -8
- package/dist/seed/stores-seed-data.js +37 -8
- package/dist/seed/users-seed-data.js +38 -1
- package/dist/server-entry.d.ts +1 -3
- package/dist/server-entry.js +1 -3
- package/dist/server.d.ts +2 -1
- package/dist/server.js +3 -1
- package/dist/ui/components/HorizontalScroller.js +3 -0
- package/dist/ui/components/PriceDisplay.js +3 -12
- package/dist/utils/number.formatter.d.ts +2 -7
- package/dist/utils/number.formatter.js +3 -8
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +8 -3
- package/dist/_internal/client/scaffolds/DashboardScaffold.d.ts +0 -34
- package/dist/_internal/client/scaffolds/DashboardScaffold.js +0 -26
- package/dist/_internal/client/theme/__tests__/ThemeProvider.test.d.ts +0 -1
- package/dist/_internal/client/theme/__tests__/ThemeProvider.test.js +0 -109
- package/dist/_internal/server/features/auctions/__tests__/service.test.d.ts +0 -1
- package/dist/_internal/server/features/auctions/__tests__/service.test.js +0 -140
- package/dist/_internal/server/features/checkout/__tests__/actions.test.d.ts +0 -1
- package/dist/_internal/server/features/checkout/__tests__/actions.test.js +0 -600
- package/dist/_internal/server/features/refunds/__tests__/actions.test.d.ts +0 -1
- package/dist/_internal/server/features/refunds/__tests__/actions.test.js +0 -263
- package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.js +0 -249
- package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.js +0 -65
- package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.js +0 -163
- package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.js +0 -115
- package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.js +0 -201
- package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.js +0 -169
- package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.js +0 -148
- package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.js +0 -210
- package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.js +0 -190
- package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.js +0 -161
- package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.js +0 -302
- package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.js +0 -96
- package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.js +0 -252
- package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.d.ts +0 -1
- package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.js +0 -129
- package/dist/_internal/server/jobs/core/onCatalogueSubmittedForApproval.d.ts +0 -15
- package/dist/_internal/server/jobs/core/onCatalogueSubmittedForApproval.js +0 -38
- package/dist/_internal/server/providers/index.d.ts +0 -11
- package/dist/_internal/server/providers/index.js +0 -11
- package/dist/_internal/server/providers/payment/razorpay-mock.d.ts +0 -52
- package/dist/_internal/server/providers/payment/razorpay-mock.js +0 -118
- package/dist/_internal/server/providers/resolve.d.ts +0 -36
- package/dist/_internal/server/providers/resolve.js +0 -31
- package/dist/_internal/server/providers/shipping/shiprocket-mock.d.ts +0 -29
- package/dist/_internal/server/providers/shipping/shiprocket-mock.js +0 -152
- package/dist/_internal/shared/types/__tests__/action-result.test.d.ts +0 -1
- package/dist/_internal/shared/types/__tests__/action-result.test.js +0 -65
- package/dist/errors/__tests__/error-mapping.test.d.ts +0 -1
- package/dist/errors/__tests__/error-mapping.test.js +0 -122
- package/dist/errors/__tests__/safe-read.test.d.ts +0 -1
- package/dist/errors/__tests__/safe-read.test.js +0 -39
- package/dist/features/addresses/repository/__tests__/addresses.repository.test.d.ts +0 -1
- package/dist/features/addresses/repository/__tests__/addresses.repository.test.js +0 -386
- package/dist/features/admin/components/AdminListingScaffold.d.ts +0 -41
- package/dist/features/admin/components/AdminListingScaffold.js +0 -68
- package/dist/features/admin/components/QuickActionsPanel.d.ts +0 -15
- package/dist/features/admin/components/QuickActionsPanel.js +0 -5
- package/dist/features/admin/repository/__tests__/notification.repository.test.d.ts +0 -1
- package/dist/features/admin/repository/__tests__/notification.repository.test.js +0 -356
- package/dist/features/admin/repository/__tests__/site-settings.repository.test.d.ts +0 -1
- package/dist/features/admin/repository/__tests__/site-settings.repository.test.js +0 -298
- package/dist/features/auctions/repository/__tests__/bid.repository.test.d.ts +0 -1
- package/dist/features/auctions/repository/__tests__/bid.repository.test.js +0 -290
- package/dist/features/auctions/repository/auctions.repository.d.ts +0 -12
- package/dist/features/auctions/repository/auctions.repository.js +0 -42
- package/dist/features/auth/repository/__tests__/session.repository.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/session.repository.test.js +0 -310
- package/dist/features/auth/repository/__tests__/session.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/session.test.js +0 -146
- package/dist/features/auth/repository/__tests__/sms-counter.repository.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/sms-counter.repository.test.js +0 -171
- package/dist/features/auth/repository/__tests__/sms-counter.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/sms-counter.test.js +0 -88
- package/dist/features/auth/repository/__tests__/token.repository.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/token.repository.test.js +0 -260
- package/dist/features/auth/repository/__tests__/token.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/token.test.js +0 -140
- package/dist/features/auth/repository/__tests__/user.repository.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/user.repository.test.js +0 -352
- package/dist/features/auth/repository/__tests__/user.test.d.ts +0 -1
- package/dist/features/auth/repository/__tests__/user.test.js +0 -226
- package/dist/features/before-after/repository/before-after.repository.d.ts +0 -13
- package/dist/features/before-after/repository/before-after.repository.js +0 -36
- package/dist/features/before-after/server.d.ts +0 -6
- package/dist/features/before-after/server.js +0 -6
- package/dist/features/cart/repository/__tests__/cart.repository.test.d.ts +0 -1
- package/dist/features/cart/repository/__tests__/cart.repository.test.js +0 -371
- package/dist/features/categories/repository/__tests__/categories.repository.test.d.ts +0 -1
- package/dist/features/categories/repository/__tests__/categories.repository.test.js +0 -813
- package/dist/features/collections/repository/collections.repository.d.ts +0 -8
- package/dist/features/collections/repository/collections.repository.js +0 -16
- package/dist/features/collections/server.d.ts +0 -6
- package/dist/features/collections/server.js +0 -6
- package/dist/features/events/repository/__tests__/event.repository.test.d.ts +0 -1
- package/dist/features/events/repository/__tests__/event.repository.test.js +0 -299
- package/dist/features/faq/repository/__tests__/faqs.repository.test.d.ts +0 -1
- package/dist/features/faq/repository/__tests__/faqs.repository.test.js +0 -311
- package/dist/features/forms/Form.d.ts +0 -25
- package/dist/features/forms/Form.js +0 -37
- package/dist/features/history/repository/__tests__/user-history.repository.test.d.ts +0 -1
- package/dist/features/history/repository/__tests__/user-history.repository.test.js +0 -180
- package/dist/features/homepage/repository/__tests__/carousel.repository.test.d.ts +0 -1
- package/dist/features/homepage/repository/__tests__/carousel.repository.test.js +0 -182
- package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.d.ts +0 -1
- package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.js +0 -185
- package/dist/features/layout/ListingLayout.d.ts +0 -34
- package/dist/features/layout/ListingLayout.js +0 -103
- package/dist/features/messages/repository/__tests__/conversations.repository.test.d.ts +0 -1
- package/dist/features/messages/repository/__tests__/conversations.repository.test.js +0 -257
- package/dist/features/orders/repository/__tests__/orders.repository.test.d.ts +0 -1
- package/dist/features/orders/repository/__tests__/orders.repository.test.js +0 -211
- package/dist/features/payments/repository/__tests__/payout.repository.test.d.ts +0 -1
- package/dist/features/payments/repository/__tests__/payout.repository.test.js +0 -292
- package/dist/features/pre-orders/repository/preorders.repository.d.ts +0 -8
- package/dist/features/pre-orders/repository/preorders.repository.js +0 -25
- package/dist/features/products/repository/__tests__/product-features.repository.test.d.ts +0 -1
- package/dist/features/products/repository/__tests__/product-features.repository.test.js +0 -329
- package/dist/features/products/repository/__tests__/products.repository.test.d.ts +0 -1
- package/dist/features/products/repository/__tests__/products.repository.test.js +0 -607
- package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.d.ts +0 -1
- package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.js +0 -219
- package/dist/features/promotions/repository/__tests__/coupons.repository.test.d.ts +0 -1
- package/dist/features/promotions/repository/__tests__/coupons.repository.test.js +0 -480
- package/dist/features/promotions/repository/promotions.repository.d.ts +0 -14
- package/dist/features/promotions/repository/promotions.repository.js +0 -43
- package/dist/features/reviews/repository/__tests__/reviews.repository.test.d.ts +0 -1
- package/dist/features/reviews/repository/__tests__/reviews.repository.test.js +0 -327
- package/dist/features/scams/repository/__tests__/scammer.repository.test.d.ts +0 -1
- package/dist/features/scams/repository/__tests__/scammer.repository.test.js +0 -385
- package/dist/features/search/repository/__tests__/search.repository.test.d.ts +0 -1
- package/dist/features/search/repository/__tests__/search.repository.test.js +0 -369
- package/dist/features/seller/components/SellerStatCard.d.ts +0 -14
- package/dist/features/seller/components/SellerStatCard.js +0 -6
- package/dist/features/seller/components/seller-products-styles.d.ts +0 -7
- package/dist/features/seller/components/seller-products-styles.js +0 -14
- package/dist/features/seller/repository/__tests__/offer.repository.test.d.ts +0 -1
- package/dist/features/seller/repository/__tests__/offer.repository.test.js +0 -458
- package/dist/features/seller/repository/seller.repository.d.ts +0 -22
- package/dist/features/seller/repository/seller.repository.js +0 -72
- package/dist/features/site-settings/components/__tests__/ThemeManagerView.test.d.ts +0 -1
- package/dist/features/site-settings/components/__tests__/ThemeManagerView.test.js +0 -37
- package/dist/features/stores/repository/__tests__/store.repository.test.d.ts +0 -1
- package/dist/features/stores/repository/__tests__/store.repository.test.js +0 -261
- package/dist/features/stores/repository/stores.repository.d.ts +0 -11
- package/dist/features/stores/repository/stores.repository.js +0 -37
- package/dist/features/support/repository/__tests__/support.repository.test.d.ts +0 -1
- package/dist/features/support/repository/__tests__/support.repository.test.js +0 -312
- package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.d.ts +0 -1
- package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.js +0 -139
- package/dist/features/wishlist/repository/wishlist.repository.d.ts +0 -13
- package/dist/features/wishlist/repository/wishlist.repository.js +0 -31
- package/dist/providers/db-firebase/__tests__/filter-aliases.test.d.ts +0 -1
- package/dist/providers/db-firebase/__tests__/filter-aliases.test.js +0 -93
- package/dist/providers/shipping-shiprocket/index.d.ts +0 -297
- package/dist/providers/shipping-shiprocket/index.js +0 -194
- package/dist/providers/shipping-shiprocket/shiprocket-provider.d.ts +0 -45
- package/dist/providers/shipping-shiprocket/shiprocket-provider.js +0 -168
- package/dist/react/contexts/ThemeContext.d.ts +0 -13
- package/dist/react/contexts/ThemeContext.js +0 -64
- package/dist/schemas/webhooks/shiprocket.d.ts +0 -30
- package/dist/schemas/webhooks/shiprocket.js +0 -22
- package/dist/seed/actions/demo-seed-actions.d.ts +0 -42
- package/dist/seed/actions/demo-seed-actions.js +0 -36
- package/dist/seed/actions/index.d.ts +0 -1
- package/dist/seed/actions/index.js +0 -1
- package/dist/seed/sub-listings-seed-data.d.ts +0 -123
- package/dist/seed/sub-listings-seed-data.js +0 -447
- package/dist/seed/tester-checklist-seed-data.d.ts +0 -2
- package/dist/seed/tester-checklist-seed-data.js +0 -248
- package/dist/ui/components/DashboardStatsCard.d.ts +0 -15
- package/dist/ui/components/DashboardStatsCard.js +0 -27
- package/dist/ui/components/DashboardStatsCard.style.css +0 -68
- package/dist/ui/components/DynamicSelect.d.ts +0 -23
- package/dist/ui/components/DynamicSelect.js +0 -77
- package/dist/ui/components/DynamicSelect.style.css +0 -101
- package/dist/ui/components/InlineCreateSelect.d.ts +0 -48
- package/dist/ui/components/InlineCreateSelect.js +0 -75
- package/dist/ui/components/ListingViewShell.d.ts +0 -37
- package/dist/ui/components/ListingViewShell.js +0 -9
- package/dist/ui/components/PaginatedMultiSelect.d.ts +0 -28
- package/dist/ui/components/PaginatedMultiSelect.js +0 -141
- package/dist/ui/components/PaginatedMultiSelect.style.css +0 -272
- package/dist/ui/components/SectionTabs.d.ts +0 -19
- package/dist/ui/components/SectionTabs.js +0 -66
- package/dist/ui/components/SectionTabs.style.css +0 -164
- package/dist/ui/components/__tests__/BulkActionBar.test.d.ts +0 -1
- package/dist/ui/components/__tests__/BulkActionBar.test.js +0 -96
- package/dist/ui/components/__tests__/ListingToolbar.test.d.ts +0 -1
- package/dist/ui/components/__tests__/ListingToolbar.test.js +0 -125
- package/dist/ui/components/__tests__/new-primitives.test.d.ts +0 -1
- package/dist/ui/components/__tests__/new-primitives.test.js +0 -187
|
@@ -255,7 +255,7 @@ function OrderItemsPanel(props) {
|
|
|
255
255
|
const q = Math.max(0, parseInt(raw, 10) || 0);
|
|
256
256
|
setOrderItems((prev) => prev.map((p, i) => (i === idx ? { ...p, quantity: q } : p)));
|
|
257
257
|
};
|
|
258
|
-
return (_jsxs(Stack, { padding: "sm", className: "border border-info/40 bg-[var(--appkit-color-info-surface)]/40", gap: "sm", rounded: "lg", children: [_jsx(Text, { className: "text-info tracking-wide", size: "xs", weight: "semibold", transform: "uppercase", children: "Modify order items" }), linkedOrderId ? (_jsxs(_Fragment, { children: [_jsxs(Text, { size: "xs", color: "muted", children: ["Editing order: ", _jsx(Code, { className: "font-mono", children: linkedOrderId })] }), !orderItemsOpen ? (_jsx(Button, { type: "button", variant: "secondary", size: "sm", isLoading: loadOrderItems.isPending, disabled: loadOrderItems.isPending, onClick: () => loadOrderItems.mutate(), children: "Load current items" })) : (_jsxs(_Fragment, { children: [orderItems.length === 0 ? (_jsx(Text, { size: "xs", color: "muted", children: "Order has no items." })) : (_jsx(Stack, { gap: "sm", children: orderItems.map((it, idx) => (_jsxs(Row, { paddingY: "y-2xs", padding: "x-xs", rounded: "default", align: "center", gap: "sm", border: "default", children: [_jsxs(Div, { className: "flex-1 min-w-0", children: [_jsx(Text, { className: "truncate", size: "xs", weight: "medium", children: it.productTitle }), _jsxs(Text, { size: "xs", color: "muted", children: [it.productId, " \u00B7 \u20B9",
|
|
258
|
+
return (_jsxs(Stack, { padding: "sm", className: "border border-info/40 bg-[var(--appkit-color-info-surface)]/40", gap: "sm", rounded: "lg", children: [_jsx(Text, { className: "text-info tracking-wide", size: "xs", weight: "semibold", transform: "uppercase", children: "Modify order items" }), linkedOrderId ? (_jsxs(_Fragment, { children: [_jsxs(Text, { size: "xs", color: "muted", children: ["Editing order: ", _jsx(Code, { className: "font-mono", children: linkedOrderId })] }), !orderItemsOpen ? (_jsx(Button, { type: "button", variant: "secondary", size: "sm", isLoading: loadOrderItems.isPending, disabled: loadOrderItems.isPending, onClick: () => loadOrderItems.mutate(), children: "Load current items" })) : (_jsxs(_Fragment, { children: [orderItems.length === 0 ? (_jsx(Text, { size: "xs", color: "muted", children: "Order has no items." })) : (_jsx(Stack, { gap: "sm", children: orderItems.map((it, idx) => (_jsxs(Row, { paddingY: "y-2xs", padding: "x-xs", rounded: "default", align: "center", gap: "sm", border: "default", children: [_jsxs(Div, { className: "flex-1 min-w-0", children: [_jsx(Text, { className: "truncate", size: "xs", weight: "medium", children: it.productTitle }), _jsxs(Text, { size: "xs", color: "muted", children: [it.productId, " \u00B7 \u20B9", it.unitPrice.toFixed(2), "/ea"] })] }), _jsx(Input, { bare: true, type: "number", min: "0", value: it.quantity, onChange: (e) => updateQty(idx, e.target.value), className: "w-16 rounded border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] px-[var(--appkit-space-2)] py-[var(--appkit-space-1)] text-[length:var(--appkit-text-xs)]" })] }, `${it.productId}-${idx}`))) })), _jsxs(Row, { gap: "sm", children: [_jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setOrderItemsOpen(false), children: "Cancel" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", isLoading: applyOrderItems.isPending, disabled: applyOrderItems.isPending, onClick: () => applyOrderItems.mutate(), children: "Apply changes" })] })] }))] })) : (_jsxs(Text, { size: "xs", color: "muted", children: ["Set the", " ", _jsx(Text, { as: "span", weight: "semibold", children: "Order ID" }), " ", "field in the Linked parties panel above to enable this action."] }))] }));
|
|
259
259
|
}
|
|
260
260
|
function StoreChangePanel(props) {
|
|
261
261
|
const { linkedStoreId, storeStatus, setStoreStatus, storeIsVerified, setStoreIsVerified, storeIsFeatured, setStoreIsFeatured, applyStoreChange, } = props;
|
|
@@ -190,7 +190,7 @@ export function parseProductsBuilder(config) {
|
|
|
190
190
|
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
191
191
|
filterByCategory: toStringValue(config.filterByCategory),
|
|
192
192
|
maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
|
|
193
|
-
loop: toBooleanValue(config.loop,
|
|
193
|
+
loop: toBooleanValue(config.loop, DEFAULT_PRODUCTS_BUILDER.loop),
|
|
194
194
|
};
|
|
195
195
|
}
|
|
196
196
|
export function parseAuctionsBuilder(config) {
|
|
@@ -210,7 +210,7 @@ export function parseAuctionsBuilder(config) {
|
|
|
210
210
|
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
211
211
|
filterByCategory: toStringValue(config.filterByCategory),
|
|
212
212
|
maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
|
|
213
|
-
loop: toBooleanValue(config.loop,
|
|
213
|
+
loop: toBooleanValue(config.loop, DEFAULT_AUCTIONS_BUILDER.loop),
|
|
214
214
|
};
|
|
215
215
|
}
|
|
216
216
|
export function parseStatsBuilder(config) {
|
|
@@ -271,7 +271,7 @@ export function parsePreOrdersBuilder(config) {
|
|
|
271
271
|
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
272
272
|
filterByCategory: toStringValue(config.filterByCategory),
|
|
273
273
|
maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
|
|
274
|
-
loop: toBooleanValue(config.loop,
|
|
274
|
+
loop: toBooleanValue(config.loop, DEFAULT_PRE_ORDERS_BUILDER.loop),
|
|
275
275
|
};
|
|
276
276
|
}
|
|
277
277
|
export function parseStoresBuilder(config) {
|
|
@@ -292,7 +292,7 @@ export function parseStoresBuilder(config) {
|
|
|
292
292
|
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
293
293
|
filterByCategory: toStringValue(config.filterByCategory),
|
|
294
294
|
maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
|
|
295
|
-
loop: toBooleanValue(config.loop,
|
|
295
|
+
loop: toBooleanValue(config.loop, DEFAULT_STORES_BUILDER.loop),
|
|
296
296
|
};
|
|
297
297
|
}
|
|
298
298
|
export function parseEventsBuilder(config) {
|
|
@@ -313,7 +313,7 @@ export function parseEventsBuilder(config) {
|
|
|
313
313
|
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
314
314
|
filterByCategory: toStringValue(config.filterByCategory),
|
|
315
315
|
maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
|
|
316
|
-
loop: toBooleanValue(config.loop,
|
|
316
|
+
loop: toBooleanValue(config.loop, DEFAULT_EVENTS_BUILDER.loop),
|
|
317
317
|
};
|
|
318
318
|
}
|
|
319
319
|
export function buildSocialFeedConfig(builder) {
|
|
@@ -395,6 +395,7 @@ export function buildCategoriesConfig(builder) {
|
|
|
395
395
|
maxCategories: builder.maxCategories,
|
|
396
396
|
autoScroll: builder.autoScroll,
|
|
397
397
|
scrollInterval: builder.scrollInterval,
|
|
398
|
+
loop: builder.loop,
|
|
398
399
|
};
|
|
399
400
|
}
|
|
400
401
|
export function parseCategoriesBuilder(config) {
|
|
@@ -403,6 +404,7 @@ export function parseCategoriesBuilder(config) {
|
|
|
403
404
|
maxCategories: toNumberValue(config.maxCategories, DEFAULT_CATEGORIES_BUILDER.maxCategories),
|
|
404
405
|
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_CATEGORIES_BUILDER.autoScroll),
|
|
405
406
|
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_CATEGORIES_BUILDER.scrollInterval),
|
|
407
|
+
loop: toBooleanValue(config.loop, DEFAULT_CATEGORIES_BUILDER.loop),
|
|
406
408
|
};
|
|
407
409
|
}
|
|
408
410
|
export function buildBrandsConfig(builder) {
|
|
@@ -412,6 +414,7 @@ export function buildBrandsConfig(builder) {
|
|
|
412
414
|
maxBrands: builder.maxBrands,
|
|
413
415
|
autoScroll: builder.autoScroll,
|
|
414
416
|
scrollInterval: builder.scrollInterval,
|
|
417
|
+
loop: builder.loop,
|
|
415
418
|
};
|
|
416
419
|
}
|
|
417
420
|
export function parseBrandsBuilder(config) {
|
|
@@ -421,6 +424,7 @@ export function parseBrandsBuilder(config) {
|
|
|
421
424
|
maxBrands: toNumberValue(config.maxBrands, DEFAULT_BRANDS_BUILDER.maxBrands),
|
|
422
425
|
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_BRANDS_BUILDER.autoScroll),
|
|
423
426
|
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_BRANDS_BUILDER.scrollInterval),
|
|
427
|
+
loop: toBooleanValue(config.loop, DEFAULT_BRANDS_BUILDER.loop),
|
|
424
428
|
};
|
|
425
429
|
}
|
|
426
430
|
export function buildBannerConfig(builder) {
|
|
@@ -486,6 +490,7 @@ export function buildReviewsConfig(builder) {
|
|
|
486
490
|
mobileItemsPerView: 1,
|
|
487
491
|
autoScroll: builder.autoScroll,
|
|
488
492
|
scrollInterval: builder.scrollInterval,
|
|
493
|
+
loop: builder.loop,
|
|
489
494
|
source: builder.source,
|
|
490
495
|
placeId: builder.source === "google" ? builder.placeId || undefined : undefined,
|
|
491
496
|
};
|
|
@@ -497,6 +502,7 @@ export function parseReviewsBuilder(config) {
|
|
|
497
502
|
itemsPerView: toNumberValue(config.itemsPerView, DEFAULT_REVIEWS_BUILDER.itemsPerView),
|
|
498
503
|
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_REVIEWS_BUILDER.autoScroll),
|
|
499
504
|
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_REVIEWS_BUILDER.scrollInterval),
|
|
505
|
+
loop: toBooleanValue(config.loop, DEFAULT_REVIEWS_BUILDER.loop),
|
|
500
506
|
source: toStringValue(config.source, "platform"),
|
|
501
507
|
placeId: toStringValue(config.placeId),
|
|
502
508
|
};
|
|
@@ -613,6 +619,7 @@ export function buildCustomCardsConfig(builder) {
|
|
|
613
619
|
columns: builder.columns,
|
|
614
620
|
autoScroll: builder.autoScroll,
|
|
615
621
|
scrollIntervalMs: builder.scrollIntervalMs,
|
|
622
|
+
loop: builder.loop,
|
|
616
623
|
cards: builder.cards.map((card, index) => ({
|
|
617
624
|
id: card.id || `card-${index + 1}`,
|
|
618
625
|
image: card.image || undefined,
|
|
@@ -639,6 +646,7 @@ export function parseCustomCardsBuilder(config) {
|
|
|
639
646
|
columns: ([1, 2, 3, 4].includes(cols) ? cols : DEFAULT_CUSTOM_CARDS_BUILDER.columns),
|
|
640
647
|
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_CUSTOM_CARDS_BUILDER.autoScroll),
|
|
641
648
|
scrollIntervalMs: toNumberValue(config.scrollIntervalMs, DEFAULT_CUSTOM_CARDS_BUILDER.scrollIntervalMs),
|
|
649
|
+
loop: toBooleanValue(config.loop, DEFAULT_CUSTOM_CARDS_BUILDER.loop),
|
|
642
650
|
cards: cardsRaw.map((item, index) => {
|
|
643
651
|
const c = (item ?? {});
|
|
644
652
|
const br = toStringValue(c.borderRadius, "none");
|
|
@@ -150,6 +150,7 @@ export interface CategoriesBuilderState {
|
|
|
150
150
|
maxCategories: number;
|
|
151
151
|
autoScroll: boolean;
|
|
152
152
|
scrollInterval: number;
|
|
153
|
+
loop: boolean;
|
|
153
154
|
}
|
|
154
155
|
export interface BrandsBuilderState {
|
|
155
156
|
title: string;
|
|
@@ -157,6 +158,7 @@ export interface BrandsBuilderState {
|
|
|
157
158
|
maxBrands: number;
|
|
158
159
|
autoScroll: boolean;
|
|
159
160
|
scrollInterval: number;
|
|
161
|
+
loop: boolean;
|
|
160
162
|
}
|
|
161
163
|
export interface BannerBuilderState {
|
|
162
164
|
height: "sm" | "md" | "lg" | "xl";
|
|
@@ -185,6 +187,7 @@ export interface ReviewsBuilderState {
|
|
|
185
187
|
itemsPerView: number;
|
|
186
188
|
autoScroll: boolean;
|
|
187
189
|
scrollInterval: number;
|
|
190
|
+
loop: boolean;
|
|
188
191
|
source: "platform" | "google";
|
|
189
192
|
placeId: string;
|
|
190
193
|
}
|
|
@@ -249,6 +252,7 @@ export interface CustomCardsBuilderState {
|
|
|
249
252
|
columns: 1 | 2 | 3 | 4;
|
|
250
253
|
autoScroll: boolean;
|
|
251
254
|
scrollIntervalMs: number;
|
|
255
|
+
loop: boolean;
|
|
252
256
|
cards: CustomCardsCardBuilderEntry[];
|
|
253
257
|
}
|
|
254
258
|
export interface GoogleReviewsBuilderState {
|
|
@@ -42,7 +42,7 @@ export const DEFAULT_PRODUCTS_BUILDER = {
|
|
|
42
42
|
manualResourceIds: "",
|
|
43
43
|
filterByCategory: "",
|
|
44
44
|
maxCount: 10,
|
|
45
|
-
loop:
|
|
45
|
+
loop: true,
|
|
46
46
|
};
|
|
47
47
|
export const DEFAULT_AUCTIONS_BUILDER = {
|
|
48
48
|
title: "Live Auctions",
|
|
@@ -57,7 +57,7 @@ export const DEFAULT_AUCTIONS_BUILDER = {
|
|
|
57
57
|
manualResourceIds: "",
|
|
58
58
|
filterByCategory: "",
|
|
59
59
|
maxCount: 10,
|
|
60
|
-
loop:
|
|
60
|
+
loop: true,
|
|
61
61
|
};
|
|
62
62
|
const DEFAULT_STAT_ROW = {
|
|
63
63
|
source: "static",
|
|
@@ -89,7 +89,7 @@ export const DEFAULT_PRE_ORDERS_BUILDER = {
|
|
|
89
89
|
manualResourceIds: "",
|
|
90
90
|
filterByCategory: "",
|
|
91
91
|
maxCount: 10,
|
|
92
|
-
loop:
|
|
92
|
+
loop: true,
|
|
93
93
|
};
|
|
94
94
|
export const DEFAULT_STORES_BUILDER = {
|
|
95
95
|
title: "Featured Stores",
|
|
@@ -105,7 +105,7 @@ export const DEFAULT_STORES_BUILDER = {
|
|
|
105
105
|
manualResourceIds: "",
|
|
106
106
|
filterByCategory: "",
|
|
107
107
|
maxCount: 10,
|
|
108
|
-
loop:
|
|
108
|
+
loop: true,
|
|
109
109
|
};
|
|
110
110
|
export const DEFAULT_EVENTS_BUILDER = {
|
|
111
111
|
title: "Events & Offers",
|
|
@@ -121,7 +121,7 @@ export const DEFAULT_EVENTS_BUILDER = {
|
|
|
121
121
|
manualResourceIds: "",
|
|
122
122
|
filterByCategory: "",
|
|
123
123
|
maxCount: 10,
|
|
124
|
-
loop:
|
|
124
|
+
loop: true,
|
|
125
125
|
};
|
|
126
126
|
export const DEFAULT_SOCIAL_FEED_BUILDER = {
|
|
127
127
|
title: "",
|
|
@@ -156,6 +156,7 @@ export const DEFAULT_CATEGORIES_BUILDER = {
|
|
|
156
156
|
maxCategories: 8,
|
|
157
157
|
autoScroll: false,
|
|
158
158
|
scrollInterval: 5000,
|
|
159
|
+
loop: true,
|
|
159
160
|
};
|
|
160
161
|
export const DEFAULT_BRANDS_BUILDER = {
|
|
161
162
|
title: "Top Brands",
|
|
@@ -163,6 +164,7 @@ export const DEFAULT_BRANDS_BUILDER = {
|
|
|
163
164
|
maxBrands: 13,
|
|
164
165
|
autoScroll: true,
|
|
165
166
|
scrollInterval: 4000,
|
|
167
|
+
loop: true,
|
|
166
168
|
};
|
|
167
169
|
export const DEFAULT_BANNER_BUILDER = {
|
|
168
170
|
height: "lg",
|
|
@@ -187,6 +189,7 @@ export const DEFAULT_REVIEWS_BUILDER = {
|
|
|
187
189
|
itemsPerView: 3,
|
|
188
190
|
autoScroll: true,
|
|
189
191
|
scrollInterval: 5000,
|
|
192
|
+
loop: true,
|
|
190
193
|
source: "platform",
|
|
191
194
|
placeId: "",
|
|
192
195
|
};
|
|
@@ -237,6 +240,7 @@ export const DEFAULT_CUSTOM_CARDS_BUILDER = {
|
|
|
237
240
|
columns: 3,
|
|
238
241
|
autoScroll: false,
|
|
239
242
|
scrollIntervalMs: 4000,
|
|
243
|
+
loop: true,
|
|
240
244
|
cards: [],
|
|
241
245
|
};
|
|
242
246
|
export const DEFAULT_GOOGLE_REVIEWS_BUILDER = {
|
|
@@ -32,6 +32,6 @@ export declare function useAdminListingData<TResponse, TRow extends {
|
|
|
32
32
|
}>({ queryKey, endpoint, page, pageSize, sorts, filters, q, mapRows, getTotal, }: UseAdminListingDataOptions<TResponse, TRow>): UseAdminListingDataResult<TRow>;
|
|
33
33
|
export declare function toRecordArray(value: unknown): ListingItemRecord[];
|
|
34
34
|
export declare function toStringValue(value: unknown, fallback?: string): string;
|
|
35
|
-
export declare function
|
|
35
|
+
export declare function toCurrency(value: unknown): string;
|
|
36
36
|
export declare function toRelativeDate(value: unknown): string;
|
|
37
37
|
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
import { apiClient, ApiClientError } from "../../../http";
|
|
4
|
+
import { formatCurrency } from "../../../utils/number.formatter";
|
|
4
5
|
function withQueryParams(endpoint, params) {
|
|
5
6
|
const hasQuery = endpoint.includes("?");
|
|
6
7
|
const query = new URLSearchParams(params).toString();
|
|
@@ -49,11 +50,11 @@ export function toStringValue(value, fallback = "-") {
|
|
|
49
50
|
}
|
|
50
51
|
return fallback;
|
|
51
52
|
}
|
|
52
|
-
export function
|
|
53
|
+
export function toCurrency(value) {
|
|
53
54
|
if (typeof value !== "number" || Number.isNaN(value)) {
|
|
54
55
|
return "-";
|
|
55
56
|
}
|
|
56
|
-
return
|
|
57
|
+
return formatCurrency(value);
|
|
57
58
|
}
|
|
58
59
|
export function toRelativeDate(value) {
|
|
59
60
|
const date = parseDate(value);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Covers: notifications, chat rooms, site settings
|
|
4
4
|
*/
|
|
5
5
|
export declare const ADMIN_CHECKOUT_BYPASS_FLAG_KEY: "adminCheckoutBypass";
|
|
6
|
-
export type NotificationType = "order_placed" | "order_confirmed" | "order_shipped" | "order_delivered" | "order_cancelled" | "bid_placed" | "bid_outbid" | "bid_won" | "bid_lost" | "review_approved" | "review_replied" | "product_available" | "promotion" | "system" | "welcome" | "account_action" | "offer_received" | "offer_responded" | "offer_expired" | "offer_counter_accepted" | "refund_initiated" | "prize_reveal_ready" | "prize_reveal_expired" | "prize_reveal_reminder" | "emi_installment_due_soon" | "emi_installment_overdue";
|
|
6
|
+
export type NotificationType = "order_placed" | "order_confirmed" | "order_shipped" | "order_delivered" | "order_cancelled" | "bid_placed" | "bid_outbid" | "bid_won" | "bid_lost" | "review_approved" | "review_replied" | "product_available" | "promotion" | "system" | "welcome" | "account_action" | "offer_received" | "offer_responded" | "offer_expired" | "offer_counter_accepted" | "refund_initiated" | "prize_reveal_ready" | "prize_reveal_expired" | "prize_reveal_reminder" | "emi_installment_due_soon" | "emi_installment_overdue" | "payment_review";
|
|
7
7
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
8
8
|
export type NotificationPriority = "low" | "normal" | "high";
|
|
9
9
|
export interface NotificationDocument extends BaseDocument {
|
|
@@ -288,12 +288,14 @@ export interface SiteSettingsDocument extends BaseDocument {
|
|
|
288
288
|
razorpayEnabled: boolean;
|
|
289
289
|
upiManualEnabled: boolean;
|
|
290
290
|
codEnabled: boolean;
|
|
291
|
+
/** Tier PP — cart total (rupees) at/above which checkout requires OTP verification. Applies to all payment methods except COD. Optional — falls back to no OTP gate when unset. */
|
|
292
|
+
otpCheckoutThreshold?: number;
|
|
291
293
|
};
|
|
292
294
|
/** Site-wide EMI (installment) settings. A seller must ALSO have `StoreDocument.emiEnabled` on for EMI to appear at checkout for their items. */
|
|
293
295
|
emi: {
|
|
294
296
|
enabled: boolean;
|
|
295
|
-
/**
|
|
296
|
-
|
|
297
|
+
/** Decimal rupees — a seller's cart subtotal must exceed this for EMI to appear as an option. */
|
|
298
|
+
minOrderValue: number;
|
|
297
299
|
tenureOptions: number[];
|
|
298
300
|
/** Down payment % collected at checkout. */
|
|
299
301
|
tokenPercent: number;
|
|
@@ -314,8 +316,8 @@ export interface SiteSettingsDocument extends BaseDocument {
|
|
|
314
316
|
/** Razorpay gateway cost % (absorbed by platform, not passed through separately). */
|
|
315
317
|
gatewayFeePercent: number;
|
|
316
318
|
codDepositPercent: number;
|
|
317
|
-
/** COD handling fee charged to the buyer: max(
|
|
318
|
-
|
|
319
|
+
/** COD handling fee charged to the buyer: max(codHandlingFeeMin, subtotal × codHandlingFeePercent / 100). */
|
|
320
|
+
codHandlingFeeMin: number;
|
|
319
321
|
codHandlingFeePercent: number;
|
|
320
322
|
sellerShippingFixed: number;
|
|
321
323
|
platformShippingPercent: number;
|
|
@@ -331,10 +333,10 @@ export interface SiteSettingsDocument extends BaseDocument {
|
|
|
331
333
|
promotedSlotFee?: number;
|
|
332
334
|
};
|
|
333
335
|
/** Procurement Shipments (Feature A) — the hourly rate used to compute a
|
|
334
|
-
* shipment's
|
|
336
|
+
* shipment's laborCost, and the daily-hour cap used to project
|
|
335
337
|
* estimatedProcessingDays. */
|
|
336
338
|
laborRate: {
|
|
337
|
-
|
|
339
|
+
hourlyRate: number;
|
|
338
340
|
maxHoursPerDay: number;
|
|
339
341
|
};
|
|
340
342
|
/** P-8 GST — Indian tax compliance. Distinct from commissions.gstPercent
|
|
@@ -170,10 +170,11 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
|
|
|
170
170
|
razorpayEnabled: false,
|
|
171
171
|
upiManualEnabled: true,
|
|
172
172
|
codEnabled: true,
|
|
173
|
+
otpCheckoutThreshold: 5000,
|
|
173
174
|
},
|
|
174
175
|
emi: {
|
|
175
176
|
enabled: false,
|
|
176
|
-
|
|
177
|
+
minOrderValue: 10000,
|
|
177
178
|
tenureOptions: [2, 3, 4, 5, 6],
|
|
178
179
|
tokenPercent: 10,
|
|
179
180
|
billingDay: 5,
|
|
@@ -186,7 +187,7 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
|
|
|
186
187
|
minimumTransactionFee: 0,
|
|
187
188
|
gatewayFeePercent: 2,
|
|
188
189
|
codDepositPercent: 10,
|
|
189
|
-
|
|
190
|
+
codHandlingFeeMin: 200,
|
|
190
191
|
codHandlingFeePercent: 10,
|
|
191
192
|
sellerShippingFixed: 0,
|
|
192
193
|
platformShippingPercent: 10,
|
|
@@ -200,7 +201,7 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
|
|
|
200
201
|
promotedSlotFee: 499,
|
|
201
202
|
},
|
|
202
203
|
laborRate: {
|
|
203
|
-
|
|
204
|
+
hourlyRate: 200,
|
|
204
205
|
maxHoursPerDay: 6,
|
|
205
206
|
},
|
|
206
207
|
gst: {
|
|
@@ -6,12 +6,12 @@ import { Badge, Button, Div, Row, Span, Stack, Text } from "../../../ui";
|
|
|
6
6
|
const __O = {
|
|
7
7
|
hidden: "overflow-hidden",
|
|
8
8
|
};
|
|
9
|
-
function
|
|
9
|
+
function formatBidAmount(amount) {
|
|
10
10
|
return new Intl.NumberFormat("en-IN", {
|
|
11
11
|
style: "currency",
|
|
12
12
|
currency: "INR",
|
|
13
13
|
maximumFractionDigits: 0,
|
|
14
|
-
}).format(amount
|
|
14
|
+
}).format(amount);
|
|
15
15
|
}
|
|
16
16
|
function relDate(d) {
|
|
17
17
|
const ms = new Date(d).getTime();
|
|
@@ -54,7 +54,7 @@ function AuctionRow({ auction, portal, }) {
|
|
|
54
54
|
const sorted = useMemo(() => [...auction.bids].sort((a, b) => b.bidAmount - a.bidAmount), [auction.bids]);
|
|
55
55
|
const highest = sorted[0]?.bidAmount ?? 0;
|
|
56
56
|
const isWinning = auction.bids.some((b) => b.isWinning);
|
|
57
|
-
return (_jsxs(Div, { className: `border border-[var(--appkit-color-border)] ${__O.hidden} bg-[var(--appkit-color-surface)]`, rounded: "xl", shadow: "sm", children: [_jsxs(Button, { type: "button", variant: "ghost", onClick: () => setExpanded((v) => !v), gap: "lg", paddingX: "md", paddingY: "md", className: "w-full text-left", "aria-expanded": expanded, children: [_jsx(ChevronRight, { className: `shrink-0 text-[var(--appkit-color-text-muted)] transition-transform ${expanded ? "rotate-90" : ""}`, size: 16 }), _jsx(Div, { className: "flex-1 min-w-0", children: _jsx(Text, { className: "text-[var(--appkit-color-text)] line-clamp-1", size: "sm", weight: "semibold", children: auction.productTitle }) }), _jsxs(Row, { gap: "sm", className: "shrink-0", children: [isWinning && (_jsx(Badge, { variant: "active", children: "Winning" })), _jsxs(Text, { variant: "secondary", size: "xs", children: [auction.bids.length, " bid", auction.bids.length !== 1 ? "s" : ""] }), _jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "semibold", children:
|
|
57
|
+
return (_jsxs(Div, { className: `border border-[var(--appkit-color-border)] ${__O.hidden} bg-[var(--appkit-color-surface)]`, rounded: "xl", shadow: "sm", children: [_jsxs(Button, { type: "button", variant: "ghost", onClick: () => setExpanded((v) => !v), gap: "lg", paddingX: "md", paddingY: "md", className: "w-full text-left", "aria-expanded": expanded, children: [_jsx(ChevronRight, { className: `shrink-0 text-[var(--appkit-color-text-muted)] transition-transform ${expanded ? "rotate-90" : ""}`, size: 16 }), _jsx(Div, { className: "flex-1 min-w-0", children: _jsx(Text, { className: "text-[var(--appkit-color-text)] line-clamp-1", size: "sm", weight: "semibold", children: auction.productTitle }) }), _jsxs(Row, { gap: "sm", className: "shrink-0", children: [isWinning && (_jsx(Badge, { variant: "active", children: "Winning" })), _jsxs(Text, { variant: "secondary", size: "xs", children: [auction.bids.length, " bid", auction.bids.length !== 1 ? "s" : ""] }), _jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "semibold", children: formatBidAmount(highest) })] })] }), expanded && (_jsxs(Div, { className: "border-t border-[var(--appkit-color-border)]", children: [_jsxs(Div, { textSize: "xs", textWeight: "medium", paddingX: "x-md", paddingY: "y-xs", className: `grid text-[var(--appkit-color-text-muted)] uppercase tracking-wide border-b border-[var(--appkit-color-border-subtle)] ${portal === "buyer" ? "[grid-template-columns:1fr_auto_auto]" : "[grid-template-columns:1fr_1fr_auto_auto]"}`, children: [_jsx(Span, { children: portal === "buyer" ? "Amount" : "Bidder" }), portal !== "buyer" && _jsx(Span, { children: "Amount" }), _jsx(Span, { children: "Status" }), _jsx(Span, { className: "text-right", children: "Time" })] }), sorted.map((bid) => (_jsxs(Div, { layout: "grid", align: "center", paddingX: "x-md", paddingY: "y-xs-tall", className: `border-b border-[var(--appkit-color-border-subtle)] last:border-0 hover:bg-[var(--appkit-color-border-subtle)] transition-colors ${portal === "buyer" ? "[grid-template-columns:1fr_auto_auto]" : "[grid-template-columns:1fr_1fr_auto_auto]"}`, children: [portal !== "buyer" && (_jsx(Text, { className: "text-[var(--appkit-color-text)] truncate pr-[0.75rem]", size: "sm", children: bid.userName || bid.userId })), _jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: formatBidAmount(bid.bidAmount) }), _jsx(Badge, { variant: STATUS_VARIANT[bid.status] ?? "pending", className: "capitalize", children: bid.status }), _jsx(Text, { variant: "secondary", size: "xs", align: "end", children: relDate(bid.bidDate) })] }, bid.id)))] }))] }));
|
|
58
58
|
}
|
|
59
59
|
export function AuctionBidsTable({ bids, portal = "buyer", emptyLabel = "No bids found.", }) {
|
|
60
60
|
const auctions = useMemo(() => groupByAuction(bids), [bids]);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkout Value OTP — Tier PP.
|
|
3
|
+
*
|
|
4
|
+
* A distinct OTP purpose from `consent-otp.ts` (which gates third-party
|
|
5
|
+
* shipping consent): this one gates placing a checkout ≥ the site's
|
|
6
|
+
* `payment.otpCheckoutThreshold` (skipped for COD — see
|
|
7
|
+
* `createCheckoutOrderAction`). Deliberately a SEPARATE Firestore namespace
|
|
8
|
+
* (`checkoutValueOtps` vs `consentOtps`) rather than reusing the shipping-
|
|
9
|
+
* consent one — different purpose, different copy, independently tunable
|
|
10
|
+
* rate limits. Reuses `generateOtpCode()`/`hashOtp()` from `consent-otp.ts`
|
|
11
|
+
* rather than duplicating the crypto.
|
|
12
|
+
*/
|
|
13
|
+
import { generateOtpCode, hashOtp } from "./consent-otp";
|
|
14
|
+
export { generateOtpCode, hashOtp };
|
|
15
|
+
/** OTP validity window (10 minutes) — matches consent-OTP's window; independently tunable if policy diverges later. */
|
|
16
|
+
export declare const CHECKOUT_VALUE_OTP_EXPIRY_MS: number;
|
|
17
|
+
export declare const CHECKOUT_VALUE_OTP_EXPIRY_MINUTES = 10;
|
|
18
|
+
/** Per-user send cooldown (15 minutes). */
|
|
19
|
+
export declare const CHECKOUT_VALUE_OTP_COOLDOWN_MS: number;
|
|
20
|
+
/** Maximum failed verification attempts before the OTP is locked. */
|
|
21
|
+
export declare const CHECKOUT_VALUE_OTP_MAX_ATTEMPTS = 5;
|
|
22
|
+
/** Rate-limit config for the verify endpoint / action (10 attempts per 5 min). */
|
|
23
|
+
export declare const CHECKOUT_VALUE_OTP_VERIFY_RATE_LIMIT: {
|
|
24
|
+
readonly limit: 10;
|
|
25
|
+
readonly window: 300;
|
|
26
|
+
};
|
|
27
|
+
type Db = FirebaseFirestore.Firestore;
|
|
28
|
+
/**
|
|
29
|
+
* Single-slot doc per user — unlike consent OTP (one per address), a buyer
|
|
30
|
+
* can only be mid-checkout once, so there's no per-context key needed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkoutValueOtpRef(db: Db, uid: string): FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
|
|
33
|
+
export declare function checkoutValueOtpRateLimitRef(db: Db, uid: string): FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
|
|
34
|
+
export interface CheckoutValueOtpDoc {
|
|
35
|
+
codeHash: string;
|
|
36
|
+
expiresAt: FirebaseFirestore.Timestamp;
|
|
37
|
+
attempts: number;
|
|
38
|
+
verified: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Enforce the per-user send rate-limit.
|
|
42
|
+
* Throws AuthorizationError("checkoutValueOtpRateLimit") when throttled.
|
|
43
|
+
*/
|
|
44
|
+
export declare function enforceCheckoutValueOtpRateLimit(db: Db, uid: string): Promise<void>;
|
|
45
|
+
/** Build the checkout-value OTP WhatsApp/SMS message body. */
|
|
46
|
+
export declare function buildCheckoutValueOtpMessage(code: string, siteName: string): string;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkout Value OTP — Tier PP.
|
|
3
|
+
*
|
|
4
|
+
* A distinct OTP purpose from `consent-otp.ts` (which gates third-party
|
|
5
|
+
* shipping consent): this one gates placing a checkout ≥ the site's
|
|
6
|
+
* `payment.otpCheckoutThreshold` (skipped for COD — see
|
|
7
|
+
* `createCheckoutOrderAction`). Deliberately a SEPARATE Firestore namespace
|
|
8
|
+
* (`checkoutValueOtps` vs `consentOtps`) rather than reusing the shipping-
|
|
9
|
+
* consent one — different purpose, different copy, independently tunable
|
|
10
|
+
* rate limits. Reuses `generateOtpCode()`/`hashOtp()` from `consent-otp.ts`
|
|
11
|
+
* rather than duplicating the crypto.
|
|
12
|
+
*/
|
|
13
|
+
import { AuthorizationError } from "../../errors";
|
|
14
|
+
import { resolveDate } from "../../utils";
|
|
15
|
+
import { USER_COLLECTION } from "./schemas";
|
|
16
|
+
import { generateOtpCode, hashOtp } from "./consent-otp";
|
|
17
|
+
export { generateOtpCode, hashOtp };
|
|
18
|
+
/** OTP validity window (10 minutes) — matches consent-OTP's window; independently tunable if policy diverges later. */
|
|
19
|
+
export const CHECKOUT_VALUE_OTP_EXPIRY_MS = 10 * 60 * 1000;
|
|
20
|
+
export const CHECKOUT_VALUE_OTP_EXPIRY_MINUTES = 10;
|
|
21
|
+
/** Per-user send cooldown (15 minutes). */
|
|
22
|
+
export const CHECKOUT_VALUE_OTP_COOLDOWN_MS = 15 * 60 * 1000;
|
|
23
|
+
/** Maximum failed verification attempts before the OTP is locked. */
|
|
24
|
+
export const CHECKOUT_VALUE_OTP_MAX_ATTEMPTS = 5;
|
|
25
|
+
/** Rate-limit config for the verify endpoint / action (10 attempts per 5 min). */
|
|
26
|
+
export const CHECKOUT_VALUE_OTP_VERIFY_RATE_LIMIT = {
|
|
27
|
+
limit: 10,
|
|
28
|
+
window: 300,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Single-slot doc per user — unlike consent OTP (one per address), a buyer
|
|
32
|
+
* can only be mid-checkout once, so there's no per-context key needed.
|
|
33
|
+
*/
|
|
34
|
+
export function checkoutValueOtpRef(db, uid) {
|
|
35
|
+
return db
|
|
36
|
+
.collection(USER_COLLECTION)
|
|
37
|
+
.doc(uid)
|
|
38
|
+
.collection("checkoutValueOtps")
|
|
39
|
+
.doc("current");
|
|
40
|
+
}
|
|
41
|
+
export function checkoutValueOtpRateLimitRef(db, uid) {
|
|
42
|
+
return db
|
|
43
|
+
.collection(USER_COLLECTION)
|
|
44
|
+
.doc(uid)
|
|
45
|
+
.collection("checkoutValueOtpRateLimit")
|
|
46
|
+
.doc("meta");
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Enforce the per-user send rate-limit.
|
|
50
|
+
* Throws AuthorizationError("checkoutValueOtpRateLimit") when throttled.
|
|
51
|
+
*/
|
|
52
|
+
export async function enforceCheckoutValueOtpRateLimit(db, uid) {
|
|
53
|
+
const metaRef = checkoutValueOtpRateLimitRef(db, uid);
|
|
54
|
+
await db.runTransaction(async (tx) => {
|
|
55
|
+
const metaSnap = await tx.get(metaRef);
|
|
56
|
+
const meta = metaSnap.exists
|
|
57
|
+
? metaSnap.data()
|
|
58
|
+
: null;
|
|
59
|
+
const lastSentMs = resolveDate(meta?.lastSentAt)?.getTime() ?? 0;
|
|
60
|
+
const elapsed = Date.now() - lastSentMs;
|
|
61
|
+
if (elapsed < CHECKOUT_VALUE_OTP_COOLDOWN_MS) {
|
|
62
|
+
throw new AuthorizationError("checkoutValueOtpRateLimit");
|
|
63
|
+
}
|
|
64
|
+
tx.set(metaRef, { lastSentAt: new Date() }, { merge: true });
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/** Build the checkout-value OTP WhatsApp/SMS message body. */
|
|
68
|
+
export function buildCheckoutValueOtpMessage(code, siteName) {
|
|
69
|
+
return (`*${siteName} — Order Verification*\n\n` +
|
|
70
|
+
`Your verification code for this high-value order is: *${code}*\n\n` +
|
|
71
|
+
`This code expires in ${CHECKOUT_VALUE_OTP_EXPIRY_MINUTES} minutes. ` +
|
|
72
|
+
`If you did not request this, please ignore this message.`);
|
|
73
|
+
}
|
|
@@ -16,6 +16,12 @@ export declare class UserRepository extends BaseRepository<UserDocument> {
|
|
|
16
16
|
findByRole(role: UserRole): Promise<UserDocument[]>;
|
|
17
17
|
findVerified(limit?: number): Promise<UserDocument[]>;
|
|
18
18
|
findActive(limit?: number): Promise<UserDocument[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Cloud Functions: temporary hard-bans past their `hardBanExpiresAt` —
|
|
21
|
+
* the `hardBanReinstatement` sweep re-enables Auth login for these.
|
|
22
|
+
* Permanent bans (`hardBanExpiresAt` null/absent) never match this query.
|
|
23
|
+
*/
|
|
24
|
+
getExpiredHardBans(): Promise<UserDocument[]>;
|
|
19
25
|
update(uid: string, data: Partial<UserDocument>): Promise<UserDocument>;
|
|
20
26
|
markEmailAsVerified(uid: string): Promise<UserDocument>;
|
|
21
27
|
disable(uid: string): Promise<UserDocument>;
|
|
@@ -106,6 +106,25 @@ export class UserRepository extends BaseRepository {
|
|
|
106
106
|
throw new DatabaseError("Failed to fetch active users", error);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Cloud Functions: temporary hard-bans past their `hardBanExpiresAt` —
|
|
111
|
+
* the `hardBanReinstatement` sweep re-enables Auth login for these.
|
|
112
|
+
* Permanent bans (`hardBanExpiresAt` null/absent) never match this query.
|
|
113
|
+
*/
|
|
114
|
+
async getExpiredHardBans() {
|
|
115
|
+
try {
|
|
116
|
+
const snapshot = await this.getCollection()
|
|
117
|
+
.where(USER_FIELDS.IS_DISABLED, "==", true)
|
|
118
|
+
.where(USER_FIELDS.HARD_BAN_EXPIRES_AT, "<=", new Date())
|
|
119
|
+
.limit(500)
|
|
120
|
+
.get();
|
|
121
|
+
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
void normalizeError(error);
|
|
125
|
+
throw new DatabaseError("Failed to fetch expired hard bans", error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
109
128
|
async update(uid, data) {
|
|
110
129
|
const encrypted = this.encryptUserData(data);
|
|
111
130
|
return super.update(uid, encrypted);
|
|
@@ -44,6 +44,8 @@ export interface UserDocument extends BaseDocument {
|
|
|
44
44
|
passwordHash?: string;
|
|
45
45
|
emailVerified: boolean;
|
|
46
46
|
disabled: boolean;
|
|
47
|
+
/** Hard-ban flag — disables Firebase Auth login. Distinct from `disabled` (used elsewhere); read alongside `hardBanReason`/`hardBannedAt`/`hardBannedBy`. Set by `hardBanCascade`, cleared by `hardBanReinstatement` for temporary bans. */
|
|
48
|
+
isDisabled?: boolean;
|
|
47
49
|
storeId?: string;
|
|
48
50
|
storeSlug?: string;
|
|
49
51
|
storeStatus?: "pending" | "approved" | "rejected";
|
|
@@ -95,6 +97,12 @@ export interface UserDocument extends BaseDocument {
|
|
|
95
97
|
hardBanReason?: string;
|
|
96
98
|
hardBannedAt?: Date;
|
|
97
99
|
hardBannedBy?: string;
|
|
100
|
+
/** Null/absent = permanent hard ban (the default). A future Date makes this a temporary ban, auto-reinstated by the `hardBanReinstatement` sweep — mirrors `UserSoftBan.expiresAt`'s null-vs-past-date convention. Set only by the payment-fraud-reject path today. */
|
|
101
|
+
hardBanExpiresAt?: Date | null;
|
|
102
|
+
/** Order that triggered a fraud-rejection ban, for traceability. */
|
|
103
|
+
hardBanFraudOrderId?: string;
|
|
104
|
+
/** Stamped by `hardBanReinstatement` when a temporary ban's `hardBanExpiresAt` passes and login is re-enabled. `hardBanReason`/`hardBannedAt`/`hardBannedBy`/`hardBanExpiresAt` are left in place as historical record — not cleared. */
|
|
105
|
+
hardBanReinstatedAt?: Date;
|
|
98
106
|
/** Timestamp when user confirmed they read the scam awareness guide. Required before full platform access. */
|
|
99
107
|
scamAwarenessAcknowledgedAt?: Date;
|
|
100
108
|
/** User-controlled notification channel and type preferences. */
|
|
@@ -206,6 +214,8 @@ export declare const USER_FIELDS: {
|
|
|
206
214
|
readonly PASSWORD_HASH: "passwordHash";
|
|
207
215
|
readonly EMAIL_VERIFIED: "emailVerified";
|
|
208
216
|
readonly DISABLED: "disabled";
|
|
217
|
+
readonly IS_DISABLED: "isDisabled";
|
|
218
|
+
readonly HARD_BAN_EXPIRES_AT: "hardBanExpiresAt";
|
|
209
219
|
readonly CREATED_AT: "createdAt";
|
|
210
220
|
readonly UPDATED_AT: "updatedAt";
|
|
211
221
|
readonly STORE_ID: "storeId";
|
|
@@ -102,6 +102,8 @@ export const USER_FIELDS = {
|
|
|
102
102
|
PASSWORD_HASH: "passwordHash",
|
|
103
103
|
EMAIL_VERIFIED: "emailVerified",
|
|
104
104
|
DISABLED: "disabled",
|
|
105
|
+
IS_DISABLED: "isDisabled",
|
|
106
|
+
HARD_BAN_EXPIRES_AT: "hardBanExpiresAt",
|
|
105
107
|
CREATED_AT: "createdAt",
|
|
106
108
|
UPDATED_AT: "updatedAt",
|
|
107
109
|
STORE_ID: "storeId",
|
|
@@ -14,4 +14,4 @@ export declare function mergeGuestCart(userId: string, items: Array<{
|
|
|
14
14
|
quantity: number;
|
|
15
15
|
}>): Promise<void>;
|
|
16
16
|
export declare function getCart(userId: string): Promise<CartDocument | null>;
|
|
17
|
-
export declare function updateCartItemShipping(userId: string, itemId: string, providerId: string,
|
|
17
|
+
export declare function updateCartItemShipping(userId: string, itemId: string, providerId: string, fee: number): Promise<CartDocument>;
|
|
@@ -77,11 +77,11 @@ export async function mergeGuestCart(userId, items) {
|
|
|
77
77
|
export async function getCart(userId) {
|
|
78
78
|
return cartRepository.findByUserId(userId);
|
|
79
79
|
}
|
|
80
|
-
export async function updateCartItemShipping(userId, itemId, providerId,
|
|
80
|
+
export async function updateCartItemShipping(userId, itemId, providerId, fee) {
|
|
81
81
|
if (!itemId || !providerId)
|
|
82
82
|
throw new ValidationError("itemId and providerId are required");
|
|
83
|
-
if (!Number.isFinite(
|
|
84
|
-
throw new ValidationError("
|
|
83
|
+
if (!Number.isFinite(fee) || fee < 0) {
|
|
84
|
+
throw new ValidationError("fee must be a non-negative number");
|
|
85
85
|
}
|
|
86
|
-
return cartRepository.updateItemShipping(userId, itemId, providerId,
|
|
86
|
+
return cartRepository.updateItemShipping(userId, itemId, providerId, fee);
|
|
87
87
|
}
|
|
@@ -11,11 +11,11 @@ export interface ShippingPickerProps {
|
|
|
11
11
|
providers: ShippingProviderConfig[];
|
|
12
12
|
/** Currently persisted provider id (from CartItemDocument.chosenShippingProviderId). */
|
|
13
13
|
selectedProviderId?: string;
|
|
14
|
-
/** Order subtotal
|
|
15
|
-
|
|
14
|
+
/** Order subtotal, decimal rupees — used to evaluate freeAbove + percentOfOrder rules. */
|
|
15
|
+
subtotal?: number;
|
|
16
16
|
/** Called when the buyer picks (or changes) a provider. */
|
|
17
|
-
onPickProvider: (providerId: string,
|
|
17
|
+
onPickProvider: (providerId: string, fee: number) => void | Promise<void>;
|
|
18
18
|
isLoading?: boolean;
|
|
19
19
|
className?: string;
|
|
20
20
|
}
|
|
21
|
-
export declare function ShippingPicker({ providers, selectedProviderId,
|
|
21
|
+
export declare function ShippingPicker({ providers, selectedProviderId, subtotal, onPickProvider, isLoading, className, }: ShippingPickerProps): React.JSX.Element;
|