@mohasinac/appkit 4.53.2 → 4.54.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/.build-stamp.json +3 -3
- package/dist/_internal/server/features/auth/capabilities.js +7 -5
- package/dist/_internal/server/features/checkout/actions.d.ts +22 -6
- package/dist/_internal/server/features/checkout/actions.js +96 -51
- package/dist/_internal/server/features/checkout/index.d.ts +1 -1
- package/dist/_internal/server/features/checkout/index.js +1 -1
- package/dist/_internal/server/features/checkout/supplier-identity.js +28 -6
- package/dist/_internal/server/features/orders/adapters.js +1 -3
- package/dist/_internal/server/features/products/listing-tab-counts.js +81 -25
- package/dist/_internal/server/features/search/index-build/sources.js +43 -2
- package/dist/_internal/server/features/site-settings/adapters.js +1 -1
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +0 -1
- package/dist/_internal/server/jobs/core/analyticsAlertEvaluate.js +2 -5
- package/dist/_internal/server/jobs/core/jobRunners.js +0 -10
- package/dist/_internal/server/jobs/core/onOrderCreate.js +10 -104
- package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +0 -2
- package/dist/_internal/server/jobs/core/onOrderStatusChange.js +0 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +0 -1
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +0 -1
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +0 -1
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +0 -1
- package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +0 -1
- package/dist/_internal/server/notifications/channel-health.d.ts +7 -3
- package/dist/_internal/server/notifications/channel-health.js +2 -2
- package/dist/_internal/server/notifications/send-guard.d.ts +1 -1
- package/dist/_internal/server/notifications/send-guard.js +2 -4
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +128 -28
- package/dist/_internal/shared/checkout/order-math.d.ts +1 -1
- package/dist/_internal/shared/checkout/order-math.js +1 -1
- package/dist/_internal/shared/features/categories/bundle-copy.d.ts +1 -1
- package/dist/_internal/shared/features/checkout/config.d.ts +0 -2
- package/dist/_internal/shared/features/checkout/config.js +0 -2
- package/dist/_internal/shared/features/messaging/config.d.ts +7 -5
- package/dist/_internal/shared/features/messaging/config.js +1 -4
- package/dist/_internal/shared/features/site-settings/fees.d.ts +0 -2
- package/dist/_internal/shared/features/site-settings/fees.js +0 -2
- package/dist/_internal/shared/features/site-settings/supplier-of-record.d.ts +56 -0
- package/dist/_internal/shared/features/site-settings/supplier-of-record.js +57 -0
- package/dist/_internal/shared/fees/calculator.d.ts +0 -8
- package/dist/_internal/shared/fees/calculator.js +0 -7
- package/dist/_internal/shared/listing-types/tiers.d.ts +94 -0
- package/dist/_internal/shared/listing-types/tiers.js +150 -0
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +25 -4
- package/dist/client.js +36 -5
- package/dist/constants/api-endpoints.d.ts +21 -15
- package/dist/constants/api-endpoints.js +7 -8
- package/dist/constants/field-names.d.ts +1 -0
- package/dist/constants/field-names.js +1 -0
- package/dist/constants/notification-types.d.ts +1 -1
- package/dist/constants/notification-types.js +1 -1
- package/dist/core/integration-keys.d.ts +5 -5
- package/dist/core/integration-keys.js +21 -10
- package/dist/features/about/components/FeesView.js +0 -6
- package/dist/features/about/components/GuidesHubView.js +15 -2
- package/dist/features/account/components/NotificationPreferencesPanel.js +3 -4
- package/dist/features/account/components/UserOrdersView.js +26 -7
- package/dist/features/account/types/index.d.ts +0 -2
- package/dist/features/addresses/utils/postal-autofill.d.ts +39 -0
- package/dist/features/addresses/utils/postal-autofill.js +54 -0
- package/dist/features/admin/actions/notification-actions.d.ts +2 -8
- package/dist/features/admin/actions/notification-actions.js +9 -104
- package/dist/features/admin/components/AdminGuideHubView.js +1 -8
- package/dist/features/admin/components/AdminOrderEditorView.d.ts +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +0 -2
- package/dist/features/admin/components/AdminSectionsView.js +3 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +22 -68
- package/dist/features/admin/components/AdminStoreEditorView.js +72 -34
- package/dist/features/admin/components/OwnerQuickActions.d.ts +29 -0
- package/dist/features/admin/components/OwnerQuickActions.js +142 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +13 -4
- package/dist/features/admin/components/sections/icon-options.d.ts +21 -0
- package/dist/features/admin/components/sections/icon-options.js +23 -0
- package/dist/features/admin/components/sections/sectionTemplates.js +4 -1
- package/dist/features/admin/constants/site-settings-tabs.d.ts +7 -12
- package/dist/features/admin/constants/site-settings-tabs.js +6 -12
- package/dist/features/admin/repository/site-settings.repository.js +1 -1
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +1 -1
- package/dist/features/admin/schemas/admin-editor-forms.js +4 -1
- package/dist/features/admin/schemas/admin-user-form.d.ts +0 -61
- package/dist/features/admin/schemas/admin-user-form.js +3 -44
- package/dist/features/admin/schemas/firestore.d.ts +28 -54
- package/dist/features/admin/schemas/firestore.js +40 -18
- package/dist/features/auctions/components/AuctionDetailPageView.js +4 -3
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +9 -2
- package/dist/features/auth/checkout-value-otp.d.ts +1 -1
- package/dist/features/auth/checkout-value-otp.js +1 -1
- package/dist/features/auth/permissions/constants.d.ts +29 -2
- package/dist/features/auth/permissions/constants.js +67 -1
- package/dist/features/blog/components/BlogFeaturedCard.d.ts +11 -1
- package/dist/features/blog/components/BlogFeaturedCard.js +9 -2
- package/dist/features/cart/components/CartDrawer.js +3 -2
- package/dist/features/cart/components/CartGroupLineRow.js +2 -1
- package/dist/features/cart/components/CartPriceBreakdown.d.ts +0 -2
- package/dist/features/cart/components/CartPriceBreakdown.js +1 -1
- package/dist/features/cart/components/StoreAddonsPicker.d.ts +2 -5
- package/dist/features/cart/components/StoreAddonsPicker.js +4 -5
- package/dist/features/cart/hooks/useAddToCart.js +10 -5
- package/dist/features/cart/repository/cart.repository.js +1 -2
- package/dist/features/cart/schemas/firestore.d.ts +1 -2
- package/dist/features/cart/utils/pending-ops.d.ts +11 -1
- package/dist/features/cart/utils/pending-ops.js +14 -2
- package/dist/features/categories/components/BrandDetailPageView.js +2 -1
- package/dist/features/categories/components/BundleDetailView.js +2 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +2 -1
- package/dist/features/categories/components/CategoryGrid.d.ts +11 -1
- package/dist/features/categories/components/CategoryGrid.js +9 -2
- package/dist/features/checkout/actions/checkout-value-otp-actions.d.ts +10 -5
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +2 -88
- package/dist/features/classified/components/ClassifiedDetailPageView.js +2 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +2 -1
- package/dist/features/events/components/EventCard.d.ts +11 -1
- package/dist/features/events/components/EventCard.js +9 -2
- package/dist/features/grouped/components/GroupedListingDetailView.js +3 -1
- package/dist/features/homepage/components/CTABannerSection.d.ts +3 -1
- package/dist/features/homepage/components/CTABannerSection.js +6 -3
- package/dist/features/homepage/components/HeroCarousel.js +8 -6
- package/dist/features/homepage/components/MarketplaceHomepageView.js +33 -7
- package/dist/features/homepage/components/SectionCarousel.js +13 -5
- package/dist/features/homepage/components/SecurityHighlightsSection.d.ts +8 -3
- package/dist/features/homepage/components/SecurityHighlightsSection.js +2 -2
- package/dist/features/homepage/components/StatsCounterSection.d.ts +9 -4
- package/dist/features/homepage/components/StatsCounterSection.js +2 -2
- package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
- package/dist/features/homepage/components/TrustFeaturesSection.d.ts +18 -4
- package/dist/features/homepage/components/TrustFeaturesSection.js +5 -5
- package/dist/features/homepage/components/WelcomeSection.d.ts +13 -2
- package/dist/features/homepage/components/WelcomeSection.js +3 -3
- package/dist/features/homepage/components/WhatsAppCommunitySection.d.ts +28 -0
- package/dist/features/homepage/components/WhatsAppCommunitySection.js +42 -6
- package/dist/features/homepage/components/WhatsAppGlyph.d.ts +20 -0
- package/dist/features/homepage/components/WhatsAppGlyph.js +20 -0
- package/dist/features/homepage/constants/hero-carousel-styles.d.ts +8 -6
- package/dist/features/homepage/constants/hero-carousel-styles.js +8 -6
- package/dist/features/homepage/constants/section-copy.d.ts +12 -10
- package/dist/features/homepage/constants/section-copy.js +28 -6
- package/dist/features/homepage/constants/stat-icons.d.ts +12 -0
- package/dist/features/homepage/constants/stat-icons.js +17 -0
- package/dist/features/homepage/constants/trust-icon-aliases.d.ts +8 -0
- package/dist/features/homepage/constants/trust-icon-aliases.js +75 -0
- package/dist/features/homepage/lib/section-defaults.d.ts +16 -1
- package/dist/features/homepage/lib/section-defaults.js +24 -4
- package/dist/features/homepage/lib/section-renderer.js +48 -8
- package/dist/features/homepage/schemas/firestore.d.ts +18 -1
- package/dist/features/layout/AppLayoutShell.js +2 -1
- package/dist/features/layout/BottomActions.d.ts +1 -0
- package/dist/features/layout/BottomActions.js +330 -0
- package/dist/features/layout/BottomChrome.d.ts +45 -0
- package/dist/features/layout/BottomChrome.js +5 -17
- package/dist/features/layout/SideActionDock.js +36 -13
- package/dist/features/layout/index.d.ts +2 -7
- package/dist/features/layout/index.js +7 -7
- package/dist/features/layout/useIsDesktop.d.ts +36 -0
- package/dist/features/layout/useIsDesktop.js +48 -0
- package/dist/features/live/components/LiveItemDetailPageView.js +2 -1
- package/dist/features/orders/actions/refund-actions.js +0 -1
- package/dist/features/orders/components/OrderAddonBadges.d.ts +1 -3
- package/dist/features/orders/components/OrderAddonBadges.js +3 -4
- package/dist/features/orders/components/OrderPaymentSummary.js +15 -2
- package/dist/features/orders/components/YourPurchaseStrip.d.ts +24 -0
- package/dist/features/orders/components/YourPurchaseStrip.js +77 -0
- package/dist/features/orders/components/index.d.ts +2 -1
- package/dist/features/orders/components/index.js +1 -1
- package/dist/features/orders/repository/orders.repository.d.ts +0 -8
- package/dist/features/orders/repository/orders.repository.js +0 -2
- package/dist/features/orders/schemas/firestore.d.ts +17 -9
- package/dist/features/orders/types/index.d.ts +2 -5
- package/dist/features/orders/utils/order-announcement-message.d.ts +18 -0
- package/dist/features/orders/utils/order-announcement-message.js +16 -0
- package/dist/features/orders/utils/payment-proof-message.d.ts +20 -0
- package/dist/features/orders/utils/payment-proof-message.js +17 -0
- package/dist/features/parts/components/PartDetailPageView.js +96 -1
- package/dist/features/parts/schemas/firestore.d.ts +247 -0
- package/dist/features/parts/schemas/firestore.js +6 -6
- package/dist/features/pre-orders/components/MarketplacePreorderCard.d.ts +11 -1
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +10 -3
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -3
- package/dist/features/products/api/[id]/route.js +8 -1
- package/dist/features/products/api/route.js +16 -4
- package/dist/features/products/components/AvailabilityScopeHint.js +1 -1
- package/dist/features/products/components/InteractiveProductCard.d.ts +7 -1
- package/dist/features/products/components/InteractiveProductCard.js +16 -4
- package/dist/features/products/components/MarketplaceBundleCard.d.ts +11 -1
- package/dist/features/products/components/MarketplaceBundleCard.js +9 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.d.ts +11 -1
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +9 -2
- package/dist/features/products/components/PrizeDrawDetailPageView.js +2 -1
- package/dist/features/products/components/ProductDetailPageView.js +27 -2
- package/dist/features/products/components/ProductGrid.d.ts +14 -1
- package/dist/features/products/components/ProductGrid.js +22 -5
- package/dist/features/products/components/ProductsIndexListing.js +2 -2
- package/dist/features/reviews/api/[id]/route.js +83 -23
- package/dist/features/reviews/components/PurchaseReviewAffordance.d.ts +6 -0
- package/dist/features/reviews/components/PurchaseReviewAffordance.js +42 -0
- package/dist/features/reviews/components/ReviewFormDrawer.d.ts +34 -0
- package/dist/features/reviews/components/ReviewFormDrawer.js +127 -0
- package/dist/features/reviews/components/index.d.ts +4 -0
- package/dist/features/reviews/components/index.js +2 -0
- package/dist/features/scams/schemas/index.d.ts +10 -10
- package/dist/features/search/action-index/settings-entries.js +0 -9
- package/dist/features/seller/actions/seller-actions.d.ts +1 -1
- package/dist/features/seller/actions/seller-actions.js +49 -3
- package/dist/features/seller/components/SellerPayoutSettingsView.js +30 -2
- package/dist/features/seller/components/SellerProductShell.d.ts +17 -1
- package/dist/features/seller/hooks/useStoreListingEntitlements.d.ts +8 -0
- package/dist/features/seller/hooks/useStoreListingEntitlements.js +70 -0
- package/dist/features/store-extensions/repository/store-extensions.repositories.d.ts +1 -6
- package/dist/features/store-extensions/repository/store-extensions.repositories.js +1 -10
- package/dist/features/store-extensions/schemas/firestore.d.ts +1 -17
- package/dist/features/store-extensions/schemas/firestore.js +0 -10
- package/dist/features/stores/components/InteractiveStoreCard.d.ts +11 -1
- package/dist/features/stores/components/InteractiveStoreCard.js +9 -2
- package/dist/features/stores/components/StoreCapabilitiesGuideView.js +0 -1
- package/dist/features/stores/components/StoreGuideHubView.js +2 -8
- package/dist/features/stores/components/StoreSettingsGuideView.js +2 -6
- package/dist/features/stores/components/index.d.ts +0 -2
- package/dist/features/stores/components/index.js +0 -1
- package/dist/features/stores/repository/store.repository.d.ts +1 -26
- package/dist/features/stores/repository/store.repository.js +5 -60
- package/dist/features/stores/schemas/firestore.d.ts +6 -25
- package/dist/features/stores/schemas/firestore.js +6 -3
- package/dist/features/stores/schemas/index.d.ts +1 -87
- package/dist/features/stores/schemas/index.js +10 -15
- package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -48
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -40
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -16
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +1 -1
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -79
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +1 -1
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +415 -69
- package/dist/index.d.ts +20 -32
- package/dist/index.js +34 -43
- package/dist/next/routing/route-map.d.ts +2 -8
- package/dist/next/routing/route-map.js +21 -4
- package/dist/providers/db-firebase/base.repository.d.ts +1 -1
- package/dist/providers/db-firebase/base.repository.js +1 -1
- package/dist/providers/payment-razorpay/index.d.ts +125 -0
- package/dist/providers/payment-razorpay/index.js +232 -0
- package/dist/providers/payment-razorpay/signature.d.ts +53 -0
- package/dist/providers/payment-razorpay/signature.js +71 -0
- package/dist/providers/shipping-shiprocket/index.d.ts +98 -0
- package/dist/providers/shipping-shiprocket/index.js +356 -0
- package/dist/providers.d.ts +3 -0
- package/dist/providers.js +3 -0
- package/dist/react/hooks/useCanSeePrices.d.ts +0 -27
- package/dist/react/hooks/useCanSeePrices.js +25 -0
- package/dist/repositories/index.d.ts +1 -1
- package/dist/repositories/index.js +1 -1
- package/dist/schemas/registry.d.ts +10 -115
- package/dist/schemas/registry.js +1 -2
- package/dist/security/pii-encrypt.js +1 -1
- package/dist/seed/_helpers/category-forest.js +27 -0
- package/dist/seed/_helpers/category-parts-glossary-map.js +1816 -88
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +13399 -3019
- package/dist/seed/carousel-slides-seed-data.js +47 -10
- package/dist/seed/categories-seed-data.js +48 -6
- package/dist/seed/faq-seed-data.js +2 -2
- package/dist/seed/homepage-sections-seed-data.js +286 -54
- package/dist/seed/index.d.ts +1 -1
- package/dist/seed/index.js +1 -1
- package/dist/seed/manifest.d.ts +1 -1
- package/dist/seed/manifest.js +1 -2
- package/dist/seed/model-composition-seed-data.js +6 -8
- package/dist/seed/part-glossary/chunk0.d.ts +9 -0
- package/dist/seed/part-glossary/chunk0.js +35448 -0
- package/dist/seed/part-glossary/chunk1.d.ts +9 -0
- package/dist/seed/part-glossary/chunk1.js +40494 -0
- package/dist/seed/part-glossary/chunk2.d.ts +9 -0
- package/dist/seed/part-glossary/chunk2.js +51242 -0
- package/dist/seed/part-glossary/chunk3.d.ts +9 -0
- package/dist/seed/part-glossary/chunk3.js +53337 -0
- package/dist/seed/part-glossary/chunk4.d.ts +9 -0
- package/dist/seed/part-glossary/chunk4.js +51454 -0
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +23 -47483
- package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
- package/dist/seed/products-catalogue-seed-data.js +63936 -13803
- package/dist/seed/site-settings-seed-data.js +34 -35
- package/dist/seed/store-extensions-seed-data.d.ts +1 -2
- package/dist/seed/store-extensions-seed-data.js +1 -23
- package/dist/seed/stores-seed-data.js +0 -1
- package/dist/server-entry.d.ts +1 -1
- package/dist/server-entry.js +1 -1
- package/dist/server.d.ts +8 -10
- package/dist/server.js +16 -22
- package/dist/styles.css +392 -43
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +1 -1
- package/dist/tokens/themes/default-light.js +2 -1
- package/dist/tokens/tokens.css +6 -2
- package/dist/ui/components/Button.d.ts +11 -0
- package/dist/ui/components/Button.js +11 -0
- package/dist/ui/components/Button.style.css +29 -0
- package/dist/ui/components/CarouselNav.d.ts +57 -0
- package/dist/ui/components/CarouselNav.js +25 -0
- package/dist/ui/components/CarouselNav.style.css +265 -0
- package/dist/ui/components/GatedPrice.js +30 -3
- package/dist/ui/components/GatedPrice.style.css +43 -40
- package/dist/ui/components/HorizontalScroller.d.ts +12 -1
- package/dist/ui/components/HorizontalScroller.js +43 -3
- package/dist/ui/components/ImageMosaic.d.ts +8 -1
- package/dist/ui/components/ImageMosaic.js +3 -2
- package/dist/ui/components/ImageMosaic.style.css +22 -0
- package/dist/ui/components/Layout.style.css +6 -0
- package/dist/ui/components/Semantic.d.ts +3 -2
- package/dist/ui/components/Semantic.js +1 -0
- package/dist/ui/components/Typography.d.ts +2 -0
- package/dist/ui/components/Typography.js +2 -0
- package/dist/ui/components/Typography.style.css +19 -0
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/index.d.ts +3 -1
- package/dist/ui/index.js +4 -0
- package/package.json +3 -2
- package/dist/_internal/server/jobs/core/whatsappCatalogImport.d.ts +0 -27
- package/dist/_internal/server/jobs/core/whatsappCatalogImport.js +0 -172
- package/dist/_internal/server/jobs/core/whatsappNotify.d.ts +0 -35
- package/dist/_internal/server/jobs/core/whatsappNotify.js +0 -140
- package/dist/features/admin/components/AdminWhatsAppGuideView.d.ts +0 -2
- package/dist/features/admin/components/AdminWhatsAppGuideView.js +0 -35
- package/dist/features/orders/components/MarketplaceOrderCard.d.ts +0 -36
- package/dist/features/orders/components/MarketplaceOrderCard.js +0 -57
- package/dist/features/stores/components/StoreWhatsAppGuideView.d.ts +0 -3
- package/dist/features/stores/components/StoreWhatsAppGuideView.js +0 -12
- package/dist/features/whatsapp-bot/api/send-status/route.d.ts +0 -12
- package/dist/features/whatsapp-bot/api/send-status/route.js +0 -38
- package/dist/features/whatsapp-bot/api/webhook/route.d.ts +0 -12
- package/dist/features/whatsapp-bot/api/webhook/route.js +0 -43
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +0 -6
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +0 -270
- package/dist/features/whatsapp-bot/components/WhatsAppChatButton.d.ts +0 -9
- package/dist/features/whatsapp-bot/components/WhatsAppChatButton.js +0 -7
- package/dist/features/whatsapp-bot/components/index.d.ts +0 -3
- package/dist/features/whatsapp-bot/components/index.js +0 -2
- package/dist/features/whatsapp-bot/helpers/payment-proof-message.d.ts +0 -14
- package/dist/features/whatsapp-bot/helpers/payment-proof-message.js +0 -17
- package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +0 -52
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +0 -283
- package/dist/features/whatsapp-bot/index.d.ts +0 -3
- package/dist/features/whatsapp-bot/index.js +0 -3
- package/dist/features/whatsapp-bot/manifest.d.ts +0 -2
- package/dist/features/whatsapp-bot/manifest.js +0 -13
- package/dist/features/whatsapp-bot/messages/en.json +0 -7
- package/dist/features/whatsapp-bot/server.d.ts +0 -7
- package/dist/features/whatsapp-bot/server.js +0 -7
- package/dist/features/whatsapp-bot/types/index.d.ts +0 -126
- package/dist/features/whatsapp-bot/types/index.js +0 -1
|
@@ -111,6 +111,28 @@ export const ACTIONS = {
|
|
|
111
111
|
confirmLabel: "Delete listing",
|
|
112
112
|
},
|
|
113
113
|
},
|
|
114
|
+
/*
|
|
115
|
+
* Clone — ADMIN ONLY, and no confirmation.
|
|
116
|
+
*
|
|
117
|
+
* `POST /api/store/products/[id]/duplicate` already strips identity,
|
|
118
|
+
* analytics, auction bid state and group membership, titles the copy
|
|
119
|
+
* "… (Copy)" and forces `status: "draft"`. So it creates a draft and
|
|
120
|
+
* destroys nothing: a confirm dialog on a non-destructive action trains
|
|
121
|
+
* people to dismiss confirm dialogs.
|
|
122
|
+
*
|
|
123
|
+
* 🛑 `permissions: ["admin"]` is narrower than `edit`/`delete` above on
|
|
124
|
+
* purpose. A seller editing or deleting their own listing is ordinary;
|
|
125
|
+
* duplicating across the catalogue is a staff tool.
|
|
126
|
+
*/
|
|
127
|
+
duplicate: {
|
|
128
|
+
iconKey: "duplicate",
|
|
129
|
+
id: "product.duplicate",
|
|
130
|
+
label: "Duplicate",
|
|
131
|
+
ariaLabel: "Duplicate this listing as a draft",
|
|
132
|
+
description: "Copy this listing into a new draft, without its bids, analytics or group membership.",
|
|
133
|
+
kind: "secondary",
|
|
134
|
+
permissions: ["admin"],
|
|
135
|
+
},
|
|
114
136
|
"add-to-cart": {
|
|
115
137
|
iconKey: "cart",
|
|
116
138
|
id: "product.add-to-cart",
|
|
@@ -321,6 +343,43 @@ export const ACTIONS = {
|
|
|
321
343
|
kind: "primary",
|
|
322
344
|
categoryTypeScope: ["bundle"],
|
|
323
345
|
},
|
|
346
|
+
/*
|
|
347
|
+
* Edit and delete lived only in the ADMIN bucket (`delete-bundle`,
|
|
348
|
+
* `activate-bundle`, …), so a bundle's own surfaces had nothing
|
|
349
|
+
* resource-scoped to resolve against. Added here beside `buy-now` so the
|
|
350
|
+
* owner affordance keys on the resource it is acting on, like every other
|
|
351
|
+
* bucket.
|
|
352
|
+
*
|
|
353
|
+
* 🛑 No `duplicate`. A bundle's members, `bundleCategorySlugs` and
|
|
354
|
+
* `display.mosaicImages` are all resolved at WRITE time, so a copy would
|
|
355
|
+
* carry another bundle's resolved state.
|
|
356
|
+
*/
|
|
357
|
+
edit: {
|
|
358
|
+
iconKey: "edit",
|
|
359
|
+
id: "bundle.edit",
|
|
360
|
+
label: "Edit",
|
|
361
|
+
ariaLabel: "Edit bundle",
|
|
362
|
+
description: "Edit this bundle.",
|
|
363
|
+
kind: "secondary",
|
|
364
|
+
permissions: ["admin", "seller"],
|
|
365
|
+
categoryTypeScope: ["bundle"],
|
|
366
|
+
},
|
|
367
|
+
delete: {
|
|
368
|
+
iconKey: "delete",
|
|
369
|
+
id: "bundle.delete",
|
|
370
|
+
label: "Delete",
|
|
371
|
+
ariaLabel: "Delete bundle",
|
|
372
|
+
description: "Permanently delete this bundle.",
|
|
373
|
+
kind: "danger",
|
|
374
|
+
permissions: ["admin", "seller"],
|
|
375
|
+
categoryTypeScope: ["bundle"],
|
|
376
|
+
confirmation: {
|
|
377
|
+
title: "Delete this bundle?",
|
|
378
|
+
body: "This cannot be undone. The products inside it are NOT deleted — only the bundle that groups them and its discounted price.",
|
|
379
|
+
confirmLabel: "Delete bundle",
|
|
380
|
+
confirmKind: "danger",
|
|
381
|
+
},
|
|
382
|
+
},
|
|
324
383
|
},
|
|
325
384
|
/*
|
|
326
385
|
* These four buckets were literally `{}` for months while their editors
|
|
@@ -660,34 +719,6 @@ export const ACTIONS = {
|
|
|
660
719
|
kind: "ghost",
|
|
661
720
|
permissions: ["seller", "admin"],
|
|
662
721
|
},
|
|
663
|
-
// ── WhatsApp integration ────────────────────────────────────────────
|
|
664
|
-
"whatsapp-connect": {
|
|
665
|
-
iconKey: "link",
|
|
666
|
-
id: "store.whatsapp-connect",
|
|
667
|
-
label: "Save & Connect",
|
|
668
|
-
ariaLabel: "Save WhatsApp credentials and connect",
|
|
669
|
-
description: "Save WhatsApp Business credentials and establish connection.",
|
|
670
|
-
kind: "primary",
|
|
671
|
-
permissions: ["seller", "admin"],
|
|
672
|
-
},
|
|
673
|
-
"whatsapp-catalog-sync": {
|
|
674
|
-
iconKey: "retry",
|
|
675
|
-
id: "store.whatsapp-catalog-sync",
|
|
676
|
-
label: "Push to WhatsApp",
|
|
677
|
-
ariaLabel: "Sync products to WhatsApp catalog",
|
|
678
|
-
description: "Push published standard products to WhatsApp Business Catalog.",
|
|
679
|
-
kind: "secondary",
|
|
680
|
-
permissions: ["seller", "admin"],
|
|
681
|
-
},
|
|
682
|
-
"whatsapp-catalog-import": {
|
|
683
|
-
iconKey: "upload",
|
|
684
|
-
id: "store.whatsapp-catalog-import",
|
|
685
|
-
label: "Import from WhatsApp",
|
|
686
|
-
ariaLabel: "Import products from WhatsApp catalog",
|
|
687
|
-
description: "Import products from WhatsApp Catalog as drafts.",
|
|
688
|
-
kind: "secondary",
|
|
689
|
-
permissions: ["seller", "admin"],
|
|
690
|
-
},
|
|
691
722
|
// ── Google Reviews integration ──────────────────────────────────────
|
|
692
723
|
"google-reviews-sync": {
|
|
693
724
|
iconKey: "retry",
|
|
@@ -1042,7 +1073,76 @@ export const ACTIONS = {
|
|
|
1042
1073
|
},
|
|
1043
1074
|
},
|
|
1044
1075
|
},
|
|
1076
|
+
/*
|
|
1077
|
+
* There was no REVIEW bucket at all, while review actions sat scattered
|
|
1078
|
+
* across three others — ADMIN (approve / reject / feature), STORE (reply /
|
|
1079
|
+
* contest) and USER (write-review) — and NOTHING anywhere for a reviewer
|
|
1080
|
+
* editing or deleting their own review. That is the gap a buyer hits on a
|
|
1081
|
+
* product page, so it is the one this bucket is for.
|
|
1082
|
+
*/
|
|
1083
|
+
REVIEW: {
|
|
1084
|
+
edit: {
|
|
1085
|
+
iconKey: "edit",
|
|
1086
|
+
id: "review.edit",
|
|
1087
|
+
label: "Edit review",
|
|
1088
|
+
ariaLabel: "Edit your review",
|
|
1089
|
+
description: "Edit a review you wrote.",
|
|
1090
|
+
kind: "secondary",
|
|
1091
|
+
},
|
|
1092
|
+
delete: {
|
|
1093
|
+
iconKey: "delete",
|
|
1094
|
+
id: "review.delete",
|
|
1095
|
+
label: "Delete review",
|
|
1096
|
+
ariaLabel: "Delete your review",
|
|
1097
|
+
description: "Permanently delete a review you wrote.",
|
|
1098
|
+
kind: "danger",
|
|
1099
|
+
confirmation: {
|
|
1100
|
+
title: "Delete your review?",
|
|
1101
|
+
body: "This cannot be undone. The seller's reply to it goes too, and the product's rating is recalculated without your score.",
|
|
1102
|
+
confirmLabel: "Delete review",
|
|
1103
|
+
confirmKind: "danger",
|
|
1104
|
+
},
|
|
1105
|
+
},
|
|
1106
|
+
write: {
|
|
1107
|
+
iconKey: "review",
|
|
1108
|
+
id: "review.write",
|
|
1109
|
+
label: "Write a review",
|
|
1110
|
+
ariaLabel: "Write a review for this item",
|
|
1111
|
+
description: "Write a review for an item you bought.",
|
|
1112
|
+
kind: "primary",
|
|
1113
|
+
},
|
|
1114
|
+
},
|
|
1045
1115
|
EVENT: {
|
|
1116
|
+
/*
|
|
1117
|
+
* This bucket had only register / cancel-registration / draw-raffle-winner
|
|
1118
|
+
* — no edit, no delete — so the owner affordance on an event card or detail
|
|
1119
|
+
* page had no registry entry to resolve its label and confirm copy from,
|
|
1120
|
+
* and Rule #7 forbids inlining them.
|
|
1121
|
+
*/
|
|
1122
|
+
edit: {
|
|
1123
|
+
iconKey: "edit",
|
|
1124
|
+
id: "event.edit",
|
|
1125
|
+
label: "Edit",
|
|
1126
|
+
ariaLabel: "Edit event",
|
|
1127
|
+
description: "Edit this event.",
|
|
1128
|
+
kind: "secondary",
|
|
1129
|
+
permissions: ["admin"],
|
|
1130
|
+
},
|
|
1131
|
+
delete: {
|
|
1132
|
+
iconKey: "delete",
|
|
1133
|
+
id: "event.delete",
|
|
1134
|
+
label: "Delete",
|
|
1135
|
+
ariaLabel: "Delete event",
|
|
1136
|
+
description: "Permanently delete this event.",
|
|
1137
|
+
kind: "danger",
|
|
1138
|
+
permissions: ["admin"],
|
|
1139
|
+
confirmation: {
|
|
1140
|
+
title: "Delete this event?",
|
|
1141
|
+
body: "This cannot be undone. Entries already recorded against it are removed with it, so a participant loses their place.",
|
|
1142
|
+
confirmLabel: "Delete event",
|
|
1143
|
+
confirmKind: "danger",
|
|
1144
|
+
},
|
|
1145
|
+
},
|
|
1046
1146
|
"register": {
|
|
1047
1147
|
iconKey: "user",
|
|
1048
1148
|
id: "event.register",
|
|
@@ -170,7 +170,7 @@ export interface PayableOrderLike {
|
|
|
170
170
|
* money bug in all four payout paths (`autoPayoutEligibility`,
|
|
171
171
|
* `weeklyPayoutEligibility`, and both `seller-actions` entry points). That
|
|
172
172
|
* field is the GRAND TOTAL — `checkout/actions.ts` builds it as
|
|
173
|
-
* `goods − coupon + shipping + codHandling +
|
|
173
|
+
* `goods − coupon + shipping + codHandling + giftWrap +
|
|
174
174
|
* shipmentProtection + platformFee + platformFeeGst + emiSurcharge + gstAmount`
|
|
175
175
|
* — so using it as the payout base did three wrong things at once:
|
|
176
176
|
*
|
|
@@ -264,7 +264,7 @@ export function allocateAcrossMembers(total, weights) {
|
|
|
264
264
|
* money bug in all four payout paths (`autoPayoutEligibility`,
|
|
265
265
|
* `weeklyPayoutEligibility`, and both `seller-actions` entry points). That
|
|
266
266
|
* field is the GRAND TOTAL — `checkout/actions.ts` builds it as
|
|
267
|
-
* `goods − coupon + shipping + codHandling +
|
|
267
|
+
* `goods − coupon + shipping + codHandling + giftWrap +
|
|
268
268
|
* shipmentProtection + platformFee + platformFeeGst + emiSurcharge + gstAmount`
|
|
269
269
|
* — so using it as the payout base did three wrong things at once:
|
|
270
270
|
*
|
|
@@ -72,7 +72,7 @@ export declare const BUNDLE_COPY: {
|
|
|
72
72
|
readonly adminEditor: {
|
|
73
73
|
readonly loading: "Loading bundle…";
|
|
74
74
|
readonly saveButton: (saving: boolean, isEdit: boolean) => "Save changes" | "Saving…" | "Create bundle";
|
|
75
|
-
readonly deleteButton: (deleting: boolean) => "
|
|
75
|
+
readonly deleteButton: (deleting: boolean) => "Delete bundle" | "Deleting…";
|
|
76
76
|
readonly deleteConfirm: "Delete this bundle? This action cannot be undone.";
|
|
77
77
|
readonly fields: {
|
|
78
78
|
readonly nameLabel: "Name *";
|
|
@@ -6,8 +6,6 @@ export declare const CHECKOUT_DEFAULT_COMMISSIONS: {
|
|
|
6
6
|
readonly codDepositPercent: 10;
|
|
7
7
|
readonly codHandlingFeeMin: 200;
|
|
8
8
|
readonly codHandlingFeePercent: 10;
|
|
9
|
-
readonly whatsappNotifyFeeEnabled: true;
|
|
10
|
-
readonly whatsappNotifyFee: 10;
|
|
11
9
|
readonly giftWrapFeeEnabled: true;
|
|
12
10
|
readonly giftWrapFee: 49;
|
|
13
11
|
readonly shipmentProtectionFeeEnabled: true;
|
|
@@ -13,8 +13,6 @@ export const CHECKOUT_DEFAULT_COMMISSIONS = {
|
|
|
13
13
|
// Mirrors the SiteSettingsDocument defaults, which enable every add-on.
|
|
14
14
|
// Consequence of the mirror: if the settings read fails, an add-on already
|
|
15
15
|
// ticked on the cart document is still billed rather than silently dropped.
|
|
16
|
-
whatsappNotifyFeeEnabled: true,
|
|
17
|
-
whatsappNotifyFee: 10,
|
|
18
16
|
giftWrapFeeEnabled: true,
|
|
19
17
|
giftWrapFee: 49,
|
|
20
18
|
shipmentProtectionFeeEnabled: true,
|
|
@@ -16,7 +16,12 @@
|
|
|
16
16
|
* and find the budget already covers them. A channel that is born capped
|
|
17
17
|
* cannot repeat what email did.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* `whatsapp` was removed 2026-10-20 with the Cloud API integration. `sms`
|
|
21
|
+
* stays declared with no sender — the ceiling exists so one cannot ship
|
|
22
|
+
* uncapped — and `email` is the only channel with a live transport.
|
|
23
|
+
*/
|
|
24
|
+
export type MessageChannel = "email" | "sms";
|
|
20
25
|
/**
|
|
21
26
|
* Who the message is FOR — which is what the kill switch keys on.
|
|
22
27
|
*
|
|
@@ -76,13 +81,12 @@ export type SendDecision = {
|
|
|
76
81
|
/**
|
|
77
82
|
* Defaults, mirrored into `DEFAULT_SITE_SETTINGS_DATA.messaging`.
|
|
78
83
|
*
|
|
79
|
-
* 🛑 `emailEnabled`
|
|
84
|
+
* 🛑 `emailEnabled` defaults to FALSE. An install that
|
|
80
85
|
* has not made a decision should be quiet, not loud — the opposite default is
|
|
81
86
|
* how a fresh deploy mails real people from a half-configured site.
|
|
82
87
|
*/
|
|
83
88
|
export declare const MESSAGE_BUDGET_DEFAULTS: {
|
|
84
89
|
readonly emailEnabled: false;
|
|
85
|
-
readonly whatsappEnabled: false;
|
|
86
90
|
readonly dailyCeiling: {
|
|
87
91
|
/**
|
|
88
92
|
* Resend's free tier is 100/day. 80 is not timidity — the counter is
|
|
@@ -92,8 +96,6 @@ export declare const MESSAGE_BUDGET_DEFAULTS: {
|
|
|
92
96
|
* headroom is what stops "at the limit" from becoming "over it".
|
|
93
97
|
*/
|
|
94
98
|
readonly email: 80;
|
|
95
|
-
/** Meta's pricing is per-conversation, not per-message; this is a sanity bound, not a tier limit. */
|
|
96
|
-
readonly whatsapp: 200;
|
|
97
99
|
/** No sender exists yet. Present so one cannot ship uncapped. */
|
|
98
100
|
readonly sms: 50;
|
|
99
101
|
};
|
|
@@ -9,13 +9,12 @@
|
|
|
9
9
|
/**
|
|
10
10
|
* Defaults, mirrored into `DEFAULT_SITE_SETTINGS_DATA.messaging`.
|
|
11
11
|
*
|
|
12
|
-
* 🛑 `emailEnabled`
|
|
12
|
+
* 🛑 `emailEnabled` defaults to FALSE. An install that
|
|
13
13
|
* has not made a decision should be quiet, not loud — the opposite default is
|
|
14
14
|
* how a fresh deploy mails real people from a half-configured site.
|
|
15
15
|
*/
|
|
16
16
|
export const MESSAGE_BUDGET_DEFAULTS = {
|
|
17
17
|
emailEnabled: false,
|
|
18
|
-
whatsappEnabled: false,
|
|
19
18
|
dailyCeiling: {
|
|
20
19
|
/**
|
|
21
20
|
* Resend's free tier is 100/day. 80 is not timidity — the counter is
|
|
@@ -25,8 +24,6 @@ export const MESSAGE_BUDGET_DEFAULTS = {
|
|
|
25
24
|
* headroom is what stops "at the limit" from becoming "over it".
|
|
26
25
|
*/
|
|
27
26
|
email: 80,
|
|
28
|
-
/** Meta's pricing is per-conversation, not per-message; this is a sanity bound, not a tier limit. */
|
|
29
|
-
whatsapp: 200,
|
|
30
27
|
/** No sender exists yet. Present so one cannot ship uncapped. */
|
|
31
28
|
sms: 50,
|
|
32
29
|
},
|
|
@@ -27,8 +27,6 @@ import type { EmiSettings } from "../emi/schedule";
|
|
|
27
27
|
* and each `compute*Fee` helper carries its own default.
|
|
28
28
|
*/
|
|
29
29
|
export interface BuyerFacingFees {
|
|
30
|
-
whatsappNotifyFeeEnabled?: boolean;
|
|
31
|
-
whatsappNotifyFee?: number;
|
|
32
30
|
giftWrapFeeEnabled?: boolean;
|
|
33
31
|
giftWrapFee?: number;
|
|
34
32
|
shipmentProtectionFeeEnabled?: boolean;
|
|
@@ -13,8 +13,6 @@ export function toBuyerFacingFees(commissions) {
|
|
|
13
13
|
if (!commissions)
|
|
14
14
|
return null;
|
|
15
15
|
return {
|
|
16
|
-
whatsappNotifyFeeEnabled: commissions.whatsappNotifyFeeEnabled,
|
|
17
|
-
whatsappNotifyFee: commissions.whatsappNotifyFee,
|
|
18
16
|
giftWrapFeeEnabled: commissions.giftWrapFeeEnabled,
|
|
19
17
|
giftWrapFee: commissions.giftWrapFee,
|
|
20
18
|
shipmentProtectionFeeEnabled: commissions.shipmentProtectionFeeEnabled,
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The platform's own supplier-of-record identity, injected once at boot.
|
|
3
|
+
*
|
|
4
|
+
* ── Why this seam exists ──────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `appkit.config.js → business` is documented as "THE one owner of the
|
|
7
|
+
* business's statutory identity", and it records what it was created to end:
|
|
8
|
+
* the legal name, address, GSTIN and support channels had lived in five places
|
|
9
|
+
* that already disagreed — four different support addresses published, the
|
|
10
|
+
* registered address saying Solapur while the warehouse said Hyderabad.
|
|
11
|
+
*
|
|
12
|
+
* But that file belongs to the CONSUMER, and appkit has no runtime reader for
|
|
13
|
+
* it. `resolveSupplierIdentity` therefore read `siteSettings.gst.*` instead,
|
|
14
|
+
* which quietly made the invoice path a SIXTH owner — and the one that decides
|
|
15
|
+
* what a tax invoice says about who issued it.
|
|
16
|
+
*
|
|
17
|
+
* So the consumer injects it at boot, the same way `configureMarketDefaults`
|
|
18
|
+
* injects currency and locale: one call in `providers.config.ts`, values read
|
|
19
|
+
* from `src/constants/business.ts`, which reads `appkit.config.js`. One owner,
|
|
20
|
+
* one hop.
|
|
21
|
+
*
|
|
22
|
+
* 🛑 This is NOT a cache of site settings and must not become one. Whether to
|
|
23
|
+
* charge GST at all stays `siteSettings.gst.enabled` — an operational switch an
|
|
24
|
+
* admin owns. WHO the supplier is is a fact about the registered entity, is
|
|
25
|
+
* legally required to be published, and belongs in a committed file.
|
|
26
|
+
*
|
|
27
|
+
* @tag domain:site-settings
|
|
28
|
+
* @tag layer:shared
|
|
29
|
+
* @tag access:isomorphic
|
|
30
|
+
* @tag sideEffects:module-state
|
|
31
|
+
*/
|
|
32
|
+
export interface PlatformSupplierIdentity {
|
|
33
|
+
gstin?: string;
|
|
34
|
+
legalName?: string;
|
|
35
|
+
/** One line, as it should appear in an invoice header. */
|
|
36
|
+
address?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register the platform's statutory identity. Call once, at boot.
|
|
40
|
+
*
|
|
41
|
+
* Merges rather than replaces, so a partial call cannot blank a field that was
|
|
42
|
+
* already supplied — the same shape `configureMarketDefaults` uses.
|
|
43
|
+
*/
|
|
44
|
+
export declare function configurePlatformSupplier(identity: PlatformSupplierIdentity): void;
|
|
45
|
+
/**
|
|
46
|
+
* The registered identity, or an empty object when nothing was injected.
|
|
47
|
+
*
|
|
48
|
+
* 🛑 Returns `{}` rather than throwing, and the caller must treat a missing
|
|
49
|
+
* GSTIN as "not a tax invoice" — which `resolveSupplierIdentity` already does
|
|
50
|
+
* via `source: "none"`. Throwing here would turn a misconfigured deployment
|
|
51
|
+
* into a failed CHECKOUT, and an order that cannot be placed is worse than an
|
|
52
|
+
* invoice that correctly declines to call itself a tax invoice.
|
|
53
|
+
*/
|
|
54
|
+
export declare function getPlatformSupplier(): PlatformSupplierIdentity;
|
|
55
|
+
/** Reset — for tests and for the seed CLI's isolated runs. */
|
|
56
|
+
export declare function resetPlatformSupplier(): void;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The platform's own supplier-of-record identity, injected once at boot.
|
|
3
|
+
*
|
|
4
|
+
* ── Why this seam exists ──────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `appkit.config.js → business` is documented as "THE one owner of the
|
|
7
|
+
* business's statutory identity", and it records what it was created to end:
|
|
8
|
+
* the legal name, address, GSTIN and support channels had lived in five places
|
|
9
|
+
* that already disagreed — four different support addresses published, the
|
|
10
|
+
* registered address saying Solapur while the warehouse said Hyderabad.
|
|
11
|
+
*
|
|
12
|
+
* But that file belongs to the CONSUMER, and appkit has no runtime reader for
|
|
13
|
+
* it. `resolveSupplierIdentity` therefore read `siteSettings.gst.*` instead,
|
|
14
|
+
* which quietly made the invoice path a SIXTH owner — and the one that decides
|
|
15
|
+
* what a tax invoice says about who issued it.
|
|
16
|
+
*
|
|
17
|
+
* So the consumer injects it at boot, the same way `configureMarketDefaults`
|
|
18
|
+
* injects currency and locale: one call in `providers.config.ts`, values read
|
|
19
|
+
* from `src/constants/business.ts`, which reads `appkit.config.js`. One owner,
|
|
20
|
+
* one hop.
|
|
21
|
+
*
|
|
22
|
+
* 🛑 This is NOT a cache of site settings and must not become one. Whether to
|
|
23
|
+
* charge GST at all stays `siteSettings.gst.enabled` — an operational switch an
|
|
24
|
+
* admin owns. WHO the supplier is is a fact about the registered entity, is
|
|
25
|
+
* legally required to be published, and belongs in a committed file.
|
|
26
|
+
*
|
|
27
|
+
* @tag domain:site-settings
|
|
28
|
+
* @tag layer:shared
|
|
29
|
+
* @tag access:isomorphic
|
|
30
|
+
* @tag sideEffects:module-state
|
|
31
|
+
*/
|
|
32
|
+
let _identity = {};
|
|
33
|
+
/**
|
|
34
|
+
* Register the platform's statutory identity. Call once, at boot.
|
|
35
|
+
*
|
|
36
|
+
* Merges rather than replaces, so a partial call cannot blank a field that was
|
|
37
|
+
* already supplied — the same shape `configureMarketDefaults` uses.
|
|
38
|
+
*/
|
|
39
|
+
export function configurePlatformSupplier(identity) {
|
|
40
|
+
_identity = { ..._identity, ...identity };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The registered identity, or an empty object when nothing was injected.
|
|
44
|
+
*
|
|
45
|
+
* 🛑 Returns `{}` rather than throwing, and the caller must treat a missing
|
|
46
|
+
* GSTIN as "not a tax invoice" — which `resolveSupplierIdentity` already does
|
|
47
|
+
* via `source: "none"`. Throwing here would turn a misconfigured deployment
|
|
48
|
+
* into a failed CHECKOUT, and an order that cannot be placed is worse than an
|
|
49
|
+
* invoice that correctly declines to call itself a tax invoice.
|
|
50
|
+
*/
|
|
51
|
+
export function getPlatformSupplier() {
|
|
52
|
+
return _identity;
|
|
53
|
+
}
|
|
54
|
+
/** Reset — for tests and for the seed CLI's isolated runs. */
|
|
55
|
+
export function resetPlatformSupplier() {
|
|
56
|
+
_identity = {};
|
|
57
|
+
}
|
|
@@ -82,14 +82,6 @@ export interface CodHandlingFeeRates {
|
|
|
82
82
|
}
|
|
83
83
|
/** COD handling fee charged to the buyer: max(fixed floor, subtotal × percent). */
|
|
84
84
|
export declare function computeCodHandlingFee(subtotal: number, rates: CodHandlingFeeRates): number;
|
|
85
|
-
export interface WhatsAppNotifyFeeRates {
|
|
86
|
-
/** Admin master toggle — the addon isn't charged (even if the buyer selected it) unless this is true. */
|
|
87
|
-
whatsappNotifyFeeEnabled?: boolean;
|
|
88
|
-
/** Flat rupee fee charged when the buyer opts in. Falls back to ₹10. */
|
|
89
|
-
whatsappNotifyFee?: number;
|
|
90
|
-
}
|
|
91
|
-
/** Flat WhatsApp order-updates addon fee — charged only when the buyer opted in AND the admin has the addon enabled. */
|
|
92
|
-
export declare function computeWhatsAppNotifyFee(addonSelected: boolean, rates: WhatsAppNotifyFeeRates): number;
|
|
93
85
|
export interface GiftWrapFeeRates {
|
|
94
86
|
/** Admin master toggle — the addon isn't charged (even if the buyer selected it) unless this is true. */
|
|
95
87
|
giftWrapFeeEnabled?: boolean;
|
|
@@ -82,13 +82,6 @@ export function computeCodHandlingFee(subtotal, rates) {
|
|
|
82
82
|
const percentFee = roundRupees(subtotal * (percent / 100));
|
|
83
83
|
return Math.max(min, percentFee);
|
|
84
84
|
}
|
|
85
|
-
const DEFAULT_WHATSAPP_NOTIFY_FEE = 10;
|
|
86
|
-
/** Flat WhatsApp order-updates addon fee — charged only when the buyer opted in AND the admin has the addon enabled. */
|
|
87
|
-
export function computeWhatsAppNotifyFee(addonSelected, rates) {
|
|
88
|
-
if (!addonSelected || !rates.whatsappNotifyFeeEnabled)
|
|
89
|
-
return 0;
|
|
90
|
-
return rates.whatsappNotifyFee ?? DEFAULT_WHATSAPP_NOTIFY_FEE;
|
|
91
|
-
}
|
|
92
85
|
const DEFAULT_GIFT_WRAP_FEE = 49;
|
|
93
86
|
/** Flat gift-wrap addon fee — charged only when the buyer opted in AND the admin has the addon enabled. */
|
|
94
87
|
export function computeGiftWrapFee(addonSelected, rates) {
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which listing types a store may create: the basic/advanced split.
|
|
3
|
+
*
|
|
4
|
+
* ── The rule ──────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `standard`, `spares` and `auction` are BASIC — every store can use them.
|
|
7
|
+
* The other seven are ADVANCED and need the `advanced_listing_types`
|
|
8
|
+
* capability, because each carries an obligation a new seller has not agreed
|
|
9
|
+
* to yet: a pre-order takes money for stock that does not exist, a prize draw
|
|
10
|
+
* is a regulated promotion, a classified happens off-platform with no escrow,
|
|
11
|
+
* a digital code must be delivered from a pool the seller has to keep stocked,
|
|
12
|
+
* and a live listing is an animal.
|
|
13
|
+
*
|
|
14
|
+
* ── Why a Record and not an array ─────────────────────────────────────────
|
|
15
|
+
*
|
|
16
|
+
* 🛑 `Record<ListingType, ListingTypeTier>`, so adding a member to the union
|
|
17
|
+
* is a COMPILE error here rather than a silent omission that defaults to
|
|
18
|
+
* whichever branch the code happens to fall through to.
|
|
19
|
+
* `features/products/types/index.ts` warns that adding a union member touches
|
|
20
|
+
* 21 named sites of which only 11 are compile-checked; this file is written to
|
|
21
|
+
* be one of the eleven. Root Cause #61.
|
|
22
|
+
*
|
|
23
|
+
* ── Why `capabilities` is `readonly string[]` and not `StoreCapability[]` ──
|
|
24
|
+
*
|
|
25
|
+
* Two reasons, and the first is the honest one: that is what is actually
|
|
26
|
+
* STORED. `storeFirestoreSchema` validates the field as `z.array(z.string())`,
|
|
27
|
+
* so a capability that is not a union member round-trips today and this helper
|
|
28
|
+
* must not pretend otherwise. The second is that it keeps this module free of
|
|
29
|
+
* an import from `features/auth/permissions/constants`, which is the kind of
|
|
30
|
+
* cross-feature edge `audit-import-cycles` exists to watch.
|
|
31
|
+
*
|
|
32
|
+
* A `StoreCapability[]` is assignable to it, so a typed caller loses nothing.
|
|
33
|
+
*/
|
|
34
|
+
import type { ListingType } from "../../../features/products/types/index";
|
|
35
|
+
import type { JsonValue } from "../../../schemas/types";
|
|
36
|
+
export type ListingTypeTier = "basic" | "advanced";
|
|
37
|
+
/**
|
|
38
|
+
* The capability that unlocks every advanced type at once.
|
|
39
|
+
*
|
|
40
|
+
* One flag rather than seven, deliberately: the question a seller is actually
|
|
41
|
+
* answering is "do I want the complicated listing kinds", and seven checkboxes
|
|
42
|
+
* invite six of them to be wrong. An admin who needs finer control has the
|
|
43
|
+
* per-type legacy grants below.
|
|
44
|
+
*/
|
|
45
|
+
export declare const ADVANCED_LISTING_TYPE_CAPABILITY = "advanced_listing_types";
|
|
46
|
+
export declare const LISTING_TYPE_TIER: Record<ListingType, ListingTypeTier>;
|
|
47
|
+
export declare function isAdvancedListingType(listingType: ListingType): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Does this capability array carry the advanced-types grant?
|
|
50
|
+
*
|
|
51
|
+
* Exists so no call site has to spell the capability string, and so none has
|
|
52
|
+
* to cast: `capabilities` is `StoreCapability[]` in typed code and
|
|
53
|
+
* `string[]` as stored, and an `.includes()` across that boundary is where an
|
|
54
|
+
* `as never` gets reached for — which silences every other check on the
|
|
55
|
+
* expression, not just the one being worked around.
|
|
56
|
+
*/
|
|
57
|
+
export declare function hasAdvancedListingTypes(capabilities: readonly string[] | null | undefined): boolean;
|
|
58
|
+
/** The types every store can use, with no capability at all. */
|
|
59
|
+
export declare const BASIC_LISTING_TYPES: ListingType[];
|
|
60
|
+
export declare const ADVANCED_LISTING_TYPES: ListingType[];
|
|
61
|
+
export interface ListingTypeAccessContext {
|
|
62
|
+
/** Admins and employees bypass the tier entirely. */
|
|
63
|
+
isPrivileged?: boolean;
|
|
64
|
+
/** The store's stored capability array. Absent/empty is treated as none. */
|
|
65
|
+
capabilities?: readonly string[] | null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* May this store create or convert to this listing type?
|
|
69
|
+
*
|
|
70
|
+
* Pure — takes the capability array the caller already holds rather than
|
|
71
|
+
* re-reading the store. Every gate site in the codebase has the store document
|
|
72
|
+
* in scope already, and a helper that fetched would add one Firestore read per
|
|
73
|
+
* product write against Rule #6's round-trip budget.
|
|
74
|
+
*/
|
|
75
|
+
export declare function isListingTypeAllowedFor(listingType: ListingType, ctx?: ListingTypeAccessContext): boolean;
|
|
76
|
+
/** Every type this store may use, for building a picker or filtering nav. */
|
|
77
|
+
export declare function listingTypesAllowedFor(ctx?: ListingTypeAccessContext): ListingType[];
|
|
78
|
+
/**
|
|
79
|
+
* Throwing form, for the server-side write paths.
|
|
80
|
+
*
|
|
81
|
+
* 🛑 `listingType` being absent is ALLOWED and must stay that way. Both product
|
|
82
|
+
* schemas declare it optional, and a partial update that touches only `status`
|
|
83
|
+
* or `stockQuantity` carries no type at all — refusing those would break every
|
|
84
|
+
* stock decrement and status flip in the app. The gate's job is to refuse a
|
|
85
|
+
* NAMED advanced type, not to require one.
|
|
86
|
+
*
|
|
87
|
+
* 🛑 On an UPDATE, the caller must additionally compare against the STORED
|
|
88
|
+
* type and skip this when they match — see `sellerUpdateProduct`. Every
|
|
89
|
+
* per-type edit page re-sends its own type literal, so asserting on the
|
|
90
|
+
* submitted value alone locks a seller out of editing listings they already
|
|
91
|
+
* own as soon as the capability is withdrawn. The rule is about creating and
|
|
92
|
+
* converting, not about touching.
|
|
93
|
+
*/
|
|
94
|
+
export declare function assertListingTypeAllowed(listingType: JsonValue | undefined, ctx?: ListingTypeAccessContext): void;
|