@mohasinac/appkit 4.70.0 → 4.71.2
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/PROVIDERS.md +190 -0
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/edit-mode/EditModeProvider.d.ts +32 -0
- package/dist/_internal/client/edit-mode/EditModeProvider.js +33 -0
- package/dist/_internal/client/edit-mode/index.d.ts +2 -0
- package/dist/_internal/client/edit-mode/index.js +1 -0
- package/dist/_internal/client/features/giveaway/ClearanceGiveawayDetailView.d.ts +32 -0
- package/dist/_internal/client/features/giveaway/ClearanceGiveawayDetailView.js +29 -0
- package/dist/_internal/client/features/giveaway/GiveawayAdminEditView.d.ts +66 -0
- package/dist/_internal/client/features/giveaway/GiveawayAdminEditView.js +187 -0
- package/dist/_internal/client/features/giveaway/GiveawayAdminSlotView.d.ts +18 -0
- package/dist/_internal/client/features/giveaway/GiveawayAdminSlotView.js +52 -0
- package/dist/_internal/client/features/giveaway/GiveawayDetailView.d.ts +40 -0
- package/dist/_internal/client/features/giveaway/GiveawayDetailView.js +49 -0
- package/dist/_internal/client/features/giveaway/GiveawayEntriesView.d.ts +34 -0
- package/dist/_internal/client/features/giveaway/GiveawayEntriesView.js +64 -0
- package/dist/_internal/client/features/giveaway/GiveawayListView.d.ts +39 -0
- package/dist/_internal/client/features/giveaway/GiveawayListView.js +45 -0
- package/dist/_internal/client/features/giveaway/GiveawayPullForm.d.ts +31 -0
- package/dist/_internal/client/features/giveaway/GiveawayPullForm.js +94 -0
- package/dist/_internal/client/features/giveaway/GiveawaySlotGrid.d.ts +14 -0
- package/dist/_internal/client/features/giveaway/GiveawaySlotGrid.js +23 -0
- package/dist/_internal/client/features/giveaway/slot-collage-items.d.ts +15 -0
- package/dist/_internal/client/features/giveaway/slot-collage-items.js +13 -0
- package/dist/_internal/client/features/layout/DashboardLayoutClient.d.ts +34 -1
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +79 -9
- package/dist/_internal/client/features/layout/PortalBackLink.d.ts +15 -0
- package/dist/_internal/client/features/layout/PortalBackLink.js +58 -0
- package/dist/_internal/client/features/layout/SidebarCollapseToggle.js +37 -1
- package/dist/_internal/client/features/layout/filterNavItems.d.ts +11 -6
- package/dist/_internal/client/features/layout/filterNavItems.js +36 -4
- package/dist/_internal/client/features/layout/sidebarPositionClasses.js +10 -2
- package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.d.ts +6 -1
- package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +4 -3
- package/dist/_internal/client/features/maintenance/views/CacheInvalidationPanel.js +1 -1
- package/dist/_internal/client/features/maintenance/views/CloudLogsListView.d.ts +4 -1
- package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +4 -3
- package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.d.ts +4 -1
- package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +4 -2
- package/dist/_internal/client/features/maintenance/views/RepositoryCacheStatusPanel.d.ts +15 -0
- package/dist/_internal/client/features/maintenance/views/RepositoryCacheStatusPanel.js +161 -0
- package/dist/_internal/client/features/maintenance/views/ServerErrorDetailView.d.ts +4 -1
- package/dist/_internal/client/features/maintenance/views/ServerErrorDetailView.js +3 -2
- package/dist/_internal/client/features/maintenance/views/ServerErrorsListView.d.ts +11 -1
- package/dist/_internal/client/features/maintenance/views/ServerErrorsListView.js +3 -2
- package/dist/_internal/server/features/ads/booking.d.ts +1 -1
- package/dist/_internal/server/features/ads/booking.js +1 -1
- package/dist/_internal/server/features/assistant/actions.d.ts +29 -0
- package/dist/_internal/server/features/assistant/actions.js +170 -0
- package/dist/_internal/server/features/assistant/budget.d.ts +28 -0
- package/dist/_internal/server/features/assistant/budget.js +132 -0
- package/dist/_internal/server/features/assistant/escalate.d.ts +25 -0
- package/dist/_internal/server/features/assistant/escalate.js +108 -0
- package/dist/_internal/server/features/assistant/guard.d.ts +10 -0
- package/dist/_internal/server/features/assistant/guard.js +110 -0
- package/dist/_internal/server/features/assistant/handles.d.ts +42 -0
- package/dist/_internal/server/features/assistant/handles.js +172 -0
- package/dist/_internal/server/features/assistant/history-store.d.ts +16 -0
- package/dist/_internal/server/features/assistant/history-store.js +63 -0
- package/dist/_internal/server/features/assistant/model-routing.d.ts +70 -0
- package/dist/_internal/server/features/assistant/model-routing.js +80 -0
- package/dist/_internal/server/features/assistant/quorum.d.ts +32 -0
- package/dist/_internal/server/features/assistant/quorum.js +128 -0
- package/dist/_internal/server/features/assistant/redaction.d.ts +68 -0
- package/dist/_internal/server/features/assistant/redaction.js +69 -0
- package/dist/_internal/server/features/assistant/severity.d.ts +41 -0
- package/dist/_internal/server/features/assistant/severity.js +93 -0
- package/dist/_internal/server/features/assistant/tools/admin/search-nav.d.ts +39 -0
- package/dist/_internal/server/features/assistant/tools/admin/search-nav.js +27 -0
- package/dist/_internal/server/features/assistant/tools/builtin/get-my-orders.d.ts +15 -0
- package/dist/_internal/server/features/assistant/tools/builtin/get-my-orders.js +116 -0
- package/dist/_internal/server/features/assistant/tools/builtin/get-toggle-state.d.ts +8 -0
- package/dist/_internal/server/features/assistant/tools/builtin/get-toggle-state.js +64 -0
- package/dist/_internal/server/features/assistant/tools/builtin/index.d.ts +38 -0
- package/dist/_internal/server/features/assistant/tools/builtin/index.js +29 -0
- package/dist/_internal/server/features/assistant/tools/builtin/search-faqs.d.ts +8 -0
- package/dist/_internal/server/features/assistant/tools/builtin/search-faqs.js +62 -0
- package/dist/_internal/server/features/assistant/tools/builtin/search-products.d.ts +16 -0
- package/dist/_internal/server/features/assistant/tools/builtin/search-products.js +79 -0
- package/dist/_internal/server/features/assistant/tools/define.d.ts +85 -0
- package/dist/_internal/server/features/assistant/tools/define.js +8 -0
- package/dist/_internal/server/features/assistant/tools/json-schema.d.ts +34 -0
- package/dist/_internal/server/features/assistant/tools/json-schema.js +79 -0
- package/dist/_internal/server/features/assistant/tools/manifest.d.ts +22 -0
- package/dist/_internal/server/features/assistant/tools/manifest.js +27 -0
- package/dist/_internal/server/features/assistant/tools/registry.d.ts +22 -0
- package/dist/_internal/server/features/assistant/tools/registry.js +43 -0
- package/dist/_internal/server/features/assistant/turn.d.ts +43 -0
- package/dist/_internal/server/features/assistant/turn.js +281 -0
- package/dist/_internal/server/features/auth/permissions.d.ts +65 -10
- package/dist/_internal/server/features/auth/permissions.js +74 -15
- package/dist/_internal/server/features/brands/actions.js +3 -3
- package/dist/_internal/server/features/bundles/actions.js +3 -3
- package/dist/_internal/server/features/categories/adapters.d.ts +2 -2
- package/dist/_internal/server/features/categories/adapters.js +17 -8
- package/dist/_internal/server/features/checkout/actions.d.ts +142 -15
- package/dist/_internal/server/features/checkout/actions.js +1031 -150
- package/dist/_internal/server/features/checkout/gateway-selection.d.ts +68 -0
- package/dist/_internal/server/features/checkout/gateway-selection.js +124 -0
- package/dist/_internal/server/features/checkout/index.d.ts +5 -0
- package/dist/_internal/server/features/checkout/index.js +18 -0
- package/dist/_internal/server/features/checkout/locked-lines.d.ts +10 -10
- package/dist/_internal/server/features/checkout/locked-lines.js +37 -37
- package/dist/_internal/server/features/checkout/prize-bundle-gates.d.ts +1 -1
- package/dist/_internal/server/features/checkout/prize-bundle-gates.js +1 -1
- package/dist/_internal/server/features/checkout/source-context.js +17 -17
- package/dist/_internal/server/features/checkout/split-settlement.d.ts +100 -0
- package/dist/_internal/server/features/checkout/split-settlement.js +205 -0
- package/dist/_internal/server/features/checkout/upi-resolution.js +8 -1
- package/dist/_internal/server/features/clearance/actions.d.ts +2 -0
- package/dist/_internal/server/features/clearance/actions.js +33 -0
- package/dist/_internal/server/features/clearance/data.d.ts +1 -0
- package/dist/_internal/server/features/clearance/data.js +2 -0
- package/dist/_internal/server/features/clearance/index.d.ts +4 -0
- package/dist/_internal/server/features/clearance/index.js +4 -0
- package/dist/_internal/server/features/clearance/og.d.ts +32 -0
- package/dist/_internal/server/features/clearance/og.js +47 -0
- package/dist/_internal/server/features/clearance/service.d.ts +3 -0
- package/dist/_internal/server/features/clearance/service.js +19 -0
- package/dist/_internal/server/features/collector-drops/actions.js +76 -0
- package/dist/_internal/server/features/collector-drops/data.d.ts +2 -0
- package/dist/_internal/server/features/collector-drops/data.js +3 -0
- package/dist/_internal/server/features/collector-drops/index.d.ts +5 -0
- package/dist/_internal/server/features/collector-drops/index.js +5 -0
- package/dist/_internal/server/features/collector-drops/og.d.ts +22 -0
- package/dist/_internal/server/features/collector-drops/og.js +30 -0
- package/dist/_internal/server/features/collector-drops/service.d.ts +20 -0
- package/dist/_internal/server/features/collector-drops/service.js +65 -0
- package/dist/_internal/server/features/dashboard/page-regions.d.ts +33 -0
- package/dist/_internal/server/features/dashboard/page-regions.js +53 -0
- package/dist/_internal/server/features/digital-code/pool.d.ts +14 -1
- package/dist/_internal/server/features/digital-code/pool.js +21 -2
- package/dist/_internal/server/features/digital-code/release.d.ts +79 -0
- package/dist/_internal/server/features/digital-code/release.js +176 -0
- package/dist/_internal/server/features/events/adapters.d.ts +7 -7
- package/dist/_internal/server/features/events/adapters.js +6 -6
- package/dist/_internal/server/features/events/data.d.ts +17 -1
- package/dist/_internal/server/features/events/data.js +51 -0
- package/dist/_internal/server/features/events/service.d.ts +2 -2
- package/dist/_internal/server/features/forms/field-visibility.d.ts +35 -0
- package/dist/_internal/server/features/forms/field-visibility.js +89 -0
- package/dist/_internal/server/features/giveaway/actions.d.ts +43 -0
- package/dist/_internal/server/features/giveaway/actions.js +369 -0
- package/dist/_internal/server/features/giveaway/adapters.d.ts +15 -0
- package/dist/_internal/server/features/giveaway/adapters.js +31 -0
- package/dist/_internal/server/features/giveaway/data.d.ts +19 -0
- package/dist/_internal/server/features/giveaway/data.js +56 -0
- package/dist/_internal/server/features/giveaway/metadata.d.ts +6 -0
- package/dist/_internal/server/features/giveaway/metadata.js +31 -0
- package/dist/_internal/server/features/giveaway/og.d.ts +40 -0
- package/dist/_internal/server/features/giveaway/og.js +79 -0
- package/dist/_internal/server/features/homepage/index.js +1 -1
- package/dist/_internal/server/features/inventory/reservations.d.ts +1 -1
- package/dist/_internal/server/features/inventory/reservations.js +1 -1
- package/dist/_internal/server/features/maintenance/cache-admin.d.ts +44 -0
- package/dist/_internal/server/features/maintenance/cache-admin.js +85 -0
- package/dist/_internal/server/features/media/contextGuards.d.ts +2 -2
- package/dist/_internal/server/features/media/contextGuards.js +4 -4
- package/dist/_internal/server/features/messages/actions.js +11 -0
- package/dist/_internal/server/features/order-completion/actions.js +1 -1
- package/dist/_internal/server/features/orders/actions.d.ts +3 -2
- package/dist/_internal/server/features/orders/actions.js +69 -17
- package/dist/_internal/server/features/orders/adapters.js +38 -3
- package/dist/_internal/server/features/orders/balance.d.ts +5 -2
- package/dist/_internal/server/features/orders/balance.js +14 -3
- package/dist/_internal/server/features/orders/cancellation-refund.d.ts +0 -89
- package/dist/_internal/server/features/orders/cancellation-refund.js +3 -2
- package/dist/_internal/server/features/payouts/actions.js +2 -1
- package/dist/_internal/server/features/points/award.js +3 -2
- package/dist/_internal/server/features/products/actions.d.ts +1 -1
- package/dist/_internal/server/features/products/actions.js +8 -8
- package/dist/_internal/server/features/products/data.js +5 -4
- package/dist/_internal/server/features/products/index.d.ts +1 -1
- package/dist/_internal/server/features/products/index.js +1 -1
- package/dist/_internal/server/features/products/list-public.js +18 -12
- package/dist/_internal/server/features/products/listing-tab-counts.d.ts +1 -1
- package/dist/_internal/server/features/products/listing-tab-counts.js +8 -8
- package/dist/_internal/server/features/products/og.js +1 -1
- package/dist/_internal/server/features/products/service.d.ts +51 -14
- package/dist/_internal/server/features/products/service.js +95 -29
- package/dist/_internal/server/features/protection-claims/actions.js +2 -1
- package/dist/_internal/server/features/refunds/actions.js +3 -2
- package/dist/_internal/server/features/scams/og.d.ts +1 -1
- package/dist/_internal/server/features/search/entity-index.d.ts +14 -0
- package/dist/_internal/server/features/search/entity-index.js +87 -0
- package/dist/_internal/server/features/search/index-build/build.js +13 -4
- package/dist/_internal/server/features/search/index-build/sources.d.ts +2 -0
- package/dist/_internal/server/features/search/index-build/sources.js +4 -2
- package/dist/_internal/server/features/search/search-everything.d.ts +2 -0
- package/dist/_internal/server/features/search/search-sources.js +5 -3
- package/dist/_internal/server/features/seo/index.d.ts +1 -1
- package/dist/_internal/server/features/seo/index.js +1 -1
- package/dist/_internal/server/features/seo/manifest.js +3 -3
- package/dist/_internal/server/features/seo/product-detail-types.js +2 -1
- package/dist/_internal/server/features/seo/robots.js +19 -4
- package/dist/_internal/server/features/seo/sitemap.js +62 -94
- package/dist/_internal/server/features/seo/static-params.d.ts +0 -18
- package/dist/_internal/server/features/seo/static-params.js +0 -55
- package/dist/_internal/server/features/shared/listing-data-factory.js +3 -3
- package/dist/_internal/server/features/shipping/courier-block.js +5 -2
- package/dist/_internal/server/features/shipping/reconcile.js +3 -2
- package/dist/_internal/server/features/shipping/reimbursement.js +3 -2
- package/dist/_internal/server/features/site-settings/actions.d.ts +36 -0
- package/dist/_internal/server/features/site-settings/actions.js +57 -1
- package/dist/_internal/server/features/site-settings/adapters.d.ts +3 -3
- package/dist/_internal/server/features/site-settings/adapters.js +39 -4
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +2 -2
- package/dist/_internal/server/features/sticker-trace/sweep.d.ts +13 -0
- package/dist/_internal/server/features/sticker-trace/sweep.js +49 -0
- package/dist/_internal/server/features/stores/activation.d.ts +22 -0
- package/dist/_internal/server/features/stores/activation.js +73 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +34 -2
- package/dist/_internal/server/features/stores/data.d.ts +1 -1
- package/dist/_internal/server/features/stores/data.js +1 -1
- package/dist/_internal/server/features/stores/index.d.ts +2 -1
- package/dist/_internal/server/features/stores/index.js +7 -1
- package/dist/_internal/server/features/stores/tabs.js +6 -11
- package/dist/_internal/server/features/widgets/widget-instances.d.ts +34 -0
- package/dist/_internal/server/features/widgets/widget-instances.js +169 -0
- package/dist/_internal/server/functions/define.d.ts +4 -4
- package/dist/_internal/server/functions/define.js +4 -4
- package/dist/_internal/server/functions/firestore.d.ts +3 -3
- package/dist/_internal/server/functions/firestore.js +18 -9
- package/dist/_internal/server/functions/https.js +1 -1
- package/dist/_internal/server/functions/scheduled.d.ts +26 -3
- package/dist/_internal/server/functions/scheduled.js +49 -12
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +5 -1
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +13 -11
- package/dist/_internal/server/jobs/core/bundleStockSync.js +1 -1
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +2 -2
- package/dist/_internal/server/jobs/core/clearanceAssignWinner.d.ts +60 -0
- package/dist/_internal/server/jobs/core/clearanceAssignWinner.js +227 -0
- package/dist/_internal/server/jobs/core/clearanceExpiryReveal.d.ts +14 -0
- package/dist/_internal/server/jobs/core/clearanceExpiryReveal.js +71 -0
- package/dist/_internal/server/jobs/core/clearanceSoldOutReveal.d.ts +22 -0
- package/dist/_internal/server/jobs/core/clearanceSoldOutReveal.js +67 -0
- package/dist/_internal/server/jobs/core/collectorDropSettlement.d.ts +2 -0
- package/dist/_internal/server/jobs/core/collectorDropSettlement.js +240 -0
- package/dist/_internal/server/jobs/core/countersReconcile.js +21 -21
- package/dist/_internal/server/jobs/core/dailyStatusDigest.js +7 -3
- package/dist/_internal/server/jobs/core/emiInstallmentReminder.js +2 -1
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +4 -2
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +6 -4
- package/dist/_internal/server/jobs/core/index.d.ts +5 -5
- package/dist/_internal/server/jobs/core/index.js +5 -5
- package/dist/_internal/server/jobs/core/jobRunners.d.ts +1 -1
- package/dist/_internal/server/jobs/core/jobRunners.js +25 -0
- package/dist/_internal/server/jobs/core/obligationSweep.js +5 -4
- package/dist/_internal/server/jobs/core/offerExpiry.js +23 -23
- package/dist/_internal/server/jobs/core/onCategoryWrite.d.ts +1 -1
- package/dist/_internal/server/jobs/core/onClearancePaymentConfirmed.d.ts +19 -0
- package/dist/_internal/server/jobs/core/onClearancePaymentConfirmed.js +32 -0
- package/dist/_internal/server/jobs/core/onProductWrite.d.ts +1 -1
- package/dist/_internal/server/jobs/core/onProductWrite.js +23 -23
- package/dist/_internal/server/jobs/core/onReviewWrite.d.ts +1 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +2 -1
- package/dist/_internal/server/jobs/core/onStoreWrite.d.ts +1 -1
- package/dist/_internal/server/jobs/core/paymentReconcile.js +5 -4
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +1 -1
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.d.ts +1 -1
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +1 -1
- package/dist/_internal/server/jobs/core/priceIndexRollup.d.ts +1 -1
- package/dist/_internal/server/jobs/core/priceIndexRollup.js +5 -5
- package/dist/_internal/server/jobs/core/promotions.js +1 -1
- package/dist/_internal/server/jobs/core/revalidateNotify.d.ts +1 -1
- package/dist/_internal/server/jobs/core/revalidateNotify.js +2 -2
- package/dist/_internal/server/jobs/core/settlementVendorRegister.d.ts +47 -0
- package/dist/_internal/server/jobs/core/settlementVendorRegister.js +414 -0
- package/dist/_internal/server/jobs/core/stickerTraceSweep.d.ts +9 -0
- package/dist/_internal/server/jobs/core/stickerTraceSweep.js +25 -0
- package/dist/_internal/server/jobs/core/surfaceCountsRollup.js +47 -7
- package/dist/_internal/server/jobs/core/testDataCleanup.js +1 -1
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +2 -2
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +17 -12
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +10 -8
- package/dist/_internal/server/jobs/handlers/clearanceExpiryReveal.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/clearanceExpiryReveal.js +2 -0
- package/dist/_internal/server/jobs/handlers/clearanceSoldOutReveal.d.ts +3 -0
- package/dist/_internal/server/jobs/handlers/clearanceSoldOutReveal.js +4 -0
- package/dist/_internal/server/jobs/handlers/collectorDropSettlement.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/collectorDropSettlement.js +2 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +6 -5
- package/dist/_internal/server/jobs/handlers/index.js +11 -9
- package/dist/_internal/server/jobs/handlers/messages.d.ts +4 -4
- package/dist/_internal/server/jobs/handlers/messages.js +13 -13
- package/dist/_internal/server/jobs/handlers/onCatalogueSubmittedForApproval.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onClearancePaymentConfirmed.d.ts +3 -0
- package/dist/_internal/server/jobs/handlers/onClearancePaymentConfirmed.js +11 -0
- package/dist/_internal/server/jobs/handlers/onProductStockChange.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onReviewWrite.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onScamReportCreate.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onShipmentDeleted.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onSiteSettingsWrite.d.ts +2 -2
- package/dist/_internal/server/jobs/handlers/onSiteSettingsWrite.js +1 -1
- package/dist/_internal/server/jobs/handlers/onSupportTicketCreate.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onSupportTicketUpdate.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/onUserBanChange.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/stickerTraceSweep.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/stickerTraceSweep.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +1 -1
- package/dist/_internal/server/jobs/runtime/adapters/firebase.d.ts +1 -1
- package/dist/_internal/server/jobs/runtime/adapters/firebase.js +1 -1
- package/dist/_internal/server/jobs/runtime/types.d.ts +1 -1
- package/dist/_internal/server/payments/policy-consent.d.ts +170 -0
- package/dist/_internal/server/payments/policy-consent.js +287 -0
- package/dist/_internal/server/payments/webhook-registry.d.ts +162 -0
- package/dist/_internal/server/payments/webhook-registry.js +228 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +40 -6
- package/dist/_internal/shared/actions/action-registry.js +318 -312
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +2 -2
- package/dist/_internal/shared/cache/revalidate-targets.js +8 -8
- package/dist/_internal/shared/checkout/lanes.d.ts +25 -25
- package/dist/_internal/shared/checkout/lanes.js +35 -35
- package/dist/_internal/shared/checkout/order-math.d.ts +50 -50
- package/dist/_internal/shared/checkout/order-math.js +108 -50
- package/dist/_internal/shared/checkout/payout-base.d.ts +51 -0
- package/dist/_internal/shared/checkout/payout-base.js +84 -0
- package/dist/_internal/shared/checkout/policy-consent.d.ts +182 -0
- package/dist/_internal/shared/checkout/policy-consent.js +214 -0
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +35 -4
- package/dist/_internal/shared/checkout/rules/_limits.js +35 -4
- package/dist/_internal/shared/checkout/rules/_registry.js +6 -8
- package/dist/_internal/shared/checkout/rules/art-and-stickers.rule.d.ts +13 -0
- package/dist/_internal/shared/checkout/rules/art-and-stickers.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/bundle.rule.d.ts +24 -6
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +4 -1
- package/dist/_internal/shared/checkout/rules/clearance.rule.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/clearance.rule.js +148 -0
- package/dist/_internal/shared/checkout/rules/collector-drop.rule.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/collector-drop.rule.js +50 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +4 -5
- package/dist/_internal/shared/checkout/rules/index.js +4 -5
- package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +24 -3
- package/dist/_internal/shared/checkout/rules/payment-gate.js +24 -6
- package/dist/_internal/shared/checkout/rules/preorder.rule.js +39 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +26 -5
- package/dist/_internal/shared/checkout/settlement-split.d.ts +136 -0
- package/dist/_internal/shared/checkout/settlement-split.js +198 -0
- package/dist/_internal/shared/checkout/settlement.d.ts +186 -0
- package/dist/_internal/shared/checkout/settlement.js +0 -0
- package/dist/_internal/shared/config/index.d.ts +1 -1
- package/dist/_internal/shared/config/schema.d.ts +50 -1
- package/dist/_internal/shared/content/composite-sentences/en.d.ts +31 -0
- package/dist/_internal/shared/content/composite-sentences/en.js +173 -0
- package/dist/_internal/shared/content/composite-sentences/index.d.ts +21 -0
- package/dist/_internal/shared/content/composite-sentences/index.js +26 -0
- package/dist/_internal/shared/content/composite-sentences/registry.d.ts +41 -0
- package/dist/_internal/shared/content/composite-sentences/registry.js +50 -0
- package/dist/_internal/shared/content/disclaimers.d.ts +4 -4
- package/dist/_internal/shared/content/disclaimers.js +32 -10
- package/dist/_internal/shared/content/fragmented-paragraphs/en.d.ts +20 -0
- package/dist/_internal/shared/content/fragmented-paragraphs/en.js +16 -0
- package/dist/_internal/shared/content/fragmented-paragraphs/index.d.ts +16 -0
- package/dist/_internal/shared/content/fragmented-paragraphs/index.js +22 -0
- package/dist/_internal/shared/content/fragments.d.ts +114 -0
- package/dist/_internal/shared/content/fragments.js +88 -0
- package/dist/_internal/shared/content/published-values.d.ts +2 -2
- package/dist/_internal/shared/content/published-values.js +33 -12
- package/dist/_internal/shared/features/admin/integrations.d.ts +2 -1
- package/dist/_internal/shared/features/admin/integrations.js +34 -16
- package/dist/_internal/shared/features/admin/row-widget-resources.d.ts +4 -0
- package/dist/_internal/shared/features/admin/row-widget-resources.js +29 -0
- package/dist/_internal/shared/features/blog/schema.d.ts +7 -7
- package/dist/_internal/shared/features/cart/schema.d.ts +8 -8
- package/dist/_internal/shared/features/cart/schema.js +3 -4
- package/dist/_internal/shared/features/categories/bundle-config.d.ts +3 -3
- package/dist/_internal/shared/features/categories/bundle-config.js +3 -3
- package/dist/_internal/shared/features/categories/bundle-copy.d.ts +1 -1
- package/dist/_internal/shared/features/categories/bundle-copy.js +1 -1
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +49 -49
- package/dist/_internal/shared/features/categories/bundle-schemas.js +1 -1
- package/dist/_internal/shared/features/checkout/config.d.ts +2 -0
- package/dist/_internal/shared/features/checkout/config.js +23 -0
- package/dist/_internal/shared/features/collector-drops/config.d.ts +100 -0
- package/dist/_internal/shared/features/collector-drops/config.js +136 -0
- package/dist/_internal/shared/features/collector-drops/errors.d.ts +16 -0
- package/dist/_internal/shared/features/collector-drops/errors.js +32 -0
- package/dist/_internal/shared/features/collector-drops/schema.d.ts +42 -0
- package/dist/_internal/shared/features/collector-drops/schema.js +24 -0
- package/dist/_internal/shared/features/content-tags/registry.d.ts +55 -0
- package/dist/_internal/shared/features/content-tags/registry.js +54 -0
- package/dist/_internal/shared/features/dashboard/recent-entry.d.ts +466 -0
- package/dist/_internal/shared/features/dashboard/recent-entry.js +132 -0
- package/dist/_internal/shared/features/events/config.d.ts +1 -1
- package/dist/_internal/shared/features/events/config.js +1 -1
- package/dist/_internal/shared/features/events/schema.d.ts +4 -4
- package/dist/_internal/shared/features/layout/config.d.ts +9 -1
- package/dist/_internal/shared/features/layout/config.js +23 -3
- package/dist/_internal/shared/features/notifications/action-url.js +1 -1
- package/dist/_internal/shared/features/notifications/email-eligibility.d.ts +4 -4
- package/dist/_internal/shared/features/notifications/email-eligibility.js +9 -9
- package/dist/_internal/shared/features/offers/config.js +1 -1
- package/dist/_internal/shared/features/orders/refund-copy.js +3 -2
- package/dist/_internal/shared/features/orders/schema.d.ts +2 -2
- package/dist/_internal/shared/features/orders/workflow-registry.d.ts +145 -0
- package/dist/_internal/shared/features/orders/workflow-registry.js +197 -0
- package/dist/_internal/shared/features/payouts/destination.d.ts +101 -0
- package/dist/_internal/shared/features/payouts/destination.js +221 -0
- package/dist/_internal/shared/features/print/label-profiles.d.ts +1 -1
- package/dist/_internal/shared/features/print/label-profiles.js +1 -1
- package/dist/_internal/shared/features/products/composite.d.ts +104 -0
- package/dist/_internal/shared/features/products/composite.js +188 -0
- package/dist/_internal/shared/features/products/group-rules.d.ts +28 -2
- package/dist/_internal/shared/features/products/group-rules.js +29 -0
- package/dist/_internal/shared/features/products/pdp-section-ids.d.ts +13 -0
- package/dist/_internal/shared/features/products/pdp-section-ids.js +14 -0
- package/dist/_internal/shared/features/products/schema.d.ts +31 -13
- package/dist/_internal/shared/features/products/schema.js +75 -10
- package/dist/_internal/shared/features/products/to-product-item.js +1 -1
- package/dist/_internal/shared/features/products/types.d.ts +1 -1
- package/dist/_internal/shared/features/promotions/errors.js +2 -1
- package/dist/_internal/shared/features/promotions/schema.d.ts +4 -4
- package/dist/_internal/shared/features/shipping/offer.d.ts +408 -0
- package/dist/_internal/shared/features/shipping/offer.js +440 -0
- package/dist/_internal/shared/features/site-settings/fees.d.ts +32 -3
- package/dist/_internal/shared/features/site-settings/fees.js +1 -1
- package/dist/_internal/shared/features/site-settings/settings-preview-registry.d.ts +17 -0
- package/dist/_internal/shared/features/site-settings/settings-preview-registry.js +56 -0
- package/dist/_internal/shared/features/site-settings/toggle-catalog.d.ts +68 -0
- package/dist/_internal/shared/features/site-settings/toggle-catalog.js +204 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +27 -1
- package/dist/_internal/shared/fees/calculator.d.ts +256 -21
- package/dist/_internal/shared/fees/calculator.js +269 -26
- package/dist/_internal/shared/fees/explain.d.ts +20 -5
- package/dist/_internal/shared/fees/explain.js +38 -18
- package/dist/_internal/shared/listing-types/_registry.d.ts +30 -15
- package/dist/_internal/shared/listing-types/_registry.js +39 -16
- package/dist/_internal/shared/listing-types/action-tracker.d.ts +1 -1
- package/dist/_internal/shared/listing-types/art-and-stickers/config.d.ts +94 -0
- package/dist/_internal/shared/listing-types/art-and-stickers/config.js +57 -0
- package/dist/_internal/shared/listing-types/art-and-stickers/ctas.js +3 -0
- package/dist/_internal/shared/listing-types/art-and-stickers/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/art-and-stickers/schema.js +3 -0
- package/dist/_internal/shared/listing-types/availability.js +2 -2
- package/dist/_internal/shared/listing-types/capabilities.d.ts +77 -1
- package/dist/_internal/shared/listing-types/capabilities.js +72 -13
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +1 -0
- package/dist/_internal/shared/listing-types/clearance/config.d.ts +74 -0
- package/dist/_internal/shared/listing-types/clearance/config.js +46 -0
- package/dist/_internal/shared/listing-types/clearance/schema.d.ts +3 -0
- package/dist/_internal/shared/listing-types/clearance/schema.js +13 -0
- package/dist/_internal/shared/listing-types/collector-drop/config.d.ts +85 -0
- package/dist/_internal/shared/listing-types/collector-drop/config.js +59 -0
- package/dist/_internal/shared/listing-types/collector-drop/schema.d.ts +3 -0
- package/dist/_internal/shared/listing-types/collector-drop/schema.js +11 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +125 -8
- package/dist/_internal/shared/listing-types/feature-flags.js +149 -12
- package/dist/_internal/shared/listing-types/hidden-surfaces.d.ts +19 -10
- package/dist/_internal/shared/listing-types/hidden-surfaces.js +6 -5
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +20 -5
- package/dist/_internal/shared/listing-types/pre-order/schema.d.ts +45 -0
- package/dist/_internal/shared/listing-types/pre-order/schema.js +60 -2
- package/dist/_internal/shared/listing-types/route-gating.d.ts +11 -11
- package/dist/_internal/shared/listing-types/route-gating.js +15 -14
- package/dist/_internal/shared/listing-types/spares/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/config.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +1 -0
- package/dist/_internal/shared/listing-types/tiers.d.ts +2 -2
- package/dist/_internal/shared/listing-types/tiers.js +6 -7
- package/dist/_internal/shared/search/index-record.d.ts +10 -4
- package/dist/_internal/shared/search/index-record.js +18 -1
- package/dist/_internal/shared/search/match.d.ts +3 -1
- package/dist/_internal/shared/search/match.js +2 -1
- package/dist/_internal/shared/search/to-groups.js +1 -0
- package/dist/_internal/shared/templating/placeholders.d.ts +18 -0
- package/dist/_internal/shared/templating/placeholders.js +24 -0
- package/dist/_internal/shared/tester/window.d.ts +1 -1
- package/dist/_internal/shared/tester/window.js +5 -5
- package/dist/_internal/shared/tokens/index.d.ts +1 -1
- package/dist/_internal/shared/tokens/index.js +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/client-entry.d.ts +1 -1
- package/dist/client.d.ts +49 -40
- package/dist/client.js +97 -32
- package/dist/configs/next.d.ts +1 -1
- package/dist/configs/tailwind.d.ts +12 -0
- package/dist/configs/tailwind.js +14 -0
- package/dist/constants/api-endpoints.d.ts +93 -51
- package/dist/constants/api-endpoints.js +53 -28
- package/dist/constants/field-names.d.ts +63 -20
- package/dist/constants/field-names.js +64 -21
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.js +2 -2
- package/dist/constants/notification-types.d.ts +1 -1
- package/dist/constants/pagination-presets.d.ts +2 -2
- package/dist/constants/pagination-presets.js +2 -2
- package/dist/constants/seed-meta.d.ts +1 -1
- package/dist/constants/storage-keys.d.ts +96 -0
- package/dist/constants/storage-keys.js +131 -0
- package/dist/constants/table-keys.d.ts +3 -2
- package/dist/constants/table-keys.js +3 -2
- package/dist/contracts/ai.d.ts +183 -0
- package/dist/contracts/ai.js +2 -0
- package/dist/contracts/auth.d.ts +16 -1
- package/dist/contracts/client-live-edit.d.ts +29 -0
- package/dist/contracts/client-live-edit.js +23 -0
- package/dist/contracts/feature.d.ts +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/payment.d.ts +280 -0
- package/dist/contracts/payment.js +125 -0
- package/dist/contracts/registry.d.ts +37 -1
- package/dist/contracts/tax.d.ts +118 -0
- package/dist/contracts/tax.js +3 -0
- package/dist/core/CacheManager.d.ts +21 -0
- package/dist/core/CacheManager.js +38 -0
- package/dist/core/brand-resolver.d.ts +92 -0
- package/dist/core/brand-resolver.js +120 -0
- package/dist/core/brand-text.d.ts +15 -0
- package/dist/core/brand-text.js +73 -0
- package/dist/core/hooks/useNewsletterSubscribe.d.ts +30 -0
- package/dist/core/hooks/useNewsletterSubscribe.js +121 -0
- package/dist/core/integration-keys.d.ts +6 -0
- package/dist/core/integration-keys.js +14 -0
- package/dist/core/mutation-events.d.ts +3 -3
- package/dist/core/mutation-events.js +7 -5
- package/dist/core/site-config.js +1 -1
- package/dist/core/unit-of-work.d.ts +1 -2
- package/dist/core/unit-of-work.js +1 -5
- package/dist/edit-mode/index.d.ts +11 -0
- package/dist/edit-mode/index.js +10 -0
- package/dist/errors/error-codes.d.ts +7 -7
- package/dist/errors/error-codes.js +7 -7
- package/dist/errors/error-display-map.js +8 -8
- package/dist/errors/messages.d.ts +8 -8
- package/dist/errors/messages.js +8 -8
- package/dist/features/_guide-cls.d.ts +1 -0
- package/dist/features/_guide-cls.js +10 -1
- package/dist/features/about/components/DeveloperView.d.ts +4 -1
- package/dist/features/about/components/DeveloperView.js +4 -2
- package/dist/features/about/components/FeesView.d.ts +4 -1
- package/dist/features/about/components/FeesView.js +3 -2
- package/dist/features/about/components/GstExplainerView.d.ts +4 -1
- package/dist/features/about/components/GstExplainerView.js +3 -2
- package/dist/features/about/components/GuidesHubView.d.ts +5 -2
- package/dist/features/about/components/GuidesHubView.js +7 -6
- package/dist/features/about/components/HelpPageView.d.ts +10 -1
- package/dist/features/about/components/HelpPageView.js +6 -5
- package/dist/features/about/components/HowCheckoutWorksView.d.ts +4 -1
- package/dist/features/about/components/HowCheckoutWorksView.js +4 -14
- package/dist/features/about/components/HowCollectorDropsWorkView.d.ts +6 -0
- package/dist/features/about/components/HowCollectorDropsWorkView.js +105 -0
- package/dist/features/about/components/HowEmiWorksView.d.ts +4 -1
- package/dist/features/about/components/HowEmiWorksView.js +4 -14
- package/dist/features/about/components/HowOffersWorkView.d.ts +4 -1
- package/dist/features/about/components/HowOffersWorkView.js +3 -16
- package/dist/features/about/components/HowOrdersWorkView.d.ts +4 -1
- package/dist/features/about/components/HowOrdersWorkView.js +3 -10
- package/dist/features/about/components/HowPayoutsWorkView.d.ts +4 -1
- package/dist/features/about/components/HowPayoutsWorkView.js +5 -15
- package/dist/features/about/components/HowPreOrdersWorkView.d.ts +4 -1
- package/dist/features/about/components/HowPreOrdersWorkView.js +5 -15
- package/dist/features/about/components/HowReviewsWorkView.d.ts +4 -1
- package/dist/features/about/components/HowReviewsWorkView.js +5 -15
- package/dist/features/about/components/PolicyPageView.d.ts +79 -3
- package/dist/features/about/components/PolicyPageView.js +63 -4
- package/dist/features/about/components/PublicProfileView.d.ts +11 -1
- package/dist/features/about/components/PublicProfileView.js +9 -8
- package/dist/features/about/components/SecurityPrivacyView.d.ts +4 -1
- package/dist/features/about/components/SecurityPrivacyView.js +3 -2
- package/dist/features/about/components/ShippingPolicyView.d.ts +4 -1
- package/dist/features/about/components/ShippingPolicyView.js +4 -3
- package/dist/features/about/components/SpotAFakeView.d.ts +4 -1
- package/dist/features/about/components/SpotAFakeView.js +3 -2
- package/dist/features/about/components/TrackOrderView.d.ts +4 -1
- package/dist/features/about/components/TrackOrderView.js +3 -2
- package/dist/features/about/index.d.ts +2 -2
- package/dist/features/about/index.js +1 -1
- package/dist/features/about/schemas/index.d.ts +18 -18
- package/dist/features/account/components/AddressBook.d.ts +1 -1
- package/dist/features/account/components/AddressForm.js +25 -1
- package/dist/features/account/components/BecomeSellerView.d.ts +4 -1
- package/dist/features/account/components/BecomeSellerView.js +3 -2
- package/dist/features/account/components/BuyerAccountGuideView.d.ts +6 -1
- package/dist/features/account/components/BuyerAccountGuideView.js +5 -4
- package/dist/features/account/components/BuyerCollectorDropsGuideView.d.ts +7 -0
- package/dist/features/account/components/BuyerCollectorDropsGuideView.js +46 -0
- package/dist/features/account/components/BuyerOrdersGuideView.d.ts +6 -1
- package/dist/features/account/components/BuyerOrdersGuideView.js +8 -7
- package/dist/features/account/components/BuyerShoppingGuideView.d.ts +6 -1
- package/dist/features/account/components/BuyerShoppingGuideView.js +7 -6
- package/dist/features/account/components/NotificationBell.js +1 -1
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/OrderDetailView.d.ts +4 -1
- package/dist/features/account/components/OrderDetailView.js +3 -1
- package/dist/features/account/components/UserAccountHubView.d.ts +4 -1
- package/dist/features/account/components/UserAccountHubView.js +8 -2
- package/dist/features/account/components/UserBidsView.d.ts +6 -1
- package/dist/features/account/components/UserBidsView.js +17 -8
- package/dist/features/account/components/UserOffersPanel.js +2 -1
- package/dist/features/account/components/UserOrderTrackView.d.ts +4 -1
- package/dist/features/account/components/UserOrderTrackView.js +3 -1
- package/dist/features/account/components/UserOrdersView.d.ts +4 -1
- package/dist/features/account/components/UserOrdersView.js +6 -5
- package/dist/features/account/components/UserReturnsView.d.ts +4 -1
- package/dist/features/account/components/UserReturnsView.js +4 -3
- package/dist/features/account/components/UserSidebar.js +14 -4
- package/dist/features/account/hooks/useCollapsedSections.js +5 -3
- package/dist/features/account/hooks/useNotifications.d.ts +1 -1
- package/dist/features/account/hooks/useProfile.d.ts +13 -0
- package/dist/features/account/hooks/usePublicProfile.d.ts +11 -1
- package/dist/features/account/hooks/usePublicProfile.js +6 -1
- package/dist/features/account/schemas/index.d.ts +4 -4
- package/dist/features/account/schemas/index.js +1 -1
- package/dist/features/addresses/schemas/address-form.d.ts +12 -12
- package/dist/features/addresses/schemas/index.d.ts +2 -2
- package/dist/features/admin/actions/admin-actions.js +4 -4
- package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
- package/dist/features/admin/actions/admin-read-actions.js +1 -1
- package/dist/features/admin/actions/notification-actions.js +13 -6
- package/dist/features/admin/actions/site-settings-actions.d.ts +1 -1
- package/dist/features/admin/api/bids/route.js +7 -1
- package/dist/features/admin/api/coupons/route.js +7 -1
- package/dist/features/admin/api/products/route.js +7 -1
- package/dist/features/admin/api/reviews/route.js +7 -1
- package/dist/features/admin/components/AdminActionIndexView.d.ts +4 -1
- package/dist/features/admin/components/AdminActionIndexView.js +3 -2
- package/dist/features/admin/components/AdminAdEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminAdEditorView.js +3 -1
- package/dist/features/admin/components/AdminAddressBookView.d.ts +4 -1
- package/dist/features/admin/components/AdminAddressBookView.js +3 -2
- package/dist/features/admin/components/AdminAddressClustersView.d.ts +4 -1
- package/dist/features/admin/components/AdminAddressClustersView.js +3 -2
- package/dist/features/admin/components/AdminAddressEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminAddressEditorView.js +13 -2
- package/dist/features/admin/components/AdminAddressesView.d.ts +4 -1
- package/dist/features/admin/components/AdminAddressesView.js +3 -2
- package/dist/features/admin/components/AdminAdsView.d.ts +4 -1
- package/dist/features/admin/components/AdminAdsView.js +3 -2
- package/dist/features/admin/components/AdminAllEventEntriesView.d.ts +6 -2
- package/dist/features/admin/components/AdminAllEventEntriesView.js +3 -2
- package/dist/features/admin/components/AdminAnalyticsGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminAnalyticsGuideView.js +4 -2
- package/dist/features/admin/components/AdminArtAndStickersView.d.ts +20 -0
- package/dist/features/admin/components/AdminArtAndStickersView.js +39 -0
- package/dist/features/admin/components/AdminAuditLogView.d.ts +6 -2
- package/dist/features/admin/components/AdminAuditLogView.js +5 -1
- package/dist/features/admin/components/AdminBidsView.d.ts +6 -2
- package/dist/features/admin/components/AdminBidsView.js +5 -3
- package/dist/features/admin/components/AdminBlogEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +5 -2
- package/dist/features/admin/components/AdminBlogView.d.ts +6 -2
- package/dist/features/admin/components/AdminBlogView.js +4 -2
- package/dist/features/admin/components/AdminBrandEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminBrandEditorView.js +6 -2
- package/dist/features/admin/components/AdminBrandsView.d.ts +6 -2
- package/dist/features/admin/components/AdminBrandsView.js +7 -3
- package/dist/features/admin/components/AdminBundleEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminBundleEditorView.js +6 -2
- package/dist/features/admin/components/AdminBundlesView.d.ts +4 -1
- package/dist/features/admin/components/AdminBundlesView.js +12 -4
- package/dist/features/admin/components/AdminCartsView.d.ts +6 -2
- package/dist/features/admin/components/AdminCartsView.js +7 -2
- package/dist/features/admin/components/AdminCatalogGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminCatalogGuideView.js +5 -3
- package/dist/features/admin/components/AdminCategoriesView.d.ts +6 -2
- package/dist/features/admin/components/AdminCategoriesView.js +7 -3
- package/dist/features/admin/components/AdminCategoryEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +13 -9
- package/dist/features/admin/components/AdminClassifiedView.d.ts +6 -2
- package/dist/features/admin/components/AdminClassifiedView.js +8 -3
- package/dist/features/admin/components/AdminClearanceView.d.ts +8 -0
- package/dist/features/admin/components/AdminClearanceView.js +156 -0
- package/dist/features/admin/components/AdminContactView.d.ts +4 -1
- package/dist/features/admin/components/AdminContactView.js +3 -1
- package/dist/features/admin/components/AdminContentGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminContentGuideView.js +5 -3
- package/dist/features/admin/components/AdminCouponEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminCouponEditorView.js +9 -5
- package/dist/features/admin/components/AdminCouponsView.d.ts +4 -1
- package/dist/features/admin/components/AdminCouponsView.js +4 -2
- package/dist/features/admin/components/AdminDashboardView.d.ts +4 -1
- package/dist/features/admin/components/AdminDashboardView.js +3 -1
- package/dist/features/admin/components/AdminDigitalCodesView.d.ts +6 -2
- package/dist/features/admin/components/AdminDigitalCodesView.js +4 -3
- package/dist/features/admin/components/AdminEmployeeEditorView.d.ts +36 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +15 -7
- package/dist/features/admin/components/AdminFaqEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminFaqEditorView.js +84 -5
- package/dist/features/admin/components/AdminFaqsView.d.ts +4 -1
- package/dist/features/admin/components/AdminFaqsView.js +5 -4
- package/dist/features/admin/components/AdminFeatureEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminFeatureEditorView.js +6 -2
- package/dist/features/admin/components/AdminFeaturesView.d.ts +6 -2
- package/dist/features/admin/components/AdminFeaturesView.js +10 -4
- package/dist/features/admin/components/AdminFulfillmentView.d.ts +4 -1
- package/dist/features/admin/components/AdminFulfillmentView.js +3 -2
- package/dist/features/admin/components/AdminGatewayEventsView.d.ts +6 -2
- package/dist/features/admin/components/AdminGatewayEventsView.js +5 -3
- package/dist/features/admin/components/AdminGroupedListingsView.d.ts +6 -2
- package/dist/features/admin/components/AdminGroupedListingsView.js +3 -2
- package/dist/features/admin/components/AdminGuideHubView.d.ts +7 -1
- package/dist/features/admin/components/AdminGuideHubView.js +6 -3
- package/dist/features/admin/components/AdminHistoryView.d.ts +6 -2
- package/dist/features/admin/components/AdminHistoryView.js +7 -6
- package/dist/features/admin/components/AdminInvoicingView.d.ts +6 -1
- package/dist/features/admin/components/AdminInvoicingView.js +3 -2
- package/dist/features/admin/components/AdminLiveView.d.ts +6 -2
- package/dist/features/admin/components/AdminLiveView.js +4 -3
- package/dist/features/admin/components/AdminMediaView.d.ts +4 -1
- package/dist/features/admin/components/AdminMediaView.js +15 -3
- package/dist/features/admin/components/AdminMoneyCasesView.d.ts +6 -2
- package/dist/features/admin/components/AdminMoneyCasesView.js +5 -3
- package/dist/features/admin/components/AdminNavEditorView.d.ts +12 -1
- package/dist/features/admin/components/AdminNavEditorView.js +4 -3
- package/dist/features/admin/components/AdminNavigationView.d.ts +4 -1
- package/dist/features/admin/components/AdminNavigationView.js +3 -1
- package/dist/features/admin/components/AdminNewsletterView.d.ts +4 -1
- package/dist/features/admin/components/AdminNewsletterView.js +3 -2
- package/dist/features/admin/components/AdminNotificationsView.d.ts +6 -2
- package/dist/features/admin/components/AdminNotificationsView.js +19 -7
- package/dist/features/admin/components/AdminOffersView.d.ts +6 -2
- package/dist/features/admin/components/AdminOffersView.js +4 -3
- package/dist/features/admin/components/AdminOrderEditorView.d.ts +1 -1
- package/dist/features/admin/components/AdminOrderEditorView.js +1 -1
- package/dist/features/admin/components/AdminOrdersGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminOrdersGuideView.js +6 -4
- package/dist/features/admin/components/AdminOrdersView.d.ts +6 -2
- package/dist/features/admin/components/AdminOrdersView.js +46 -5
- package/dist/features/admin/components/AdminPaymentClustersView.d.ts +4 -1
- package/dist/features/admin/components/AdminPaymentClustersView.js +3 -2
- package/dist/features/admin/components/AdminPaymentMethodsView.d.ts +4 -1
- package/dist/features/admin/components/AdminPaymentMethodsView.js +3 -2
- package/dist/features/admin/components/AdminPaymentsGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminPaymentsGuideView.js +3 -2
- package/dist/features/admin/components/AdminPayoutsView.d.ts +6 -2
- package/dist/features/admin/components/AdminPayoutsView.js +3 -2
- package/dist/features/admin/components/AdminProductEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminProductEditorView.js +7 -3
- package/dist/features/admin/components/AdminProductsView.d.ts +4 -1
- package/dist/features/admin/components/AdminProductsView.js +80 -48
- package/dist/features/admin/components/AdminReturnRequestsView.d.ts +4 -1
- package/dist/features/admin/components/AdminReturnRequestsView.js +3 -2
- package/dist/features/admin/components/AdminReviewsView.d.ts +6 -2
- package/dist/features/admin/components/AdminReviewsView.js +3 -2
- package/dist/features/admin/components/AdminScammersView.d.ts +6 -2
- package/dist/features/admin/components/AdminScammersView.js +3 -2
- package/dist/features/admin/components/AdminSectionsView.d.ts +4 -1
- package/dist/features/admin/components/AdminSectionsView.js +42 -40
- package/dist/features/admin/components/AdminSessionsView.d.ts +6 -2
- package/dist/features/admin/components/AdminSessionsView.js +3 -2
- package/dist/features/admin/components/AdminSidebar.js +19 -5
- package/dist/features/admin/components/AdminSiteConfigGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminSiteConfigGuideView.js +4 -3
- package/dist/features/admin/components/AdminSiteSettingsView.d.ts +4 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +1161 -646
- package/dist/features/admin/components/AdminSparesView.d.ts +7 -3
- package/dist/features/admin/components/AdminSparesView.js +5 -4
- package/dist/features/admin/components/AdminStoreAddressesView.d.ts +4 -1
- package/dist/features/admin/components/AdminStoreAddressesView.js +3 -2
- package/dist/features/admin/components/AdminStoreEditorView.js +4 -3
- package/dist/features/admin/components/AdminStoresGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminStoresGuideView.js +4 -2
- package/dist/features/admin/components/AdminStoresView.d.ts +6 -2
- package/dist/features/admin/components/AdminStoresView.js +3 -2
- package/dist/features/admin/components/AdminSublistingCategoriesView.d.ts +4 -1
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +4 -3
- package/dist/features/admin/components/AdminSublistingCategoryEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +3 -1
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +2 -1
- package/dist/features/admin/components/AdminSupportTicketsView.d.ts +6 -2
- package/dist/features/admin/components/AdminSupportTicketsView.js +3 -2
- package/dist/features/admin/components/AdminTaxCodesView.d.ts +6 -2
- package/dist/features/admin/components/AdminTaxCodesView.js +4 -3
- package/dist/features/admin/components/AdminTeamGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminTeamGuideView.js +5 -2
- package/dist/features/admin/components/AdminTeamView.d.ts +4 -1
- package/dist/features/admin/components/AdminTeamView.js +22 -28
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.d.ts +6 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +6 -2
- package/dist/features/admin/components/AdminTesterChecklistView.d.ts +4 -1
- package/dist/features/admin/components/AdminTesterChecklistView.js +5 -4
- package/dist/features/admin/components/AdminTrustGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminTrustGuideView.js +5 -3
- package/dist/features/admin/components/AdminUserEditorView.js +2 -1
- package/dist/features/admin/components/AdminUsersGuideView.d.ts +6 -1
- package/dist/features/admin/components/AdminUsersGuideView.js +4 -2
- package/dist/features/admin/components/AdminUsersView.d.ts +6 -2
- package/dist/features/admin/components/AdminUsersView.js +38 -6
- package/dist/features/admin/components/AdminViewCards.js +1 -1
- package/dist/features/admin/components/AdminWishlistsView.d.ts +6 -2
- package/dist/features/admin/components/AdminWishlistsView.js +7 -6
- package/dist/features/admin/components/DashboardStats.js +20 -23
- package/dist/features/admin/components/DataListingView.js +16 -2
- package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/OwnerQuickActions.js +18 -2
- package/dist/features/admin/components/QuickEditMenu.js +1 -1
- package/dist/features/admin/components/ViewNotificationModal.js +1 -1
- package/dist/features/admin/components/analytics/AdminStatCard.d.ts +1 -5
- package/dist/features/admin/components/analytics/AdminStatCard.js +2 -14
- package/dist/features/admin/components/index.d.ts +4 -12
- package/dist/features/admin/components/index.js +4 -8
- package/dist/features/admin/components/sections/adminSectionsBuildParse.d.ts +5 -5
- package/dist/features/admin/components/sections/adminSectionsBuildParse.js +22 -22
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +8 -7
- package/dist/features/admin/components/sections/adminSectionsTypes.js +14 -14
- package/dist/features/admin/constants/filter-tabs.d.ts +27 -17
- package/dist/features/admin/constants/filter-tabs.js +40 -12
- package/dist/features/admin/constants/site-settings-tabs.d.ts +4 -4
- package/dist/features/admin/constants/site-settings-tabs.js +3 -3
- package/dist/features/admin/hooks/build-filter-panel.d.ts +50 -0
- package/dist/features/admin/hooks/build-filter-panel.js +55 -0
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/hooks/useAdminListingData.js +14 -1
- package/dist/features/admin/hooks/useAdminSiteSettingsPreview.d.ts +6 -0
- package/dist/features/admin/hooks/useAdminSiteSettingsPreview.js +46 -0
- package/dist/features/admin/repository/site-settings.repository.d.ts +26 -25
- package/dist/features/admin/repository/site-settings.repository.js +73 -21
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +2 -2
- package/dist/features/admin/schemas/admin-user-form.d.ts +7 -7
- package/dist/features/admin/schemas/admin-user-form.js +6 -6
- package/dist/features/admin/schemas/firestore.d.ts +265 -41
- package/dist/features/admin/schemas/firestore.js +10 -10
- package/dist/features/admin/schemas/nav-item-form.d.ts +2 -2
- package/dist/features/admin/schemas/site-settings-about-form.d.ts +162 -0
- package/dist/features/admin/schemas/site-settings-about-form.js +142 -0
- package/dist/features/admin/schemas/site-settings-announcement-form.d.ts +18 -0
- package/dist/features/admin/schemas/site-settings-announcement-form.js +53 -0
- package/dist/features/admin/schemas/site-settings-appearance-form.d.ts +93 -0
- package/dist/features/admin/schemas/site-settings-appearance-form.js +75 -0
- package/dist/features/admin/schemas/site-settings-branding-form.d.ts +30 -0
- package/dist/features/admin/schemas/site-settings-branding-form.js +77 -0
- package/dist/features/admin/schemas/site-settings-collector-drop-form.d.ts +30 -0
- package/dist/features/admin/schemas/site-settings-collector-drop-form.js +63 -0
- package/dist/features/admin/schemas/site-settings-contact-form.d.ts +42 -0
- package/dist/features/admin/schemas/site-settings-contact-form.js +85 -0
- package/dist/features/admin/schemas/site-settings-emi-form.d.ts +27 -0
- package/dist/features/admin/schemas/site-settings-emi-form.js +68 -0
- package/dist/features/admin/schemas/site-settings-fees-form.d.ts +78 -0
- package/dist/features/admin/schemas/site-settings-fees-form.js +161 -0
- package/dist/features/admin/schemas/site-settings-form.d.ts +3 -3
- package/dist/features/admin/schemas/site-settings-form.js +1 -1
- package/dist/features/admin/schemas/site-settings-gst-form.d.ts +18 -0
- package/dist/features/admin/schemas/site-settings-gst-form.js +57 -0
- package/dist/features/admin/schemas/site-settings-integrations-form.d.ts +99 -0
- package/dist/features/admin/schemas/site-settings-integrations-form.js +172 -0
- package/dist/features/admin/schemas/site-settings-legal-form.d.ts +38 -0
- package/dist/features/admin/schemas/site-settings-legal-form.js +76 -0
- package/dist/features/admin/schemas/site-settings-limits-form.d.ts +15 -0
- package/dist/features/admin/schemas/site-settings-limits-form.js +48 -0
- package/dist/features/admin/schemas/site-settings-listings-form.d.ts +15 -0
- package/dist/features/admin/schemas/site-settings-listings-form.js +78 -0
- package/dist/features/admin/schemas/site-settings-notifications-form.d.ts +60 -0
- package/dist/features/admin/schemas/site-settings-notifications-form.js +160 -0
- package/dist/features/admin/schemas/site-settings-procurement-form.d.ts +12 -0
- package/dist/features/admin/schemas/site-settings-procurement-form.js +48 -0
- package/dist/features/admin/schemas/site-settings-seo-form.d.ts +21 -0
- package/dist/features/admin/schemas/site-settings-seo-form.js +42 -0
- package/dist/features/admin/schemas/site-settings-shipping-form.d.ts +48 -0
- package/dist/features/admin/schemas/site-settings-shipping-form.js +132 -0
- package/dist/features/admin/schemas/site-settings-watermark-form.d.ts +34 -0
- package/dist/features/admin/schemas/site-settings-watermark-form.js +68 -0
- package/dist/features/admin/schemas/site-settings-whatsapp-form.d.ts +36 -0
- package/dist/features/admin/schemas/site-settings-whatsapp-form.js +62 -0
- package/dist/features/admin/types/product.types.d.ts +6 -6
- package/dist/features/admin/types/product.types.js +1 -1
- package/dist/features/analytics/types.d.ts +1 -1
- package/dist/features/analytics/types.js +3 -3
- package/dist/features/assistant/components/AdminAssistantWidget.d.ts +1 -0
- package/dist/features/assistant/components/AdminAssistantWidget.js +84 -0
- package/dist/features/assistant/components/AssistantPageView.d.ts +6 -0
- package/dist/features/assistant/components/AssistantPageView.js +54 -0
- package/dist/features/assistant/components/AssistantWidget.d.ts +5 -0
- package/dist/features/assistant/components/AssistantWidget.js +127 -0
- package/dist/features/assistant/schemas/ask.d.ts +15 -0
- package/dist/features/assistant/schemas/ask.js +10 -0
- package/dist/features/audit-log/schemas/firestore.d.ts +94 -0
- package/dist/features/audit-log/schemas/firestore.js +51 -0
- package/dist/features/auth/actions/profile-actions.d.ts +8 -6
- package/dist/features/auth/actions/profile-actions.js +17 -8
- package/dist/features/auth/actions/user-slug.js +21 -2
- package/dist/features/auth/auth-helpers.d.ts +186 -2
- package/dist/features/auth/auth-helpers.js +320 -4
- package/dist/features/auth/components/Guards.d.ts +10 -0
- package/dist/features/auth/components/Guards.js +30 -6
- package/dist/features/auth/components/OAuthLoadingView.d.ts +6 -1
- package/dist/features/auth/components/OAuthLoadingView.js +3 -2
- package/dist/features/auth/hooks/useAuth.js +11 -4
- package/dist/features/auth/hooks/useRBAC.d.ts +29 -1
- package/dist/features/auth/hooks/useRBAC.js +46 -12
- package/dist/features/auth/permissions/constants.d.ts +130 -5
- package/dist/features/auth/permissions/constants.js +176 -2
- package/dist/features/auth/repository/user.repository.d.ts +89 -29
- package/dist/features/auth/repository/user.repository.js +218 -79
- package/dist/features/auth/role-predicates.d.ts +64 -8
- package/dist/features/auth/role-predicates.js +104 -12
- package/dist/features/auth/schemas/firestore.d.ts +107 -8
- package/dist/features/auth/schemas/firestore.js +19 -2
- package/dist/features/auth/schemas/index.d.ts +26 -6
- package/dist/features/auth/schemas/index.js +17 -0
- package/dist/features/auth/types/index.d.ts +23 -1
- package/dist/features/before-after/schemas/index.d.ts +2 -2
- package/dist/features/blog/actions/blog-actions.d.ts +31 -31
- package/dist/features/blog/actions/blog-actions.js +1 -1
- package/dist/features/blog/components/BlogFeaturedCard.js +1 -1
- package/dist/features/blog/components/BlogIndexListing.js +2 -1
- package/dist/features/blog/components/BlogIndexPageView.d.ts +4 -1
- package/dist/features/blog/components/BlogIndexPageView.js +3 -2
- package/dist/features/blog/components/BlogListView.js +1 -1
- package/dist/features/blog/components/BlogPostView.js +33 -2
- package/dist/features/blog/schemas/blog-category.schema.d.ts +2 -0
- package/dist/features/blog/schemas/blog-category.schema.js +8 -0
- package/dist/features/blog/schemas/blog-form.d.ts +4 -4
- package/dist/features/blog/schemas/blog-form.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +67 -67
- package/dist/features/blog/schemas/index.js +3 -7
- package/dist/features/cart/actions/cart-actions.d.ts +5 -5
- package/dist/features/cart/actions/cart-actions.js +7 -7
- package/dist/features/cart/components/CartDrawer.js +1 -1
- package/dist/features/cart/components/CartGroupLineRow.js +1 -1
- package/dist/features/cart/components/CartView.d.ts +1 -1
- package/dist/features/cart/hooks/useCartQuery.d.ts +1 -1
- package/dist/features/cart/hooks/useCheckoutReadQueries.d.ts +1 -1
- package/dist/features/cart/repository/cart.repository.d.ts +3 -3
- package/dist/features/cart/repository/cart.repository.js +6 -6
- package/dist/features/cart/schemas/firestore.d.ts +21 -21
- package/dist/features/cart/schemas/firestore.js +2 -2
- package/dist/features/cart/schemas/index.d.ts +15 -15
- package/dist/features/cart/utils/pending-ops.d.ts +1 -1
- package/dist/features/cart/utils/pending-ops.js +16 -3
- package/dist/features/catalogue/components/AdminCatalogueApprovalsView.d.ts +6 -1
- package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +3 -1
- package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +6 -1
- package/dist/features/catalogue/components/CatalogueItemEditorView.js +3 -2
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.d.ts +4 -1
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +4 -3
- package/dist/features/catalogue/components/PublicCatalogueView.js +1 -1
- package/dist/features/catalogue/components/UserCatalogueView.d.ts +4 -1
- package/dist/features/catalogue/components/UserCatalogueView.js +4 -3
- package/dist/features/catalogue/utils/product-from-item.d.ts +18 -2
- package/dist/features/catalogue/utils/product-from-item.js +23 -4
- package/dist/features/categories/api/[id]/description-template/route.js +1 -24
- package/dist/features/categories/api/[id]/price-guidance/route.js +6 -1
- package/dist/features/categories/api/[id]/route.js +20 -3
- package/dist/features/categories/api/route.js +1 -1
- package/dist/features/categories/components/BrandDetailPageView.d.ts +4 -1
- package/dist/features/categories/components/BrandDetailPageView.js +50 -10
- package/dist/features/categories/components/BrandDetailTabs.d.ts +12 -3
- package/dist/features/categories/components/BrandDetailTabs.js +10 -9
- package/dist/features/categories/components/BundleCollage.d.ts +1 -1
- package/dist/features/categories/components/BundleCollage.js +2 -2
- package/dist/features/categories/components/BundleDetailView.d.ts +4 -1
- package/dist/features/categories/components/BundleDetailView.js +4 -3
- package/dist/features/categories/components/BundleDynamicRuleEditor.d.ts +1 -1
- package/dist/features/categories/components/BundleDynamicRuleEditor.js +1 -1
- package/dist/features/categories/components/BundleItemsPicker.js +2 -1
- package/dist/features/categories/components/BundlesListView.d.ts +4 -1
- package/dist/features/categories/components/BundlesListView.js +3 -2
- package/dist/features/categories/components/CategoriesIndexListing.js +10 -3
- package/dist/features/categories/components/CategoriesIndexPageView.d.ts +4 -1
- package/dist/features/categories/components/CategoriesIndexPageView.js +3 -2
- package/dist/features/categories/components/CategoryBundlesListing.js +7 -3
- package/dist/features/categories/components/CategoryDetailPageView.d.ts +4 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +135 -101
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +12 -3
- package/dist/features/categories/components/CategoryDetailTabs.js +10 -10
- package/dist/features/categories/components/CategoryForm.js +2 -1
- package/dist/features/categories/components/CategoryGrid.js +1 -1
- package/dist/features/categories/components/CategoryProductsListing.d.ts +1 -1
- package/dist/features/categories/components/CategoryProductsListing.js +6 -5
- package/dist/features/categories/components/CategoryTableColumns.js +1 -1
- package/dist/features/categories/components/ConcernCard.js +1 -1
- package/dist/features/categories/components/ContextualTrail.d.ts +9 -2
- package/dist/features/categories/components/ContextualTrail.js +11 -3
- package/dist/features/categories/components/FranchiseDetailPageView.d.ts +4 -1
- package/dist/features/categories/components/FranchiseDetailPageView.js +24 -5
- package/dist/features/categories/components/FranchisesIndexView.d.ts +6 -1
- package/dist/features/categories/components/FranchisesIndexView.js +4 -3
- package/dist/features/categories/components/LastCategoryBeacon.js +2 -2
- package/dist/features/categories/components/SubcategoryCardRow.js +1 -1
- package/dist/features/categories/hooks/useCategorySelector.d.ts +1 -1
- package/dist/features/categories/hooks/useCategoryTree.js +1 -1
- package/dist/features/categories/repository/categories.repository.d.ts +43 -6
- package/dist/features/categories/repository/categories.repository.js +75 -22
- package/dist/features/categories/repository/price-index.repository.d.ts +2 -2
- package/dist/features/categories/schemas/bundle-form.d.ts +21 -21
- package/dist/features/categories/schemas/bundle-form.js +1 -1
- package/dist/features/categories/schemas/category-content.d.ts +3 -3
- package/dist/features/categories/schemas/category-counts.d.ts +5 -5
- package/dist/features/categories/schemas/category-counts.js +4 -4
- package/dist/features/categories/schemas/firestore.d.ts +36 -18
- package/dist/features/categories/schemas/firestore.js +9 -9
- package/dist/features/categories/schemas/index.d.ts +122 -116
- package/dist/features/categories/schemas/index.js +10 -6
- package/dist/features/categories/types/index.d.ts +13 -10
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +9 -1
- package/dist/features/checkout/manifest.js +15 -6
- package/dist/features/checkout/repository/buyer-policy-consent.repository.d.ts +44 -0
- package/dist/features/checkout/repository/buyer-policy-consent.repository.js +66 -0
- package/dist/features/checkout/schemas/firestore.d.ts +37 -0
- package/dist/features/checkout/schemas/firestore.js +1 -0
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +4 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +35 -21
- package/dist/features/collections/components/CollectionCard.js +1 -1
- package/dist/features/collections/schemas/index.d.ts +4 -4
- package/dist/features/collector-drops/actions/bid-actions.d.ts +50 -0
- package/dist/features/collector-drops/actions/bid-actions.js +454 -0
- package/dist/features/collector-drops/api/route.d.ts +14 -0
- package/dist/features/collector-drops/api/route.js +62 -0
- package/dist/features/collector-drops/columns/index.d.ts +14 -0
- package/dist/features/collector-drops/columns/index.js +63 -0
- package/dist/features/collector-drops/components/CollapsibleBidHistory.js +41 -0
- package/dist/features/collector-drops/components/CollectorDropBidsTable.d.ts +27 -0
- package/dist/features/collector-drops/components/CollectorDropBidsTable.js +96 -0
- package/dist/features/collector-drops/components/CollectorDropBottomActions.d.ts +23 -0
- package/dist/features/collector-drops/components/CollectorDropBottomActions.js +89 -0
- package/dist/features/collector-drops/components/CollectorDropDetailPageView.d.ts +25 -0
- package/dist/features/collector-drops/components/CollectorDropDetailPageView.js +314 -0
- package/dist/features/collector-drops/components/CollectorDropFilters.d.ts +16 -0
- package/dist/features/collector-drops/components/CollectorDropFilters.js +18 -0
- package/dist/features/collector-drops/components/CollectorDropLiveStatusBadge.d.ts +20 -0
- package/dist/features/collector-drops/components/CollectorDropLiveStatusBadge.js +21 -0
- package/dist/features/collector-drops/components/CollectorDropsListView.d.ts +9 -0
- package/dist/features/collector-drops/components/CollectorDropsListView.js +23 -0
- package/dist/features/collector-drops/components/LiveBidPrice.d.ts +19 -0
- package/dist/features/collector-drops/components/LiveBidPrice.js +19 -0
- package/dist/features/collector-drops/components/LiveMinIncrement.d.ts +18 -0
- package/dist/features/collector-drops/components/LiveMinIncrement.js +25 -0
- package/dist/features/collector-drops/components/MarketplaceCollectorDropCard.d.ts +99 -0
- package/dist/features/collector-drops/components/MarketplaceCollectorDropCard.js +212 -0
- package/dist/features/collector-drops/components/MarketplaceCollectorDropGrid.d.ts +21 -0
- package/dist/features/collector-drops/components/MarketplaceCollectorDropGrid.js +47 -0
- package/dist/features/collector-drops/components/PlaceBidFormClient.d.ts +65 -0
- package/dist/features/collector-drops/components/PlaceBidFormClient.js +306 -0
- package/dist/features/collector-drops/components/bid-detail-fields.js +103 -0
- package/dist/features/collector-drops/components/index.d.ts +7 -0
- package/dist/features/collector-drops/components/index.js +5 -0
- package/dist/features/collector-drops/hooks/useBids.d.ts +33 -0
- package/dist/features/collector-drops/hooks/useBids.js +32 -0
- package/dist/features/collector-drops/hooks/useCollectorDrops.d.ts +51 -0
- package/dist/features/collector-drops/hooks/useCollectorDrops.js +105 -0
- package/dist/features/collector-drops/hooks/useIsCollectorDropEnded.d.ts +41 -0
- package/dist/features/collector-drops/hooks/useIsCollectorDropEnded.js +76 -0
- package/dist/features/collector-drops/hooks/useLiveCollectorDropBid.d.ts +20 -0
- package/dist/features/collector-drops/hooks/useLiveCollectorDropBid.js +23 -0
- package/dist/features/collector-drops/hooks/usePlaceBid.d.ts +25 -0
- package/dist/features/collector-drops/hooks/usePlaceBid.js +28 -0
- package/dist/features/collector-drops/hooks/useRealtimeBids.d.ts +41 -0
- package/dist/features/collector-drops/hooks/useRealtimeBids.js +170 -0
- package/dist/features/collector-drops/index.d.ts +8 -0
- package/dist/features/collector-drops/index.js +8 -0
- package/dist/features/collector-drops/manifest.js +17 -0
- package/dist/features/collector-drops/messages/en.json +18 -0
- package/dist/features/collector-drops/repository/bid.repository.d.ts +256 -0
- package/dist/features/collector-drops/repository/bid.repository.js +575 -0
- package/dist/features/collector-drops/schemas/bid-input.d.ts +30 -0
- package/dist/features/collector-drops/schemas/bid-input.js +28 -0
- package/dist/features/collector-drops/schemas/firestore.d.ts +120 -0
- package/dist/features/collector-drops/schemas/firestore.js +73 -0
- package/dist/features/collector-drops/schemas/index.d.ts +170 -0
- package/dist/features/collector-drops/schemas/index.js +64 -0
- package/dist/features/collector-drops/server.d.ts +8 -0
- package/dist/features/collector-drops/server.js +8 -0
- package/dist/features/collector-drops/types/index.d.ts +74 -0
- package/dist/features/consultation/schemas/index.d.ts +6 -6
- package/dist/features/contact/components/ContactInfoSidebar.d.ts +3 -1
- package/dist/features/contact/components/ContactInfoSidebar.js +3 -2
- package/dist/features/contact/components/ContactPageView.d.ts +4 -1
- package/dist/features/contact/components/ContactPageView.js +7 -6
- package/dist/features/contact/email.d.ts +1 -1
- package/dist/features/contact/email.js +11 -12
- package/dist/features/contact/schemas/inquiry-forms.js +2 -2
- package/dist/features/corporate/schemas/index.d.ts +5 -5
- package/dist/features/cron/firebase-adapters.d.ts +3 -3
- package/dist/features/cron/firebase-adapters.js +3 -3
- package/dist/features/cron/index.d.ts +0 -1
- package/dist/features/cron/index.js +9 -1
- package/dist/features/cron/jobs/preorder-reminder.job.d.ts +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/cron/registry.d.ts +4 -4
- package/dist/features/cron/registry.js +4 -4
- package/dist/features/dashboard/components/AdminComposableRegion.d.ts +49 -0
- package/dist/features/dashboard/components/AdminComposableRegion.js +42 -0
- package/dist/features/dashboard/components/DashboardCardRenderer.d.ts +73 -0
- package/dist/features/dashboard/components/DashboardCardRenderer.js +434 -0
- package/dist/features/dashboard/components/DashboardHubView.d.ts +19 -1
- package/dist/features/dashboard/components/DashboardHubView.js +11 -6
- package/dist/features/dashboard/components/DashboardQuickJump.d.ts +90 -0
- package/dist/features/dashboard/components/DashboardQuickJump.js +255 -0
- package/dist/features/dashboard/components/DashboardSectionsClient.js +7 -0
- package/dist/features/dashboard/components/EditableWidget.d.ts +51 -0
- package/dist/features/dashboard/components/EditableWidget.js +44 -0
- package/dist/features/dashboard/components/HiddenHubCardGate.d.ts +25 -0
- package/dist/features/dashboard/components/HiddenHubCardGate.js +44 -0
- package/dist/features/dashboard/components/RecentVisitTracker.d.ts +35 -0
- package/dist/features/dashboard/components/RecentVisitTracker.js +33 -0
- package/dist/features/dashboard/components/WidgetInstanceEditor.d.ts +91 -0
- package/dist/features/dashboard/components/WidgetInstanceEditor.js +91 -0
- package/dist/features/dashboard/hooks/useHiddenHubCards.d.ts +9 -0
- package/dist/features/dashboard/hooks/useHiddenHubCards.js +101 -0
- package/dist/features/dashboard/hooks/usePageRegion.d.ts +27 -0
- package/dist/features/dashboard/hooks/usePageRegion.js +106 -0
- package/dist/features/dashboard/hooks/useRecentlyVisited.d.ts +9 -0
- package/dist/features/dashboard/hooks/useRecentlyVisited.js +127 -0
- package/dist/features/dashboard/hooks/useSavedCards.d.ts +23 -0
- package/dist/features/dashboard/hooks/useSavedCards.js +147 -0
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.d.ts +4 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +29 -13
- package/dist/features/email/notification-templates.js +7 -8
- package/dist/features/email/render-static-markup.d.ts +34 -0
- package/dist/features/email/render-static-markup.js +4 -0
- package/dist/features/events/actions/event-actions.d.ts +11 -3
- package/dist/features/events/actions/event-actions.js +21 -11
- package/dist/features/events/api/[id]/route.js +1 -1
- package/dist/features/events/components/AdminEventEditorView.d.ts +6 -1
- package/dist/features/events/components/AdminEventEditorView.js +81 -21
- package/dist/features/events/components/AdminEventEntriesView.d.ts +4 -1
- package/dist/features/events/components/AdminEventEntriesView.js +3 -2
- package/dist/features/events/components/AdminEventsView.d.ts +6 -2
- package/dist/features/events/components/AdminEventsView.js +5 -4
- package/dist/features/events/components/BonusSpinView.d.ts +27 -0
- package/dist/features/events/components/BonusSpinView.js +151 -0
- package/dist/features/events/components/EventCard.js +1 -1
- package/dist/features/events/components/EventFilters.js +13 -5
- package/dist/features/events/components/EventGiveawayEntryForm.d.ts +24 -0
- package/dist/features/events/components/EventGiveawayEntryForm.js +46 -0
- package/dist/features/events/components/EventGiveawayWinnerView.d.ts +38 -0
- package/dist/features/events/components/EventGiveawayWinnerView.js +40 -0
- package/dist/features/events/components/EventGiveawaysSection.d.ts +48 -0
- package/dist/features/events/components/EventGiveawaysSection.js +102 -0
- package/dist/features/events/components/EventsIndexListing.js +7 -3
- package/dist/features/events/components/EventsListPageView.d.ts +4 -1
- package/dist/features/events/components/EventsListPageView.js +4 -2
- package/dist/features/events/components/RelatedEventsCarousel.js +1 -1
- package/dist/features/events/components/event-entry-detail-fields.d.ts +1 -1
- package/dist/features/events/components/event-entry-detail-fields.js +1 -1
- package/dist/features/events/components/index.d.ts +8 -8
- package/dist/features/events/components/index.js +4 -4
- package/dist/features/events/constants/event-type-meta.d.ts +14 -6
- package/dist/features/events/constants/event-type-meta.js +40 -14
- package/dist/features/events/manifest.js +31 -0
- package/dist/features/events/repository/events.repository.js +1 -1
- package/dist/features/events/schemas/event-form.d.ts +40 -10
- package/dist/features/events/schemas/event-form.js +32 -1
- package/dist/features/events/schemas/firestore.d.ts +55 -13
- package/dist/features/events/schemas/firestore.js +15 -10
- package/dist/features/events/schemas/index.d.ts +144 -133
- package/dist/features/events/schemas/index.js +24 -11
- package/dist/features/events/types/index.d.ts +32 -7
- package/dist/features/events/types/index.js +45 -8
- package/dist/features/events/utils/carousel-slide.d.ts +12 -14
- package/dist/features/events/utils/carousel-slide.js +23 -26
- package/dist/features/events/utils/event-charts.js +2 -1
- package/dist/features/faq/actions/faq-actions.d.ts +197 -6
- package/dist/features/faq/actions/faq-actions.js +79 -2
- package/dist/features/faq/components/FAQAccordion.js +2 -1
- package/dist/features/faq/manifest.js +9 -1
- package/dist/features/faq/schemas/firestore.d.ts +26 -1
- package/dist/features/faq/schemas/firestore.js +1 -0
- package/dist/features/faq/schemas/index.d.ts +2 -2
- package/dist/features/faq/utils/getHomepageFaqsCached.d.ts +9 -0
- package/dist/features/faq/utils/getHomepageFaqsCached.js +21 -1
- package/dist/features/faq/utils/resolveFaqAnswer.d.ts +9 -0
- package/dist/features/faq/utils/resolveFaqAnswer.js +18 -0
- package/dist/features/gateway-events/schemas/index.d.ts +2 -2
- package/dist/features/giveaway/repository/giveaway-entry.repository.d.ts +48 -0
- package/dist/features/giveaway/repository/giveaway-entry.repository.js +172 -0
- package/dist/features/giveaway/schemas/config-write.d.ts +145 -0
- package/dist/features/giveaway/schemas/config-write.js +199 -0
- package/dist/features/giveaway/schemas/firestore.d.ts +77 -0
- package/dist/features/giveaway/schemas/firestore.js +42 -0
- package/dist/features/giveaway/schemas/zod.d.ts +113 -0
- package/dist/features/giveaway/schemas/zod.js +39 -0
- package/dist/features/giveaway/types/index.d.ts +72 -0
- package/dist/features/giveaway/types/index.js +68 -0
- package/dist/features/grouped/components/GroupedListingDetailView.d.ts +4 -1
- package/dist/features/grouped/components/GroupedListingDetailView.js +4 -3
- package/dist/features/grouped/components/GroupedListingEditorView.d.ts +10 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +3 -2
- package/dist/features/grouped/schemas/index.d.ts +2 -2
- package/dist/features/history/repository/user-history.repository.d.ts +1 -1
- package/dist/features/history/utils/guest-history.d.ts +1 -1
- package/dist/features/homepage/actions/index.d.ts +0 -1
- package/dist/features/homepage/actions/index.js +0 -1
- package/dist/features/homepage/api/carousel/route.d.ts +12 -6
- package/dist/features/homepage/api/carousel/route.js +15 -137
- package/dist/features/homepage/components/AdSlot.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.js +5 -3
- package/dist/features/homepage/components/CTABannerSection.js +2 -2
- package/dist/features/homepage/components/CollectionCardsSection.d.ts +2 -2
- package/dist/features/homepage/components/CollectionCardsSection.js +4 -4
- package/dist/features/homepage/components/CustomCardsSection.js +1 -1
- package/dist/features/homepage/components/FeaturedCollectorDropsSection.d.ts +18 -0
- package/dist/features/homepage/components/FeaturedCollectorDropsSection.js +12 -0
- package/dist/features/homepage/components/GoogleReviewsSection.js +1 -1
- package/dist/features/homepage/components/HeroCarousel.js +7 -6
- package/dist/features/homepage/components/HomepageSectionBoundary.d.ts +1 -1
- package/dist/features/homepage/components/HomepageSectionBoundary.js +1 -1
- package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +4 -1
- package/dist/features/homepage/components/MarketplaceHomepageView.js +23 -32
- package/dist/features/homepage/components/SectionCarousel.js +1 -1
- package/dist/features/homepage/components/ShopByCategorySection.js +12 -2
- package/dist/features/homepage/components/SocialPostCard.js +1 -1
- package/dist/features/homepage/components/TrustFeaturesSection.js +11 -1
- package/dist/features/homepage/components/WelcomeSection.d.ts +3 -1
- package/dist/features/homepage/components/WelcomeSection.js +2 -2
- package/dist/features/homepage/components/index.d.ts +2 -2
- package/dist/features/homepage/components/index.js +1 -1
- package/dist/features/homepage/constants/carousel.d.ts +8 -0
- package/dist/features/homepage/constants/carousel.js +8 -0
- package/dist/features/homepage/constants/section-copy.d.ts +2 -2
- package/dist/features/homepage/constants/section-copy.js +5 -5
- package/dist/features/homepage/hooks/homepage-query.js +2 -2
- package/dist/features/homepage/hooks/useActiveAd.d.ts +1 -1
- package/dist/features/homepage/hooks/useActiveAd.js +1 -1
- package/dist/features/homepage/hooks/useFeaturedCollectorDrops.d.ts +15 -0
- package/dist/features/homepage/hooks/useFeaturedCollectorDrops.js +49 -0
- package/dist/features/homepage/index.d.ts +1 -1
- package/dist/features/homepage/index.js +1 -1
- package/dist/features/homepage/lib/section-gating.d.ts +1 -1
- package/dist/features/homepage/lib/section-gating.js +1 -1
- package/dist/features/homepage/lib/section-renderer.d.ts +11 -2
- package/dist/features/homepage/lib/section-renderer.js +24 -13
- package/dist/features/homepage/lib/slide-gating.d.ts +5 -5
- package/dist/features/homepage/lib/slide-gating.js +6 -6
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +48 -169
- package/dist/features/homepage/schemas/firestore.js +12 -57
- package/dist/features/homepage/schemas/index.d.ts +2 -885
- package/dist/features/homepage/schemas/index.js +7 -112
- package/dist/features/homepage/server.d.ts +1 -3
- package/dist/features/homepage/server.js +1 -3
- package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +6 -1
- package/dist/features/inventory/components/AdminMoveLedgerView.js +3 -2
- package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +6 -1
- package/dist/features/inventory/components/AdminStorageBoxesView.js +4 -3
- package/dist/features/inventory/components/ReceiveStationView.d.ts +4 -1
- package/dist/features/inventory/components/ReceiveStationView.js +3 -2
- package/dist/features/jobs/actions/enqueue-job.d.ts +1 -1
- package/dist/features/jobs/schemas/firestore.d.ts +1 -1
- package/dist/features/layout/AppLayoutShell.d.ts +32 -1
- package/dist/features/layout/AppLayoutShell.js +44 -14
- package/dist/features/layout/AutoBreadcrumbs.js +6 -7
- package/dist/features/layout/BottomActions.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +1 -1
- package/dist/features/layout/BottomNavbar.js +1 -1
- package/dist/features/layout/EditModeToggle.d.ts +8 -0
- package/dist/features/layout/EditModeToggle.js +17 -0
- package/dist/features/layout/LanguageSwitcher.d.ts +27 -0
- package/dist/features/layout/LanguageSwitcher.js +28 -0
- package/dist/features/layout/NavbarLayout.js +2 -2
- package/dist/features/layout/SideActionDock.js +2 -2
- package/dist/features/layout/SidebarLayout.js +11 -1
- package/dist/features/layout/TitleBarLayout.d.ts +21 -1
- package/dist/features/layout/TitleBarLayout.js +2 -2
- package/dist/features/layout/index.d.ts +6 -6
- package/dist/features/layout/index.js +3 -3
- package/dist/features/live/components/LiveItemDetailPageView.d.ts +4 -1
- package/dist/features/live/components/LiveItemDetailPageView.js +21 -3
- package/dist/features/media/MediaPickerModal.js +1 -1
- package/dist/features/media/hooks/useMedia.d.ts +1 -1
- package/dist/features/media/index.d.ts +0 -8
- package/dist/features/media/index.js +2 -5
- package/dist/features/media/modals/ImageCropModal.d.ts +2 -8
- package/dist/features/media/types/index.d.ts +4 -4
- package/dist/features/media/upload/ImageUpload.js +1 -1
- package/dist/features/media/upload/MediaUploadField.js +2 -2
- package/dist/features/media/upload/MediaUploadList.js +2 -2
- package/dist/features/media/upload/register-form-field-renderers.d.ts +1 -0
- package/dist/features/media/upload/register-form-field-renderers.js +34 -0
- package/dist/features/messages/components/ConversationThreadView.d.ts +4 -1
- package/dist/features/messages/components/ConversationThreadView.js +4 -3
- package/dist/features/messages/components/ConversationsInboxView.d.ts +6 -1
- package/dist/features/messages/components/ConversationsInboxView.js +26 -3
- package/dist/features/messages/schemas/firestore.d.ts +26 -3
- package/dist/features/messages/schemas/firestore.js +10 -0
- package/dist/features/obligations/constants/policies.js +71 -2
- package/dist/features/obligations/schemas/firestore.d.ts +17 -1
- package/dist/features/obligations/schemas/firestore.js +1 -0
- package/dist/features/orders/actions/order-actions.js +39 -0
- package/dist/features/orders/actions/refund-actions.js +3 -2
- package/dist/features/orders/components/OrderPaymentSummary.js +1 -0
- package/dist/features/orders/components/OrderProvenanceCard.js +11 -11
- package/dist/features/orders/components/OrdersList.js +6 -4
- package/dist/features/orders/components/RefundRequestView.d.ts +4 -1
- package/dist/features/orders/components/RefundRequestView.js +18 -4
- package/dist/features/orders/constants/order-lane-tabs.d.ts +3 -3
- package/dist/features/orders/constants/order-lane-tabs.js +8 -8
- package/dist/features/orders/hooks/useOrders.d.ts +2 -0
- package/dist/features/orders/hooks/useOrders.js +7 -1
- package/dist/features/orders/repository/orders.repository.js +4 -3
- package/dist/features/orders/schemas/firestore.d.ts +197 -26
- package/dist/features/orders/schemas/firestore.js +1 -1
- package/dist/features/orders/schemas/index.d.ts +69 -29
- package/dist/features/orders/schemas/index.js +19 -1
- package/dist/features/orders/types/index.d.ts +45 -4
- package/dist/features/orders/utils/order-splitter.d.ts +3 -3
- package/dist/features/orders/utils/order-splitter.js +8 -8
- package/dist/features/orders/utils/payment-proof-message.js +5 -2
- package/dist/features/payments/repository/payout.repository.d.ts +80 -0
- package/dist/features/payments/repository/payout.repository.js +116 -0
- package/dist/features/payments/schemas/firestore.d.ts +29 -0
- package/dist/features/payments/schemas/firestore.js +15 -0
- package/dist/features/payments/schemas/index.d.ts +2 -2
- package/dist/features/payments/types/index.d.ts +1 -1
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +1 -1
- package/dist/features/pre-orders/components/PreOrderActionsClient.d.ts +5 -0
- package/dist/features/pre-orders/components/PreOrderActionsClient.js +8 -5
- package/dist/features/pre-orders/components/PreOrderDetailPageView.d.ts +4 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +30 -10
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/pre-orders/components/PreOrdersListView.d.ts +4 -1
- package/dist/features/pre-orders/components/PreOrdersListView.js +3 -2
- package/dist/features/pre-orders/schemas/index.d.ts +8 -8
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +4 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +12 -11
- package/dist/features/price-index/lookup-target.js +1 -1
- package/dist/features/pricing/components/AdminPricingView.js +2 -1
- package/dist/features/print/components/BoxLabelPrintView.d.ts +4 -1
- package/dist/features/print/components/BoxLabelPrintView.js +3 -2
- package/dist/features/print/components/labels.js +2 -1
- package/dist/features/products/actions/product-actions.d.ts +9 -9
- package/dist/features/products/actions/product-actions.js +19 -19
- package/dist/features/products/api/[id]/route.js +31 -10
- package/dist/features/products/api/route.d.ts +2 -2
- package/dist/features/products/api/route.js +11 -4
- package/dist/features/products/columns/productTableColumns.js +1 -1
- package/dist/features/products/components/ArtStickersListView.d.ts +4 -1
- package/dist/features/products/components/ArtStickersListView.js +7 -6
- package/dist/features/products/components/AvailabilityTabs.js +2 -2
- package/dist/features/products/components/BidHistory.d.ts +3 -0
- package/dist/features/products/components/BidHistory.js +3 -1
- package/dist/features/products/components/CardStoreLine.d.ts +2 -2
- package/dist/features/products/components/CardStoreLine.js +1 -1
- package/dist/features/products/components/CityCollectiblesView.d.ts +4 -1
- package/dist/features/products/components/CityCollectiblesView.js +4 -2
- package/dist/features/products/components/ClearanceBottomActions.d.ts +6 -0
- package/dist/features/products/components/ClearanceBottomActions.js +6 -0
- package/dist/features/products/components/ClearanceCollage.d.ts +35 -0
- package/dist/features/products/components/ClearanceCollage.js +91 -0
- package/dist/features/products/components/ClearanceDetailPageView.d.ts +37 -0
- package/dist/features/products/components/ClearanceDetailPageView.js +156 -0
- package/dist/features/products/components/ClearanceEntryActions.d.ts +32 -0
- package/dist/features/products/components/ClearanceEntryActions.js +104 -0
- package/dist/features/products/components/ClearanceIndexListing.d.ts +8 -0
- package/dist/features/products/components/ClearanceIndexListing.js +108 -0
- package/dist/features/products/components/ClearanceItemsEditor.d.ts +13 -0
- package/dist/features/products/components/ClearanceItemsEditor.js +101 -0
- package/dist/features/products/components/ClearanceListingView.d.ts +18 -0
- package/dist/features/products/components/ClearanceListingView.js +38 -0
- package/dist/features/products/components/ClearanceSection.d.ts +15 -0
- package/dist/features/products/components/ClearanceSection.js +49 -0
- package/dist/features/products/components/ClearanceWinnerMappingView.d.ts +14 -0
- package/dist/features/products/components/ClearanceWinnerMappingView.js +43 -0
- package/dist/features/products/components/CollectorDropDetailView.d.ts +16 -0
- package/dist/features/products/components/CollectorDropDetailView.js +13 -0
- package/dist/features/products/components/CollectorDropsIndexListing.d.ts +8 -0
- package/dist/features/products/components/CollectorDropsIndexListing.js +170 -0
- package/dist/features/products/components/CompareOverlay.d.ts +2 -2
- package/dist/features/products/components/CompareOverlay.js +5 -5
- package/dist/features/products/components/CustomSectionTabContent.d.ts +1 -1
- package/dist/features/products/components/CustomSectionTabContent.js +1 -1
- package/dist/features/products/components/GroupMemberPicker.js +1 -1
- package/dist/features/products/components/GroupSettingsPanel.d.ts +2 -2
- package/dist/features/products/components/GroupSettingsPanel.js +4 -4
- package/dist/features/products/components/ListingBottomActions.d.ts +4 -4
- package/dist/features/products/components/ListingBottomActions.js +1 -1
- package/dist/features/products/components/MakeOfferButton.js +2 -1
- package/dist/features/products/components/MarketplaceBundleCard.js +1 -1
- package/dist/features/products/components/MarketplaceClearanceCard.d.ts +34 -0
- package/dist/features/products/components/MarketplaceClearanceCard.js +129 -0
- package/dist/features/products/components/NonRefundableConsentModal.d.ts +1 -1
- package/dist/features/products/components/NonRefundableConsentModal.js +2 -2
- package/dist/features/products/components/PdpSectionJumpNav.d.ts +4 -0
- package/dist/features/products/components/PdpSectionJumpNav.js +41 -0
- package/dist/features/products/components/PlaceBidForm.d.ts +1 -1
- package/dist/features/products/components/PrizeRevealModal.js +32 -8
- package/dist/features/products/components/ProductDetailActions.js +1 -1
- package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
- package/dist/features/products/components/ProductDetailPageView.js +128 -98
- package/dist/features/products/components/ProductFeatureBadges.js +10 -7
- package/dist/features/products/components/ProductFilters.js +1 -1
- package/dist/features/products/components/ProductForm.d.ts +1 -1
- package/dist/features/products/components/ProductForm.js +20 -21
- package/dist/features/products/components/ProductGalleryClient.js +1 -1
- package/dist/features/products/components/ProductGradingTab.js +1 -1
- package/dist/features/products/components/ProductGrid.d.ts +18 -1
- package/dist/features/products/components/ProductGrid.js +91 -22
- package/dist/features/products/components/ProductsIndexListing.d.ts +1 -1
- package/dist/features/products/components/ProductsIndexListing.js +85 -18
- package/dist/features/products/components/ProductsIndexPageView.d.ts +4 -1
- package/dist/features/products/components/ProductsIndexPageView.js +12 -11
- package/dist/features/products/components/RelatedItemsSection.d.ts +82 -2
- package/dist/features/products/components/RelatedItemsSection.js +152 -9
- package/dist/features/products/components/ShowGroupSection.js +30 -2
- package/dist/features/products/components/SparesListView.d.ts +4 -1
- package/dist/features/products/components/SparesListView.js +3 -2
- package/dist/features/products/components/SublistingCarouselSection.js +1 -1
- package/dist/features/products/components/TrustBadgeRow.d.ts +15 -0
- package/dist/features/products/components/TrustBadgeRow.js +13 -0
- package/dist/features/products/components/index.d.ts +16 -16
- package/dist/features/products/components/index.js +9 -9
- package/dist/features/products/config/listing-type-listing-config.js +1 -1
- package/dist/features/products/constants/action-defs.d.ts +24 -25
- package/dist/features/products/constants/action-defs.js +35 -36
- package/dist/features/products/constants/card-badges.d.ts +3 -3
- package/dist/features/products/constants/card-badges.js +3 -3
- package/dist/features/products/constants/listing-tabs.d.ts +11 -5
- package/dist/features/products/constants/listing-tabs.js +21 -22
- package/dist/features/products/constants/preorder-window.d.ts +101 -0
- package/dist/features/products/constants/preorder-window.js +172 -0
- package/dist/features/products/constants/product-features.constants.js +3 -3
- package/dist/features/products/constants/sieve.d.ts +4 -4
- package/dist/features/products/constants/sieve.js +14 -14
- package/dist/features/products/hooks/useProducts.js +1 -1
- package/dist/features/products/hooks/useRelatedProducts.d.ts +2 -2
- package/dist/features/products/hooks/useRelatedProducts.js +5 -5
- package/dist/features/products/index.d.ts +1 -1
- package/dist/features/products/index.js +3 -3
- package/dist/features/products/messages/en.json +1 -1
- package/dist/features/products/repository/category-assignment.js +2 -2
- package/dist/features/products/repository/products.repository.d.ts +9 -6
- package/dist/features/products/repository/products.repository.js +56 -30
- package/dist/features/products/schemas/firestore.d.ts +81 -29
- package/dist/features/products/schemas/firestore.js +84 -14
- package/dist/features/products/schemas/index.d.ts +61 -40
- package/dist/features/products/schemas/index.js +26 -10
- package/dist/features/products/schemas/part-slots.d.ts +84 -0
- package/dist/features/products/schemas/part-slots.js +231 -0
- package/dist/features/products/schemas/product-features.d.ts +3 -3
- package/dist/features/products/schemas/product-features.validators.d.ts +40 -40
- package/dist/features/products/schemas/product-features.validators.js +3 -3
- package/dist/features/products/schemas/surface-counts.d.ts +1 -1
- package/dist/features/products/schemas/surface-counts.js +1 -1
- package/dist/features/products/types/index.d.ts +7 -7
- package/dist/features/products/utils/listing-badge-variant.d.ts +1 -1
- package/dist/features/products/utils/listing-badge-variant.js +5 -6
- package/dist/features/products/utils/listing-type.d.ts +6 -9
- package/dist/features/products/utils/listing-type.js +30 -9
- package/dist/features/promotions/actions/seller-coupon-actions.d.ts +2 -2
- package/dist/features/promotions/actions/seller-coupon-actions.js +2 -2
- package/dist/features/promotions/components/CouponCard.d.ts +1 -1
- package/dist/features/promotions/components/CouponCard.js +3 -2
- package/dist/features/promotions/components/CouponHelpDetails.js +2 -1
- package/dist/features/promotions/components/CouponsIndexListing.js +3 -1
- package/dist/features/promotions/constants/coupon-help.d.ts +1 -1
- package/dist/features/promotions/constants/coupon-help.js +8 -1
- package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
- package/dist/features/promotions/repository/coupons.repository.d.ts +2 -5
- package/dist/features/promotions/repository/coupons.repository.js +22 -11
- package/dist/features/promotions/schemas/firestore.d.ts +11 -3
- package/dist/features/promotions/schemas/index.d.ts +23 -23
- package/dist/features/promotions/schemas/index.js +3 -3
- package/dist/features/reviews/actions/review-actions.js +1 -1
- package/dist/features/reviews/api/[id]/route.js +34 -10
- package/dist/features/reviews/components/ReviewDetailPageView.d.ts +4 -1
- package/dist/features/reviews/components/ReviewDetailPageView.js +29 -2
- package/dist/features/reviews/components/ReviewDetailShell.js +2 -2
- package/dist/features/reviews/components/ReviewModal.js +1 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.d.ts +4 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +4 -3
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/components/ReviewsListingPanel.d.ts +1 -1
- package/dist/features/reviews/schemas/firestore.d.ts +1 -1
- package/dist/features/reviews/schemas/index.d.ts +20 -20
- package/dist/features/scams/actions/scam-actions.js +1 -1
- package/dist/features/scams/components/ScamAwarenessModal.js +2 -1
- package/dist/features/scams/components/ScamProfileView.d.ts +4 -1
- package/dist/features/scams/components/ScamProfileView.js +9 -6
- package/dist/features/scams/components/ScamRegistryView.d.ts +4 -1
- package/dist/features/scams/components/ScamRegistryView.js +7 -4
- package/dist/features/scams/constants/scam-types.d.ts +13 -1
- package/dist/features/scams/constants/scam-types.js +67 -23
- package/dist/features/scams/schemas/firestore.js +1 -1
- package/dist/features/scams/schemas/index.d.ts +8 -8
- package/dist/features/scams/schemas/report-form.d.ts +4 -4
- package/dist/features/search/action-index/repository.d.ts +1 -1
- package/dist/features/search/action-index/repository.js +1 -1
- package/dist/features/search/action-index/settings-entries.js +6 -6
- package/dist/features/search/components/Search.d.ts +1 -1
- package/dist/features/search/components/Search.js +5 -1
- package/dist/features/search/components/SearchFacetRail.js +2 -2
- package/dist/features/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useNavSuggestions.d.ts +1 -1
- package/dist/features/search/hooks/useNavSuggestions.js +1 -1
- package/dist/features/search/hooks/useSiteSearch.js +1 -1
- package/dist/features/seller/actions/offer-actions.js +50 -12
- package/dist/features/seller/actions/seller-actions.d.ts +19 -0
- package/dist/features/seller/actions/seller-actions.js +163 -44
- package/dist/features/seller/api/coupons/route.js +6 -1
- package/dist/features/seller/api/products/route.js +6 -1
- package/dist/features/seller/api/store/route.js +6 -1
- package/dist/features/seller/components/DispatchForm.js +3 -2
- package/dist/features/seller/components/FulfillmentView.d.ts +4 -1
- package/dist/features/seller/components/FulfillmentView.js +3 -2
- package/dist/features/seller/components/PrintCenterView.d.ts +4 -1
- package/dist/features/seller/components/PrintCenterView.js +6 -3
- package/dist/features/seller/components/SellerAddressesView.d.ts +4 -1
- package/dist/features/seller/components/SellerAddressesView.js +3 -2
- package/dist/features/seller/components/SellerAnalyticsAlertsView.d.ts +4 -1
- package/dist/features/seller/components/SellerAnalyticsAlertsView.js +3 -2
- package/dist/features/seller/components/SellerAnalyticsView.d.ts +4 -1
- package/dist/features/seller/components/SellerAnalyticsView.js +3 -1
- package/dist/features/seller/components/SellerArtAndStickersView.d.ts +18 -0
- package/dist/features/seller/components/SellerArtAndStickersView.js +7 -0
- package/dist/features/seller/components/SellerBidsView.d.ts +4 -1
- package/dist/features/seller/components/SellerBidsView.js +9 -8
- package/dist/features/seller/components/SellerBundlesView.d.ts +4 -1
- package/dist/features/seller/components/SellerBundlesView.js +5 -3
- package/dist/features/seller/components/SellerClassifiedView.d.ts +6 -2
- package/dist/features/seller/components/SellerClassifiedView.js +4 -3
- package/dist/features/seller/components/SellerCouponEditorView.d.ts +4 -1
- package/dist/features/seller/components/SellerCouponEditorView.js +3 -2
- package/dist/features/seller/components/SellerDigitalCodesView.d.ts +6 -2
- package/dist/features/seller/components/SellerDigitalCodesView.js +4 -3
- package/dist/features/seller/components/SellerFeaturesView.d.ts +6 -1
- package/dist/features/seller/components/SellerFeaturesView.js +8 -3
- package/dist/features/seller/components/SellerGoogleReviewsView.d.ts +4 -1
- package/dist/features/seller/components/SellerGoogleReviewsView.js +3 -2
- package/dist/features/seller/components/SellerGuideView.d.ts +11 -1
- package/dist/features/seller/components/SellerGuideView.js +7 -2
- package/dist/features/seller/components/SellerListingTypeView.d.ts +2 -2
- package/dist/features/seller/components/SellerListingTypeView.js +14 -20
- package/dist/features/seller/components/SellerLiveView.d.ts +6 -2
- package/dist/features/seller/components/SellerLiveView.js +4 -3
- package/dist/features/seller/components/SellerOffersView.d.ts +4 -1
- package/dist/features/seller/components/SellerOffersView.js +4 -3
- package/dist/features/seller/components/SellerOrdersView.d.ts +4 -1
- package/dist/features/seller/components/SellerOrdersView.js +44 -47
- package/dist/features/seller/components/SellerPayoutRequestView.d.ts +4 -1
- package/dist/features/seller/components/SellerPayoutRequestView.js +3 -2
- package/dist/features/seller/components/SellerPayoutSettingsView.js +127 -14
- package/dist/features/seller/components/SellerProductShell.d.ts +3 -3
- package/dist/features/seller/components/SellerProductShell.js +77 -28
- package/dist/features/seller/components/SellerProductsCards.js +3 -3
- package/dist/features/seller/components/SellerProductsView.js +24 -123
- package/dist/features/seller/components/SellerReviewsView.d.ts +10 -1
- package/dist/features/seller/components/SellerReviewsView.js +3 -2
- package/dist/features/seller/components/SellerShippingOfferView.d.ts +5 -0
- package/dist/features/seller/components/SellerShippingOfferView.js +164 -0
- package/dist/features/seller/components/SellerShippingView.d.ts +4 -1
- package/dist/features/seller/components/SellerShippingView.js +6 -5
- package/dist/features/seller/components/SellerSidebar.js +29 -5
- package/dist/features/seller/components/SellerSparesView.d.ts +6 -2
- package/dist/features/seller/components/SellerSparesView.js +4 -3
- package/dist/features/seller/components/SellerStoreCategoriesView.d.ts +4 -1
- package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
- package/dist/features/seller/components/SellerStorefrontView.d.ts +4 -1
- package/dist/features/seller/components/SellerStorefrontView.js +6 -5
- package/dist/features/seller/components/SellerSupportView.d.ts +4 -1
- package/dist/features/seller/components/SellerSupportView.js +3 -2
- package/dist/features/seller/components/analytics/SellerAnalyticsStats.d.ts +8 -1
- package/dist/features/seller/components/analytics/SellerAnalyticsStats.js +1 -1
- package/dist/features/seller/components/index.d.ts +2 -4
- package/dist/features/seller/components/index.js +1 -2
- package/dist/features/seller/constants/store-tabs.d.ts +4 -0
- package/dist/features/seller/constants/store-tabs.js +12 -0
- package/dist/features/seller/hooks/useSellerStorefront.js +18 -1
- package/dist/features/seller/repository/seller-profile.repository.d.ts +32 -0
- package/dist/features/seller/repository/seller-profile.repository.js +98 -0
- package/dist/features/seller/schemas/coupon-form.d.ts +15 -15
- package/dist/features/seller/schemas/coupon-form.js +2 -2
- package/dist/features/seller/schemas/index.d.ts +6 -6
- package/dist/features/seller/schemas/product-form.d.ts +9 -9
- package/dist/features/seller/schemas/product-form.js +4 -4
- package/dist/features/seller/schemas/seller-profile-firestore.d.ts +48 -0
- package/dist/features/seller/schemas/seller-profile-firestore.js +38 -0
- package/dist/features/server-errors/schemas/index.d.ts +4 -4
- package/dist/features/shell/CommandPalette.d.ts +53 -4
- package/dist/features/shell/CommandPalette.js +144 -11
- package/dist/features/shell/QuickFormDrawer.d.ts +2 -14
- package/dist/features/shell/SectionForm.js +1 -1
- package/dist/features/shell/SectionVisibilityGate.d.ts +36 -0
- package/dist/features/shell/SectionVisibilityGate.js +46 -0
- package/dist/features/shell/WizardFormSteps.d.ts +7 -0
- package/dist/features/shell/WizardFormSteps.js +53 -0
- package/dist/features/shell/build-sections.d.ts +95 -2
- package/dist/features/shell/build-sections.js +177 -6
- package/dist/features/shell/field-ui-meta.d.ts +69 -0
- package/dist/features/shell/field-ui-meta.js +56 -0
- package/dist/features/shell/index.d.ts +2 -0
- package/dist/features/shell/index.js +1 -0
- package/dist/features/shell/searchNavItems.d.ts +22 -0
- package/dist/features/shell/searchNavItems.js +61 -0
- package/dist/features/shell/useFieldVisibility.d.ts +43 -0
- package/dist/features/shell/useFieldVisibility.js +126 -0
- package/dist/features/shipments/components/AdminShipmentEditorView.d.ts +6 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +3 -2
- package/dist/features/shipments/components/AdminShipmentLotItemsView.d.ts +4 -1
- package/dist/features/shipments/components/AdminShipmentLotItemsView.js +3 -2
- package/dist/features/shipments/components/AdminShipmentProjectionsView.d.ts +6 -1
- package/dist/features/shipments/components/AdminShipmentProjectionsView.js +3 -9
- package/dist/features/shipments/components/AdminShipmentsView.d.ts +6 -2
- package/dist/features/shipments/components/AdminShipmentsView.js +5 -4
- package/dist/features/shipments/schemas/validation.d.ts +19 -19
- package/dist/features/shipments/schemas/validation.js +3 -4
- package/dist/features/site-settings/components/ActionPermissionsManager.js +21 -9
- package/dist/features/site-settings/components/NavPermissionsManager.d.ts +20 -1
- package/dist/features/site-settings/components/NavPermissionsManager.js +82 -6
- package/dist/features/site-settings/components/ThemeManagerView.js +22 -2
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +8 -1
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +43 -11
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +34 -13
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +1 -1
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +1 -1
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +8 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +15 -0
- package/dist/features/store-extensions/repository/store-extensions.repositories.d.ts +32 -5
- package/dist/features/store-extensions/repository/store-extensions.repositories.js +62 -7
- package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +2 -2
- package/dist/features/store-extensions/schemas/analytics-forms.d.ts +2 -2
- package/dist/features/store-extensions/schemas/firestore.d.ts +34 -5
- package/dist/features/store-extensions/schemas/firestore.js +23 -4
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +10 -10
- package/dist/features/store-extensions/schemas/listing-template-form.js +3 -4
- package/dist/features/store-extensions/schemas/payout-method-form.d.ts +10 -10
- package/dist/features/store-extensions/schemas/report-create-form.d.ts +2 -2
- package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +33 -20
- package/dist/features/store-extensions/schemas/shipping-config-form.js +11 -0
- package/dist/features/store-extensions/schemas/store-category-form.d.ts +6 -6
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +5 -5
- package/dist/features/stores/api/[storeSlug]/collector-drops/route.d.ts +23 -0
- package/dist/features/stores/api/[storeSlug]/collector-drops/route.js +83 -0
- package/dist/features/stores/api/[storeSlug]/products/route.d.ts +1 -1
- package/dist/features/stores/api/[storeSlug]/products/route.js +1 -1
- package/dist/features/stores/components/InteractiveStoreCard.js +1 -1
- package/dist/features/stores/components/StoreArtStickersPageView.d.ts +4 -1
- package/dist/features/stores/components/StoreArtStickersPageView.js +6 -5
- package/dist/features/stores/components/StoreBundlesPageView.d.ts +5 -2
- package/dist/features/stores/components/StoreBundlesPageView.js +5 -4
- package/dist/features/stores/components/StoreCapabilitiesGuideView.d.ts +6 -2
- package/dist/features/stores/components/StoreCapabilitiesGuideView.js +13 -11
- package/dist/features/stores/components/StoreClassifiedsPageView.d.ts +4 -1
- package/dist/features/stores/components/StoreClassifiedsPageView.js +4 -3
- package/dist/features/stores/components/StoreClearancePageView.d.ts +11 -0
- package/dist/features/stores/components/StoreClearancePageView.js +25 -0
- package/dist/features/stores/components/StoreCollectorDropsListing.d.ts +7 -0
- package/dist/features/stores/components/StoreCollectorDropsListing.js +138 -0
- package/dist/features/stores/components/StoreCollectorDropsPageView.d.ts +11 -0
- package/dist/features/stores/components/StoreCollectorDropsPageView.js +25 -0
- package/dist/features/stores/components/StoreCollectorDropsView.d.ts +17 -0
- package/dist/features/stores/components/StoreCollectorDropsView.js +5 -0
- package/dist/features/stores/components/StoreCreateForm.js +16 -2
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +7 -1
- package/dist/features/stores/components/StoreDigitalCodesPageView.d.ts +4 -1
- package/dist/features/stores/components/StoreDigitalCodesPageView.js +4 -3
- package/dist/features/stores/components/StoreFinanceGuideView.d.ts +6 -2
- package/dist/features/stores/components/StoreFinanceGuideView.js +9 -7
- package/dist/features/stores/components/StoreGuideHubView.d.ts +4 -1
- package/dist/features/stores/components/StoreGuideHubView.js +7 -4
- package/dist/features/stores/components/StoreHeader.js +1 -1
- package/dist/features/stores/components/StoreListingsGuideView.d.ts +6 -2
- package/dist/features/stores/components/StoreListingsGuideView.js +14 -12
- package/dist/features/stores/components/StoreLiveItemsPageView.d.ts +4 -1
- package/dist/features/stores/components/StoreLiveItemsPageView.js +4 -3
- package/dist/features/stores/components/StoreNavTabs.d.ts +1 -1
- package/dist/features/stores/components/StoreOrdersGuideView.d.ts +6 -2
- package/dist/features/stores/components/StoreOrdersGuideView.js +11 -9
- package/dist/features/stores/components/StorePreOrdersPageView.d.ts +4 -1
- package/dist/features/stores/components/StorePreOrdersPageView.js +4 -3
- package/dist/features/stores/components/StoreProductsPageView.d.ts +12 -1
- package/dist/features/stores/components/StoreProductsPageView.js +4 -3
- package/dist/features/stores/components/StoreReviewsPageView.d.ts +4 -1
- package/dist/features/stores/components/StoreReviewsPageView.js +4 -3
- package/dist/features/stores/components/StoreSettingsGuideView.d.ts +6 -2
- package/dist/features/stores/components/StoreSettingsGuideView.js +5 -3
- package/dist/features/stores/components/StoreSparesPageView.d.ts +4 -1
- package/dist/features/stores/components/StoreSparesPageView.js +10 -9
- package/dist/features/stores/components/StoresIndexListing.js +16 -11
- package/dist/features/stores/components/StoresIndexPageView.d.ts +10 -1
- package/dist/features/stores/components/StoresIndexPageView.js +3 -2
- package/dist/features/stores/components/index.d.ts +5 -5
- package/dist/features/stores/components/index.js +2 -2
- package/dist/features/stores/hooks/useStores.d.ts +4 -4
- package/dist/features/stores/hooks/useStores.js +4 -4
- package/dist/features/stores/manifest.js +3 -3
- package/dist/features/stores/messages/en.json +1 -1
- package/dist/features/stores/repository/store.repository.d.ts +80 -0
- package/dist/features/stores/repository/store.repository.js +98 -0
- package/dist/features/stores/schemas/firestore.d.ts +193 -1
- package/dist/features/stores/schemas/firestore.js +66 -0
- package/dist/features/stores/schemas/index.d.ts +16 -16
- package/dist/features/stores/server.d.ts +1 -1
- package/dist/features/stores/server.js +1 -1
- package/dist/features/stores/types/index.d.ts +5 -5
- package/dist/features/support/schemas/firestore.d.ts +1 -1
- package/dist/features/support/schemas/firestore.js +1 -1
- package/dist/features/support/schemas/index.d.ts +12 -12
- package/dist/features/support/schemas/index.js +1 -1
- package/dist/features/tax-codes/schemas/tax-code-form.d.ts +4 -4
- package/dist/features/tax-codes/schemas/tax-codes.validators.d.ts +4 -4
- package/dist/features/tax-codes/schemas/tax-codes.validators.js +1 -1
- package/dist/features/tester/actions/checklist-item-actions.d.ts +3 -3
- package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +1 -1
- package/dist/features/tester/components/AdminTesterFeedbackView.d.ts +6 -1
- package/dist/features/tester/components/AdminTesterFeedbackView.js +3 -2
- package/dist/features/tester/schemas/checklist-item-form.d.ts +2 -2
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +5 -2
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +5 -3
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +5 -2
- package/dist/features/wishlist/components/WishlistHeartButton.d.ts +2 -2
- package/dist/features/wishlist/components/WishlistHeartButton.js +2 -2
- package/dist/features/wishlist/components/WishlistPage.js +1 -1
- package/dist/features/wishlist/components/WishlistView.d.ts +1 -1
- package/dist/features/wishlist/hooks/useGuestWishlist.d.ts +6 -6
- package/dist/features/wishlist/hooks/useUserWishlist.d.ts +1 -1
- package/dist/features/wishlist/hooks/useWishlistCount.js +1 -1
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +6 -6
- package/dist/features/wishlist/repository/user-wishlist.repository.d.ts +1 -1
- package/dist/features/wishlist/utils/guest-wishlist.d.ts +14 -5
- package/dist/index.d.ts +182 -202
- package/dist/index.js +284 -232
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.js +3 -3
- package/dist/next/api/api-response.d.ts +1 -1
- package/dist/next/api/parseJsonBody.d.ts +1 -1
- package/dist/next/api/routeHandler.d.ts +5 -0
- package/dist/next/api/routeHandler.js +24 -2
- package/dist/next/components/UnauthorizedView.d.ts +4 -1
- package/dist/next/components/UnauthorizedView.js +3 -2
- package/dist/next/index.d.ts +3 -1
- package/dist/next/index.js +5 -1
- package/dist/next/routing/portals.d.ts +266 -0
- package/dist/next/routing/portals.js +379 -0
- package/dist/next/routing/route-map.d.ts +114 -71
- package/dist/next/routing/route-map.js +137 -45
- package/dist/providers/ai-groq/index.d.ts +18 -0
- package/dist/providers/ai-groq/index.js +241 -0
- package/dist/providers/auth-firebase/claims.d.ts +85 -0
- package/dist/providers/auth-firebase/claims.js +116 -0
- package/dist/providers/auth-firebase/helpers.d.ts +6 -1
- package/dist/providers/auth-firebase/helpers.js +26 -2
- package/dist/providers/auth-firebase/provider.js +9 -4
- package/dist/providers/auth-firebase/session.js +32 -1
- package/dist/providers/db-firebase/admin.d.ts +24 -1
- package/dist/providers/db-firebase/admin.js +29 -5
- package/dist/providers/db-firebase/base.repository.d.ts +1 -1
- package/dist/providers/db-firebase/filter-aliases.d.ts +2 -2
- package/dist/providers/db-firebase/rtdb-url.js +1 -1
- package/dist/providers/db-firebase/sieve.js +2 -2
- package/dist/providers/payment-cashfree/easy-split.d.ts +119 -0
- package/dist/providers/payment-cashfree/easy-split.js +206 -0
- package/dist/providers/payment-cashfree/index.d.ts +341 -0
- package/dist/providers/payment-cashfree/index.js +714 -0
- package/dist/providers/payment-manual/index.d.ts +11 -0
- package/dist/providers/payment-manual/index.js +13 -0
- package/dist/providers/payment-phonepe/index.d.ts +24 -8
- package/dist/providers/payment-phonepe/index.js +29 -1
- package/dist/providers/payment-razorpay/index.d.ts +14 -1
- package/dist/providers/payment-razorpay/index.js +21 -1
- package/dist/providers/shipping-shiprocket/index.d.ts +40 -5
- package/dist/providers/shipping-shiprocket/index.js +49 -5
- package/dist/providers/tax-india-gst/index.d.ts +45 -0
- package/dist/providers/tax-india-gst/index.js +78 -0
- package/dist/providers.d.ts +3 -0
- package/dist/providers.js +5 -0
- package/dist/react/contexts/SessionContext.d.ts +18 -2
- package/dist/react/contexts/SessionContext.js +23 -1
- package/dist/react/hooks/useBrowsePageFlags.d.ts +2 -2
- package/dist/react/hooks/useBrowsePageFlags.js +11 -5
- package/dist/react/hooks/useCanSeePrices.js +1 -1
- package/dist/react/hooks/useCountdown.d.ts +1 -1
- package/dist/react/hooks/useCountdown.js +1 -1
- package/dist/react/hooks/useListingSurfaceVisibility.js +12 -2
- package/dist/react/hooks/useListingTypeFlags.d.ts +62 -8
- package/dist/react/hooks/useListingTypeFlags.js +14 -7
- package/dist/react/hooks/useScrollToTop.d.ts +5 -0
- package/dist/react/hooks/useScrollToTop.js +70 -0
- package/dist/repositories/index.d.ts +3 -4
- package/dist/repositories/index.js +4 -5
- package/dist/schemas/registry.d.ts +320 -899
- package/dist/schemas/registry.js +7 -7
- package/dist/schemas/sieve.d.ts +2 -2
- package/dist/schemas/webhooks/google-oauth.d.ts +4 -4
- package/dist/security/authorization.d.ts +27 -5
- package/dist/security/authorization.js +53 -13
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/pii-mask.d.ts +1 -1
- package/dist/security/pii-mask.js +1 -1
- package/dist/security/pii-schemas.d.ts +26 -2
- package/dist/security/pii-schemas.js +26 -2
- package/dist/seo/json-ld.d.ts +6 -6
- package/dist/seo/json-ld.js +32 -11
- package/dist/seo/metadata.d.ts +3 -3
- package/dist/seo/metadata.js +7 -7
- package/dist/server-entry.d.ts +13 -13
- package/dist/server-entry.js +54 -15
- package/dist/server.d.ts +79 -46
- package/dist/server.js +158 -74
- package/dist/stores/panel-store.d.ts +1 -1
- package/dist/styles.css +380 -183
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/contrast.d.ts +61 -0
- package/dist/tokens/contrast.js +128 -0
- package/dist/tokens/themes/cobalt-night.js +10 -3
- package/dist/tokens/themes/default-dark.d.ts +5 -4
- package/dist/tokens/themes/default-dark.js +48 -40
- package/dist/tokens/themes/default-light.d.ts +5 -5
- package/dist/tokens/themes/default-light.js +64 -36
- package/dist/tokens/themes/required.d.ts +1 -1
- package/dist/tokens/themes/required.js +40 -0
- package/dist/tokens/themes/sunset.js +14 -2
- package/dist/tokens/tokens.css +117 -85
- package/dist/ui/chrome/BottomActionsContext.d.ts +190 -0
- package/dist/ui/chrome/BottomActionsContext.js +198 -0
- package/dist/ui/chrome/useBottomActions.d.ts +37 -0
- package/dist/ui/chrome/useBottomActions.js +86 -0
- package/dist/ui/columns/cell-renderers.d.ts +10 -5
- package/dist/ui/columns/cell-renderers.js +9 -7
- package/dist/ui/columns/column-renderers.js +13 -4
- package/dist/ui/components/AdminFilterFacets.d.ts +37 -0
- package/dist/ui/components/AdminFilterFacets.js +126 -0
- package/dist/ui/components/Avatar.js +1 -1
- package/dist/ui/components/AvatarDisplay.d.ts +1 -1
- package/dist/ui/components/BaseListingCard.js +1 -1
- package/dist/ui/components/Button.js +2 -13
- package/dist/ui/components/Button.style.css +91 -0
- package/dist/ui/components/Card.d.ts +1 -1
- package/dist/ui/components/Card.js +0 -9
- package/dist/ui/components/Card.style.css +0 -70
- package/dist/ui/components/ClaimCouponButton.d.ts +1 -1
- package/dist/ui/components/ConfirmDeleteModal.d.ts +1 -1
- package/dist/ui/components/ConfirmDeleteModal.js +2 -18
- package/dist/ui/components/ConfirmDeleteModal.style.css +53 -1
- package/dist/ui/components/DetailPageGallery.d.ts +1 -1
- package/dist/ui/components/DetailPageGallery.js +2 -2
- package/dist/ui/components/DetailPageHero.d.ts +1 -1
- package/dist/ui/components/DetailPageHero.js +1 -1
- package/dist/ui/components/DetailPageTabs.d.ts +1 -1
- package/dist/ui/components/DetailPageTabs.js +1 -1
- package/dist/ui/components/DetailViewShell.d.ts +27 -2
- package/dist/ui/components/DetailViewShell.js +5 -1
- package/dist/ui/components/Disclaimer.js +11 -2
- package/dist/ui/components/Drawer.js +19 -2
- package/dist/ui/components/FilterChipGroup.d.ts +2 -2
- package/dist/ui/components/Form.js +1 -1
- package/dist/ui/components/FormField.d.ts +19 -2
- package/dist/ui/components/FormField.js +88 -21
- package/dist/ui/components/GatedPrice.d.ts +1 -1
- package/dist/ui/components/GatedPrice.js +1 -1
- package/dist/ui/components/ImageGallery.js +1 -1
- package/dist/ui/components/ImageLightbox.js +5 -2
- package/dist/ui/components/ImageMosaic.js +1 -1
- package/dist/ui/components/ListingToolbar.d.ts +56 -1
- package/dist/ui/components/ListingToolbar.js +54 -4
- package/dist/ui/components/LiveEditableRegion.d.ts +29 -0
- package/dist/ui/components/LiveEditableRegion.js +54 -0
- package/dist/ui/components/MediaAvatar.js +13 -0
- package/dist/ui/components/MediaImage.d.ts +116 -0
- package/dist/ui/components/MediaImage.js +194 -0
- package/dist/ui/components/MediaLightbox.js +246 -0
- package/dist/ui/components/MediaVideo.js +141 -0
- package/dist/ui/components/Modal.d.ts +1 -1
- package/dist/ui/components/Modal.js +18 -47
- package/dist/ui/components/Modal.style.css +43 -0
- package/dist/ui/components/PaginatedSelect.d.ts +1 -1
- package/dist/ui/components/QuickCreateModal.js +4 -1
- package/dist/ui/components/RecordDetailModal.js +1 -1
- package/dist/ui/components/RowActionMenu.js +11 -51
- package/dist/ui/components/RowActionMenu.style.css +64 -10
- package/dist/ui/components/SideDrawer.style.css +11 -16
- package/dist/ui/components/SiteLogo.d.ts +20 -2
- package/dist/ui/components/SiteLogo.js +29 -7
- package/dist/ui/components/SiteMark.d.ts +1 -1
- package/dist/ui/components/SiteMark.js +22 -7
- package/dist/ui/components/SpecTable.d.ts +1 -1
- package/dist/ui/components/SplitTile.js +1 -1
- package/dist/ui/components/dialog-shell.d.ts +32 -0
- package/dist/ui/components/dialog-shell.js +23 -0
- package/dist/ui/components/form-field-registry.d.ts +43 -0
- package/dist/ui/components/form-field-registry.js +7 -0
- package/dist/ui/components/surface-tokens.d.ts +6 -2
- package/dist/ui/components/surface-tokens.js +3 -1
- package/dist/ui/design-pack.d.ts +21 -0
- package/dist/ui/design-pack.js +47 -0
- package/dist/ui/forms/FormShell.js +14 -1
- package/dist/ui/forms/useFormBottomActions.d.ts +78 -0
- package/dist/ui/forms/useFormBottomActions.js +128 -0
- package/dist/ui/icons/icon-registry.d.ts +6 -1
- package/dist/ui/icons/icon-registry.js +12 -3
- package/dist/ui/rich-text/RichText.js +35 -8
- package/dist/ui/types/image-crop.d.ts +8 -0
- package/dist/ui/types/quick-field.d.ts +33 -0
- package/dist/ui/widgets/index.d.ts +7 -0
- package/dist/ui/widgets/index.js +3 -0
- package/dist/ui/widgets/merge.d.ts +85 -0
- package/dist/ui/widgets/merge.js +162 -0
- package/dist/ui/widgets/pilot-registry.d.ts +104 -0
- package/dist/ui/widgets/pilot-registry.js +305 -0
- package/dist/ui/widgets/resolve.d.ts +109 -0
- package/dist/ui/widgets/resolve.js +442 -0
- package/dist/ui/widgets/types.d.ts +252 -0
- package/dist/ui/widgets/types.js +45 -0
- package/dist/utils/date.formatter.d.ts +20 -0
- package/dist/utils/date.formatter.js +25 -0
- package/dist/utils/id-generators.d.ts +5 -5
- package/dist/utils/id-generators.js +14 -10
- package/dist/utils/listing-params.d.ts +1 -1
- package/dist/utils/listing-params.js +1 -1
- package/dist/utils/number.formatter.d.ts +47 -0
- package/dist/utils/number.formatter.js +79 -1
- package/dist/utils/pack-by-span.d.ts +21 -0
- package/dist/utils/pack-by-span.js +84 -0
- package/dist/utils/search-txt-builders.d.ts +2 -2
- package/dist/utils/search-txt-builders.js +1 -1
- package/dist/validation/phone.validator.d.ts +0 -1
- package/dist/validation/phone.validator.js +17 -3
- package/dist/validation/schemas.d.ts +17 -17
- package/package.json +86 -10
- package/scripts/dedupe-peer-deps.mjs +17 -0
- package/scripts/seed-cli.mjs +33 -16
- package/scripts/sieve-audit.mjs +14 -14
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +0 -66
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +0 -187
- package/dist/_internal/client/features/lottery/LotteryAdminSlotView.d.ts +0 -15
- package/dist/_internal/client/features/lottery/LotteryAdminSlotView.js +0 -50
- package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +0 -37
- package/dist/_internal/client/features/lottery/LotteryDetailView.js +0 -48
- package/dist/_internal/client/features/lottery/LotteryEntriesView.d.ts +0 -24
- package/dist/_internal/client/features/lottery/LotteryEntriesView.js +0 -63
- package/dist/_internal/client/features/lottery/LotteryListView.d.ts +0 -29
- package/dist/_internal/client/features/lottery/LotteryListView.js +0 -44
- package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +0 -31
- package/dist/_internal/client/features/lottery/LotteryPullForm.js +0 -94
- package/dist/_internal/client/features/lottery/LotterySlotGrid.d.ts +0 -14
- package/dist/_internal/client/features/lottery/LotterySlotGrid.js +0 -23
- package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.d.ts +0 -29
- package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +0 -28
- package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +0 -15
- package/dist/_internal/client/features/lottery/slot-collage-items.js +0 -13
- package/dist/_internal/server/features/auctions/actions.js +0 -76
- package/dist/_internal/server/features/auctions/data.d.ts +0 -2
- package/dist/_internal/server/features/auctions/data.js +0 -3
- package/dist/_internal/server/features/auctions/index.d.ts +0 -5
- package/dist/_internal/server/features/auctions/index.js +0 -5
- package/dist/_internal/server/features/auctions/og.d.ts +0 -22
- package/dist/_internal/server/features/auctions/og.js +0 -30
- package/dist/_internal/server/features/auctions/service.d.ts +0 -20
- package/dist/_internal/server/features/auctions/service.js +0 -65
- package/dist/_internal/server/features/beys/data.d.ts +0 -44
- package/dist/_internal/server/features/beys/data.js +0 -107
- package/dist/_internal/server/features/beys/og.d.ts +0 -42
- package/dist/_internal/server/features/beys/og.js +0 -89
- package/dist/_internal/server/features/checkout/freeze-parts.d.ts +0 -50
- package/dist/_internal/server/features/checkout/freeze-parts.js +0 -94
- package/dist/_internal/server/features/lottery/actions.d.ts +0 -43
- package/dist/_internal/server/features/lottery/actions.js +0 -365
- package/dist/_internal/server/features/lottery/adapters.d.ts +0 -15
- package/dist/_internal/server/features/lottery/adapters.js +0 -31
- package/dist/_internal/server/features/lottery/data.d.ts +0 -19
- package/dist/_internal/server/features/lottery/data.js +0 -41
- package/dist/_internal/server/features/lottery/metadata.d.ts +0 -6
- package/dist/_internal/server/features/lottery/metadata.js +0 -31
- package/dist/_internal/server/features/lottery/og.d.ts +0 -40
- package/dist/_internal/server/features/lottery/og.js +0 -79
- package/dist/_internal/server/features/parts/assembly.d.ts +0 -126
- package/dist/_internal/server/features/parts/assembly.js +0 -246
- package/dist/_internal/server/features/parts/buildable.d.ts +0 -47
- package/dist/_internal/server/features/parts/buildable.js +0 -159
- package/dist/_internal/server/features/parts/data.d.ts +0 -65
- package/dist/_internal/server/features/parts/data.js +0 -171
- package/dist/_internal/server/features/parts/og.d.ts +0 -34
- package/dist/_internal/server/features/parts/og.js +0 -66
- package/dist/_internal/server/features/prize-draws/actions.d.ts +0 -2
- package/dist/_internal/server/features/prize-draws/actions.js +0 -33
- package/dist/_internal/server/features/prize-draws/data.d.ts +0 -1
- package/dist/_internal/server/features/prize-draws/data.js +0 -2
- package/dist/_internal/server/features/prize-draws/index.d.ts +0 -4
- package/dist/_internal/server/features/prize-draws/index.js +0 -4
- package/dist/_internal/server/features/prize-draws/og.d.ts +0 -32
- package/dist/_internal/server/features/prize-draws/og.js +0 -47
- package/dist/_internal/server/features/prize-draws/service.d.ts +0 -3
- package/dist/_internal/server/features/prize-draws/service.js +0 -19
- package/dist/_internal/server/jobs/core/auctionSettlement.d.ts +0 -2
- package/dist/_internal/server/jobs/core/auctionSettlement.js +0 -240
- package/dist/_internal/server/jobs/core/onPrizeDrawPaymentConfirmed.d.ts +0 -19
- package/dist/_internal/server/jobs/core/onPrizeDrawPaymentConfirmed.js +0 -30
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.d.ts +0 -20
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +0 -114
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.d.ts +0 -14
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +0 -71
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.d.ts +0 -22
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +0 -67
- package/dist/_internal/server/jobs/handlers/auctionSettlement.d.ts +0 -2
- package/dist/_internal/server/jobs/handlers/auctionSettlement.js +0 -2
- package/dist/_internal/server/jobs/handlers/onPrizeDrawPaymentConfirmed.d.ts +0 -3
- package/dist/_internal/server/jobs/handlers/onPrizeDrawPaymentConfirmed.js +0 -11
- package/dist/_internal/server/jobs/handlers/prizeDrawExpiryReveal.d.ts +0 -2
- package/dist/_internal/server/jobs/handlers/prizeDrawExpiryReveal.js +0 -2
- package/dist/_internal/server/jobs/handlers/prizeDrawSoldOutReveal.d.ts +0 -3
- package/dist/_internal/server/jobs/handlers/prizeDrawSoldOutReveal.js +0 -4
- package/dist/_internal/shared/checkout/rules/art.rule.d.ts +0 -9
- package/dist/_internal/shared/checkout/rules/art.rule.js +0 -5
- package/dist/_internal/shared/checkout/rules/auction.rule.d.ts +0 -2
- package/dist/_internal/shared/checkout/rules/auction.rule.js +0 -19
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.d.ts +0 -2
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +0 -112
- package/dist/_internal/shared/checkout/rules/stickers.rule.d.ts +0 -9
- package/dist/_internal/shared/checkout/rules/stickers.rule.js +0 -5
- package/dist/_internal/shared/features/auctions/config.d.ts +0 -100
- package/dist/_internal/shared/features/auctions/config.js +0 -136
- package/dist/_internal/shared/features/auctions/errors.d.ts +0 -16
- package/dist/_internal/shared/features/auctions/errors.js +0 -31
- package/dist/_internal/shared/features/auctions/schema.d.ts +0 -42
- package/dist/_internal/shared/features/auctions/schema.js +0 -24
- package/dist/_internal/shared/listing-types/art/config.d.ts +0 -74
- package/dist/_internal/shared/listing-types/art/config.js +0 -36
- package/dist/_internal/shared/listing-types/art/ctas.js +0 -3
- package/dist/_internal/shared/listing-types/art/schema.d.ts +0 -2
- package/dist/_internal/shared/listing-types/art/schema.js +0 -3
- package/dist/_internal/shared/listing-types/auction/config.d.ts +0 -84
- package/dist/_internal/shared/listing-types/auction/config.js +0 -58
- package/dist/_internal/shared/listing-types/auction/schema.d.ts +0 -3
- package/dist/_internal/shared/listing-types/auction/schema.js +0 -7
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +0 -73
- package/dist/_internal/shared/listing-types/prize-draw/config.js +0 -45
- package/dist/_internal/shared/listing-types/prize-draw/schema.d.ts +0 -3
- package/dist/_internal/shared/listing-types/prize-draw/schema.js +0 -13
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +0 -74
- package/dist/_internal/shared/listing-types/stickers/config.js +0 -36
- package/dist/_internal/shared/listing-types/stickers/ctas.d.ts +0 -1
- package/dist/_internal/shared/listing-types/stickers/ctas.js +0 -3
- package/dist/_internal/shared/listing-types/stickers/schema.d.ts +0 -2
- package/dist/_internal/shared/listing-types/stickers/schema.js +0 -3
- package/dist/_internal/shared/listing-types/stickers/seed-factory.d.ts +0 -1
- package/dist/_internal/shared/listing-types/stickers/seed-factory.js +0 -1
- package/dist/features/about/components/HowAuctionsWorkView.d.ts +0 -3
- package/dist/features/about/components/HowAuctionsWorkView.js +0 -104
- package/dist/features/account/components/BuyerAuctionsGuideView.d.ts +0 -2
- package/dist/features/account/components/BuyerAuctionsGuideView.js +0 -45
- package/dist/features/admin/components/AdminArtView.d.ts +0 -13
- package/dist/features/admin/components/AdminArtView.js +0 -31
- package/dist/features/admin/components/AdminBeysView.d.ts +0 -27
- package/dist/features/admin/components/AdminBeysView.js +0 -180
- package/dist/features/admin/components/AdminCarouselEditorView.d.ts +0 -9
- package/dist/features/admin/components/AdminCarouselEditorView.js +0 -299
- package/dist/features/admin/components/AdminCarouselGroupEditorView.d.ts +0 -14
- package/dist/features/admin/components/AdminCarouselGroupEditorView.js +0 -96
- package/dist/features/admin/components/AdminCarouselView.d.ts +0 -6
- package/dist/features/admin/components/AdminCarouselView.js +0 -273
- package/dist/features/admin/components/AdminPartsView.d.ts +0 -27
- package/dist/features/admin/components/AdminPartsView.js +0 -162
- package/dist/features/admin/components/AdminPrizeDrawsView.d.ts +0 -4
- package/dist/features/admin/components/AdminPrizeDrawsView.js +0 -155
- package/dist/features/admin/components/AdminStickersView.d.ts +0 -13
- package/dist/features/admin/components/AdminStickersView.js +0 -31
- package/dist/features/auctions/actions/bid-actions.d.ts +0 -50
- package/dist/features/auctions/actions/bid-actions.js +0 -454
- package/dist/features/auctions/api/route.d.ts +0 -14
- package/dist/features/auctions/api/route.js +0 -62
- package/dist/features/auctions/columns/index.d.ts +0 -14
- package/dist/features/auctions/columns/index.js +0 -63
- package/dist/features/auctions/components/AuctionBidsTable.d.ts +0 -27
- package/dist/features/auctions/components/AuctionBidsTable.js +0 -96
- package/dist/features/auctions/components/AuctionBottomActions.d.ts +0 -23
- package/dist/features/auctions/components/AuctionBottomActions.js +0 -89
- package/dist/features/auctions/components/AuctionDetailPageView.d.ts +0 -22
- package/dist/features/auctions/components/AuctionDetailPageView.js +0 -246
- package/dist/features/auctions/components/AuctionFilters.d.ts +0 -16
- package/dist/features/auctions/components/AuctionFilters.js +0 -18
- package/dist/features/auctions/components/AuctionLiveStatusBadge.d.ts +0 -20
- package/dist/features/auctions/components/AuctionLiveStatusBadge.js +0 -21
- package/dist/features/auctions/components/AuctionsListView.d.ts +0 -6
- package/dist/features/auctions/components/AuctionsListView.js +0 -22
- package/dist/features/auctions/components/CollapsibleBidHistory.js +0 -34
- package/dist/features/auctions/components/LiveBidPrice.d.ts +0 -19
- package/dist/features/auctions/components/LiveBidPrice.js +0 -19
- package/dist/features/auctions/components/LiveMinIncrement.d.ts +0 -18
- package/dist/features/auctions/components/LiveMinIncrement.js +0 -25
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +0 -99
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +0 -212
- package/dist/features/auctions/components/MarketplaceAuctionGrid.d.ts +0 -21
- package/dist/features/auctions/components/MarketplaceAuctionGrid.js +0 -47
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +0 -65
- package/dist/features/auctions/components/PlaceBidFormClient.js +0 -306
- package/dist/features/auctions/components/bid-detail-fields.js +0 -103
- package/dist/features/auctions/components/index.d.ts +0 -7
- package/dist/features/auctions/components/index.js +0 -5
- package/dist/features/auctions/hooks/useAuctions.d.ts +0 -51
- package/dist/features/auctions/hooks/useAuctions.js +0 -105
- package/dist/features/auctions/hooks/useBids.d.ts +0 -33
- package/dist/features/auctions/hooks/useBids.js +0 -32
- package/dist/features/auctions/hooks/useIsAuctionEnded.d.ts +0 -41
- package/dist/features/auctions/hooks/useIsAuctionEnded.js +0 -76
- package/dist/features/auctions/hooks/useLiveAuctionBid.d.ts +0 -20
- package/dist/features/auctions/hooks/useLiveAuctionBid.js +0 -23
- package/dist/features/auctions/hooks/usePlaceBid.d.ts +0 -25
- package/dist/features/auctions/hooks/usePlaceBid.js +0 -28
- package/dist/features/auctions/hooks/useRealtimeBids.d.ts +0 -41
- package/dist/features/auctions/hooks/useRealtimeBids.js +0 -170
- package/dist/features/auctions/index.d.ts +0 -8
- package/dist/features/auctions/index.js +0 -8
- package/dist/features/auctions/manifest.js +0 -17
- package/dist/features/auctions/messages/en.json +0 -18
- package/dist/features/auctions/repository/bid.repository.d.ts +0 -256
- package/dist/features/auctions/repository/bid.repository.js +0 -575
- package/dist/features/auctions/schemas/bid-input.d.ts +0 -30
- package/dist/features/auctions/schemas/bid-input.js +0 -28
- package/dist/features/auctions/schemas/firestore.d.ts +0 -120
- package/dist/features/auctions/schemas/firestore.js +0 -73
- package/dist/features/auctions/schemas/index.d.ts +0 -170
- package/dist/features/auctions/schemas/index.js +0 -64
- package/dist/features/auctions/server.d.ts +0 -8
- package/dist/features/auctions/server.js +0 -8
- package/dist/features/auctions/types/index.d.ts +0 -74
- package/dist/features/beys/components/BeyDetailPageView.d.ts +0 -50
- package/dist/features/beys/components/BeyDetailPageView.js +0 -104
- package/dist/features/beys/schemas/firestore.d.ts +0 -417
- package/dist/features/beys/schemas/firestore.js +0 -65
- package/dist/features/cron/jobs/auction-expiry.job.d.ts +0 -27
- package/dist/features/cron/jobs/auction-expiry.job.js +0 -43
- package/dist/features/events/components/EventRaffleEntryForm.d.ts +0 -24
- package/dist/features/events/components/EventRaffleEntryForm.js +0 -46
- package/dist/features/events/components/EventRaffleWinnerView.d.ts +0 -35
- package/dist/features/events/components/EventRaffleWinnerView.js +0 -39
- package/dist/features/events/components/EventRafflesSection.d.ts +0 -42
- package/dist/features/events/components/EventRafflesSection.js +0 -96
- package/dist/features/events/components/SpinWheelView.d.ts +0 -27
- package/dist/features/events/components/SpinWheelView.js +0 -151
- package/dist/features/homepage/actions/carousel-actions.d.ts +0 -38
- package/dist/features/homepage/actions/carousel-actions.js +0 -54
- package/dist/features/homepage/api/carousel/[id]/route.d.ts +0 -23
- package/dist/features/homepage/api/carousel/[id]/route.js +0 -125
- package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +0 -18
- package/dist/features/homepage/components/FeaturedAuctionsSection.js +0 -12
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +0 -15
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +0 -49
- package/dist/features/homepage/repository/carousel.repository.d.ts +0 -100
- package/dist/features/homepage/repository/carousel.repository.js +0 -258
- package/dist/features/homepage/repository/carousels.repository.d.ts +0 -38
- package/dist/features/homepage/repository/carousels.repository.js +0 -149
- package/dist/features/layout/BottomActionsContext.d.ts +0 -173
- package/dist/features/layout/BottomActionsContext.js +0 -175
- package/dist/features/layout/hooks/useBottomActions.d.ts +0 -37
- package/dist/features/layout/hooks/useBottomActions.js +0 -86
- package/dist/features/layout/hooks/useFormBottomActions.d.ts +0 -78
- package/dist/features/layout/hooks/useFormBottomActions.js +0 -128
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +0 -48
- package/dist/features/lottery/repository/lottery-entry.repository.js +0 -172
- package/dist/features/lottery/schemas/config-write.d.ts +0 -145
- package/dist/features/lottery/schemas/config-write.js +0 -199
- package/dist/features/lottery/schemas/firestore.d.ts +0 -77
- package/dist/features/lottery/schemas/firestore.js +0 -25
- package/dist/features/lottery/schemas/zod.d.ts +0 -113
- package/dist/features/lottery/schemas/zod.js +0 -39
- package/dist/features/lottery/types/index.d.ts +0 -72
- package/dist/features/lottery/types/index.js +0 -68
- package/dist/features/media/MediaAvatar.js +0 -13
- package/dist/features/media/MediaImage.d.ts +0 -116
- package/dist/features/media/MediaImage.js +0 -194
- package/dist/features/media/MediaLightbox.js +0 -246
- package/dist/features/media/MediaVideo.js +0 -140
- package/dist/features/parts/components/AssemblyDrawer.d.ts +0 -107
- package/dist/features/parts/components/AssemblyDrawer.js +0 -257
- package/dist/features/parts/components/ModelCompositionPanel.d.ts +0 -37
- package/dist/features/parts/components/ModelCompositionPanel.js +0 -38
- package/dist/features/parts/components/PartDetailPageView.d.ts +0 -61
- package/dist/features/parts/components/PartDetailPageView.js +0 -123
- package/dist/features/parts/components/PartsIndexPageView.d.ts +0 -42
- package/dist/features/parts/components/PartsIndexPageView.js +0 -29
- package/dist/features/parts/components/PartsSearchBox.d.ts +0 -9
- package/dist/features/parts/components/PartsSearchBox.js +0 -136
- package/dist/features/parts/schemas/admin-edit.d.ts +0 -81
- package/dist/features/parts/schemas/admin-edit.js +0 -89
- package/dist/features/parts/schemas/firestore.d.ts +0 -925
- package/dist/features/parts/schemas/firestore.js +0 -384
- package/dist/features/parts/utils/colourway-match.d.ts +0 -62
- package/dist/features/parts/utils/colourway-match.js +0 -98
- package/dist/features/parts/utils/part-breakdown.d.ts +0 -53
- package/dist/features/parts/utils/part-breakdown.js +0 -77
- package/dist/features/products/components/AuctionDetailView.d.ts +0 -16
- package/dist/features/products/components/AuctionDetailView.js +0 -13
- package/dist/features/products/components/AuctionsIndexListing.d.ts +0 -8
- package/dist/features/products/components/AuctionsIndexListing.js +0 -170
- package/dist/features/products/components/MarketplacePrizeDrawCard.d.ts +0 -34
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +0 -129
- package/dist/features/products/components/PrizeDrawBottomActions.d.ts +0 -6
- package/dist/features/products/components/PrizeDrawBottomActions.js +0 -6
- package/dist/features/products/components/PrizeDrawCollage.d.ts +0 -35
- package/dist/features/products/components/PrizeDrawCollage.js +0 -90
- package/dist/features/products/components/PrizeDrawDetailPageView.d.ts +0 -27
- package/dist/features/products/components/PrizeDrawDetailPageView.js +0 -136
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +0 -32
- package/dist/features/products/components/PrizeDrawEntryActions.js +0 -104
- package/dist/features/products/components/PrizeDrawItemsEditor.d.ts +0 -13
- package/dist/features/products/components/PrizeDrawItemsEditor.js +0 -101
- package/dist/features/products/components/PrizeDrawWinnerMappingView.d.ts +0 -14
- package/dist/features/products/components/PrizeDrawWinnerMappingView.js +0 -43
- package/dist/features/products/components/PrizeDrawsIndexListing.d.ts +0 -8
- package/dist/features/products/components/PrizeDrawsIndexListing.js +0 -108
- package/dist/features/products/components/PrizeDrawsListingView.d.ts +0 -15
- package/dist/features/products/components/PrizeDrawsListingView.js +0 -37
- package/dist/features/products/components/PrizeDrawsSection.d.ts +0 -15
- package/dist/features/products/components/PrizeDrawsSection.js +0 -49
- package/dist/features/seller/components/SellerArtView.d.ts +0 -15
- package/dist/features/seller/components/SellerArtView.js +0 -6
- package/dist/features/seller/components/SellerStickersView.d.ts +0 -15
- package/dist/features/seller/components/SellerStickersView.js +0 -6
- package/dist/features/stores/api/[storeSlug]/auctions/route.d.ts +0 -23
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +0 -83
- package/dist/features/stores/components/StoreAuctionsListing.d.ts +0 -7
- package/dist/features/stores/components/StoreAuctionsListing.js +0 -138
- package/dist/features/stores/components/StoreAuctionsPageView.d.ts +0 -8
- package/dist/features/stores/components/StoreAuctionsPageView.js +0 -24
- package/dist/features/stores/components/StoreAuctionsView.d.ts +0 -17
- package/dist/features/stores/components/StoreAuctionsView.js +0 -5
- package/dist/features/stores/components/StorePrizeDrawsPageView.d.ts +0 -8
- package/dist/features/stores/components/StorePrizeDrawsPageView.js +0 -24
- /package/dist/_internal/server/features/{auctions → collector-drops}/actions.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/ctas.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/og.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/og.js +0 -0
- /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/seed-factory.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/seed-factory.js +0 -0
- /package/dist/_internal/shared/listing-types/{auction → clearance}/ctas.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{auction → clearance}/ctas.js +0 -0
- /package/dist/_internal/shared/listing-types/{auction → clearance}/og.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{auction → clearance}/og.js +0 -0
- /package/dist/_internal/shared/listing-types/{auction → clearance}/seed-factory.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{auction → clearance}/seed-factory.js +0 -0
- /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/ctas.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/ctas.js +0 -0
- /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/og.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/og.js +0 -0
- /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/seed-factory.d.ts +0 -0
- /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/seed-factory.js +0 -0
- /package/dist/features/{auctions → collector-drops}/actions/index.d.ts +0 -0
- /package/dist/features/{auctions → collector-drops}/actions/index.js +0 -0
- /package/dist/features/{auctions → collector-drops}/components/CollapsibleBidHistory.d.ts +0 -0
- /package/dist/features/{auctions → collector-drops}/components/bid-detail-fields.d.ts +0 -0
- /package/dist/features/{auctions → collector-drops}/manifest.d.ts +0 -0
- /package/dist/features/{auctions → collector-drops}/types/index.js +0 -0
- /package/dist/{features/media → ui/components}/MediaAvatar.d.ts +0 -0
- /package/dist/{features/media → ui/components}/MediaLightbox.d.ts +0 -0
- /package/dist/{features/media → ui/components}/MediaVideo.d.ts +0 -0
- /package/dist/{_internal/shared/listing-types/stickers/og.d.ts → ui/types/image-crop.js} +0 -0
- /package/dist/{_internal/shared/listing-types/stickers/og.js → ui/types/quick-field.js} +0 -0
|
@@ -16,14 +16,13 @@ import { MediaUploadField } from "../../media/upload/MediaUploadField.js";
|
|
|
16
16
|
import { useMediaUpload } from "../../media/hooks/useMedia.js";
|
|
17
17
|
import { apiClient } from "../../../http/index.js";
|
|
18
18
|
import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
|
|
19
|
-
import { ROUTES } from "../../../next/routing/route-map.js";
|
|
20
19
|
import { NOTIFICATION_TYPE_TABS } from "../../../constants/notification-types.js";
|
|
21
|
-
import { ALL_LISTING_TYPES, ALL_BROWSE_PAGES, } from "../../../_internal/shared/listing-types/feature-flags.js";
|
|
20
|
+
import { ALL_LISTING_TYPES, ALL_BROWSE_PAGES, FLAG_CHOICE_OPTIONS, flagValueToChoice, choiceToFlagValue, } from "../../../_internal/shared/listing-types/feature-flags.js";
|
|
22
21
|
import { pluginFor } from "../../../_internal/shared/listing-types/_registry.js";
|
|
23
22
|
import { SITE_SETTINGS_TABS, isSiteSettingsTabId, } from "../constants/site-settings-tabs.js";
|
|
24
23
|
import { ThemeManagerView, } from "../../site-settings/components/ThemeManagerView.js";
|
|
25
24
|
import { DEFAULT_LIGHT_THEME, DEFAULT_DARK_THEME } from "../../../tokens/themes/index.js";
|
|
26
|
-
import {
|
|
25
|
+
import { DEFAULT_COLLECTOR_DROP_BID_INCREMENT_TIERS, } from "../../../_internal/shared/features/collector-drops/config.js";
|
|
27
26
|
import { validateGstEnablement } from "../../../_internal/shared/features/site-settings/gst-registration.js";
|
|
28
27
|
/*
|
|
29
28
|
* 🛑 The SAME constant the checkout page and the server-side gate read. An
|
|
@@ -32,9 +31,37 @@ import { validateGstEnablement } from "../../../_internal/shared/features/site-s
|
|
|
32
31
|
*/
|
|
33
32
|
import { COD_MAX_ORDER_VALUE_FALLBACK } from "../schemas/firestore.js";
|
|
34
33
|
import { siteSettingsFormSchema } from "../schemas/site-settings-form.js";
|
|
34
|
+
import { siteSettingsBrandingFormSchema, } from "../schemas/site-settings-branding-form.js";
|
|
35
|
+
import { siteSettingsAnnouncementFormSchema, } from "../schemas/site-settings-announcement-form.js";
|
|
36
|
+
import { siteSettingsSeoFormSchema, } from "../schemas/site-settings-seo-form.js";
|
|
37
|
+
import { siteSettingsContactFormSchema, } from "../schemas/site-settings-contact-form.js";
|
|
38
|
+
import { siteSettingsWatermarkFormSchema, } from "../schemas/site-settings-watermark-form.js";
|
|
39
|
+
import { siteSettingsFeesFormSchema, } from "../schemas/site-settings-fees-form.js";
|
|
40
|
+
import { siteSettingsProcurementFormSchema, } from "../schemas/site-settings-procurement-form.js";
|
|
41
|
+
import { siteSettingsLimitsFormSchema, } from "../schemas/site-settings-limits-form.js";
|
|
42
|
+
import { siteSettingsNotificationsFormSchema, } from "../schemas/site-settings-notifications-form.js";
|
|
43
|
+
import { siteSettingsShippingFormSchema, } from "../schemas/site-settings-shipping-form.js";
|
|
44
|
+
import { siteSettingsGstFormSchema, } from "../schemas/site-settings-gst-form.js";
|
|
45
|
+
import { siteSettingsEmiFormSchema, } from "../schemas/site-settings-emi-form.js";
|
|
46
|
+
import { siteSettingsLegalFormSchema, LEGAL_PAGE_FIELDS, } from "../schemas/site-settings-legal-form.js";
|
|
47
|
+
import { siteSettingsWhatsappFormSchema, } from "../schemas/site-settings-whatsapp-form.js";
|
|
48
|
+
import { siteSettingsIntegrationsFormSchema, MASKED_CREDENTIAL_FIELDS, } from "../schemas/site-settings-integrations-form.js";
|
|
49
|
+
import { siteSettingsCollectorDropFormSchema, } from "../schemas/site-settings-collector-drop-form.js";
|
|
50
|
+
import { siteSettingsListingsFormSchema, } from "../schemas/site-settings-listings-form.js";
|
|
51
|
+
import { siteSettingsAppearanceFormSchema, } from "../schemas/site-settings-appearance-form.js";
|
|
52
|
+
import { siteSettingsAboutFormSchema, } from "../schemas/site-settings-about-form.js";
|
|
53
|
+
import { Repeater } from "../../../ui/components/Repeater.js";
|
|
35
54
|
import { FormErrorSummary } from "../../../ui/forms/FormErrorSummary.js";
|
|
36
55
|
import { SectionForm } from "../../shell/SectionForm.js";
|
|
37
|
-
import {
|
|
56
|
+
import { buildSectionsFromSchema, resolveFields } from "../../shell/build-sections.js";
|
|
57
|
+
import { useFieldVisibility } from "../../shell/useFieldVisibility.js";
|
|
58
|
+
import { swapFieldOrder } from "../../shell/field-ui-meta.js";
|
|
59
|
+
import { useEditMode } from "../../../_internal/client/edit-mode/EditModeProvider.js";
|
|
60
|
+
import { useFormShellState, FormShellContext, applyZodIssues, FieldInput, FieldTextarea } from "../../../ui/forms/index.js";
|
|
61
|
+
import { FieldCheckbox } from "../../../ui/forms/FieldCheckbox.js";
|
|
62
|
+
import { humaniseFieldName } from "../../shell/entity-form.js";
|
|
63
|
+
import { getBrandName, getBrandDomain } from "../../../core/brand-resolver.js";
|
|
64
|
+
import { AdminComposableRegion } from "../../dashboard/components/AdminComposableRegion.js";
|
|
38
65
|
const __O = {
|
|
39
66
|
hidden: "overflow-hidden",
|
|
40
67
|
};
|
|
@@ -50,13 +77,39 @@ function MaskedInput({ label, value, onChange, placeholder, helperText, }) {
|
|
|
50
77
|
const [revealed, setRevealed] = React.useState(false);
|
|
51
78
|
return (_jsxs(Div, { className: "relative", children: [_jsx(Input, { label: label, value: value, onChange: (e) => onChange(e.target.value), type: revealed ? "text" : "password", placeholder: placeholder, helperText: helperText }), _jsx(Button, { type: "button", variant: "ghost", textSize: "xs", textColor: "faint", paddingX: "none", paddingY: "none", onClick: () => setRevealed((r) => !r), className: "absolute right-3 top-8", children: revealed ? "Hide" : "Reveal" })] }));
|
|
52
79
|
}
|
|
53
|
-
const NOTIF_CHANNEL_INDENT = "space-y-4 pl-4 border-l-2 border-[var(--appkit-color-border)]";
|
|
54
80
|
const PRIORITY_OPTIONS = [
|
|
55
81
|
{ label: "Low (send all)", value: "low" },
|
|
56
82
|
{ label: "Normal", value: "normal" },
|
|
57
83
|
{ label: "High", value: "high" },
|
|
58
84
|
{ label: "Critical only", value: "critical" },
|
|
59
85
|
];
|
|
86
|
+
/*
|
|
87
|
+
* Moved to module scope from inside the component body (2026-11-04,
|
|
88
|
+
* Shipping tab migration) — `buildSectionsFromSchema`'s `opts.options` is a
|
|
89
|
+
* plain object evaluated eagerly at the point the `useMemo` factory runs,
|
|
90
|
+
* unlike a `renderers` function value, so a component-scoped `const`
|
|
91
|
+
* declared textually AFTER that `useMemo` call would be a TDZ error at
|
|
92
|
+
* runtime. A module-level const has no such ordering constraint.
|
|
93
|
+
*/
|
|
94
|
+
const CARRIER_OPTIONS = [
|
|
95
|
+
{ label: "Custom / Other", value: "custom" },
|
|
96
|
+
{ label: "Shiprocket", value: "shiprocket" },
|
|
97
|
+
{ label: "Delhivery", value: "delhivery" },
|
|
98
|
+
{ label: "Bluedart", value: "bluedart" },
|
|
99
|
+
{ label: "FedEx", value: "fedex" },
|
|
100
|
+
];
|
|
101
|
+
/*
|
|
102
|
+
* Shared by every gateway that has a sandbox/production split (PhonePe,
|
|
103
|
+
* Cashfree). Was `PHONEPE_ENVIRONMENT_OPTIONS`; renamed when the second
|
|
104
|
+
* gateway needed the identical two options, because a provider-named
|
|
105
|
+
* constant used by two providers is how a name stops meaning anything.
|
|
106
|
+
* Module scope for the same eager-evaluation reason as `CARRIER_OPTIONS`
|
|
107
|
+
* above (2026-11-04, Integrations tab migration).
|
|
108
|
+
*/
|
|
109
|
+
const GATEWAY_ENVIRONMENT_OPTIONS = [
|
|
110
|
+
{ label: "Sandbox (test)", value: "sandbox" },
|
|
111
|
+
{ label: "Production (live)", value: "production" },
|
|
112
|
+
];
|
|
60
113
|
/** Single persistent save action for the whole settings form — every tab writes
|
|
61
114
|
* into the same combined payload, so one save covers whichever tabs were edited
|
|
62
115
|
* regardless of which one is currently active. */
|
|
@@ -84,11 +137,47 @@ function SettingsTabForm({ id, label, children, }) {
|
|
|
84
137
|
* on every render of a 20-tab page.
|
|
85
138
|
*/
|
|
86
139
|
const EMPTY_TAB_VALUES = {};
|
|
140
|
+
/** 1A-v (overhaul brief) — `ActionKind` display text, for the listing-type
|
|
141
|
+
* toggle grid's own label only; not reused anywhere a translated or
|
|
142
|
+
* buyer-facing string is needed. */
|
|
143
|
+
const ACTION_KIND_LABELS = {
|
|
144
|
+
"buy-now": "Buy Now",
|
|
145
|
+
bid: "Bid",
|
|
146
|
+
reserve: "Reserve",
|
|
147
|
+
"enter-draw": "Enter Draw",
|
|
148
|
+
"make-offer": "Make Offer",
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Reproduces the generator's default `kind: "toggle"` rendering
|
|
152
|
+
* (`FieldCheckbox`, see `build-sections.tsx`'s `renderField`), wrapped in an
|
|
153
|
+
* `id`-bearing anchor — fixed 2026-11-05. The old hand-written JSX carried
|
|
154
|
+
* 13 literal `id="setting-*"` attributes (`settings-preview-registry.ts`'s
|
|
155
|
+
* own header comment records the count), used by the dashboard's "jump to
|
|
156
|
+
* this setting" cards and the `?tab=X#setting-Y` search-index deep links.
|
|
157
|
+
* The generator has no per-field DOM-id mechanism, so the Universal Template
|
|
158
|
+
* System migration silently dropped all of them — flagged as a known gap in
|
|
159
|
+
* the Branding tab's own commit message at the time, and confirmed as a
|
|
160
|
+
* real regression by `audit-widget-descriptor-sync`/`audit-action-index`
|
|
161
|
+
* once the whole migration was gated.
|
|
162
|
+
*
|
|
163
|
+
* 🛑 A component taking `id` as a real JSX attribute, NOT a function
|
|
164
|
+
* returning a closure over a string parameter — `audit-widget-descriptor-sync`/
|
|
165
|
+
* `audit-action-index` both do a literal SOURCE-TEXT search for
|
|
166
|
+
* `id="setting-X"` (`adminSiteSettingsSrc.includes('id="${anchorId}"')`,
|
|
167
|
+
* not a DOM/runtime check), so `id={someVariable}` passes functionally but
|
|
168
|
+
* fails the audit textually. Writing `id="setting-x"` as a literal at each
|
|
169
|
+
* call site satisfies both. Not a generic `domId` mechanism on
|
|
170
|
+
* `FieldUiMeta` — adding one for 8 current call sites would be new
|
|
171
|
+
* infrastructure for a need that has not recurred beyond this list.
|
|
172
|
+
*/
|
|
173
|
+
function AnchoredToggle({ id, field, values, onChange, }) {
|
|
174
|
+
return (_jsx("div", { id: id, children: _jsx(FieldCheckbox, { name: field.name, label: field.meta.label ?? humaniseFieldName(field.name), hint: field.meta.help, checked: Boolean(values[field.name]), onChange: (v) => onChange({ [field.name]: v }) }) }));
|
|
175
|
+
}
|
|
87
176
|
function SaveAllBar({ isPending, onSave }) {
|
|
88
177
|
return (_jsxs(_Fragment, { children: [_jsx(FormErrorSummary, {}), _jsx(FormActions, { align: "right", children: _jsx(Button, { type: "button", isLoading: isPending, disabled: isPending, onClick: onSave, children: isPending ? "Saving…" : "Save all changes" }) })] }));
|
|
89
178
|
}
|
|
90
179
|
// --- Component ---------------------------------------------------------------
|
|
91
|
-
export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
180
|
+
export function AdminSiteSettingsView({ labels = {}, pageRegionCards = [], ...rest }) {
|
|
92
181
|
const queryClient = useQueryClient();
|
|
93
182
|
const { showToast } = useToast();
|
|
94
183
|
/*
|
|
@@ -116,295 +205,608 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
|
116
205
|
},
|
|
117
206
|
});
|
|
118
207
|
const s = (data ?? {});
|
|
119
|
-
// ① Branding
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const [
|
|
126
|
-
|
|
208
|
+
// ① Branding — first tab migrated to the Universal Template System
|
|
209
|
+
// (schema + buildSectionsFromSchema), 2026-11-04. One combined object
|
|
210
|
+
// instead of eight useState calls; `chatEnabled` defaults false (D9,
|
|
211
|
+
// opt-in) and `assistantEnabled` defaults true (kill switch on an
|
|
212
|
+
// already-shipped path, matching assertAssistantEnabled's server-side
|
|
213
|
+
// polarity) — same defaults the eight separate calls used.
|
|
214
|
+
const [brandingForm, setBrandingForm] = React.useState({
|
|
215
|
+
siteName: "", tagline: "", logoUrl: "", faviconUrl: "",
|
|
216
|
+
maintenanceMode: false, maintenanceMessage: "",
|
|
217
|
+
chatEnabled: false, assistantEnabled: true,
|
|
218
|
+
});
|
|
219
|
+
const { editMode } = useEditMode();
|
|
220
|
+
const { fields: brandingVisibilityFields, setVisible: setBrandingFieldVisible, fieldOrder: brandingFieldOrder, setFieldOrder: setBrandingFieldOrder, } = useFieldVisibility("admin-site-settings-branding");
|
|
221
|
+
const brandingSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsBrandingFormSchema, {
|
|
222
|
+
renderers: {
|
|
223
|
+
logoUrl: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Logo", currentImage: values.logoUrl ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ logoUrl: url }) })),
|
|
224
|
+
faviconUrl: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Favicon", currentImage: values.faviconUrl ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ faviconUrl: url }) })),
|
|
225
|
+
},
|
|
226
|
+
fieldVisibility: brandingVisibilityFields,
|
|
227
|
+
editMode,
|
|
228
|
+
onToggleFieldVisibility: setBrandingFieldVisible,
|
|
229
|
+
fieldOrder: brandingFieldOrder,
|
|
230
|
+
onMoveField: (fieldName, neighborName) => setBrandingFieldOrder(swapFieldOrder(brandingFieldOrder, resolveFields(siteSettingsBrandingFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
231
|
+
}), [brandingVisibilityFields, editMode, setBrandingFieldVisible, brandingFieldOrder, setBrandingFieldOrder, upload]);
|
|
232
|
+
// ② Appearance — eighteenth tab migrated to the Universal Template
|
|
233
|
+
// System, 2026-11-04. Ten useState calls collapsed into two combined
|
|
234
|
+
// objects (`lightBg`/`darkBg`), each a structured value rather than a
|
|
235
|
+
// scalar — see site-settings-appearance-form.ts's header for why.
|
|
236
|
+
//
|
|
127
237
|
// The old primaryColor/secondaryColor/accentColor/fontFamily/defaultTheme
|
|
128
238
|
// fields here were dead (saved to Firestore, never read back anywhere —
|
|
129
239
|
// redundant with the working Theme Manager tab below). Removed 2026-08-09.
|
|
130
|
-
const [
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
240
|
+
const [appearanceForm, setAppearanceForm] = React.useState({
|
|
241
|
+
lightBg: { type: "color", value: "", overlayEnabled: false, overlayColor: "#000000", overlayOpacity: 30 },
|
|
242
|
+
darkBg: { type: "color", value: "", overlayEnabled: false, overlayColor: "#000000", overlayOpacity: 30 },
|
|
243
|
+
});
|
|
244
|
+
const { fields: appearanceVisibilityFields, setVisible: setAppearanceFieldVisible, fieldOrder: appearanceFieldOrder, setFieldOrder: setAppearanceFieldOrder, } = useFieldVisibility("admin-site-settings-appearance");
|
|
245
|
+
/*
|
|
246
|
+
* Shared by both `lightBg` and `darkBg` — the original JSX was already
|
|
247
|
+
* byte-structurally identical for both modes apart from the default
|
|
248
|
+
* swatch color and the `<BackgroundRenderer mode>` prop, so this is the
|
|
249
|
+
* ONE renderer, parameterized, rather than two hand-written copies.
|
|
250
|
+
*/
|
|
251
|
+
const buildBackgroundModeRenderer = React.useCallback((mode, defaultColor) => ({ values, onChange }) => {
|
|
252
|
+
const fieldName = mode === "light" ? "lightBg" : "darkBg";
|
|
253
|
+
const bg = values[fieldName];
|
|
254
|
+
const setBg = (patch) => onChange({ [fieldName]: { ...bg, ...patch } });
|
|
255
|
+
return (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: mode === "light" ? "Light mode" : "Dark mode" }), _jsx(Select, { label: "Type", options: BG_TYPE_OPTIONS, value: bg.type, onValueChange: (v) => setBg({ type: v }) }), bg.type === "color" ? (_jsx(Input, { type: "color", label: "Color", value: bg.value || defaultColor, onChange: (e) => setBg({ value: e.target.value }), className: "h-10 w-full cursor-pointer", bare: true }) /* audit-hex-tokens-ok: native color picker requires literal hex string fallback */) : bg.type === "gradient" ? (_jsx(Textarea, { label: "CSS gradient expression", rows: 2, value: bg.value, onChange: (e) => setBg({ value: e.target.value }), placeholder: "linear-gradient(...)" })) : (_jsx(MediaUploadField, { label: bg.type === "video" ? "Background video" : "Background image", kind: bg.type === "video" ? "video" : "image", value: bg.value, onChange: (v) => setBg({ value: v }), onUpload: (file) => upload(file, "store") })), _jsx(Toggle, { label: "Dim overlay", checked: bg.overlayEnabled, onChange: (v) => setBg({ overlayEnabled: v }) }), bg.overlayEnabled && (_jsxs(_Fragment, { children: [_jsx(Input, { type: "color", label: "Overlay color", value: bg.overlayColor, onChange: (e) => setBg({ overlayColor: e.target.value }), className: "h-10 w-full cursor-pointer", bare: true }), " ", _jsx(Slider, { label: "Overlay opacity", min: 0, max: 100, value: bg.overlayOpacity, onChange: (v) => setBg({ overlayOpacity: v }) })] })), _jsx(Text, { size: "xs", color: "muted", children: "Preview" }), _jsx(Div, { className: "relative h-24 w-full", overflow: "hidden", rounded: "md", border: "default", children: _jsx(BackgroundRenderer, { mode: mode, lightMode: mode === "light"
|
|
256
|
+
? { type: bg.type, value: bg.value, overlay: { enabled: bg.overlayEnabled, color: bg.overlayColor, opacity: bg.overlayOpacity / 100 } }
|
|
257
|
+
: { type: "color", value: "" }, darkMode: mode === "dark"
|
|
258
|
+
? { type: bg.type, value: bg.value, overlay: { enabled: bg.overlayEnabled, color: bg.overlayColor, opacity: bg.overlayOpacity / 100 } }
|
|
259
|
+
: { type: "color", value: "" } }) })] }));
|
|
260
|
+
}, [upload]);
|
|
261
|
+
const appearanceSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsAppearanceFormSchema, {
|
|
262
|
+
renderers: {
|
|
263
|
+
lightBg: buildBackgroundModeRenderer("light", "#ffffff"),
|
|
264
|
+
darkBg: buildBackgroundModeRenderer("dark", "#000000"),
|
|
265
|
+
},
|
|
266
|
+
fieldVisibility: appearanceVisibilityFields,
|
|
267
|
+
editMode,
|
|
268
|
+
onToggleFieldVisibility: setAppearanceFieldVisible,
|
|
269
|
+
fieldOrder: appearanceFieldOrder,
|
|
270
|
+
onMoveField: (fieldName, neighborName) => setAppearanceFieldOrder(swapFieldOrder(appearanceFieldOrder, resolveFields(siteSettingsAppearanceFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
271
|
+
}), [appearanceVisibilityFields, editMode, setAppearanceFieldVisible, appearanceFieldOrder, setAppearanceFieldOrder, buildBackgroundModeRenderer]);
|
|
140
272
|
// Theme registry (custom themes + default-light / default-dark pointers).
|
|
141
273
|
const [themeRegistry, setThemeRegistry] = React.useState({
|
|
142
274
|
themes: [],
|
|
143
275
|
defaultLightThemeId: DEFAULT_LIGHT_THEME.id,
|
|
144
276
|
defaultDarkThemeId: DEFAULT_DARK_THEME.id,
|
|
145
277
|
});
|
|
146
|
-
// ③ Announcement
|
|
147
|
-
|
|
148
|
-
const [
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
const [
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
//
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
const [
|
|
192
|
-
|
|
278
|
+
// ③ Announcement — second tab migrated to the Universal Template System,
|
|
279
|
+
// 2026-11-04. One combined object instead of four useState calls.
|
|
280
|
+
const [announcementForm, setAnnouncementForm] = React.useState({
|
|
281
|
+
announcementEnabled: false, announcementText: "", announcementLink: "", announcementBg: "",
|
|
282
|
+
});
|
|
283
|
+
const { fields: announcementVisibilityFields, setVisible: setAnnouncementFieldVisible, fieldOrder: announcementFieldOrder, setFieldOrder: setAnnouncementFieldOrder, } = useFieldVisibility("admin-site-settings-announcement");
|
|
284
|
+
const announcementSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsAnnouncementFormSchema, {
|
|
285
|
+
renderers: {
|
|
286
|
+
announcementBg: ({ values, onChange }) => (_jsxs(Stack, { gap: "none", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", className: "mb-1", children: "Background color" }), _jsx(Input, { type: "color", "aria-label": "Background color", value: values.announcementBg || "#1d4ed8", onChange: (e) => onChange({ announcementBg: e.target.value }), className: "h-10 w-32 cursor-pointer", bare: true }), " "] })),
|
|
287
|
+
announcementEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-announcement-bar", ...props }),
|
|
288
|
+
},
|
|
289
|
+
fieldVisibility: announcementVisibilityFields,
|
|
290
|
+
editMode,
|
|
291
|
+
onToggleFieldVisibility: setAnnouncementFieldVisible,
|
|
292
|
+
fieldOrder: announcementFieldOrder,
|
|
293
|
+
onMoveField: (fieldName, neighborName) => setAnnouncementFieldOrder(swapFieldOrder(announcementFieldOrder, resolveFields(siteSettingsAnnouncementFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
294
|
+
}), [announcementVisibilityFields, editMode, setAnnouncementFieldVisible, announcementFieldOrder, setAnnouncementFieldOrder]);
|
|
295
|
+
// ④ SEO — third tab migrated to the Universal Template System, 2026-11-04.
|
|
296
|
+
const [seoForm, setSeoForm] = React.useState({
|
|
297
|
+
seoTitle: "", seoDescription: "", seoOgImage: "", canonicalUrl: "", seoNoIndex: false,
|
|
298
|
+
});
|
|
299
|
+
const { fields: seoVisibilityFields, setVisible: setSeoFieldVisible, fieldOrder: seoFieldOrder, setFieldOrder: setSeoFieldOrder, } = useFieldVisibility("admin-site-settings-seo");
|
|
300
|
+
const seoSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsSeoFormSchema, {
|
|
301
|
+
renderers: {
|
|
302
|
+
seoOgImage: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Default OG image", currentImage: values.seoOgImage ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ seoOgImage: url }) })),
|
|
303
|
+
seoNoIndex: (props) => _jsx(AnchoredToggle, { id: "setting-robots-noindex", ...props }),
|
|
304
|
+
},
|
|
305
|
+
fieldVisibility: seoVisibilityFields,
|
|
306
|
+
editMode,
|
|
307
|
+
onToggleFieldVisibility: setSeoFieldVisible,
|
|
308
|
+
fieldOrder: seoFieldOrder,
|
|
309
|
+
onMoveField: (fieldName, neighborName) => setSeoFieldOrder(swapFieldOrder(seoFieldOrder, resolveFields(siteSettingsSeoFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
310
|
+
}), [seoVisibilityFields, editMode, setSeoFieldVisible, seoFieldOrder, setSeoFieldOrder, upload]);
|
|
311
|
+
// ⑤ Contact & Social — fourth tab migrated to the Universal Template
|
|
312
|
+
// System, 2026-11-04. One combined object instead of twelve useState
|
|
313
|
+
// calls.
|
|
314
|
+
//
|
|
315
|
+
// 🛑 `upiVpa` specifically is load-bearing, and its absence from this
|
|
316
|
+
// object was a live bug until 2026-10-19 under the old per-field state.
|
|
317
|
+
// `buildFullPayload()` writes the WHOLE `contact` group, so a key this
|
|
318
|
+
// component does not carry is erased on the next save of ANY tab.
|
|
319
|
+
// `contact.upiVpa` is the site-wide fallback `resolveDisplayedUpiId` uses
|
|
320
|
+
// when a seller has no UPI configured or the store is admin-owned — i.e.
|
|
321
|
+
// the VPA a manual-payment buyer is told to pay into. Carried through
|
|
322
|
+
// unconditionally below, same as every other field in this object.
|
|
323
|
+
const [contactForm, setContactForm] = React.useState({
|
|
324
|
+
supportEmail: "", supportPhone: "", supportAddress: "", supportHours: "",
|
|
325
|
+
instagram: "", twitter: "", facebook: "", youtube: "", whatsapp: "",
|
|
326
|
+
upiVpa: "", linkedin: "", pinterest: "",
|
|
327
|
+
});
|
|
328
|
+
const { fields: contactVisibilityFields, setVisible: setContactFieldVisible, fieldOrder: contactFieldOrder, setFieldOrder: setContactFieldOrder, } = useFieldVisibility("admin-site-settings-contact");
|
|
329
|
+
const contactSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsContactFormSchema, {
|
|
330
|
+
fieldVisibility: contactVisibilityFields,
|
|
331
|
+
editMode,
|
|
332
|
+
onToggleFieldVisibility: setContactFieldVisible,
|
|
333
|
+
fieldOrder: contactFieldOrder,
|
|
334
|
+
onMoveField: (fieldName, neighborName) => setContactFieldOrder(swapFieldOrder(contactFieldOrder, resolveFields(siteSettingsContactFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
335
|
+
}), [contactVisibilityFields, editMode, setContactFieldVisible, contactFieldOrder, setContactFieldOrder]);
|
|
336
|
+
// ⑥ Watermark — fifth tab migrated to the Universal Template System,
|
|
337
|
+
// 2026-11-04. One combined object instead of nine useState calls.
|
|
338
|
+
//
|
|
339
|
+
// "custom" is only ever set by the offset toggle, never a 6th Select
|
|
340
|
+
// option (keeps the picker at 5 options — see PaginatedSelect rule for >5)
|
|
341
|
+
// — `watermarkPosition` itself stays the 5-value enum; `buildFullPayload()`
|
|
342
|
+
// still substitutes "custom" for the SAVED `position` key when the offset
|
|
343
|
+
// toggle is on, exactly as the old single-field version did.
|
|
344
|
+
const [watermarkForm, setWatermarkForm] = React.useState({
|
|
345
|
+
watermarkType: "text", watermarkText: getBrandDomain(), watermarkImageUrl: "",
|
|
346
|
+
watermarkSize: 10, watermarkOpacity: 10, watermarkPosition: "center",
|
|
347
|
+
watermarkUseCustomOffset: false, watermarkOffsetX: 0, watermarkOffsetY: 0,
|
|
348
|
+
});
|
|
349
|
+
const { fields: watermarkVisibilityFields, setVisible: setWatermarkFieldVisible, fieldOrder: watermarkFieldOrder, setFieldOrder: setWatermarkFieldOrder, } = useFieldVisibility("admin-site-settings-watermark");
|
|
350
|
+
const watermarkSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsWatermarkFormSchema, {
|
|
351
|
+
renderers: {
|
|
352
|
+
watermarkImageUrl: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Watermark image", currentImage: values.watermarkImageUrl ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ watermarkImageUrl: url }) })),
|
|
353
|
+
watermarkSize: ({ values, onChange }) => (_jsx(Slider, { label: `Size — ${values.watermarkSize}% of image width`, value: values.watermarkSize, onChange: (v) => onChange({ watermarkSize: v }), min: 5, max: 100, step: 5 })),
|
|
354
|
+
watermarkOpacity: ({ values, onChange }) => (_jsx(Slider, { label: `Opacity — ${values.watermarkOpacity}%`, value: values.watermarkOpacity, onChange: (v) => onChange({ watermarkOpacity: v }), min: 5, max: 100, step: 5 })),
|
|
355
|
+
watermarkPosition: ({ values, onChange }) => (_jsx(Select, { label: "Position", options: [
|
|
356
|
+
{ label: "Center", value: "center" },
|
|
357
|
+
{ label: "Top left", value: "top-left" },
|
|
358
|
+
{ label: "Top right", value: "top-right" },
|
|
359
|
+
{ label: "Bottom left", value: "bottom-left" },
|
|
360
|
+
{ label: "Bottom right", value: "bottom-right" },
|
|
361
|
+
], value: values.watermarkPosition, onValueChange: (v) => onChange({ watermarkPosition: v }), disabled: Boolean(values.watermarkUseCustomOffset) })),
|
|
362
|
+
watermarkOffsetX: ({ values, onChange }) => (_jsx(Input, { label: "X offset (%) \u2014 + right / \u2212 left of center", value: String(values.watermarkOffsetX), onChange: (e) => onChange({ watermarkOffsetX: Math.max(-45, Math.min(45, parseInt(e.target.value) || 0)) }), type: "number", min: -45, max: 45 })),
|
|
363
|
+
watermarkOffsetY: ({ values, onChange }) => (_jsx(Input, { label: "Y offset (%) \u2014 + down / \u2212 up from center", value: String(values.watermarkOffsetY), onChange: (e) => onChange({ watermarkOffsetY: Math.max(-45, Math.min(45, parseInt(e.target.value) || 0)) }), type: "number", min: -45, max: 45 })),
|
|
364
|
+
},
|
|
365
|
+
fieldVisibility: watermarkVisibilityFields,
|
|
366
|
+
editMode,
|
|
367
|
+
onToggleFieldVisibility: setWatermarkFieldVisible,
|
|
368
|
+
fieldOrder: watermarkFieldOrder,
|
|
369
|
+
onMoveField: (fieldName, neighborName) => setWatermarkFieldOrder(swapFieldOrder(watermarkFieldOrder, resolveFields(siteSettingsWatermarkFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
370
|
+
}), [watermarkVisibilityFields, editMode, setWatermarkFieldVisible, watermarkFieldOrder, setWatermarkFieldOrder, upload]);
|
|
193
371
|
const watermarkPreviewRef = React.useRef(null);
|
|
194
372
|
React.useEffect(() => {
|
|
195
373
|
const el = watermarkPreviewRef.current;
|
|
196
374
|
if (!el)
|
|
197
375
|
return;
|
|
198
|
-
el.style.fontSize = `${Math.max(10, watermarkSize / 5)}px`;
|
|
199
|
-
el.style.opacity = String(watermarkOpacity / 100);
|
|
200
|
-
}, [watermarkSize, watermarkOpacity]);
|
|
201
|
-
//
|
|
202
|
-
|
|
203
|
-
const [
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
const
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const [
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
const [
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
const
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
//
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
const
|
|
333
|
-
const
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
//
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
const [
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
const
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
//
|
|
391
|
-
|
|
392
|
-
const [
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
const
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
376
|
+
el.style.fontSize = `${Math.max(10, watermarkForm.watermarkSize / 5)}px`;
|
|
377
|
+
el.style.opacity = String(watermarkForm.watermarkOpacity / 100);
|
|
378
|
+
}, [watermarkForm.watermarkSize, watermarkForm.watermarkOpacity]);
|
|
379
|
+
// ⑮ Procurement — seventh tab migrated to the Universal Template System,
|
|
380
|
+
// 2026-11-04. Two useState calls collapsed into one combined object.
|
|
381
|
+
const [procurementForm, setProcurementForm] = React.useState({
|
|
382
|
+
laborHourlyRate: 200, laborMaxHoursPerDay: 6,
|
|
383
|
+
});
|
|
384
|
+
const { fields: procurementVisibilityFields, setVisible: setProcurementFieldVisible, fieldOrder: procurementFieldOrder, setFieldOrder: setProcurementFieldOrder, } = useFieldVisibility("admin-site-settings-procurement");
|
|
385
|
+
const procurementSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsProcurementFormSchema, {
|
|
386
|
+
fieldVisibility: procurementVisibilityFields,
|
|
387
|
+
editMode,
|
|
388
|
+
onToggleFieldVisibility: setProcurementFieldVisible,
|
|
389
|
+
fieldOrder: procurementFieldOrder,
|
|
390
|
+
onMoveField: (fieldName, neighborName) => setProcurementFieldOrder(swapFieldOrder(procurementFieldOrder, resolveFields(siteSettingsProcurementFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
391
|
+
}), [procurementVisibilityFields, editMode, setProcurementFieldVisible, procurementFieldOrder, setProcurementFieldOrder]);
|
|
392
|
+
// ⑯ EMI — twelfth tab migrated to the Universal Template System,
|
|
393
|
+
// 2026-11-04. Seven useState calls collapsed into one combined object.
|
|
394
|
+
const [emiForm, setEmiForm] = React.useState({
|
|
395
|
+
emiEnabled: false, emiMinOrderValue: 10000, emiTenureOptionsText: "2,3,4,5,6",
|
|
396
|
+
emiTokenPercent: 20, emiBillingDay: 5,
|
|
397
|
+
emiSurchargePercentPerMonth: 2, emiSurchargeSellerSharePercent: 50,
|
|
398
|
+
});
|
|
399
|
+
const { fields: emiVisibilityFields, setVisible: setEmiFieldVisible, fieldOrder: emiFieldOrder, setFieldOrder: setEmiFieldOrder, } = useFieldVisibility("admin-site-settings-emi");
|
|
400
|
+
const emiSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsEmiFormSchema, {
|
|
401
|
+
fieldVisibility: emiVisibilityFields,
|
|
402
|
+
editMode,
|
|
403
|
+
onToggleFieldVisibility: setEmiFieldVisible,
|
|
404
|
+
fieldOrder: emiFieldOrder,
|
|
405
|
+
onMoveField: (fieldName, neighborName) => setEmiFieldOrder(swapFieldOrder(emiFieldOrder, resolveFields(siteSettingsEmiFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
406
|
+
}), [emiVisibilityFields, editMode, setEmiFieldVisible, emiFieldOrder, setEmiFieldOrder]);
|
|
407
|
+
// ⑰ GST — eleventh tab migrated to the Universal Template System,
|
|
408
|
+
// 2026-11-04. Four useState calls collapsed into one combined object.
|
|
409
|
+
//
|
|
410
|
+
// `validateGstEnablement()` is shown inline, live, and ONLY while the
|
|
411
|
+
// toggle is on — the same rule the server enforces. `/api/admin/site`
|
|
412
|
+
// rejects the save, so without this the admin would get a generic "save
|
|
413
|
+
// failed" with no indication of which of the four fields it meant. Live
|
|
414
|
+
// rather than on-submit because the toggle is the action: an admin who
|
|
415
|
+
// flips it on sees immediately what else is needed, instead of
|
|
416
|
+
// discovering it after a round trip. Empty when the toggle is off, so an
|
|
417
|
+
// admin editing their address with GST disabled is never shown errors
|
|
418
|
+
// about it (Root Cause #74 — a summary that accuses before anything was
|
|
419
|
+
// attempted). Computed LIVE inside each custom renderer below, against
|
|
420
|
+
// that renderer's own `values` parameter, rather than a separate
|
|
421
|
+
// `useMemo` — simpler, and provably reactive to exactly what's on screen.
|
|
422
|
+
const [gstForm, setGstForm] = React.useState({
|
|
423
|
+
gstEnabled: false, gstin: "", gstLegalName: "", gstAddress: "",
|
|
424
|
+
});
|
|
425
|
+
const { fields: gstVisibilityFields, setVisible: setGstFieldVisible, fieldOrder: gstFieldOrder, setFieldOrder: setGstFieldOrder, } = useFieldVisibility("admin-site-settings-gst");
|
|
426
|
+
const gstSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsGstFormSchema, {
|
|
427
|
+
renderers: {
|
|
428
|
+
gstin: ({ values, onChange }) => {
|
|
429
|
+
const problems = validateGstEnablement({
|
|
430
|
+
enabled: Boolean(values.gstEnabled),
|
|
431
|
+
gstin: values.gstin,
|
|
432
|
+
legalName: values.gstLegalName,
|
|
433
|
+
address: values.gstAddress,
|
|
434
|
+
});
|
|
435
|
+
return (_jsx(FieldInput, { name: "gstin", label: "GSTIN", hint: "15-character GST Identification Number.", error: problems.gstin, value: values.gstin ?? "", onChange: (v) => onChange({ gstin: v }), placeholder: "29AAAAA0000A1Z5", maxLength: 15 }));
|
|
436
|
+
},
|
|
437
|
+
gstLegalName: ({ values, onChange }) => {
|
|
438
|
+
const problems = validateGstEnablement({
|
|
439
|
+
enabled: Boolean(values.gstEnabled),
|
|
440
|
+
gstin: values.gstin,
|
|
441
|
+
legalName: values.gstLegalName,
|
|
442
|
+
address: values.gstAddress,
|
|
443
|
+
});
|
|
444
|
+
return (_jsx(FieldInput, { name: "gstLegalName", label: "Legal name", hint: "Registered business name for invoices.", error: problems.legalName, value: values.gstLegalName ?? "", onChange: (v) => onChange({ gstLegalName: v }), placeholder: `${getBrandName()} Pvt Ltd` }));
|
|
445
|
+
},
|
|
446
|
+
gstAddress: ({ values, onChange }) => {
|
|
447
|
+
const problems = validateGstEnablement({
|
|
448
|
+
enabled: Boolean(values.gstEnabled),
|
|
449
|
+
gstin: values.gstin,
|
|
450
|
+
legalName: values.gstLegalName,
|
|
451
|
+
address: values.gstAddress,
|
|
452
|
+
});
|
|
453
|
+
return (_jsx(FieldTextarea, { name: "gstAddress", label: "Registered address", error: problems.address, value: values.gstAddress ?? "", onChange: (v) => onChange({ gstAddress: v }), placeholder: "Registered business address for GST invoices\u2026", rows: 3 }));
|
|
454
|
+
},
|
|
455
|
+
},
|
|
456
|
+
fieldVisibility: gstVisibilityFields,
|
|
457
|
+
editMode,
|
|
458
|
+
onToggleFieldVisibility: setGstFieldVisible,
|
|
459
|
+
fieldOrder: gstFieldOrder,
|
|
460
|
+
onMoveField: (fieldName, neighborName) => setGstFieldOrder(swapFieldOrder(gstFieldOrder, resolveFields(siteSettingsGstFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
461
|
+
}), [gstVisibilityFields, editMode, setGstFieldVisible, gstFieldOrder, setGstFieldOrder]);
|
|
462
|
+
// ⑦ Fees & Commissions — sixth tab migrated to the Universal Template
|
|
463
|
+
// System, 2026-11-04. Twenty-four useState calls collapsed into one
|
|
464
|
+
// combined object. 🛑 D13 — `saleProtectionFee*`/`codHandlingFee*` had NO
|
|
465
|
+
// state, NO field and NO control at all until that fix, while
|
|
466
|
+
// `updateSingleton` replaced the whole `commissions` map on every save —
|
|
467
|
+
// so the first save of any commissions field silently deleted them (sale
|
|
468
|
+
// protection stopped being sold, COD handling reverted to code defaults).
|
|
469
|
+
// The repository now writes dotted paths, so an omitted key survives, but
|
|
470
|
+
// the controls still have to exist. `saleProtectionFeeEnabled` defaults
|
|
471
|
+
// true to match the platform-tier default (the SELLER tier is the opt-in).
|
|
472
|
+
const [feesForm, setFeesForm] = React.useState({
|
|
473
|
+
platformFeePercent: 5, gstPercent: 18, minimumTransactionFee: 0, platformFeeMax: 10,
|
|
474
|
+
gatewayFeePercent: 2, payoutHoldDays: 7, minPayoutAmount: 100,
|
|
475
|
+
collectorDropListingFee: 0, preOrderListingFee: 0, featuredSlotFee: 999, promotedSlotFee: 499,
|
|
476
|
+
codDepositPercent: 10,
|
|
477
|
+
whatsappNotifyFeeEnabled: false, whatsappNotifyFee: 10,
|
|
478
|
+
giftWrapFeeEnabled: false, giftWrapFee: 49,
|
|
479
|
+
shipmentProtectionFeeEnabled: false, shipmentProtectionFeePercent: 2, shipmentProtectionFeeMin: 30,
|
|
480
|
+
saleProtectionFeeEnabled: true, saleProtectionFeePercent: 3, saleProtectionFeeMin: 49,
|
|
481
|
+
codHandlingFeePercent: 10, codHandlingFeeCap: 200,
|
|
482
|
+
});
|
|
483
|
+
const { fields: feesVisibilityFields, setVisible: setFeesFieldVisible, fieldOrder: feesFieldOrder, setFieldOrder: setFeesFieldOrder, } = useFieldVisibility("admin-site-settings-fees");
|
|
484
|
+
const feesSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsFeesFormSchema, {
|
|
485
|
+
fieldVisibility: feesVisibilityFields,
|
|
486
|
+
editMode,
|
|
487
|
+
onToggleFieldVisibility: setFeesFieldVisible,
|
|
488
|
+
fieldOrder: feesFieldOrder,
|
|
489
|
+
onMoveField: (fieldName, neighborName) => setFeesFieldOrder(swapFieldOrder(feesFieldOrder, resolveFields(siteSettingsFeesFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
490
|
+
}), [feesVisibilityFields, editMode, setFeesFieldVisible, feesFieldOrder, setFeesFieldOrder]);
|
|
491
|
+
// ⑧ Integrations — fifteenth tab migrated to the Universal Template
|
|
492
|
+
// System, 2026-11-04, and the largest by field count (30). Thirty
|
|
493
|
+
// useState calls collapsed into one combined object.
|
|
494
|
+
//
|
|
495
|
+
// D7b — Microsoft Clarity. Blank keeps it OFF; there is no enable toggle,
|
|
496
|
+
// and the absence of an id IS the off state (the same shape as the other
|
|
497
|
+
// three analytics fields).
|
|
498
|
+
const [integrationsForm, setIntegrationsForm] = React.useState({
|
|
499
|
+
razorpayKeyId: "", razorpayKeySecret: "", razorpayWebhookSecret: "",
|
|
500
|
+
cashfreeAppId: "", cashfreeSecretKey: "", cashfreeEnvironment: "sandbox",
|
|
501
|
+
phonepeClientId: "", phonepeClientSecret: "", phonepeClientVersion: "1",
|
|
502
|
+
phonepeEnvironment: "sandbox", phonepeWebhookUsername: "", phonepeWebhookPassword: "",
|
|
503
|
+
smtpHost: "", smtpPort: "587", smtpUser: "", smtpFrom: "",
|
|
504
|
+
googleMapsApiKey: "", googlePlaceId: "",
|
|
505
|
+
gaMeasurementId: "", fbPixelId: "", gtmContainerId: "", clarityProjectId: "",
|
|
506
|
+
metaPageAccessToken: "", metaPageId: "",
|
|
507
|
+
tiktokClientKey: "", tiktokClientSecret: "", tiktokAccessToken: "",
|
|
508
|
+
deviantartClientId: "", deviantartClientSecret: "",
|
|
509
|
+
});
|
|
510
|
+
const { fields: integrationsVisibilityFields, setVisible: setIntegrationsFieldVisible, fieldOrder: integrationsFieldOrder, setFieldOrder: setIntegrationsFieldOrder, } = useFieldVisibility("admin-site-settings-integrations");
|
|
511
|
+
const integrationsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsIntegrationsFormSchema, {
|
|
512
|
+
renderers: {
|
|
513
|
+
...Object.fromEntries(MASKED_CREDENTIAL_FIELDS.map(({ name, label, placeholder }) => [
|
|
514
|
+
name,
|
|
515
|
+
({ values, onChange }) => (_jsx(MaskedInput, { label: label, value: values[name] ?? "", onChange: (v) => onChange({ [name]: v }), placeholder: placeholder })),
|
|
516
|
+
])),
|
|
517
|
+
},
|
|
518
|
+
options: {
|
|
519
|
+
phonepeEnvironment: GATEWAY_ENVIRONMENT_OPTIONS,
|
|
520
|
+
cashfreeEnvironment: GATEWAY_ENVIRONMENT_OPTIONS,
|
|
521
|
+
},
|
|
522
|
+
fieldVisibility: integrationsVisibilityFields,
|
|
523
|
+
editMode,
|
|
524
|
+
onToggleFieldVisibility: setIntegrationsFieldVisible,
|
|
525
|
+
fieldOrder: integrationsFieldOrder,
|
|
526
|
+
onMoveField: (fieldName, neighborName) => setIntegrationsFieldOrder(swapFieldOrder(integrationsFieldOrder, resolveFields(siteSettingsIntegrationsFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
527
|
+
}), [integrationsVisibilityFields, editMode, setIntegrationsFieldVisible, integrationsFieldOrder, setIntegrationsFieldOrder]);
|
|
528
|
+
// ⑨ Shipping (Payment methods + Shipping Defaults + Seller shipping charge
|
|
529
|
+
// defaults) — tenth tab migrated to the Universal Template System,
|
|
530
|
+
// 2026-11-04. Fourteen useState calls collapsed into one combined object,
|
|
531
|
+
// including the 3 `commissions.*` fields shared with the Fees tab (its
|
|
532
|
+
// buildFullPayload() spread now reads them from `shippingForm` instead of
|
|
533
|
+
// bare vars — see that schema's own header for the seam).
|
|
534
|
+
//
|
|
535
|
+
// 🛑 `platformStoreId` defaults to EMPTY, which means "every store is
|
|
536
|
+
// third-party" and therefore refuses online collection for every cart.
|
|
537
|
+
// That is the fail-closed direction and it must not be "helpfully"
|
|
538
|
+
// defaulted to a store id here — a wrong guess would authorise collecting
|
|
539
|
+
// another seller's money into the platform's own account (the RBI
|
|
540
|
+
// commingling), and it would present as a completely successful checkout.
|
|
541
|
+
const [shippingForm, setShippingForm] = React.useState({
|
|
542
|
+
razorpayEnabled: false, phonepeEnabled: false, cashfreeEnabled: false,
|
|
543
|
+
platformStoreId: "", upiManualEnabled: true, codEnabled: true,
|
|
544
|
+
freeShippingThreshold: 999, defaultCarrier: "custom", maxDeliveryRadius: 0,
|
|
545
|
+
codMaxOrderValue: COD_MAX_ORDER_VALUE_FALLBACK, otpCheckoutThreshold: 5000,
|
|
546
|
+
sellerShippingFixed: 0, platformShippingPercent: 10, platformShippingFixedMin: 0,
|
|
547
|
+
});
|
|
548
|
+
const { fields: shippingVisibilityFields, setVisible: setShippingFieldVisible, fieldOrder: shippingFieldOrder, setFieldOrder: setShippingFieldOrder, } = useFieldVisibility("admin-site-settings-shipping");
|
|
549
|
+
const shippingSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsShippingFormSchema, {
|
|
550
|
+
options: { defaultCarrier: CARRIER_OPTIONS },
|
|
551
|
+
renderers: {
|
|
552
|
+
phonepeEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-phonepe-enabled", ...props }),
|
|
553
|
+
upiManualEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-manual-payment-enabled", ...props }),
|
|
554
|
+
codEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-cod-enabled", ...props }),
|
|
555
|
+
},
|
|
556
|
+
fieldVisibility: shippingVisibilityFields,
|
|
557
|
+
editMode,
|
|
558
|
+
onToggleFieldVisibility: setShippingFieldVisible,
|
|
559
|
+
fieldOrder: shippingFieldOrder,
|
|
560
|
+
onMoveField: (fieldName, neighborName) => setShippingFieldOrder(swapFieldOrder(shippingFieldOrder, resolveFields(siteSettingsShippingFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
561
|
+
}), [shippingVisibilityFields, editMode, setShippingFieldVisible, shippingFieldOrder, setShippingFieldOrder]);
|
|
562
|
+
// ⑱ Listings — seventeenth tab migrated to the Universal Template
|
|
563
|
+
// System, 2026-11-04. Three Record<string, boolean> useState calls
|
|
564
|
+
// collapsed into one combined object. All three are DYNAMIC
|
|
565
|
+
// registry-driven toggle grids (keys come from LISTING_TYPE_KEYS/
|
|
566
|
+
// CATEGORY_TYPE_KEYS/BROWSE_PAGE_KEYS, declared further down this
|
|
567
|
+
// component body) rather than fixed scalar fields — see
|
|
568
|
+
// site-settings-listings-form.ts's header for why that's a Record field
|
|
569
|
+
// with a custom renderer rather than per-key schema fields.
|
|
570
|
+
const [listingsForm, setListingsForm] = React.useState({
|
|
571
|
+
listingTypeFlags: {}, categoryTypeFlags: {}, browsePageFlags: {},
|
|
572
|
+
});
|
|
573
|
+
const { fields: listingsVisibilityFields, setVisible: setListingsFieldVisible, fieldOrder: listingsFieldOrder, setFieldOrder: setListingsFieldOrder, } = useFieldVisibility("admin-site-settings-listings");
|
|
574
|
+
const listingsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsListingsFormSchema, {
|
|
575
|
+
renderers: {
|
|
576
|
+
/*
|
|
577
|
+
* 🛑 A THREE-STATE SELECT, not a Toggle — all three grids.
|
|
578
|
+
*
|
|
579
|
+
* Every one of these axes stores `boolean | "unlisted"`, and
|
|
580
|
+
* `"unlisted"` is the state the owner asked for on 2026-11-07:
|
|
581
|
+
* *"do not show their links or filters or any way to jump to them,
|
|
582
|
+
* but do not 404 their pages."* A `Toggle` cannot carry it. Worse
|
|
583
|
+
* than cannot: a stored `"unlisted"` is a truthy STRING, so the
|
|
584
|
+
* toggle drew it fully ON — indistinguishable from "listed" — and
|
|
585
|
+
* flipping it wrote a boolean, destroying the state with no way to
|
|
586
|
+
* put it back from this screen. The only way to set it was editing
|
|
587
|
+
* Firestore by hand, which is precisely the "code change to flip a
|
|
588
|
+
* flag" the capability model exists to abolish.
|
|
589
|
+
*
|
|
590
|
+
* Labels come from `FLAG_CHOICE_OPTIONS` and say what each state
|
|
591
|
+
* DOES, because the one thing an admin must not get wrong here is
|
|
592
|
+
* that "unlisted" keeps serving the page and "off" 404s it.
|
|
593
|
+
*/
|
|
594
|
+
listingTypeFlags: ({ values, onChange }) => {
|
|
595
|
+
const flags = values.listingTypeFlags ?? {};
|
|
596
|
+
return (_jsx(Grid, { cols: 2, gap: "sm", children: LISTING_TYPE_KEYS.map((key) => (_jsx(Select, {
|
|
597
|
+
// The plugin's own display label, not the raw key — the
|
|
598
|
+
// literal version rendered "pre-order" and
|
|
599
|
+
// "digital-code" at an admin. 1A-v — the primary action
|
|
600
|
+
// kind appended so an admin can tell at a glance what
|
|
601
|
+
// disabling this type actually turns off (bid/reserve/
|
|
602
|
+
// offer, not just "buy").
|
|
603
|
+
label: `${pluginFor(key).typeLabel} — ${ACTION_KIND_LABELS[pluginFor(key).primaryActionKind]}`, value: flagValueToChoice(flags[key]), options: [...FLAG_CHOICE_OPTIONS], onValueChange: (choice) => onChange({
|
|
604
|
+
listingTypeFlags: {
|
|
605
|
+
...flags,
|
|
606
|
+
[key]: choiceToFlagValue(choice),
|
|
607
|
+
},
|
|
608
|
+
}) }, key))) }));
|
|
609
|
+
},
|
|
610
|
+
categoryTypeFlags: ({ values, onChange }) => {
|
|
611
|
+
const flags = values.categoryTypeFlags ?? {};
|
|
612
|
+
return (_jsx(Grid, { cols: 2, gap: "sm", children: CATEGORY_TYPE_KEYS.map((key) => (_jsx(Select, { label: key, value: flagValueToChoice(flags[key]), options: [...FLAG_CHOICE_OPTIONS], onValueChange: (choice) => onChange({
|
|
613
|
+
categoryTypeFlags: {
|
|
614
|
+
...flags,
|
|
615
|
+
[key]: choiceToFlagValue(choice),
|
|
616
|
+
},
|
|
617
|
+
}) }, key))) }));
|
|
618
|
+
},
|
|
619
|
+
browsePageFlags: ({ values, onChange }) => {
|
|
620
|
+
const flags = values.browsePageFlags ?? {};
|
|
621
|
+
return (_jsx(Grid, { cols: 2, gap: "sm", children: BROWSE_PAGE_KEYS.map((key) => (_jsxs(Stack, { gap: "xs", children: [_jsx(Select, { label: BROWSE_PAGE_META[key]?.label ?? key, value: flagValueToChoice(flags[key]), options: [...FLAG_CHOICE_OPTIONS], onValueChange: (choice) => onChange({
|
|
622
|
+
browsePageFlags: {
|
|
623
|
+
...flags,
|
|
624
|
+
[key]: choiceToFlagValue(choice),
|
|
625
|
+
},
|
|
626
|
+
}) }), _jsx(Text, { size: "xs", color: "muted", children: BROWSE_PAGE_META[key]?.hint })] }, key))) }));
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
fieldVisibility: listingsVisibilityFields,
|
|
630
|
+
editMode,
|
|
631
|
+
onToggleFieldVisibility: setListingsFieldVisible,
|
|
632
|
+
fieldOrder: listingsFieldOrder,
|
|
633
|
+
onMoveField: (fieldName, neighborName) => setListingsFieldOrder(swapFieldOrder(listingsFieldOrder, resolveFields(siteSettingsListingsFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
634
|
+
}), [listingsVisibilityFields, editMode, setListingsFieldVisible, listingsFieldOrder, setListingsFieldOrder]);
|
|
635
|
+
// ⑩ Collector Drop — sixteenth tab migrated to the Universal Template
|
|
636
|
+
// System, 2026-11-04. Three useState calls collapsed into one combined
|
|
637
|
+
// object. `bidIncrementTiers` keeps its original hand-written add/remove
|
|
638
|
+
// UI as a custom renderer — see site-settings-collector-drop-form.ts's
|
|
639
|
+
// header for why it does not fit the generic `<Repeater>` primitive.
|
|
640
|
+
const [collectorDropForm, setCollectorDropForm] = React.useState({
|
|
641
|
+
bidIncrementTiers: DEFAULT_COLLECTOR_DROP_BID_INCREMENT_TIERS,
|
|
642
|
+
autoExtendWindow: 5, settlementGrace: 24,
|
|
643
|
+
});
|
|
644
|
+
const { fields: collectorDropVisibilityFields, setVisible: setCollectorDropFieldVisible, fieldOrder: collectorDropFieldOrder, setFieldOrder: setCollectorDropFieldOrder, } = useFieldVisibility("admin-site-settings-collector-drop");
|
|
645
|
+
const collectorDropSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsCollectorDropFormSchema, {
|
|
646
|
+
renderers: {
|
|
647
|
+
bidIncrementTiers: ({ values, onChange }) => {
|
|
648
|
+
const tiers = values.bidIncrementTiers ?? [];
|
|
649
|
+
const setTiers = (next) => onChange({ bidIncrementTiers: next });
|
|
650
|
+
return (_jsxs(Stack, { gap: "sm", children: [tiers.map((tier, i) => {
|
|
651
|
+
const isLast = i === tiers.length - 1;
|
|
652
|
+
return (_jsxs(Grid, { align: "end", gap: "xs", className: "grid-cols-12", children: [_jsx(Div, { className: "col-span-5", children: isLast ? (_jsxs(_Fragment, { children: [_jsx(Text, { size: "xs", weight: "medium", className: "mb-1", children: "Up to (\u20B9)" }), _jsx(Text, { size: "sm", color: "muted", children: "and above" })] })) : (_jsx(Input, { label: "Up to (\u20B9)", type: "number", min: 1, value: String(tier.upTo ?? ""), onChange: (e) => setTiers(tiers.map((t, j) => (j === i ? { ...t, upTo: parseInt(e.target.value) || 0 } : t))) })) }), _jsx(Div, { className: "col-span-5", children: _jsx(Input, { label: "Increment (\u20B9)", type: "number", min: 1, value: String(tier.increment), onChange: (e) => setTiers(tiers.map((t, j) => (j === i ? { ...t, increment: parseInt(e.target.value) || 0 } : t))) }) }), _jsx(Row, { centered: true, className: "col-span-2", padding: "b-xs", children: _jsx(Button, { variant: "ghost", type: "button", disabled: tiers.length <= 1, onClick: () => setTiers(tiers.filter((_, j) => j !== i)), "aria-label": "Remove tier", children: "\u00D7" }) })] }, i));
|
|
653
|
+
}), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setTiers([
|
|
654
|
+
...tiers.slice(0, -1),
|
|
655
|
+
{ upTo: 100, increment: 10 },
|
|
656
|
+
tiers[tiers.length - 1] ?? { upTo: null, increment: 1000 },
|
|
657
|
+
]), children: "+ Add tier" })] }));
|
|
658
|
+
},
|
|
659
|
+
},
|
|
660
|
+
fieldVisibility: collectorDropVisibilityFields,
|
|
661
|
+
editMode,
|
|
662
|
+
onToggleFieldVisibility: setCollectorDropFieldVisible,
|
|
663
|
+
fieldOrder: collectorDropFieldOrder,
|
|
664
|
+
onMoveField: (fieldName, neighborName) => setCollectorDropFieldOrder(swapFieldOrder(collectorDropFieldOrder, resolveFields(siteSettingsCollectorDropFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
665
|
+
}), [collectorDropVisibilityFields, editMode, setCollectorDropFieldVisible, collectorDropFieldOrder, setCollectorDropFieldOrder]);
|
|
666
|
+
// ⑪ Platform Limits — eighth tab migrated to the Universal Template
|
|
667
|
+
// System, 2026-11-04. Three useState calls collapsed into one combined
|
|
668
|
+
// object.
|
|
669
|
+
const [limitsForm, setLimitsForm] = React.useState({
|
|
670
|
+
maxProductsPerStore: 100, maxCustomFields: 50, orderCancelWindow: 24,
|
|
671
|
+
});
|
|
672
|
+
const { fields: limitsVisibilityFields, setVisible: setLimitsFieldVisible, fieldOrder: limitsFieldOrder, setFieldOrder: setLimitsFieldOrder, } = useFieldVisibility("admin-site-settings-limits");
|
|
673
|
+
const limitsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsLimitsFormSchema, {
|
|
674
|
+
fieldVisibility: limitsVisibilityFields,
|
|
675
|
+
editMode,
|
|
676
|
+
onToggleFieldVisibility: setLimitsFieldVisible,
|
|
677
|
+
fieldOrder: limitsFieldOrder,
|
|
678
|
+
onMoveField: (fieldName, neighborName) => setLimitsFieldOrder(swapFieldOrder(limitsFieldOrder, resolveFields(siteSettingsLimitsFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
679
|
+
}), [limitsVisibilityFields, editMode, setLimitsFieldVisible, limitsFieldOrder, setLimitsFieldOrder]);
|
|
680
|
+
// ⑫ Legal — thirteenth tab migrated to the Universal Template System,
|
|
681
|
+
// 2026-11-04. Nine useState calls collapsed into one combined object.
|
|
682
|
+
//
|
|
683
|
+
// 🛑 D19 — `cancellation` and `grievance` are declared on
|
|
684
|
+
// `SiteSettingsDocument.legalPages` and were once omitted from BOTH the
|
|
685
|
+
// load and the payload here. Under the old wholesale-map replace that
|
|
686
|
+
// meant an override written to either key was ERASED on the next
|
|
687
|
+
// Legal-tab save — the same cause as D13, one group over, which is the
|
|
688
|
+
// evidence that the repository fix (dotted paths) was the right level to
|
|
689
|
+
// fix it at. The grievance page in particular is a statutory channel, so
|
|
690
|
+
// an override silently reverting to the bundled default is a compliance
|
|
691
|
+
// problem rather than a content one. Both are carried unconditionally
|
|
692
|
+
// below, same as every other field.
|
|
693
|
+
const [legalForm, setLegalForm] = React.useState({
|
|
694
|
+
termsHtml: "", privacyHtml: "", refundHtml: "", shippingPolicyHtml: "",
|
|
695
|
+
cookieHtml: "", ethicsHtml: "", conductHtml: "", cancellationHtml: "", grievanceHtml: "",
|
|
696
|
+
});
|
|
697
|
+
const { fields: legalVisibilityFields, setVisible: setLegalFieldVisible, fieldOrder: legalFieldOrder, setFieldOrder: setLegalFieldOrder, } = useFieldVisibility("admin-site-settings-legal");
|
|
698
|
+
const legalSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsLegalFormSchema, {
|
|
699
|
+
renderers: Object.fromEntries(LEGAL_PAGE_FIELDS.map(({ name, label }) => [
|
|
700
|
+
name,
|
|
701
|
+
({ values, onChange }) => (_jsx(Textarea, { label: label, value: values[name] ?? "", onChange: (e) => onChange({ [name]: e.target.value }), placeholder: `Enter ${label} HTML here…`, rows: 6, className: "font-mono" })),
|
|
702
|
+
])),
|
|
703
|
+
fieldVisibility: legalVisibilityFields,
|
|
704
|
+
editMode,
|
|
705
|
+
onToggleFieldVisibility: setLegalFieldVisible,
|
|
706
|
+
fieldOrder: legalFieldOrder,
|
|
707
|
+
onMoveField: (fieldName, neighborName) => setLegalFieldOrder(swapFieldOrder(legalFieldOrder, resolveFields(siteSettingsLegalFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
708
|
+
}), [legalVisibilityFields, editMode, setLegalFieldVisible, legalFieldOrder, setLegalFieldOrder]);
|
|
709
|
+
// ⑬ WhatsApp Business Cloud API (platform-level) — fourteenth tab
|
|
710
|
+
// migrated to the Universal Template System, 2026-11-04. Ten useState
|
|
711
|
+
// calls collapsed into one combined object.
|
|
712
|
+
const [whatsappForm, setWhatsappForm] = React.useState({
|
|
713
|
+
waPhoneNumberId: "", waCloudApiToken: "", waAdminNotifyNumbers: "",
|
|
714
|
+
waTemplateLanguage: "en", waTemplateOrderPlaced: "", waTemplateOrderConfirmed: "",
|
|
715
|
+
waTemplateOrderShipped: "", waTemplateOrderDelivered: "",
|
|
716
|
+
waTemplateOrderCancelled: "", waTemplateRefundInitiated: "",
|
|
717
|
+
});
|
|
718
|
+
const { fields: whatsappVisibilityFields, setVisible: setWhatsappFieldVisible, fieldOrder: whatsappFieldOrder, setFieldOrder: setWhatsappFieldOrder, } = useFieldVisibility("admin-site-settings-whatsapp");
|
|
719
|
+
const whatsappSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsWhatsappFormSchema, {
|
|
720
|
+
renderers: {
|
|
721
|
+
waCloudApiToken: ({ values, onChange }) => (_jsx(MaskedInput, { label: "Cloud API System User Token", value: values.waCloudApiToken ?? "", onChange: (v) => onChange({ waCloudApiToken: v }), placeholder: "EAAxxxxxxxx\u2026", helperText: "Long-lived system user access token with WhatsApp Business permissions" })),
|
|
722
|
+
},
|
|
723
|
+
fieldVisibility: whatsappVisibilityFields,
|
|
724
|
+
editMode,
|
|
725
|
+
onToggleFieldVisibility: setWhatsappFieldVisible,
|
|
726
|
+
fieldOrder: whatsappFieldOrder,
|
|
727
|
+
onMoveField: (fieldName, neighborName) => setWhatsappFieldOrder(swapFieldOrder(whatsappFieldOrder, resolveFields(siteSettingsWhatsappFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
728
|
+
}), [whatsappVisibilityFields, editMode, setWhatsappFieldVisible, whatsappFieldOrder, setWhatsappFieldOrder]);
|
|
729
|
+
// ⓪ About — nineteenth (and last field-by-field) tab migrated to the
|
|
730
|
+
// Universal Template System, 2026-11-04. Seventeen useState calls
|
|
731
|
+
// collapsed into one combined object. The four list fields use the
|
|
732
|
+
// generic `<Repeater>` primitive — see site-settings-about-form.ts's
|
|
733
|
+
// header for why that's the right fit here (unlike Collector Drop's
|
|
734
|
+
// bid-tier array, none of these four carry special last-row rules).
|
|
735
|
+
const [aboutForm, setAboutForm] = React.useState({
|
|
736
|
+
aboutTitle: "", aboutSubtitle: "", aboutMissionTitle: "", aboutMissionText: "",
|
|
737
|
+
aboutHowItWorksTitle: "", aboutHowItems: [],
|
|
738
|
+
aboutValuesTitle: "", aboutValuesSubtitle: "", aboutValueItems: [],
|
|
739
|
+
aboutMilestonesTitle: "", aboutMilestones: [],
|
|
740
|
+
aboutTeamTitle: "", aboutTeamSubtitle: "", aboutTeamMembers: [],
|
|
741
|
+
aboutCtaTitle: "", aboutCtaSell: "", aboutCtaShop: "",
|
|
742
|
+
});
|
|
743
|
+
const { fields: aboutVisibilityFields, setVisible: setAboutFieldVisible, fieldOrder: aboutFieldOrder, setFieldOrder: setAboutFieldOrder, } = useFieldVisibility("admin-site-settings-about");
|
|
744
|
+
const aboutSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsAboutFormSchema, {
|
|
745
|
+
renderers: {
|
|
746
|
+
aboutHowItems: ({ values, onChange }) => {
|
|
747
|
+
const rows = values.aboutHowItems ?? [];
|
|
748
|
+
return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutHowItems: next }), blank: () => ({ title: "", text: "", icon: "✨", tone: "indigo" }), addLabel: "+ Add step", max: 6, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(Input, { label: "Icon (emoji)", value: row.icon, onChange: (e) => set({ icon: e.target.value }), placeholder: "\uD83D\uDED2" }), _jsx(Input, { label: "Title", value: row.title, onChange: (e) => set({ title: e.target.value }) }), _jsx(Textarea, { value: row.text, onChange: (e) => set({ text: e.target.value }), rows: 2 })] })) }));
|
|
749
|
+
},
|
|
750
|
+
aboutValueItems: ({ values, onChange }) => {
|
|
751
|
+
const rows = values.aboutValueItems ?? [];
|
|
752
|
+
return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutValueItems: next }), blank: () => ({ title: "", text: "", icon: "✨" }), addLabel: "+ Add value", max: 8, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(Input, { label: "Icon (emoji)", value: row.icon, onChange: (e) => set({ icon: e.target.value }), placeholder: "\uD83D\uDEE1\uFE0F" }), _jsx(Input, { label: "Title", value: row.title, onChange: (e) => set({ title: e.target.value }) }), _jsx(Textarea, { label: "Text", value: row.text, onChange: (e) => set({ text: e.target.value }), rows: 2 }), _jsx(Textarea, { label: "Detail (optional)", value: row.detail ?? "", onChange: (e) => set({ detail: e.target.value }), rows: 2, placeholder: "How this value is actually enforced" })] })) }));
|
|
753
|
+
},
|
|
754
|
+
aboutMilestones: ({ values, onChange }) => {
|
|
755
|
+
const rows = values.aboutMilestones ?? [];
|
|
756
|
+
return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutMilestones: next }), blank: () => ({ year: "", text: "" }), addLabel: "+ Add milestone", max: 10, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(Input, { label: "Year", value: row.year, onChange: (e) => set({ year: e.target.value }), placeholder: "2024" }), _jsx(Textarea, { value: row.text, onChange: (e) => set({ text: e.target.value }), rows: 2 })] })) }));
|
|
757
|
+
},
|
|
758
|
+
aboutTeamMembers: ({ values, onChange }) => {
|
|
759
|
+
const rows = values.aboutTeamMembers ?? [];
|
|
760
|
+
return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutTeamMembers: next }), blank: () => ({ name: "", role: "", bio: "" }), addLabel: "+ Add team member", max: 12, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(ImageUpload, { label: "Photo", currentImage: row.photoUrl, onUpload: (file) => upload(file, "store"), onChange: (url) => set({ photoUrl: url }) }), _jsx(Input, { label: "Name", value: row.name, onChange: (e) => set({ name: e.target.value }) }), _jsx(Input, { label: "Role", value: row.role, onChange: (e) => set({ role: e.target.value }), placeholder: "Founder & Developer" }), _jsx(Textarea, { value: row.bio, onChange: (e) => set({ bio: e.target.value }), rows: 3 }), _jsxs(Row, { gap: "md", children: [_jsx(Toggle, { label: "Founder", checked: !!row.isFounder, onChange: (v) => set({ isFounder: v }) }), _jsx(Toggle, { label: "Developer", checked: !!row.isDeveloper, onChange: (v) => set({ isDeveloper: v }) })] })] })) }));
|
|
761
|
+
},
|
|
762
|
+
},
|
|
763
|
+
fieldVisibility: aboutVisibilityFields,
|
|
764
|
+
editMode,
|
|
765
|
+
onToggleFieldVisibility: setAboutFieldVisible,
|
|
766
|
+
fieldOrder: aboutFieldOrder,
|
|
767
|
+
onMoveField: (fieldName, neighborName) => setAboutFieldOrder(swapFieldOrder(aboutFieldOrder, resolveFields(siteSettingsAboutFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
768
|
+
}), [aboutVisibilityFields, editMode, setAboutFieldVisible, aboutFieldOrder, setAboutFieldOrder, upload]);
|
|
769
|
+
// ⑭ Notification channels — ninth tab migrated to the Universal Template
|
|
770
|
+
// System, 2026-11-04. Eighteen useState calls collapsed into one combined
|
|
771
|
+
// object. Writes across FOUR save-payload groups in buildFullPayload()
|
|
772
|
+
// (`messaging`, `notificationChannels`, part of `emailSettings`, and
|
|
773
|
+
// `credentials.resendApiKey`) — see site-settings-notifications-form.ts's
|
|
774
|
+
// header for the full breakdown.
|
|
775
|
+
//
|
|
776
|
+
// `msgEmailEnabled`/`msgWhatsappEnabled` suppress USER-facing mail only.
|
|
777
|
+
// Staff mail — the daily digest, the payout summary — keeps flowing
|
|
778
|
+
// regardless, because switching off customer email must never also blind
|
|
779
|
+
// the operator.
|
|
780
|
+
const [notificationsForm, setNotificationsForm] = React.useState({
|
|
781
|
+
msgEmailEnabled: false, msgWhatsappEnabled: false, msgCeilingEmail: 80, msgCeilingWhatsapp: 200,
|
|
782
|
+
notifEmailEnabled: false, notifEmailMinPriority: "normal", resendApiKey: "",
|
|
783
|
+
notifFromEmail: "", notifFromName: "", notifEmailTypes: [],
|
|
784
|
+
digestEnabled: false, digestRecipients: "",
|
|
785
|
+
notifWhatsappEnabled: false, notifWhatsappMinPriority: "high",
|
|
786
|
+
notifWhatsappOtpEnabled: false, notifWhatsappTypes: [],
|
|
787
|
+
notifSmsEnabled: false, notifSmsMinPriority: "high",
|
|
788
|
+
});
|
|
789
|
+
const { fields: notificationsVisibilityFields, setVisible: setNotificationsFieldVisible, fieldOrder: notificationsFieldOrder, setFieldOrder: setNotificationsFieldOrder, } = useFieldVisibility("admin-site-settings-notifications");
|
|
790
|
+
const notificationsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsNotificationsFormSchema, {
|
|
791
|
+
renderers: {
|
|
792
|
+
msgEmailEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-email-notifications", ...props }),
|
|
793
|
+
msgWhatsappEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-whatsapp-notifications", ...props }),
|
|
794
|
+
digestEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-daily-digest", ...props }),
|
|
795
|
+
resendApiKey: ({ values, onChange }) => (_jsx(MaskedInput, { label: "Resend API Key", value: values.resendApiKey ?? "", onChange: (v) => onChange({ resendApiKey: v }), placeholder: "re_live_\u2026", helperText: "Get your key at resend.com \u2014 used for all transactional notifications." })),
|
|
796
|
+
notifEmailTypes: ({ values, onChange }) => (_jsx(PaginatedSelect, { ariaLabel: "Notification types", multiple: true, options: NOTIF_TYPE_OPTIONS, value: values.notifEmailTypes, onChange: (v) => onChange({ notifEmailTypes: v }), placeholder: "All notification types" })),
|
|
797
|
+
notifWhatsappTypes: ({ values, onChange }) => (_jsx(PaginatedSelect, { multiple: true, ariaLabel: "Notification types to send over WhatsApp", options: NOTIF_TYPE_OPTIONS, value: values.notifWhatsappTypes, onChange: (v) => onChange({ notifWhatsappTypes: v }), placeholder: "All notification types" })),
|
|
798
|
+
},
|
|
799
|
+
options: {
|
|
800
|
+
notifEmailMinPriority: PRIORITY_OPTIONS,
|
|
801
|
+
notifWhatsappMinPriority: PRIORITY_OPTIONS,
|
|
802
|
+
notifSmsMinPriority: PRIORITY_OPTIONS,
|
|
803
|
+
},
|
|
804
|
+
fieldVisibility: notificationsVisibilityFields,
|
|
805
|
+
editMode,
|
|
806
|
+
onToggleFieldVisibility: setNotificationsFieldVisible,
|
|
807
|
+
fieldOrder: notificationsFieldOrder,
|
|
808
|
+
onMoveField: (fieldName, neighborName) => setNotificationsFieldOrder(swapFieldOrder(notificationsFieldOrder, resolveFields(siteSettingsNotificationsFormSchema).map((f) => f.name), fieldName, neighborName)),
|
|
809
|
+
}), [notificationsVisibilityFields, editMode, setNotificationsFieldVisible, notificationsFieldOrder, setNotificationsFieldOrder]);
|
|
408
810
|
// Snapshot of the masked placeholder strings the server returned for every
|
|
409
811
|
// credentials.* field, captured once per load. A combined single-save has
|
|
410
812
|
// to send the FULL credentials object on every save (not just the group the
|
|
@@ -418,214 +820,282 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
|
418
820
|
React.useEffect(() => {
|
|
419
821
|
if (!s || !Object.keys(s).length)
|
|
420
822
|
return;
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
823
|
+
setBrandingForm({
|
|
824
|
+
siteName: s.siteName ?? "",
|
|
825
|
+
tagline: s.tagline ?? "",
|
|
826
|
+
logoUrl: s.logo ?? "",
|
|
827
|
+
faviconUrl: s.favicon ?? "",
|
|
828
|
+
maintenanceMode: s.maintenance?.enabled ?? false,
|
|
829
|
+
maintenanceMessage: s.maintenance?.message ?? "",
|
|
830
|
+
chatEnabled: s.chat?.enabled ?? false,
|
|
831
|
+
assistantEnabled: s.assistant?.enabled ?? true,
|
|
832
|
+
});
|
|
833
|
+
setAppearanceForm({
|
|
834
|
+
lightBg: {
|
|
835
|
+
type: (s.background?.light?.type ?? "color"),
|
|
836
|
+
value: s.background?.light?.value ?? "",
|
|
837
|
+
overlayEnabled: s.background?.light?.overlay?.enabled ?? false,
|
|
838
|
+
overlayColor: s.background?.light?.overlay?.color ?? "#000000",
|
|
839
|
+
overlayOpacity: Math.round((s.background?.light?.overlay?.opacity ?? 0.3) * 100),
|
|
840
|
+
},
|
|
841
|
+
darkBg: {
|
|
842
|
+
type: (s.background?.dark?.type ?? "color"),
|
|
843
|
+
value: s.background?.dark?.value ?? "",
|
|
844
|
+
overlayEnabled: s.background?.dark?.overlay?.enabled ?? false,
|
|
845
|
+
overlayColor: s.background?.dark?.overlay?.color ?? "#000000",
|
|
846
|
+
overlayOpacity: Math.round((s.background?.dark?.overlay?.opacity ?? 0.3) * 100),
|
|
847
|
+
},
|
|
848
|
+
});
|
|
437
849
|
const themeBlock = s.theme;
|
|
438
850
|
setThemeRegistry({
|
|
439
851
|
themes: (themeBlock?.themes ?? []),
|
|
440
852
|
defaultLightThemeId: themeBlock?.defaultLightThemeId ?? DEFAULT_LIGHT_THEME.id,
|
|
441
853
|
defaultDarkThemeId: themeBlock?.defaultDarkThemeId ?? DEFAULT_DARK_THEME.id,
|
|
442
854
|
});
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
855
|
+
setAnnouncementForm({
|
|
856
|
+
announcementEnabled: s.announcementBar?.enabled ?? false,
|
|
857
|
+
announcementText: s.announcementBar?.message ?? "",
|
|
858
|
+
announcementLink: s.announcementBar?.link ?? "",
|
|
859
|
+
announcementBg: s.announcementBar?.backgroundColor ?? "",
|
|
860
|
+
});
|
|
861
|
+
setSeoForm({
|
|
862
|
+
seoTitle: s.seo?.defaultTitle ?? "",
|
|
863
|
+
seoDescription: s.seo?.defaultDescription ?? "",
|
|
864
|
+
seoOgImage: s.seo?.defaultOgImage ?? "",
|
|
865
|
+
seoNoIndex: s.seo?.noIndex ?? false,
|
|
866
|
+
canonicalUrl: s.seo?.canonicalBaseUrl ?? "",
|
|
867
|
+
});
|
|
868
|
+
setContactForm({
|
|
869
|
+
supportEmail: s.contact?.email ?? "",
|
|
870
|
+
supportPhone: s.contact?.phone ?? "",
|
|
871
|
+
supportAddress: s.contact?.address ?? "",
|
|
872
|
+
supportHours: s.contact?.supportHours ?? "",
|
|
873
|
+
instagram: s.socialLinks?.instagram ?? "",
|
|
874
|
+
twitter: s.socialLinks?.twitter ?? "",
|
|
875
|
+
facebook: s.socialLinks?.facebook ?? "",
|
|
876
|
+
youtube: s.socialLinks?.youtube ?? "",
|
|
877
|
+
whatsapp: s.contact?.whatsappNumber ?? "",
|
|
878
|
+
upiVpa: s.contact?.upiVpa ?? "",
|
|
879
|
+
linkedin: s.socialLinks?.linkedin ?? "",
|
|
880
|
+
pinterest: s.socialLinks?.pinterest ?? "",
|
|
881
|
+
});
|
|
882
|
+
const loadedWatermarkPosition = s.watermark?.position ?? "center";
|
|
883
|
+
setWatermarkForm({
|
|
884
|
+
watermarkType: s.watermark?.type ?? "text",
|
|
885
|
+
watermarkText: s.watermark?.text ?? getBrandDomain(),
|
|
886
|
+
watermarkImageUrl: s.watermark?.imageUrl ?? "",
|
|
887
|
+
watermarkSize: s.watermark?.size ?? 10,
|
|
888
|
+
watermarkOpacity: s.watermark?.opacity ?? 10,
|
|
889
|
+
watermarkUseCustomOffset: loadedWatermarkPosition === "custom",
|
|
890
|
+
watermarkPosition: loadedWatermarkPosition === "custom"
|
|
891
|
+
? "center"
|
|
892
|
+
: loadedWatermarkPosition,
|
|
893
|
+
watermarkOffsetX: s.watermark?.offsetX ?? 0,
|
|
894
|
+
watermarkOffsetY: s.watermark?.offsetY ?? 0,
|
|
895
|
+
});
|
|
896
|
+
setFeesForm({
|
|
897
|
+
platformFeePercent: s.commissions?.platformFeePercent ?? 5,
|
|
898
|
+
gstPercent: s.commissions?.gstPercent ?? 18,
|
|
899
|
+
minimumTransactionFee: s.commissions?.minimumTransactionFee ?? 0,
|
|
900
|
+
platformFeeMax: s.commissions?.platformFeeMax ?? 10,
|
|
901
|
+
gatewayFeePercent: s.commissions?.gatewayFeePercent ?? 2,
|
|
902
|
+
/*
|
|
903
|
+
* 🛑 Clamped UP to the floor on load, deliberately.
|
|
904
|
+
*
|
|
905
|
+
* The live document is seeded `2`, and the payload Zod schema now
|
|
906
|
+
* refuses anything below `PAYOUT_HOLD_FLOOR_DAYS` (7) — so without this
|
|
907
|
+
* clamp an admin opening this tab would load 2, change something
|
|
908
|
+
* unrelated, and be blocked from saving by a field they never touched.
|
|
909
|
+
* The honoured value is already 7 (`resolvePayoutHoldDays` clamps at
|
|
910
|
+
* read time), so showing 7 is showing the truth, not silently
|
|
911
|
+
* overriding them.
|
|
912
|
+
*/
|
|
913
|
+
payoutHoldDays: Math.max(s.commissions?.payoutHoldDays ?? 7, PAYOUT_HOLD_FLOOR_DAYS),
|
|
914
|
+
minPayoutAmount: s.commissions?.minPayoutAmount ?? 100,
|
|
915
|
+
collectorDropListingFee: s.commissions?.collectorDropListingFee ?? 0,
|
|
916
|
+
preOrderListingFee: s.commissions?.preOrderListingFee ?? 0,
|
|
917
|
+
featuredSlotFee: s.commissions?.featuredSlotFee ?? 999,
|
|
918
|
+
promotedSlotFee: s.commissions?.promotedSlotFee ?? 499,
|
|
919
|
+
codDepositPercent: s.commissions?.codDepositPercent ?? 10,
|
|
920
|
+
whatsappNotifyFeeEnabled: s.commissions?.whatsappNotifyFeeEnabled ?? false,
|
|
921
|
+
whatsappNotifyFee: s.commissions?.whatsappNotifyFee ?? 10,
|
|
922
|
+
giftWrapFeeEnabled: s.commissions?.giftWrapFeeEnabled ?? false,
|
|
923
|
+
giftWrapFee: s.commissions?.giftWrapFee ?? 49,
|
|
924
|
+
shipmentProtectionFeeEnabled: s.commissions?.shipmentProtectionFeeEnabled ?? false,
|
|
925
|
+
shipmentProtectionFeePercent: s.commissions?.shipmentProtectionFeePercent ?? 2,
|
|
926
|
+
shipmentProtectionFeeMin: s.commissions?.shipmentProtectionFeeMin ?? 30,
|
|
927
|
+
saleProtectionFeeEnabled: s.commissions?.saleProtectionFeeEnabled ?? true,
|
|
928
|
+
saleProtectionFeePercent: s.commissions?.saleProtectionFeePercent ?? 3,
|
|
929
|
+
saleProtectionFeeMin: s.commissions?.saleProtectionFeeMin ?? 49,
|
|
930
|
+
codHandlingFeePercent: s.commissions?.codHandlingFeePercent ?? 10,
|
|
931
|
+
codHandlingFeeCap: s.commissions?.codHandlingFeeCap ?? 200,
|
|
932
|
+
});
|
|
933
|
+
setProcurementForm({
|
|
934
|
+
laborHourlyRate: s.laborRate?.hourlyRate ?? 200,
|
|
935
|
+
laborMaxHoursPerDay: s.laborRate?.maxHoursPerDay ?? 6,
|
|
936
|
+
});
|
|
937
|
+
setEmiForm({
|
|
938
|
+
emiEnabled: s.emi?.enabled ?? false,
|
|
939
|
+
emiMinOrderValue: s.emi?.minOrderValue ?? 10000,
|
|
940
|
+
emiTenureOptionsText: (s.emi?.tenureOptions ?? [2, 3, 4, 5, 6]).join(","),
|
|
941
|
+
emiTokenPercent: s.emi?.tokenPercent ?? 20,
|
|
942
|
+
emiBillingDay: s.emi?.billingDay ?? 5,
|
|
943
|
+
emiSurchargePercentPerMonth: s.emi?.surchargePercentPerMonth ?? 2,
|
|
944
|
+
emiSurchargeSellerSharePercent: s.emi?.surchargeSellerSharePercent ?? 50,
|
|
945
|
+
});
|
|
946
|
+
setGstForm({
|
|
947
|
+
gstEnabled: s.gst?.enabled ?? false,
|
|
948
|
+
gstin: s.gst?.gstin ?? "",
|
|
949
|
+
gstLegalName: s.gst?.legalName ?? "",
|
|
950
|
+
gstAddress: s.gst?.address ?? "",
|
|
951
|
+
});
|
|
952
|
+
setIntegrationsForm({
|
|
953
|
+
razorpayKeyId: s.credentialsMasked?.razorpayKeyId ?? "",
|
|
954
|
+
razorpayKeySecret: s.credentialsMasked?.razorpayKeySecret ?? "",
|
|
955
|
+
razorpayWebhookSecret: s.credentialsMasked?.razorpayWebhookSecret ?? "",
|
|
956
|
+
cashfreeAppId: s.credentialsMasked?.cashfreeAppId ?? "",
|
|
957
|
+
cashfreeSecretKey: s.credentialsMasked?.cashfreeSecretKey ?? "",
|
|
958
|
+
cashfreeEnvironment: s.credentialsMasked?.cashfreeEnvironment ?? "sandbox",
|
|
959
|
+
phonepeClientId: s.credentialsMasked?.phonepeClientId ?? "",
|
|
960
|
+
phonepeClientSecret: s.credentialsMasked?.phonepeClientSecret ?? "",
|
|
961
|
+
phonepeClientVersion: s.credentialsMasked?.phonepeClientVersion ?? "1",
|
|
962
|
+
phonepeEnvironment: s.credentialsMasked?.phonepeEnvironment ?? "sandbox",
|
|
963
|
+
phonepeWebhookUsername: s.credentialsMasked?.phonepeWebhookUsername ?? "",
|
|
964
|
+
phonepeWebhookPassword: s.credentialsMasked?.phonepeWebhookPassword ?? "",
|
|
965
|
+
googleMapsApiKey: s.credentialsMasked?.googleMapsApiKey ?? "",
|
|
966
|
+
googlePlaceId: s.credentialsMasked?.googlePlaceId ?? "",
|
|
967
|
+
smtpHost: s.emailSettings?.host ?? "",
|
|
968
|
+
smtpPort: String(s.emailSettings?.port ?? 587),
|
|
969
|
+
smtpUser: s.emailSettings?.user ?? "",
|
|
970
|
+
smtpFrom: s.emailSettings?.fromAddress ?? "",
|
|
971
|
+
gaMeasurementId: s.integrations?.googleAnalyticsId ?? "",
|
|
972
|
+
fbPixelId: s.integrations?.facebookPixelId ?? "",
|
|
973
|
+
gtmContainerId: s.integrations?.gtmContainerId ?? "",
|
|
974
|
+
clarityProjectId: s.integrations?.clarityProjectId ?? "",
|
|
975
|
+
metaPageAccessToken: s.credentialsMasked?.metaPageAccessToken ?? "",
|
|
976
|
+
metaPageId: s.credentialsMasked?.metaPageId ?? "",
|
|
977
|
+
tiktokClientKey: s.credentialsMasked?.tiktokClientKey ?? "",
|
|
978
|
+
tiktokClientSecret: s.credentialsMasked?.tiktokClientSecret ?? "",
|
|
979
|
+
tiktokAccessToken: s.credentialsMasked?.tiktokAccessToken ?? "",
|
|
980
|
+
deviantartClientId: s.credentialsMasked?.deviantartClientId ?? "",
|
|
981
|
+
deviantartClientSecret: s.credentialsMasked?.deviantartClientSecret ?? "",
|
|
982
|
+
});
|
|
479
983
|
/*
|
|
480
|
-
* 🛑
|
|
481
|
-
*
|
|
482
|
-
*
|
|
483
|
-
*
|
|
484
|
-
*
|
|
485
|
-
* blocked from saving by a field they never touched. The honoured value is
|
|
486
|
-
* already 7 (`resolvePayoutHoldDays` clamps at read time), so showing 7 is
|
|
487
|
-
* showing the truth, not silently overriding them.
|
|
984
|
+
* 🛑 The HYDRATE leg, and skipping it is the live risk this file's own
|
|
985
|
+
* comments name: a key that is SAVED but never hydrated renders its
|
|
986
|
+
* default — here the empty string — and the next save writes that default
|
|
987
|
+
* over the stored value. For this field that silently turns online
|
|
988
|
+
* collection off for the whole site on the first unrelated settings save.
|
|
488
989
|
*/
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
setAboutTeamSubtitle(s.aboutContent?.teamSubtitle ?? "");
|
|
592
|
-
setAboutTeamMembers(s.aboutContent?.teamMembers ?? []);
|
|
593
|
-
setAboutCtaTitle(s.aboutContent?.ctaTitle ?? "");
|
|
594
|
-
setAboutCtaSell(s.aboutContent?.ctaSell ?? "");
|
|
595
|
-
setAboutCtaShop(s.aboutContent?.ctaShop ?? "");
|
|
596
|
-
setWaPhoneNumberId(s.credentialsMasked?.whatsappPhoneNumberId ?? "");
|
|
597
|
-
setWaCloudApiToken(s.credentialsMasked?.whatsappCloudApiToken ?? "");
|
|
598
|
-
setWaAdminNotifyNumbers(s.credentialsMasked?.whatsappAdminNotifyNumbers ?? "");
|
|
599
|
-
setWaTemplateLanguage(s.credentialsMasked?.whatsappTemplateLanguage ?? "en");
|
|
600
|
-
setWaTemplateOrderPlaced(s.credentialsMasked?.whatsappTemplateOrderPlaced ?? "");
|
|
601
|
-
setWaTemplateOrderConfirmed(s.credentialsMasked?.whatsappTemplateOrderConfirmed ?? "");
|
|
602
|
-
setWaTemplateOrderShipped(s.credentialsMasked?.whatsappTemplateOrderShipped ?? "");
|
|
603
|
-
setWaTemplateOrderDelivered(s.credentialsMasked?.whatsappTemplateOrderDelivered ?? "");
|
|
604
|
-
setWaTemplateOrderCancelled(s.credentialsMasked?.whatsappTemplateOrderCancelled ?? "");
|
|
605
|
-
setWaTemplateRefundInitiated(s.credentialsMasked?.whatsappTemplateRefundInitiated ?? "");
|
|
606
|
-
setNotifEmailEnabled(s.notificationChannels?.email?.enabled ?? false);
|
|
607
|
-
setNotifEmailMinPriority(s.notificationChannels?.email?.minPriority ?? "normal");
|
|
608
|
-
setNotifWhatsappEnabled(s.notificationChannels?.whatsapp?.enabled ?? false);
|
|
609
|
-
setNotifWhatsappMinPriority(s.notificationChannels?.whatsapp?.minPriority ?? "high");
|
|
610
|
-
setNotifWhatsappOtpEnabled(s.notificationChannels?.whatsapp?.otpEnabled ?? false);
|
|
611
|
-
setNotifSmsEnabled(s.notificationChannels?.sms?.enabled ?? false);
|
|
612
|
-
setNotifSmsMinPriority(s.notificationChannels?.sms?.minPriority ?? "high");
|
|
613
|
-
setResendApiKey(s.credentialsMasked?.resendApiKey ?? "");
|
|
614
|
-
setNotifFromEmail(s.emailSettings?.fromEmail ?? "");
|
|
615
|
-
setNotifFromName(s.emailSettings?.fromName ?? "");
|
|
616
|
-
setDigestEnabled(s.emailSettings?.dailyDigest?.enabled ?? false);
|
|
617
|
-
setDigestRecipients((s.emailSettings?.dailyDigest?.recipients ?? []).join("\n"));
|
|
618
|
-
// Defaults mirror MESSAGE_BUDGET_DEFAULTS — both channels OFF, so a
|
|
619
|
-
// settings document written before this feature existed reads as quiet
|
|
620
|
-
// rather than as "on and unmetered".
|
|
621
|
-
setMsgEmailEnabled(s.messaging?.emailEnabled ?? false);
|
|
622
|
-
setMsgWhatsappEnabled(s.messaging?.whatsappEnabled ?? false);
|
|
623
|
-
setMsgCeilingEmail(s.messaging?.dailyCeiling?.email ?? 80);
|
|
624
|
-
setMsgCeilingWhatsapp(s.messaging?.dailyCeiling?.whatsapp ?? 200);
|
|
990
|
+
setShippingForm({
|
|
991
|
+
razorpayEnabled: s.payment?.razorpayEnabled ?? false,
|
|
992
|
+
phonepeEnabled: s.payment?.phonepeEnabled ?? false,
|
|
993
|
+
cashfreeEnabled: s.payment?.cashfreeEnabled ?? false,
|
|
994
|
+
platformStoreId: s.payment?.platformStoreId ?? "",
|
|
995
|
+
upiManualEnabled: s.payment?.upiManualEnabled ?? true,
|
|
996
|
+
codEnabled: s.payment?.codEnabled ?? true,
|
|
997
|
+
otpCheckoutThreshold: s.payment?.otpCheckoutThreshold ?? 5000,
|
|
998
|
+
codMaxOrderValue: s.payment?.codMaxOrderValue ?? COD_MAX_ORDER_VALUE_FALLBACK,
|
|
999
|
+
freeShippingThreshold: s.shipping?.freeShippingThreshold ?? 999,
|
|
1000
|
+
defaultCarrier: s.shipping?.defaultCarrier ?? "custom",
|
|
1001
|
+
maxDeliveryRadius: s.shipping?.maxDeliveryRadius ?? 0,
|
|
1002
|
+
sellerShippingFixed: s.commissions?.sellerShippingFixed ?? 0,
|
|
1003
|
+
platformShippingPercent: s.commissions?.platformShippingPercent ?? 10,
|
|
1004
|
+
platformShippingFixedMin: s.commissions?.platformShippingFixedMin ?? 0,
|
|
1005
|
+
});
|
|
1006
|
+
/*
|
|
1007
|
+
* 🛑 `FlagValue`, not `boolean`. These three maps store
|
|
1008
|
+
* `boolean | "unlisted"`; the old `as Record<string, boolean>` cast was a
|
|
1009
|
+
* lie that let a truthy `"unlisted"` string flow into a two-state Toggle,
|
|
1010
|
+
* which rendered it as "on" and overwrote it on the next click.
|
|
1011
|
+
*/
|
|
1012
|
+
setListingsForm({
|
|
1013
|
+
listingTypeFlags: s.listings?.listingTypes ?? {},
|
|
1014
|
+
categoryTypeFlags: s.listings?.categoryTypes ?? {},
|
|
1015
|
+
browsePageFlags: s.listings?.browsePages ?? {},
|
|
1016
|
+
});
|
|
1017
|
+
setCollectorDropForm({
|
|
1018
|
+
bidIncrementTiers: s.collectorDropConfig?.bidIncrementTiers ?? DEFAULT_COLLECTOR_DROP_BID_INCREMENT_TIERS,
|
|
1019
|
+
autoExtendWindow: s.collectorDropConfig?.autoExtendWindowMinutes ?? 5,
|
|
1020
|
+
settlementGrace: s.collectorDropConfig?.settlementGracePeriodHours ?? 24,
|
|
1021
|
+
});
|
|
1022
|
+
setLimitsForm({
|
|
1023
|
+
maxProductsPerStore: s.platformLimits?.maxProductsPerStore ?? 100,
|
|
1024
|
+
maxCustomFields: s.platformLimits?.maxCustomFieldsPerProduct ?? 50,
|
|
1025
|
+
orderCancelWindow: s.platformLimits?.orderCancellationWindowHours ?? 24,
|
|
1026
|
+
});
|
|
1027
|
+
setLegalForm({
|
|
1028
|
+
termsHtml: s.legalPages?.terms ?? "",
|
|
1029
|
+
privacyHtml: s.legalPages?.privacy ?? "",
|
|
1030
|
+
refundHtml: s.legalPages?.refundPolicy ?? "",
|
|
1031
|
+
shippingPolicyHtml: s.legalPages?.shipping ?? "",
|
|
1032
|
+
cookieHtml: s.legalPages?.cookies ?? "",
|
|
1033
|
+
ethicsHtml: s.legalPages?.ethics ?? "",
|
|
1034
|
+
cancellationHtml: s.legalPages?.cancellation ?? "",
|
|
1035
|
+
grievanceHtml: s.legalPages?.grievance ?? "",
|
|
1036
|
+
conductHtml: s.legalPages?.codeOfConduct ?? "",
|
|
1037
|
+
});
|
|
1038
|
+
setAboutForm({
|
|
1039
|
+
aboutTitle: s.aboutContent?.title ?? "",
|
|
1040
|
+
aboutSubtitle: s.aboutContent?.subtitle ?? "",
|
|
1041
|
+
aboutMissionTitle: s.aboutContent?.missionTitle ?? "",
|
|
1042
|
+
aboutMissionText: s.aboutContent?.missionText ?? "",
|
|
1043
|
+
aboutHowItWorksTitle: s.aboutContent?.howItWorksTitle ?? "",
|
|
1044
|
+
aboutHowItems: s.aboutContent?.howItems ?? [],
|
|
1045
|
+
aboutValuesTitle: s.aboutContent?.valuesTitle ?? "",
|
|
1046
|
+
aboutValuesSubtitle: s.aboutContent?.valuesSubtitle ?? "",
|
|
1047
|
+
aboutValueItems: s.aboutContent?.valueItems ?? [],
|
|
1048
|
+
aboutMilestonesTitle: s.aboutContent?.milestonesTitle ?? "",
|
|
1049
|
+
aboutMilestones: s.aboutContent?.milestones ?? [],
|
|
1050
|
+
aboutTeamTitle: s.aboutContent?.teamTitle ?? "",
|
|
1051
|
+
aboutTeamSubtitle: s.aboutContent?.teamSubtitle ?? "",
|
|
1052
|
+
aboutTeamMembers: s.aboutContent?.teamMembers ?? [],
|
|
1053
|
+
aboutCtaTitle: s.aboutContent?.ctaTitle ?? "",
|
|
1054
|
+
aboutCtaSell: s.aboutContent?.ctaSell ?? "",
|
|
1055
|
+
aboutCtaShop: s.aboutContent?.ctaShop ?? "",
|
|
1056
|
+
});
|
|
1057
|
+
setWhatsappForm({
|
|
1058
|
+
waPhoneNumberId: s.credentialsMasked?.whatsappPhoneNumberId ?? "",
|
|
1059
|
+
waCloudApiToken: s.credentialsMasked?.whatsappCloudApiToken ?? "",
|
|
1060
|
+
waAdminNotifyNumbers: s.credentialsMasked?.whatsappAdminNotifyNumbers ?? "",
|
|
1061
|
+
waTemplateLanguage: s.credentialsMasked?.whatsappTemplateLanguage ?? "en",
|
|
1062
|
+
waTemplateOrderPlaced: s.credentialsMasked?.whatsappTemplateOrderPlaced ?? "",
|
|
1063
|
+
waTemplateOrderConfirmed: s.credentialsMasked?.whatsappTemplateOrderConfirmed ?? "",
|
|
1064
|
+
waTemplateOrderShipped: s.credentialsMasked?.whatsappTemplateOrderShipped ?? "",
|
|
1065
|
+
waTemplateOrderDelivered: s.credentialsMasked?.whatsappTemplateOrderDelivered ?? "",
|
|
1066
|
+
waTemplateOrderCancelled: s.credentialsMasked?.whatsappTemplateOrderCancelled ?? "",
|
|
1067
|
+
waTemplateRefundInitiated: s.credentialsMasked?.whatsappTemplateRefundInitiated ?? "",
|
|
1068
|
+
});
|
|
1069
|
+
setNotificationsForm({
|
|
1070
|
+
notifEmailEnabled: s.notificationChannels?.email?.enabled ?? false,
|
|
1071
|
+
notifEmailMinPriority: s.notificationChannels?.email?.minPriority ?? "normal",
|
|
1072
|
+
notifWhatsappEnabled: s.notificationChannels?.whatsapp?.enabled ?? false,
|
|
1073
|
+
notifWhatsappMinPriority: s.notificationChannels?.whatsapp?.minPriority ?? "high",
|
|
1074
|
+
notifWhatsappOtpEnabled: s.notificationChannels?.whatsapp?.otpEnabled ?? false,
|
|
1075
|
+
notifSmsEnabled: s.notificationChannels?.sms?.enabled ?? false,
|
|
1076
|
+
notifSmsMinPriority: s.notificationChannels?.sms?.minPriority ?? "high",
|
|
1077
|
+
notifEmailTypes: s.notificationChannels?.email?.types ?? [],
|
|
1078
|
+
notifWhatsappTypes: s.notificationChannels?.whatsapp?.types ?? [],
|
|
1079
|
+
resendApiKey: s.credentialsMasked?.resendApiKey ?? "",
|
|
1080
|
+
notifFromEmail: s.emailSettings?.fromEmail ?? "",
|
|
1081
|
+
notifFromName: s.emailSettings?.fromName ?? "",
|
|
1082
|
+
digestEnabled: s.emailSettings?.dailyDigest?.enabled ?? false,
|
|
1083
|
+
digestRecipients: (s.emailSettings?.dailyDigest?.recipients ?? []).join("\n"),
|
|
1084
|
+
// Defaults mirror MESSAGE_BUDGET_DEFAULTS — both channels OFF, so a
|
|
1085
|
+
// settings document written before this feature existed reads as
|
|
1086
|
+
// quiet rather than as "on and unmetered".
|
|
1087
|
+
msgEmailEnabled: s.messaging?.emailEnabled ?? false,
|
|
1088
|
+
msgWhatsappEnabled: s.messaging?.whatsappEnabled ?? false,
|
|
1089
|
+
msgCeilingEmail: s.messaging?.dailyCeiling?.email ?? 80,
|
|
1090
|
+
msgCeilingWhatsapp: s.messaging?.dailyCeiling?.whatsapp ?? 200,
|
|
1091
|
+
});
|
|
625
1092
|
originalMaskedRef.current = {
|
|
626
1093
|
razorpayKeyId: s.credentialsMasked?.razorpayKeyId ?? "",
|
|
627
1094
|
razorpayKeySecret: s.credentialsMasked?.razorpayKeySecret ?? "",
|
|
628
1095
|
razorpayWebhookSecret: s.credentialsMasked?.razorpayWebhookSecret ?? "",
|
|
1096
|
+
cashfreeAppId: s.credentialsMasked?.cashfreeAppId ?? "",
|
|
1097
|
+
cashfreeSecretKey: s.credentialsMasked?.cashfreeSecretKey ?? "",
|
|
1098
|
+
cashfreeEnvironment: s.credentialsMasked?.cashfreeEnvironment ?? "",
|
|
629
1099
|
phonepeClientId: s.credentialsMasked?.phonepeClientId ?? "",
|
|
630
1100
|
phonepeClientSecret: s.credentialsMasked?.phonepeClientSecret ?? "",
|
|
631
1101
|
phonepeClientVersion: s.credentialsMasked?.phonepeClientVersion ?? "",
|
|
@@ -660,36 +1130,47 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
|
660
1130
|
function buildFullPayload() {
|
|
661
1131
|
return {
|
|
662
1132
|
aboutContent: {
|
|
663
|
-
title: aboutTitle,
|
|
664
|
-
subtitle: aboutSubtitle,
|
|
665
|
-
missionTitle: aboutMissionTitle,
|
|
666
|
-
missionText: aboutMissionText,
|
|
667
|
-
howItWorksTitle: aboutHowItWorksTitle,
|
|
668
|
-
howItems: aboutHowItems,
|
|
669
|
-
valuesTitle: aboutValuesTitle,
|
|
670
|
-
valuesSubtitle: aboutValuesSubtitle,
|
|
671
|
-
valueItems: aboutValueItems,
|
|
672
|
-
milestonesTitle: aboutMilestonesTitle,
|
|
673
|
-
milestones: aboutMilestones,
|
|
674
|
-
teamTitle: aboutTeamTitle,
|
|
675
|
-
teamSubtitle: aboutTeamSubtitle,
|
|
676
|
-
teamMembers: aboutTeamMembers,
|
|
677
|
-
ctaTitle: aboutCtaTitle,
|
|
678
|
-
ctaSell: aboutCtaSell,
|
|
679
|
-
ctaShop: aboutCtaShop,
|
|
680
|
-
},
|
|
681
|
-
siteName
|
|
682
|
-
|
|
1133
|
+
title: aboutForm.aboutTitle,
|
|
1134
|
+
subtitle: aboutForm.aboutSubtitle,
|
|
1135
|
+
missionTitle: aboutForm.aboutMissionTitle,
|
|
1136
|
+
missionText: aboutForm.aboutMissionText,
|
|
1137
|
+
howItWorksTitle: aboutForm.aboutHowItWorksTitle,
|
|
1138
|
+
howItems: aboutForm.aboutHowItems,
|
|
1139
|
+
valuesTitle: aboutForm.aboutValuesTitle,
|
|
1140
|
+
valuesSubtitle: aboutForm.aboutValuesSubtitle,
|
|
1141
|
+
valueItems: aboutForm.aboutValueItems,
|
|
1142
|
+
milestonesTitle: aboutForm.aboutMilestonesTitle,
|
|
1143
|
+
milestones: aboutForm.aboutMilestones,
|
|
1144
|
+
teamTitle: aboutForm.aboutTeamTitle,
|
|
1145
|
+
teamSubtitle: aboutForm.aboutTeamSubtitle,
|
|
1146
|
+
teamMembers: aboutForm.aboutTeamMembers,
|
|
1147
|
+
ctaTitle: aboutForm.aboutCtaTitle,
|
|
1148
|
+
ctaSell: aboutForm.aboutCtaSell,
|
|
1149
|
+
ctaShop: aboutForm.aboutCtaShop,
|
|
1150
|
+
},
|
|
1151
|
+
siteName: brandingForm.siteName, tagline: brandingForm.tagline,
|
|
1152
|
+
logo: brandingForm.logoUrl, favicon: brandingForm.faviconUrl,
|
|
1153
|
+
maintenance: { enabled: brandingForm.maintenanceMode, message: brandingForm.maintenanceMessage },
|
|
1154
|
+
chat: { enabled: brandingForm.chatEnabled },
|
|
1155
|
+
assistant: { enabled: brandingForm.assistantEnabled },
|
|
683
1156
|
background: {
|
|
684
1157
|
light: {
|
|
685
|
-
type:
|
|
686
|
-
value:
|
|
687
|
-
overlay: {
|
|
1158
|
+
type: appearanceForm.lightBg.type,
|
|
1159
|
+
value: appearanceForm.lightBg.value,
|
|
1160
|
+
overlay: {
|
|
1161
|
+
enabled: appearanceForm.lightBg.overlayEnabled,
|
|
1162
|
+
color: appearanceForm.lightBg.overlayColor,
|
|
1163
|
+
opacity: appearanceForm.lightBg.overlayOpacity / 100,
|
|
1164
|
+
},
|
|
688
1165
|
},
|
|
689
1166
|
dark: {
|
|
690
|
-
type:
|
|
691
|
-
value:
|
|
692
|
-
overlay: {
|
|
1167
|
+
type: appearanceForm.darkBg.type,
|
|
1168
|
+
value: appearanceForm.darkBg.value,
|
|
1169
|
+
overlay: {
|
|
1170
|
+
enabled: appearanceForm.darkBg.overlayEnabled,
|
|
1171
|
+
color: appearanceForm.darkBg.overlayColor,
|
|
1172
|
+
opacity: appearanceForm.darkBg.overlayOpacity / 100,
|
|
1173
|
+
},
|
|
693
1174
|
},
|
|
694
1175
|
},
|
|
695
1176
|
theme: {
|
|
@@ -698,81 +1179,117 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
|
698
1179
|
defaultDarkThemeId: themeRegistry.defaultDarkThemeId,
|
|
699
1180
|
},
|
|
700
1181
|
// message, not text — text was never read by AnnouncementBar or the homepage.
|
|
701
|
-
announcementBar: {
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
1182
|
+
announcementBar: {
|
|
1183
|
+
enabled: announcementForm.announcementEnabled,
|
|
1184
|
+
message: announcementForm.announcementText,
|
|
1185
|
+
link: announcementForm.announcementLink,
|
|
1186
|
+
backgroundColor: announcementForm.announcementBg,
|
|
1187
|
+
},
|
|
1188
|
+
seo: {
|
|
1189
|
+
defaultTitle: seoForm.seoTitle,
|
|
1190
|
+
defaultDescription: seoForm.seoDescription,
|
|
1191
|
+
defaultOgImage: seoForm.seoOgImage,
|
|
1192
|
+
noIndex: seoForm.seoNoIndex,
|
|
1193
|
+
canonicalBaseUrl: seoForm.canonicalUrl,
|
|
1194
|
+
},
|
|
1195
|
+
contact: {
|
|
1196
|
+
email: contactForm.supportEmail,
|
|
1197
|
+
phone: contactForm.supportPhone,
|
|
1198
|
+
address: contactForm.supportAddress,
|
|
1199
|
+
supportHours: contactForm.supportHours,
|
|
1200
|
+
whatsappNumber: contactForm.whatsapp,
|
|
1201
|
+
upiVpa: contactForm.upiVpa,
|
|
1202
|
+
},
|
|
1203
|
+
socialLinks: {
|
|
1204
|
+
instagram: contactForm.instagram,
|
|
1205
|
+
twitter: contactForm.twitter,
|
|
1206
|
+
facebook: contactForm.facebook,
|
|
1207
|
+
youtube: contactForm.youtube,
|
|
1208
|
+
linkedin: contactForm.linkedin,
|
|
1209
|
+
pinterest: contactForm.pinterest,
|
|
1210
|
+
},
|
|
705
1211
|
watermark: {
|
|
706
|
-
type: watermarkType,
|
|
707
|
-
text: watermarkText,
|
|
708
|
-
imageUrl: watermarkImageUrl,
|
|
709
|
-
size: watermarkSize,
|
|
710
|
-
opacity: watermarkOpacity,
|
|
711
|
-
position: watermarkUseCustomOffset ? "custom" : watermarkPosition,
|
|
712
|
-
offsetX: watermarkOffsetX,
|
|
713
|
-
offsetY: watermarkOffsetY,
|
|
714
|
-
},
|
|
715
|
-
commissions: {
|
|
716
|
-
|
|
1212
|
+
type: watermarkForm.watermarkType,
|
|
1213
|
+
text: watermarkForm.watermarkText,
|
|
1214
|
+
imageUrl: watermarkForm.watermarkImageUrl,
|
|
1215
|
+
size: watermarkForm.watermarkSize,
|
|
1216
|
+
opacity: watermarkForm.watermarkOpacity,
|
|
1217
|
+
position: watermarkForm.watermarkUseCustomOffset ? "custom" : watermarkForm.watermarkPosition,
|
|
1218
|
+
offsetX: watermarkForm.watermarkOffsetX,
|
|
1219
|
+
offsetY: watermarkForm.watermarkOffsetY,
|
|
1220
|
+
},
|
|
1221
|
+
commissions: {
|
|
1222
|
+
...feesForm,
|
|
1223
|
+
sellerShippingFixed: shippingForm.sellerShippingFixed,
|
|
1224
|
+
platformShippingPercent: shippingForm.platformShippingPercent,
|
|
1225
|
+
platformShippingFixedMin: shippingForm.platformShippingFixedMin,
|
|
1226
|
+
},
|
|
1227
|
+
laborRate: { hourlyRate: procurementForm.laborHourlyRate, maxHoursPerDay: procurementForm.laborMaxHoursPerDay },
|
|
717
1228
|
emi: {
|
|
718
|
-
enabled: emiEnabled,
|
|
719
|
-
minOrderValue: emiMinOrderValue,
|
|
720
|
-
tenureOptions: emiTenureOptionsText
|
|
1229
|
+
enabled: emiForm.emiEnabled,
|
|
1230
|
+
minOrderValue: emiForm.emiMinOrderValue,
|
|
1231
|
+
tenureOptions: (emiForm.emiTenureOptionsText ?? "")
|
|
721
1232
|
.split(",")
|
|
722
1233
|
.map((v) => parseInt(v.trim(), 10))
|
|
723
1234
|
.filter((v) => !isNaN(v) && v > 0),
|
|
724
|
-
tokenPercent: emiTokenPercent,
|
|
725
|
-
billingDay: emiBillingDay,
|
|
726
|
-
surchargePercentPerMonth: emiSurchargePercentPerMonth,
|
|
727
|
-
surchargeSellerSharePercent: emiSurchargeSellerSharePercent,
|
|
1235
|
+
tokenPercent: emiForm.emiTokenPercent,
|
|
1236
|
+
billingDay: emiForm.emiBillingDay,
|
|
1237
|
+
surchargePercentPerMonth: emiForm.emiSurchargePercentPerMonth,
|
|
1238
|
+
surchargeSellerSharePercent: emiForm.emiSurchargeSellerSharePercent,
|
|
728
1239
|
},
|
|
729
1240
|
gst: {
|
|
730
|
-
enabled: gstEnabled,
|
|
731
|
-
gstin: gstin.trim().toUpperCase(),
|
|
732
|
-
legalName: gstLegalName.trim(),
|
|
733
|
-
address: gstAddress.trim(),
|
|
1241
|
+
enabled: gstForm.gstEnabled,
|
|
1242
|
+
gstin: (gstForm.gstin ?? "").trim().toUpperCase(),
|
|
1243
|
+
legalName: (gstForm.gstLegalName ?? "").trim(),
|
|
1244
|
+
address: (gstForm.gstAddress ?? "").trim(),
|
|
734
1245
|
},
|
|
735
1246
|
// Masked credential fields resolve to "" when untouched — the repository's
|
|
736
1247
|
// mergeEncryptedCredentials preserves the existing encrypted value for any
|
|
737
1248
|
// "" field, so an unedited tab never overwrites a real secret with its
|
|
738
1249
|
// own masked display string.
|
|
739
1250
|
credentials: {
|
|
740
|
-
razorpayKeyId: maskedOrReal("razorpayKeyId", razorpayKeyId),
|
|
741
|
-
razorpayKeySecret: maskedOrReal("razorpayKeySecret", razorpayKeySecret),
|
|
742
|
-
razorpayWebhookSecret: maskedOrReal("razorpayWebhookSecret", razorpayWebhookSecret),
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
1251
|
+
razorpayKeyId: maskedOrReal("razorpayKeyId", integrationsForm.razorpayKeyId ?? ""),
|
|
1252
|
+
razorpayKeySecret: maskedOrReal("razorpayKeySecret", integrationsForm.razorpayKeySecret ?? ""),
|
|
1253
|
+
razorpayWebhookSecret: maskedOrReal("razorpayWebhookSecret", integrationsForm.razorpayWebhookSecret ?? ""),
|
|
1254
|
+
cashfreeAppId: maskedOrReal("cashfreeAppId", integrationsForm.cashfreeAppId ?? ""),
|
|
1255
|
+
cashfreeSecretKey: maskedOrReal("cashfreeSecretKey", integrationsForm.cashfreeSecretKey ?? ""),
|
|
1256
|
+
cashfreeEnvironment: maskedOrReal("cashfreeEnvironment", integrationsForm.cashfreeEnvironment ?? ""),
|
|
1257
|
+
phonepeClientId: maskedOrReal("phonepeClientId", integrationsForm.phonepeClientId ?? ""),
|
|
1258
|
+
phonepeClientSecret: maskedOrReal("phonepeClientSecret", integrationsForm.phonepeClientSecret ?? ""),
|
|
1259
|
+
phonepeClientVersion: maskedOrReal("phonepeClientVersion", integrationsForm.phonepeClientVersion ?? ""),
|
|
1260
|
+
phonepeEnvironment: maskedOrReal("phonepeEnvironment", integrationsForm.phonepeEnvironment ?? ""),
|
|
1261
|
+
phonepeWebhookUsername: maskedOrReal("phonepeWebhookUsername", integrationsForm.phonepeWebhookUsername ?? ""),
|
|
1262
|
+
phonepeWebhookPassword: maskedOrReal("phonepeWebhookPassword", integrationsForm.phonepeWebhookPassword ?? ""),
|
|
1263
|
+
googleMapsApiKey: maskedOrReal("googleMapsApiKey", integrationsForm.googleMapsApiKey ?? ""),
|
|
1264
|
+
googlePlaceId: maskedOrReal("googlePlaceId", integrationsForm.googlePlaceId ?? ""),
|
|
1265
|
+
metaPageAccessToken: maskedOrReal("metaPageAccessToken", integrationsForm.metaPageAccessToken ?? ""),
|
|
1266
|
+
metaPageId: maskedOrReal("metaPageId", integrationsForm.metaPageId ?? ""),
|
|
1267
|
+
tiktokClientKey: maskedOrReal("tiktokClientKey", integrationsForm.tiktokClientKey ?? ""),
|
|
1268
|
+
tiktokClientSecret: maskedOrReal("tiktokClientSecret", integrationsForm.tiktokClientSecret ?? ""),
|
|
1269
|
+
tiktokAccessToken: maskedOrReal("tiktokAccessToken", integrationsForm.tiktokAccessToken ?? ""),
|
|
1270
|
+
deviantartClientId: maskedOrReal("deviantartClientId", integrationsForm.deviantartClientId ?? ""),
|
|
1271
|
+
deviantartClientSecret: maskedOrReal("deviantartClientSecret", integrationsForm.deviantartClientSecret ?? ""),
|
|
1272
|
+
whatsappPhoneNumberId: maskedOrReal("whatsappPhoneNumberId", whatsappForm.waPhoneNumberId ?? ""),
|
|
1273
|
+
whatsappCloudApiToken: maskedOrReal("whatsappCloudApiToken", whatsappForm.waCloudApiToken ?? ""),
|
|
1274
|
+
whatsappAdminNotifyNumbers: maskedOrReal("whatsappAdminNotifyNumbers", whatsappForm.waAdminNotifyNumbers ?? ""),
|
|
1275
|
+
whatsappTemplateLanguage: maskedOrReal("whatsappTemplateLanguage", whatsappForm.waTemplateLanguage ?? ""),
|
|
1276
|
+
whatsappTemplateOrderPlaced: maskedOrReal("whatsappTemplateOrderPlaced", whatsappForm.waTemplateOrderPlaced ?? ""),
|
|
1277
|
+
whatsappTemplateOrderConfirmed: maskedOrReal("whatsappTemplateOrderConfirmed", whatsappForm.waTemplateOrderConfirmed ?? ""),
|
|
1278
|
+
whatsappTemplateOrderShipped: maskedOrReal("whatsappTemplateOrderShipped", whatsappForm.waTemplateOrderShipped ?? ""),
|
|
1279
|
+
whatsappTemplateOrderDelivered: maskedOrReal("whatsappTemplateOrderDelivered", whatsappForm.waTemplateOrderDelivered ?? ""),
|
|
1280
|
+
whatsappTemplateOrderCancelled: maskedOrReal("whatsappTemplateOrderCancelled", whatsappForm.waTemplateOrderCancelled ?? ""),
|
|
1281
|
+
whatsappTemplateRefundInitiated: maskedOrReal("whatsappTemplateRefundInitiated", whatsappForm.waTemplateRefundInitiated ?? ""),
|
|
1282
|
+
resendApiKey: maskedOrReal("resendApiKey", notificationsForm.resendApiKey ?? ""),
|
|
769
1283
|
},
|
|
770
1284
|
emailSettings: {
|
|
771
|
-
host: smtpHost,
|
|
772
|
-
|
|
1285
|
+
host: integrationsForm.smtpHost,
|
|
1286
|
+
port: Number(integrationsForm.smtpPort),
|
|
1287
|
+
user: integrationsForm.smtpUser,
|
|
1288
|
+
fromAddress: integrationsForm.smtpFrom,
|
|
1289
|
+
fromEmail: notificationsForm.notifFromEmail, fromName: notificationsForm.notifFromName,
|
|
773
1290
|
dailyDigest: {
|
|
774
|
-
enabled: digestEnabled,
|
|
775
|
-
recipients: splitEmailList(digestRecipients),
|
|
1291
|
+
enabled: notificationsForm.digestEnabled,
|
|
1292
|
+
recipients: splitEmailList(notificationsForm.digestRecipients ?? ""),
|
|
776
1293
|
// Always empty — the CC field is gone (see the Notifications tab).
|
|
777
1294
|
// Sent explicitly rather than omitted so a save clears any CC list a
|
|
778
1295
|
// pre-existing document still carries.
|
|
@@ -780,36 +1297,88 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
|
780
1297
|
},
|
|
781
1298
|
},
|
|
782
1299
|
messaging: {
|
|
783
|
-
emailEnabled: msgEmailEnabled,
|
|
784
|
-
whatsappEnabled: msgWhatsappEnabled,
|
|
1300
|
+
emailEnabled: notificationsForm.msgEmailEnabled,
|
|
1301
|
+
whatsappEnabled: notificationsForm.msgWhatsappEnabled,
|
|
785
1302
|
dailyCeiling: {
|
|
786
|
-
email: msgCeilingEmail,
|
|
787
|
-
whatsapp: msgCeilingWhatsapp,
|
|
1303
|
+
email: notificationsForm.msgCeilingEmail,
|
|
1304
|
+
whatsapp: notificationsForm.msgCeilingWhatsapp,
|
|
788
1305
|
// No SMS sender exists; the ceiling is carried so one cannot ship
|
|
789
1306
|
// uncapped if somebody adds a provider later.
|
|
790
1307
|
sms: 50,
|
|
791
1308
|
},
|
|
792
1309
|
},
|
|
793
|
-
integrations: {
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
1310
|
+
integrations: {
|
|
1311
|
+
googleAnalyticsId: integrationsForm.gaMeasurementId,
|
|
1312
|
+
facebookPixelId: integrationsForm.fbPixelId,
|
|
1313
|
+
gtmContainerId: integrationsForm.gtmContainerId,
|
|
1314
|
+
clarityProjectId: integrationsForm.clarityProjectId,
|
|
1315
|
+
},
|
|
1316
|
+
shipping: {
|
|
1317
|
+
freeShippingThreshold: shippingForm.freeShippingThreshold,
|
|
1318
|
+
defaultCarrier: shippingForm.defaultCarrier,
|
|
1319
|
+
maxDeliveryRadius: shippingForm.maxDeliveryRadius,
|
|
1320
|
+
},
|
|
1321
|
+
/*
|
|
1322
|
+
* `platformStoreId` is trimmed and sent as `undefined` when blank rather
|
|
1323
|
+
* than as `""` — the resolver treats an empty-ish value as unset anyway,
|
|
1324
|
+
* but writing a literal empty string would record a DECISION ("no store
|
|
1325
|
+
* is ours") where none was made, and a stored `""` reads differently
|
|
1326
|
+
* from an absent key to anyone inspecting the document.
|
|
1327
|
+
*/
|
|
1328
|
+
payment: {
|
|
1329
|
+
razorpayEnabled: shippingForm.razorpayEnabled,
|
|
1330
|
+
phonepeEnabled: shippingForm.phonepeEnabled,
|
|
1331
|
+
cashfreeEnabled: shippingForm.cashfreeEnabled,
|
|
1332
|
+
platformStoreId: (shippingForm.platformStoreId ?? "").trim() || undefined,
|
|
1333
|
+
upiManualEnabled: shippingForm.upiManualEnabled,
|
|
1334
|
+
codEnabled: shippingForm.codEnabled,
|
|
1335
|
+
codMaxOrderValue: shippingForm.codMaxOrderValue,
|
|
1336
|
+
otpCheckoutThreshold: shippingForm.otpCheckoutThreshold,
|
|
1337
|
+
},
|
|
1338
|
+
collectorDropConfig: {
|
|
1339
|
+
bidIncrementTiers: collectorDropForm.bidIncrementTiers,
|
|
1340
|
+
autoExtendWindowMinutes: collectorDropForm.autoExtendWindow,
|
|
1341
|
+
settlementGracePeriodHours: collectorDropForm.settlementGrace,
|
|
1342
|
+
},
|
|
1343
|
+
platformLimits: {
|
|
1344
|
+
maxProductsPerStore: limitsForm.maxProductsPerStore,
|
|
1345
|
+
maxCustomFieldsPerProduct: limitsForm.maxCustomFields,
|
|
1346
|
+
orderCancellationWindowHours: limitsForm.orderCancelWindow,
|
|
1347
|
+
},
|
|
1348
|
+
legalPages: {
|
|
1349
|
+
terms: legalForm.termsHtml,
|
|
1350
|
+
privacy: legalForm.privacyHtml,
|
|
1351
|
+
refundPolicy: legalForm.refundHtml,
|
|
1352
|
+
shipping: legalForm.shippingPolicyHtml,
|
|
1353
|
+
cookies: legalForm.cookieHtml,
|
|
1354
|
+
ethics: legalForm.ethicsHtml,
|
|
1355
|
+
codeOfConduct: legalForm.conductHtml,
|
|
1356
|
+
cancellation: legalForm.cancellationHtml,
|
|
1357
|
+
grievance: legalForm.grievanceHtml,
|
|
1358
|
+
},
|
|
799
1359
|
// Both keys are always sent: Firestore's update() replaces a nested map
|
|
800
1360
|
// wholesale, so omitting one here would wipe it. The load-time spread this
|
|
801
1361
|
// used to carry existed to preserve `adminCheckoutBypass`, which is now a
|
|
802
1362
|
// permission rather than a stored flag.
|
|
803
1363
|
listings: {
|
|
804
|
-
listingTypes: listingTypeFlags,
|
|
805
|
-
categoryTypes: categoryTypeFlags,
|
|
806
|
-
browsePages: browsePageFlags,
|
|
1364
|
+
listingTypes: listingsForm.listingTypeFlags,
|
|
1365
|
+
categoryTypes: listingsForm.categoryTypeFlags,
|
|
1366
|
+
browsePages: listingsForm.browsePageFlags,
|
|
807
1367
|
},
|
|
808
1368
|
notificationChannels: {
|
|
809
1369
|
inApp: { enabled: true, readOnly: true },
|
|
810
|
-
email: {
|
|
811
|
-
|
|
812
|
-
|
|
1370
|
+
email: {
|
|
1371
|
+
enabled: notificationsForm.notifEmailEnabled,
|
|
1372
|
+
minPriority: notificationsForm.notifEmailMinPriority,
|
|
1373
|
+
types: notificationsForm.notifEmailTypes,
|
|
1374
|
+
},
|
|
1375
|
+
whatsapp: {
|
|
1376
|
+
enabled: notificationsForm.notifWhatsappEnabled,
|
|
1377
|
+
minPriority: notificationsForm.notifWhatsappMinPriority,
|
|
1378
|
+
otpEnabled: notificationsForm.notifWhatsappOtpEnabled,
|
|
1379
|
+
types: notificationsForm.notifWhatsappTypes,
|
|
1380
|
+
},
|
|
1381
|
+
sms: { enabled: notificationsForm.notifSmsEnabled, minPriority: notificationsForm.notifSmsMinPriority },
|
|
813
1382
|
},
|
|
814
1383
|
};
|
|
815
1384
|
}
|
|
@@ -844,17 +1413,6 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
|
844
1413
|
{ label: "Image", value: "image" },
|
|
845
1414
|
{ label: "Video", value: "video" },
|
|
846
1415
|
];
|
|
847
|
-
const CARRIER_OPTIONS = [
|
|
848
|
-
{ label: "Custom / Other", value: "custom" },
|
|
849
|
-
{ label: "Shiprocket", value: "shiprocket" },
|
|
850
|
-
{ label: "Delhivery", value: "delhivery" },
|
|
851
|
-
{ label: "Bluedart", value: "bluedart" },
|
|
852
|
-
{ label: "FedEx", value: "fedex" },
|
|
853
|
-
];
|
|
854
|
-
const PHONEPE_ENVIRONMENT_OPTIONS = [
|
|
855
|
-
{ label: "Sandbox (test)", value: "sandbox" },
|
|
856
|
-
{ label: "Production (live)", value: "production" },
|
|
857
|
-
];
|
|
858
1416
|
/*
|
|
859
1417
|
* 🛑 DERIVED. This was a hand-written literal and it had drifted in both
|
|
860
1418
|
* directions at once: `art` and `stickers` were MISSING — so an admin had no
|
|
@@ -901,61 +1459,18 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
|
|
|
901
1459
|
}
|
|
902
1460
|
saveAllMutation.mutate();
|
|
903
1461
|
};
|
|
904
|
-
return (_jsx(StackedViewShell, { portal: "admin", ...rest, title: labels.title ?? "Site Settings", sections: [
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
}, children: [_jsx(TabsList, { children: SITE_SETTINGS_TABS.map((tab) => (_jsx(TabsTrigger, { value: tab.id, children: tab.label }, tab.id))) }), _jsx(TabsContent, { value: "about", children: _jsxs(SettingsTabForm, { id: "about", label: "About", children: [_jsx(Text, { size: "xs", color: "muted", children: "Override the About page content. Leave blank to use the platform defaults." }), _jsx(Input, { label: "Hero title", value: aboutTitle, onChange: (e) => setAboutTitle(e.target.value), placeholder: "About LetItRip" }), _jsx(Input, { label: "Hero subtitle", value: aboutSubtitle, onChange: (e) => setAboutSubtitle(e.target.value), placeholder: "Connecting buyers, sellers, and bidders in one vibrant marketplace" }), _jsx(Input, { label: "Mission section title", value: aboutMissionTitle, onChange: (e) => setAboutMissionTitle(e.target.value), placeholder: "Our Mission" }), _jsx(_Fragment, { children: _jsx(Textarea, { label: "Mission text", value: aboutMissionText, onChange: (e) => setAboutMissionText(e.target.value), placeholder: "LetItRip was built to democratise commerce\u2026", rows: 4 }) }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: '"How it works" section title', value: aboutHowItWorksTitle, onChange: (e) => setAboutHowItWorksTitle(e.target.value), placeholder: "How It Works" }), aboutHowItems.map((item, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Step ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutHowItems(aboutHowItems.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(Input, { label: "Icon (emoji)", value: item.icon, onChange: (e) => { const next = [...aboutHowItems]; next[i] = { ...item, icon: e.target.value }; setAboutHowItems(next); }, placeholder: "\uD83D\uDED2" }), _jsx(Input, { label: "Title", value: item.title, onChange: (e) => { const next = [...aboutHowItems]; next[i] = { ...item, title: e.target.value }; setAboutHowItems(next); } }), _jsx(Textarea, { value: item.text, onChange: (e) => { const next = [...aboutHowItems]; next[i] = { ...item, text: e.target.value }; setAboutHowItems(next); }, rows: 2 })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutHowItems([...aboutHowItems, { title: "", text: "", icon: "✨", tone: "indigo" }]), children: "+ Add step" })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: "Values section title", value: aboutValuesTitle, onChange: (e) => setAboutValuesTitle(e.target.value), placeholder: "Our Values" }), _jsx(Input, { label: "Values section subtitle", value: aboutValuesSubtitle, onChange: (e) => setAboutValuesSubtitle(e.target.value), placeholder: "Optional intro line under the heading" }), aboutValueItems.map((item, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Value ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutValueItems(aboutValueItems.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(Input, { label: "Icon (emoji)", value: item.icon, onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, icon: e.target.value }; setAboutValueItems(next); }, placeholder: "\uD83D\uDEE1\uFE0F" }), _jsx(Input, { label: "Title", value: item.title, onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, title: e.target.value }; setAboutValueItems(next); } }), _jsx(Textarea, { label: "Text", value: item.text, onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, text: e.target.value }; setAboutValueItems(next); }, rows: 2 }), _jsx(Textarea, { label: "Detail (optional)", value: item.detail ?? "", onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, detail: e.target.value }; setAboutValueItems(next); }, rows: 2, placeholder: "How this value is actually enforced" })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutValueItems([...aboutValueItems, { title: "", text: "", icon: "✨" }]), children: "+ Add value" })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: "Milestones section title", value: aboutMilestonesTitle, onChange: (e) => setAboutMilestonesTitle(e.target.value), placeholder: "Our Journey" }), aboutMilestones.map((item, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Milestone ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutMilestones(aboutMilestones.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(Input, { label: "Year", value: item.year, onChange: (e) => { const next = [...aboutMilestones]; next[i] = { ...item, year: e.target.value }; setAboutMilestones(next); }, placeholder: "2024" }), _jsx(Textarea, { value: item.text, onChange: (e) => { const next = [...aboutMilestones]; next[i] = { ...item, text: e.target.value }; setAboutMilestones(next); }, rows: 2 })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutMilestones([...aboutMilestones, { year: "", text: "" }]), children: "+ Add milestone" })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: "Team section title", value: aboutTeamTitle, onChange: (e) => setAboutTeamTitle(e.target.value), placeholder: "Meet the Team" }), _jsx(Input, { label: "Team section subtitle", value: aboutTeamSubtitle, onChange: (e) => setAboutTeamSubtitle(e.target.value), placeholder: "The people building LetItRip" }), aboutTeamMembers.map((member, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Team member ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutTeamMembers(aboutTeamMembers.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(ImageUpload, { label: "Photo", currentImage: member.photoUrl, onUpload: (file) => upload(file, "store"), onChange: (url) => { const next = [...aboutTeamMembers]; next[i] = { ...member, photoUrl: url }; setAboutTeamMembers(next); } }), _jsx(Input, { label: "Name", value: member.name, onChange: (e) => { const next = [...aboutTeamMembers]; next[i] = { ...member, name: e.target.value }; setAboutTeamMembers(next); } }), _jsx(Input, { label: "Role", value: member.role, onChange: (e) => { const next = [...aboutTeamMembers]; next[i] = { ...member, role: e.target.value }; setAboutTeamMembers(next); }, placeholder: "Founder & Developer" }), _jsx(Textarea, { value: member.bio, onChange: (e) => { const next = [...aboutTeamMembers]; next[i] = { ...member, bio: e.target.value }; setAboutTeamMembers(next); }, rows: 3 }), _jsxs(Row, { gap: "md", children: [_jsx(Toggle, { label: "Founder", checked: !!member.isFounder, onChange: (v) => { const next = [...aboutTeamMembers]; next[i] = { ...member, isFounder: v }; setAboutTeamMembers(next); } }), _jsx(Toggle, { label: "Developer", checked: !!member.isDeveloper, onChange: (v) => { const next = [...aboutTeamMembers]; next[i] = { ...member, isDeveloper: v }; setAboutTeamMembers(next); } })] })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutTeamMembers([...aboutTeamMembers, { name: "", role: "", bio: "" }]), children: "+ Add team member" })] }), _jsx(Input, { label: "CTA banner title", value: aboutCtaTitle, onChange: (e) => setAboutCtaTitle(e.target.value), placeholder: "Ready to get started?" }), _jsx(Input, { label: "Sell CTA copy", value: aboutCtaSell, onChange: (e) => setAboutCtaSell(e.target.value), placeholder: "Start selling in minutes" }), _jsx(Input, { label: "Shop CTA copy", value: aboutCtaShop, onChange: (e) => setAboutCtaShop(e.target.value), placeholder: "Browse the marketplace" })] }) }), _jsx(TabsContent, { value: "branding", children: _jsxs(SettingsTabForm, { id: "branding", label: "Branding", children: [_jsx(Input, { label: "Site name", value: siteName, onChange: (e) => setSiteName(e.target.value), placeholder: "LetItRip" }), _jsx(Input, { label: "Tagline", value: tagline, onChange: (e) => setTagline(e.target.value), placeholder: "India's Largest Collectibles Marketplace" }), _jsx(ImageUpload, { label: "Logo", currentImage: logoUrl, onUpload: (file) => upload(file, "store"), onChange: setLogoUrl }), _jsx(ImageUpload, { label: "Favicon", currentImage: faviconUrl, onUpload: (file) => upload(file, "store"), onChange: setFaviconUrl }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-maintenance-mode", children: _jsx(Toggle, { label: "Maintenance mode", checked: maintenanceMode, onChange: setMaintenanceMode }) }), _jsx(Input, { label: "Maintenance message", value: maintenanceMessage, onChange: (e) => setMaintenanceMessage(e.target.value), placeholder: "We're back soon.", disabled: !maintenanceMode })] })] }) }), _jsx(TabsContent, { value: "appearance", children: _jsxs(SettingsTabForm, { id: "appearance", label: "Appearance", children: [_jsx(Text, { size: "xs", color: "muted", children: "Sets the background behind the public shell, dashboard sidebars, and any Section/Card that opts into it. Leave the value blank for a plain surface." }), _jsxs(Grid, { cols: 2, gap: "lg", children: [_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Light mode" }), _jsx(Select, { label: "Type", options: BG_TYPE_OPTIONS, value: lightBgType, onValueChange: (v) => setLightBgType(v) }), lightBgType === "color" ? (_jsx(Input, { type: "color", label: "Color", value: lightBgValue || "#ffffff", onChange: (e) => setLightBgValue(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }) /* audit-hex-tokens-ok: native color picker requires literal hex string fallback */) : lightBgType === "gradient" ? (_jsx(Textarea, { label: "CSS gradient expression", rows: 2, value: lightBgValue, onChange: (e) => setLightBgValue(e.target.value), placeholder: "linear-gradient(...)" })) : (_jsx(MediaUploadField, { label: lightBgType === "video" ? "Background video" : "Background image", kind: lightBgType === "video" ? "video" : "image", value: lightBgValue, onChange: setLightBgValue, onUpload: (file) => upload(file, "store") })), _jsx(Toggle, { label: "Dim overlay", checked: lightBgOverlayEnabled, onChange: setLightBgOverlayEnabled }), lightBgOverlayEnabled && (_jsxs(_Fragment, { children: [_jsx(Input, { type: "color", label: "Overlay color", value: lightBgOverlayColor, onChange: (e) => setLightBgOverlayColor(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }), " ", _jsx(Slider, { label: "Overlay opacity", min: 0, max: 100, value: lightBgOverlayOpacity, onChange: setLightBgOverlayOpacity })] })), _jsx(Text, { size: "xs", color: "muted", children: "Preview" }), _jsx(Div, { className: "relative h-24 w-full", overflow: "hidden", rounded: "md", border: "default", children: _jsx(BackgroundRenderer, { mode: "light", lightMode: {
|
|
917
|
-
|
|
918
|
-
value: lightBgValue,
|
|
919
|
-
overlay: { enabled: lightBgOverlayEnabled, color: lightBgOverlayColor, opacity: lightBgOverlayOpacity / 100 },
|
|
920
|
-
}, darkMode: { type: "color", value: "" } }) })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Dark mode" }), _jsx(Select, { label: "Type", options: BG_TYPE_OPTIONS, value: darkBgType, onValueChange: (v) => setDarkBgType(v) }), darkBgType === "color" ? (_jsx(Input, { type: "color", label: "Color", value: darkBgValue || "#000000", onChange: (e) => setDarkBgValue(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }) /* audit-hex-tokens-ok: native color picker requires literal hex string fallback */) : darkBgType === "gradient" ? (_jsx(Textarea, { label: "CSS gradient expression", rows: 2, value: darkBgValue, onChange: (e) => setDarkBgValue(e.target.value), placeholder: "linear-gradient(...)" })) : (_jsx(MediaUploadField, { label: darkBgType === "video" ? "Background video" : "Background image", kind: darkBgType === "video" ? "video" : "image", value: darkBgValue, onChange: setDarkBgValue, onUpload: (file) => upload(file, "store") })), _jsx(Toggle, { label: "Dim overlay", checked: darkBgOverlayEnabled, onChange: setDarkBgOverlayEnabled }), darkBgOverlayEnabled && (_jsxs(_Fragment, { children: [_jsx(Input, { type: "color", label: "Overlay color", value: darkBgOverlayColor, onChange: (e) => setDarkBgOverlayColor(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }), " ", _jsx(Slider, { label: "Overlay opacity", min: 0, max: 100, value: darkBgOverlayOpacity, onChange: setDarkBgOverlayOpacity })] })), _jsx(Text, { size: "xs", color: "muted", children: "Preview" }), _jsx(Div, { className: "relative h-24 w-full", overflow: "hidden", rounded: "md", border: "default", children: _jsx(BackgroundRenderer, { mode: "dark", lightMode: { type: "color", value: "" }, darkMode: {
|
|
921
|
-
type: darkBgType,
|
|
922
|
-
value: darkBgValue,
|
|
923
|
-
overlay: { enabled: darkBgOverlayEnabled, color: darkBgOverlayColor, opacity: darkBgOverlayOpacity / 100 },
|
|
924
|
-
} }) })] })] })] }) }), _jsx(TabsContent, { value: "themes", children: _jsx(SettingsTabForm, { id: "themes", label: "Themes", children: _jsx(ThemeManagerView, { value: themeRegistry, onChange: setThemeRegistry, previewOrigin: "/" }) }) }), _jsx(TabsContent, { value: "announcement", children: _jsxs(SettingsTabForm, { id: "announcement", label: "Announcement", children: [_jsx(Div, { id: "setting-announcement-bar", children: _jsx(Toggle, { label: "Show announcement bar", checked: announcementEnabled, onChange: setAnnouncementEnabled }) }), _jsx(Input, { label: "Announcement text", value: announcementText, onChange: (e) => setAnnouncementText(e.target.value), placeholder: "\uD83C\uDF89 Free shipping on orders \u20B9999+", disabled: !announcementEnabled }), _jsx(Input, { label: "Link URL (optional)", value: announcementLink, onChange: (e) => setAnnouncementLink(e.target.value), placeholder: String(ROUTES.PUBLIC.PRODUCTS), disabled: !announcementEnabled }), _jsxs(Stack, { gap: "none", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", className: "mb-1", children: "Background color" }), _jsx(Input, { type: "color", "aria-label": "Background color", value: announcementBg || "#1d4ed8", onChange: (e) => setAnnouncementBg(e.target.value), className: "h-10 w-32 cursor-pointer", bare: true, disabled: !announcementEnabled }), " "] })] }) }), _jsx(TabsContent, { value: "seo", children: _jsxs(SettingsTabForm, { id: "seo", label: "Seo", children: [_jsx(Input, { label: "Default meta title", value: seoTitle, onChange: (e) => setSeoTitle(e.target.value), placeholder: "LetItRip \u2014 Buy, Sell & Auction Collectibles in India", maxLength: 60, helperText: "Max 60 chars. Use {page} token for dynamic insertion." }), _jsx(Input, { label: "Default meta description", value: seoDescription, onChange: (e) => setSeoDescription(e.target.value), placeholder: "India's largest collectibles marketplace\u2026", maxLength: 160, helperText: "Max 160 chars." }), _jsx(ImageUpload, { label: "Default OG image", currentImage: seoOgImage, onUpload: (file) => upload(file, "store"), onChange: setSeoOgImage }), _jsx(Input, { label: "Canonical base URL", value: canonicalUrl, onChange: (e) => setCanonicalUrl(e.target.value), placeholder: "https://letitrip.in" }), _jsx(Div, { id: "setting-robots-noindex", children: _jsx(Toggle, { label: "Robots noindex (disables search indexing \u2014 use carefully)", checked: seoNoIndex, onChange: setSeoNoIndex }) })] }) }), _jsx(TabsContent, { value: "contact", children: _jsxs(SettingsTabForm, { id: "contact", label: "Contact", children: [_jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Support email", value: supportEmail, onChange: (e) => setSupportEmail(e.target.value), type: "email", placeholder: "support@letitrip.in" }), _jsx(Input, { label: "Support phone", value: supportPhone, onChange: (e) => setSupportPhone(e.target.value), placeholder: "+91 XXXXX XXXXX" })] }), _jsx(Input, { label: "Physical address", value: supportAddress, onChange: (e) => setSupportAddress(e.target.value), placeholder: "Mumbai, Maharashtra, India" }), _jsx(Input, { label: "Support hours", value: supportHours, onChange: (e) => setSupportHours(e.target.value), placeholder: "Mon\u2013Fri, 10 AM \u2013 6 PM IST" }), _jsx(Text, { className: "pt-[0.5rem]", color: "muted", size: "sm", weight: "medium", children: "Social links" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Instagram URL", value: instagram, onChange: (e) => setInstagram(e.target.value), placeholder: "https://instagram.com/letitrip" }), _jsx(Input, { label: "Twitter / X URL", value: twitter, onChange: (e) => setTwitter(e.target.value), placeholder: "https://twitter.com/letitrip" }), _jsx(Input, { label: "Facebook URL", value: facebook, onChange: (e) => setFacebook(e.target.value), placeholder: "https://facebook.com/letitrip" }), _jsx(Input, { label: "YouTube URL", value: youtube, onChange: (e) => setYoutube(e.target.value), placeholder: "https://youtube.com/@letitrip" }), _jsx(Input, { label: "WhatsApp number", value: whatsapp, onChange: (e) => setWhatsapp(e.target.value), placeholder: "+91XXXXXXXXXX" }), _jsx(Input, { label: "Business UPI VPA", value: upiVpa, onChange: (e) => setUpiVpa(e.target.value), placeholder: "name@bank" }), _jsx(Input, { label: "LinkedIn URL", value: linkedin, onChange: (e) => setLinkedin(e.target.value), placeholder: "https://linkedin.com/company/letitrip" }), _jsx(Input, { label: "Pinterest URL", value: pinterest, onChange: (e) => setPinterest(e.target.value), placeholder: "https://pinterest.com/letitrip" })] })] }) }), _jsx(TabsContent, { value: "watermark", children: _jsxs(SettingsTabForm, { id: "watermark", label: "Watermark", children: [_jsx(Select, { label: "Watermark type", options: [{ label: "Text", value: "text" }, { label: "Image", value: "image" }], value: watermarkType, onValueChange: (v) => setWatermarkType(v) }), watermarkType === "text" ? (_jsx(Input, { label: "Watermark text", value: watermarkText, onChange: (e) => setWatermarkText(e.target.value), placeholder: "letitrip.in" })) : (_jsx(ImageUpload, { label: "Watermark image", currentImage: watermarkImageUrl, onUpload: (file) => upload(file, "store"), onChange: setWatermarkImageUrl })), _jsx(Slider, { label: `Size — ${watermarkSize}% of image width`, value: watermarkSize, onChange: setWatermarkSize, min: 5, max: 100, step: 5 }), _jsx(Slider, { label: `Opacity — ${watermarkOpacity}%`, value: watermarkOpacity, onChange: setWatermarkOpacity, min: 5, max: 100, step: 5 }), _jsx(Select, { label: "Position", options: [
|
|
925
|
-
{ label: "Center", value: "center" },
|
|
926
|
-
{ label: "Top left", value: "top-left" },
|
|
927
|
-
{ label: "Top right", value: "top-right" },
|
|
928
|
-
{ label: "Bottom left", value: "bottom-left" },
|
|
929
|
-
{ label: "Bottom right", value: "bottom-right" },
|
|
930
|
-
], value: watermarkPosition, onValueChange: (v) => setWatermarkPosition(v), disabled: watermarkUseCustomOffset }), _jsx(Toggle, { checked: watermarkUseCustomOffset, onChange: setWatermarkUseCustomOffset, label: "Use a custom X/Y offset instead" }), watermarkUseCustomOffset && (_jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "X offset (%) \u2014 + right / \u2212 left of center", value: String(watermarkOffsetX), onChange: (e) => setWatermarkOffsetX(Math.max(-45, Math.min(45, parseInt(e.target.value) || 0))), type: "number", min: -45, max: 45 }), _jsx(Input, { label: "Y offset (%) \u2014 + down / \u2212 up from center", value: String(watermarkOffsetY), onChange: (e) => setWatermarkOffsetY(Math.max(-45, Math.min(45, parseInt(e.target.value) || 0))), type: "number", min: -45, max: 45 })] })), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "xs", color: "muted", children: "Preview (text watermark only)" }), _jsx(Row, { surface: "default", justify: "end", align: "end", className: `relative h-32 ${__O.hidden}`, rounded: "default", children: _jsx(Span, { ref: watermarkPreviewRef, weight: "medium", color: "faint", padding: "1", className: "select-none", children: watermarkText }) })] })] }) }), _jsx(TabsContent, { value: "fees", children: _jsxs(SettingsTabForm, { id: "fees", label: "Fees", children: [_jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Platform fee \u2014 our cut (%)", helperText: "% charged on order value. Buyer pays this.", value: String(platformFeePercent), onChange: (e) => setPlatformFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "GST on platform fee (%)", helperText: "Applied to our fee only (not full order). Usually 18%.", value: String(gstPercent), onChange: (e) => setGstPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "PhonePe gateway cost (%)", helperText: "Gateway's own fee \u2014 absorbed by platform, not passed through.", value: String(gatewayFeePercent), onChange: (e) => setGatewayFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 10, step: 0.01 }), _jsx(Input, { label: "Minimum transaction fee (\u20B9)", helperText: "Per-transaction floor. Total charge will never be below base + this.", value: String(minimumTransactionFee), onChange: (e) => setMinimumTransactionFee(parseFloat(e.target.value) || 0), type: "number", min: 0, step: 0.01 }), _jsx(Input, { label: "Maximum platform fee (\u20B9)", helperText: "Ceiling on the buyer's platform commission, charged once per checkout on every payment method. GST is calculated on the capped amount.", value: String(platformFeeMax), onChange: (e) => setPlatformFeeMax(parseFloat(e.target.value) || 0), type: "number", min: 0, step: 0.01 }), _jsx(Input, { label: "Seller payout hold (days)", value: String(payoutHoldDays), onChange: (e) => setPayoutHoldDays(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Minimum payout amount (\u20B9)", value: String(minPayoutAmount), onChange: (e) => setMinPayoutAmount(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Auction listing fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it.", value: String(auctionListingFee), onChange: (e) => setAuctionListingFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Pre-order listing fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it.", value: String(preOrderListingFee), onChange: (e) => setPreOrderListingFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Featured slot fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it. /admin/deals sets isPromoted for free today.", value: String(featuredSlotFee), onChange: (e) => setFeaturedSlotFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Promoted slot fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it. /admin/deals sets isPromoted for free today.", value: String(promotedSlotFee), onChange: (e) => setPromotedSlotFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "COD deposit (%)", helperText: "% of order collected upfront on COD orders; remainder paid on delivery.", value: String(codDepositPercent), onChange: (e) => setCodDepositPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 })] }), _jsx(Toggle, { checked: whatsappNotifyFeeEnabled, onChange: setWhatsappNotifyFeeEnabled, label: "Offer the WhatsApp order-updates addon at checkout" }), _jsx(Grid, { cols: 2, gap: "md", children: _jsx(Input, { label: "WhatsApp addon fee (\u20B9)", helperText: "Flat fee charged to the buyer when they opt in. Requires WhatsApp credentials + at least one approved template \u2014 see the WhatsApp tab.", value: String(whatsappNotifyFee), onChange: (e) => setWhatsappNotifyFee(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !whatsappNotifyFeeEnabled }) }), _jsx(Toggle, { checked: giftWrapFeeEnabled, onChange: setGiftWrapFeeEnabled, label: "Offer the gift-wrap addon at checkout" }), _jsx(Grid, { cols: 2, gap: "md", children: _jsx(Input, { label: "Gift wrap fee (\u20B9)", helperText: "Flat fee charged to the buyer when they opt in.", value: String(giftWrapFee), onChange: (e) => setGiftWrapFee(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !giftWrapFeeEnabled }) }), _jsx(Toggle, { checked: shipmentProtectionFeeEnabled, onChange: setShipmentProtectionFeeEnabled, label: "Offer the shipment-protection addon at checkout" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Shipment protection (%)", helperText: "% of order subtotal, charged when the buyer opts in.", value: String(shipmentProtectionFeePercent), onChange: (e) => setShipmentProtectionFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1, disabled: !shipmentProtectionFeeEnabled }), _jsx(Input, { label: "Shipment protection minimum (\u20B9)", helperText: "Floor for the shipment-protection fee.", value: String(shipmentProtectionFeeMin), onChange: (e) => setShipmentProtectionFeeMin(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !shipmentProtectionFeeEnabled })] }), _jsx(Toggle, { checked: saleProtectionFeeEnabled, onChange: setSaleProtectionFeeEnabled, label: "Offer the sale-protection addon at checkout" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Sale protection (%)", helperText: "% of order subtotal, charged when the buyer opts in. Covers the item against not-as-described and counterfeit claims.", value: String(saleProtectionFeePercent), onChange: (e) => setSaleProtectionFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1, disabled: !saleProtectionFeeEnabled }), _jsx(Input, { label: "Sale protection minimum (\u20B9)", helperText: "Floor for the sale-protection fee.", value: String(saleProtectionFeeMin), onChange: (e) => setSaleProtectionFeeMin(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !saleProtectionFeeEnabled })] }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "COD handling fee (%)", helperText: "% of order subtotal, charged on Cash-on-Delivery orders only.", value: String(codHandlingFeePercent), onChange: (e) => setCodHandlingFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "COD handling fee cap (\u20B9)", helperText: "Ceiling for the COD handling fee, however large the order.", value: String(codHandlingFeeCap), onChange: (e) => setCodHandlingFeeCap(parseFloat(e.target.value) || 0), type: "number", min: 0 })] })] }) }), _jsx(TabsContent, { value: "procurement", children: _jsxs(SettingsTabForm, { id: "procurement", label: "Procurement", children: [_jsx(Text, { size: "xs", color: "muted", children: "Used to compute each procurement shipment's labor cost (hours spent \u00D7 hourly rate) and its estimated processing time (hours spent \u00F7 max hours/day)." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Hourly rate (\u20B9)", helperText: "Your effective hourly wage for sorting/categorizing/listing a shipment.", value: String(laborHourlyRate), onChange: (e) => setLaborHourlyRate(Math.round((parseFloat(e.target.value) || 0) * 100) / 100), type: "number", min: 0 }), _jsx(Input, { label: "Max hours per day", helperText: "Used only to project how many days a shipment's tracked hours will take.", value: String(laborMaxHoursPerDay), onChange: (e) => setLaborMaxHoursPerDay(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 24 })] })] }) }), _jsx(TabsContent, { value: "emi", children: _jsxs(SettingsTabForm, { id: "emi", label: "Emi", children: [_jsx(Text, { size: "xs", color: "muted", children: "A seller must also opt in via their own Payout Settings for EMI to appear at checkout on their items. See the \"How EMI Works\" public page for buyer-facing copy." }), _jsx(Toggle, { checked: emiEnabled, onChange: setEmiEnabled, label: "Enable EMI platform-wide" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Minimum order value (\u20B9)", helperText: "A seller's cart subtotal must exceed this for EMI to appear as an option.", value: String(emiMinOrderValue), onChange: (e) => setEmiMinOrderValue(Math.round((parseFloat(e.target.value) || 0) * 100) / 100), type: "number", min: 0 }), _jsx(Input, { label: "Tenure options (months, comma-separated)", helperText: "e.g. 2,3,4,5,6", value: emiTenureOptionsText, onChange: (e) => setEmiTenureOptionsText(e.target.value) }), _jsx(Input, { label: "Token / down-payment (%)", helperText: "Collected upfront at checkout.", value: String(emiTokenPercent), onChange: (e) => setEmiTokenPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100 }), _jsx(Input, { label: "Billing day (1\u201310)", helperText: "Day of month each installment is due.", value: String(emiBillingDay), onChange: (e) => setEmiBillingDay(parseFloat(e.target.value) || 1), type: "number", min: 1, max: 10 }), _jsx(Input, { label: "Surcharge (% of principal per month)", helperText: "The 'excess EMI fee' the buyer pays for spreading payment.", value: String(emiSurchargePercentPerMonth), onChange: (e) => setEmiSurchargePercentPerMonth(parseFloat(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Seller's share of surcharge (%)", helperText: "The rest of the surcharge goes to the platform.", value: String(emiSurchargeSellerSharePercent), onChange: (e) => setEmiSurchargeSellerSharePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100 })] })] }) }), _jsx(TabsContent, { value: "gst", children: _jsxs(SettingsTabForm, { id: "gst", label: "Gst", children: [_jsx(Text, { size: "xs", color: "muted", children: "Required before enabling GST-inclusive checkout (P-8). Also set a GST rate + HSN code on each taxable product for the tax breakdown to appear." }), _jsx(Toggle, { checked: gstEnabled, onChange: setGstEnabled, label: "Enable GST on checkout" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "GSTIN", helperText: "15-character GST Identification Number.", error: gstProblems.gstin, value: gstin, onChange: (e) => setGstin(e.target.value), placeholder: "29AAAAA0000A1Z5", maxLength: 15 }), _jsx(Input, { label: "Legal name", helperText: "Registered business name for invoices.", error: gstProblems.legalName, value: gstLegalName, onChange: (e) => setGstLegalName(e.target.value), placeholder: "LetItRip Collectibles Pvt Ltd" })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Textarea, { label: "Registered address", value: gstAddress, onChange: (e) => setGstAddress(e.target.value), placeholder: "Registered business address for GST invoices\u2026", rows: 3 }), gstProblems.address ? (_jsx(Text, { size: "sm", variant: "error", role: "alert", children: gstProblems.address })) : null] })] }) }), _jsx(TabsContent, { value: "listings", children: _jsxs(SettingsTabForm, { id: "listings", label: "Listings", children: [_jsx(Text, { size: "xs", color: "muted", children: "Which listing and category types the marketplace offers. A disabled type is hidden from every browse surface and rejected on create and add-to-cart \u2014 existing data is untouched, it just becomes unreachable until re-enabled." }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Listing types" }), _jsx(Text, { size: "xs", color: "muted", children: "Disabled types are hidden from listings and reject create/add-to-cart." }), _jsx(Grid, { cols: 2, gap: "sm", children: LISTING_TYPE_KEYS.map((key) => (_jsx(Toggle, {
|
|
931
|
-
// The plugin's own display label, not the raw key — the
|
|
932
|
-
// literal version rendered "pre-order" and
|
|
933
|
-
// "digital-code" at an admin.
|
|
934
|
-
label: pluginFor(key).typeLabel, checked: listingTypeFlags[key] ?? true, onChange: (v) => setListingTypeFlags((prev) => ({ ...prev, [key]: v })) }, key))) })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Category types" }), _jsx(Grid, { cols: 2, gap: "sm", children: CATEGORY_TYPE_KEYS.map((key) => (_jsx(Toggle, { label: key, checked: categoryTypeFlags[key] ?? true, onChange: (v) => setCategoryTypeFlags((prev) => ({ ...prev, [key]: v })) }, key))) })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Browse sections" }), _jsx(Text, { size: "xs", color: "muted", children: "A closed section returns Not Found and disappears from the navbar, the sidebar, the mobile menu, the footer and the sitemap. Products, categories and stores are untouched \u2014 only the public way in is withdrawn, and re-opening restores it." }), _jsx(Grid, { cols: 2, gap: "sm", children: BROWSE_PAGE_KEYS.map((key) => (_jsxs(Stack, { gap: "xs", children: [_jsx(Toggle, { label: BROWSE_PAGE_META[key]?.label ?? key, checked: browsePageFlags[key] ?? true, onChange: (v) => setBrowsePageFlags((prev) => ({ ...prev, [key]: v })) }), _jsx(Text, { size: "xs", color: "muted", children: BROWSE_PAGE_META[key]?.hint })] }, key))) })] })] }) }), _jsx(TabsContent, { value: "integrations", children: _jsxs(SettingsTabForm, { id: "integrations", label: "Integrations", children: [_jsx(Text, { size: "xs", color: "muted", children: "Keys are masked in transit and stored encrypted. Click Reveal to view." }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Razorpay" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Razorpay Key ID", value: razorpayKeyId, onChange: setRazorpayKeyId, placeholder: "rzp_test_\u2026 / rzp_live_\u2026" }), _jsx(MaskedInput, { label: "Razorpay Key Secret", value: razorpayKeySecret, onChange: setRazorpayKeySecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(MaskedInput, { label: "Razorpay Webhook Secret", value: razorpayWebhookSecret, onChange: setRazorpayWebhookSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "PhonePe" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "PhonePe Client ID", value: phonepeClientId, onChange: setPhonepeClientId, placeholder: "MERCHANTID_\u2026" }), _jsx(MaskedInput, { label: "PhonePe Client Secret", value: phonepeClientSecret, onChange: setPhonepeClientSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(Input, { label: "PhonePe Client Version", value: phonepeClientVersion, onChange: (e) => setPhonepeClientVersion(e.target.value), placeholder: "1" }), _jsx(Select, { label: "PhonePe Environment", options: PHONEPE_ENVIRONMENT_OPTIONS, value: phonepeEnvironment, onValueChange: setPhonepeEnvironment }), _jsx(MaskedInput, { label: "PhonePe Webhook Username", value: phonepeWebhookUsername, onChange: setPhonepeWebhookUsername, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(MaskedInput, { label: "PhonePe Webhook Password", value: phonepeWebhookPassword, onChange: setPhonepeWebhookPassword, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "SMTP / Email" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "SMTP host", value: smtpHost, onChange: (e) => setSmtpHost(e.target.value), placeholder: "smtp.sendgrid.net" }), _jsx(Input, { label: "SMTP port", value: smtpPort, onChange: (e) => setSmtpPort(e.target.value), type: "number", placeholder: "587" }), _jsx(Input, { label: "SMTP user", value: smtpUser, onChange: (e) => setSmtpUser(e.target.value), placeholder: "apikey" })] }), _jsx(Input, { label: "From address", value: smtpFrom, onChange: (e) => setSmtpFrom(e.target.value), placeholder: "noreply@letitrip.in", type: "email" }), _jsx(Text, { size: "xs", color: "muted", children: "Transactional email is delivered through Resend \u2014 set the Resend API key below. These SMTP fields are stored but not currently used for delivery." })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Google Places (store reviews)" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Google Maps API key", value: googleMapsApiKey, onChange: setGoogleMapsApiKey, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(Input, { label: "Default Google Place ID", value: googlePlaceId, onChange: (e) => setGooglePlaceId(e.target.value), placeholder: "ChIJ\u2026" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Analytics & Tracking" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Google Analytics ID", value: gaMeasurementId, onChange: (e) => setGaMeasurementId(e.target.value), placeholder: "G-XXXXXXXXXX" }), _jsx(Input, { label: "Facebook Pixel ID", value: fbPixelId, onChange: (e) => setFbPixelId(e.target.value), placeholder: "XXXXXXXXXXXXXXXX" }), _jsx(Input, { label: "GTM Container ID", value: gtmContainerId, onChange: (e) => setGtmContainerId(e.target.value), placeholder: "GTM-XXXXXXX" }), _jsx(Input, { label: "Microsoft Clarity Project ID", value: clarityProjectId, onChange: (e) => setClarityProjectId(e.target.value), placeholder: "abcdefghij", helperText: "Heatmaps and session replay. Recording is strictly masked \u2014 no text or input values are captured. Leave blank to keep Clarity off." })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Meta (Instagram & Facebook Social Feed)" }), _jsx(Text, { size: "xs", color: "muted", children: "Used by the Social Feed section to fetch Instagram and Facebook posts via Meta Graph API v19." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Page Access Token", value: metaPageAccessToken, onChange: setMetaPageAccessToken, placeholder: "EAAxxxxxxx\u2026" }), _jsx(Input, { label: "Page ID (or handle)", value: metaPageId, onChange: (e) => setMetaPageId(e.target.value), placeholder: "letitrip" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "TikTok for Developers (Social Feed)" }), _jsx(Text, { size: "xs", color: "muted", children: "Client credentials + long-lived access token from TikTok for Developers. Used to list your account's public videos." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Client Key", value: tiktokClientKey, onChange: setTiktokClientKey, placeholder: "aw\u2026" }), _jsx(MaskedInput, { label: "Client Secret", value: tiktokClientSecret, onChange: setTiktokClientSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(MaskedInput, { label: "Access Token (long-lived)", value: tiktokAccessToken, onChange: setTiktokAccessToken, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "DeviantArt OAuth2 (Social Feed)" }), _jsx(Text, { size: "xs", color: "muted", children: "Client credentials for DeviantArt gallery fetching (client-credentials OAuth2 flow \u2014 no user login required)." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Client ID", value: deviantartClientId, onChange: setDeviantartClientId, placeholder: "1234" }), _jsx(MaskedInput, { label: "Client Secret", value: deviantartClientSecret, onChange: setDeviantartClientSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] })] }) }), _jsx(TabsContent, { value: "shipping", children: _jsxs(SettingsTabForm, { id: "shipping", label: "Shipping", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Payment methods" }), _jsx(Div, { id: "setting-razorpay-enabled", children: _jsx(Toggle, { label: "Razorpay (online card/UPI/netbanking) enabled \u2014 needs Key ID + Key Secret under Credentials", checked: razorpayEnabled, onChange: setRazorpayEnabled }) }), _jsx(Div, { id: "setting-phonepe-enabled", children: _jsx(Toggle, { label: "PhonePe (online card/UPI) enabled \u2014 ignored while Razorpay is on; only one online gateway runs at a time", checked: phonepeEnabled, onChange: setPhonepeEnabled }) }), _jsx(Div, { id: "setting-manual-payment-enabled", children: _jsx(Toggle, { label: "Manual UPI/bank transfer enabled", checked: upiManualEnabled, onChange: setUpiManualEnabled }) }), _jsx(Div, { id: "setting-cod-enabled", children: _jsx(Toggle, { label: "Cash on delivery (COD) enabled", checked: codEnabled, onChange: setCodEnabled }) }), _jsx(Input, { label: "Free shipping threshold (\u20B9)", value: String(freeShippingThreshold), onChange: (e) => setFreeShippingThreshold(parseInt(e.target.value) || 0), type: "number", min: 0, helperText: "Orders above this amount get free shipping." }), _jsx(Select, { label: "Default carrier", options: CARRIER_OPTIONS, value: defaultCarrier, onValueChange: setDefaultCarrier }), _jsx(Input, { label: "Max delivery radius (km, 0 = no limit)", value: String(maxDeliveryRadius), onChange: (e) => setMaxDeliveryRadius(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "COD maximum order value (\u20B9)",
|
|
935
|
-
/*
|
|
936
|
-
🛑 A MAXIMUM, sitting directly above a THRESHOLD that is a
|
|
937
|
-
minimum. The helper text says which way each one runs,
|
|
938
|
-
because the two fields look identical and mean opposite
|
|
939
|
-
things — and getting it backwards here either refuses every
|
|
940
|
-
COD order or refuses none.
|
|
941
|
-
*/
|
|
942
|
-
helperText: "Carts ABOVE this subtotal cannot pay by cash on delivery; the option is shown disabled with the reason. 0 = COD off for every cart.", value: String(codMaxOrderValue), onChange: (e) => setCodMaxOrderValue(parseInt(e.target.value) || 0), type: "number", min: 0, disabled: !codEnabled }), _jsx(Input, { label: "High-value checkout OTP threshold (\u20B9)", helperText: "Carts at or above this subtotal require an extra OTP verification step before payment (0 = disabled).", value: String(otpCheckoutThreshold), onChange: (e) => setOtpCheckoutThreshold(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Text, { size: "sm", weight: "medium", color: "muted", className: "pt-[var(--appkit-space-2)]", children: "Seller shipping charge defaults" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Seller shipping fixed (\u20B9)", helperText: "Flat shipping charge collected on the seller's behalf.", value: String(sellerShippingFixed), onChange: (e) => setSellerShippingFixed(parseFloat(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Platform shipping (%)", helperText: "Platform's own shipping markup, as a % of order value.", value: String(platformShippingPercent), onChange: (e) => setPlatformShippingPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "Platform shipping minimum (\u20B9)", helperText: "Floor for the platform shipping markup.", value: String(platformShippingFixedMin), onChange: (e) => setPlatformShippingFixedMin(parseFloat(e.target.value) || 0), type: "number", min: 0 })] })] }) }), _jsx(TabsContent, { value: "auction", children: _jsxs(SettingsTabForm, { id: "auction", label: "Auction", children: [_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsx(Text, { size: "xs", weight: "medium", color: "muted", children: "Bid increment tiers" }), _jsx(Text, { size: "xs", color: "muted", children: "The minimum jump a new bid must clear, based on the current bid amount. A seller's per-listing override can require more than the matching tier, but can never undercut it." }), bidIncrementTiers.map((tier, i) => {
|
|
943
|
-
const isLast = i === bidIncrementTiers.length - 1;
|
|
944
|
-
return (_jsxs(Grid, { align: "end", gap: "xs", className: "grid-cols-12", children: [_jsx(Div, { className: "col-span-5", children: isLast ? (_jsxs(_Fragment, { children: [_jsx(Text, { size: "xs", weight: "medium", className: "mb-1", children: "Up to (\u20B9)" }), _jsx(Text, { size: "sm", color: "muted", children: "and above" })] })) : (_jsx(Input, { label: "Up to (\u20B9)", type: "number", min: 1, value: String(tier.upTo ?? ""), onChange: (e) => setBidIncrementTiers(bidIncrementTiers.map((t, j) => j === i ? { ...t, upTo: parseInt(e.target.value) || 0 } : t)) })) }), _jsx(Div, { className: "col-span-5", children: _jsx(Input, { label: "Increment (\u20B9)", type: "number", min: 1, value: String(tier.increment), onChange: (e) => setBidIncrementTiers(bidIncrementTiers.map((t, j) => j === i ? { ...t, increment: parseInt(e.target.value) || 0 } : t)) }) }), _jsx(Row, { centered: true, className: "col-span-2", padding: "b-xs", children: _jsx(Button, { variant: "ghost", type: "button", disabled: bidIncrementTiers.length <= 1, onClick: () => setBidIncrementTiers(bidIncrementTiers.filter((_, j) => j !== i)), "aria-label": "Remove tier", children: "\u00D7" }) })] }, i));
|
|
945
|
-
}), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setBidIncrementTiers([
|
|
946
|
-
...bidIncrementTiers.slice(0, -1),
|
|
947
|
-
{ upTo: 100, increment: 10 },
|
|
948
|
-
bidIncrementTiers[bidIncrementTiers.length - 1] ?? { upTo: null, increment: 1000 },
|
|
949
|
-
]), children: "+ Add tier" })] }), _jsx(Input, { label: "Auto-extend window (minutes before end)", value: String(autoExtendWindow), onChange: (e) => setAutoExtendWindow(parseInt(e.target.value) || 0), type: "number", min: 0, helperText: "Extend auction end time if a bid arrives within this window." }), _jsx(Input, { label: "Settlement grace period (hours)", value: String(settlementGrace), onChange: (e) => setSettlementGrace(parseInt(e.target.value) || 0), type: "number", min: 1, helperText: "Time winner has to pay before the auction is re-listed." })] }) }), _jsx(TabsContent, { value: "limits", children: _jsx(SettingsTabForm, { id: "limits", label: "Limits", children: _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Max products per store", value: String(maxProductsPerStore), onChange: (e) => setMaxProductsPerStore(parseInt(e.target.value) || 0), type: "number", min: 1 }), _jsx(Input, { label: "Max custom fields per product", value: String(maxCustomFields), onChange: (e) => setMaxCustomFields(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Order cancellation window (hours)", value: String(orderCancelWindow), onChange: (e) => setOrderCancelWindow(parseInt(e.target.value) || 0), type: "number", min: 0 })] }) }) }), _jsx(TabsContent, { value: "whatsapp", children: _jsxs(SettingsTabForm, { id: "whatsapp", label: "Whatsapp", children: [_jsx(Text, { size: "xs", color: "muted", children: "Platform-level WhatsApp Business Cloud API credentials. Used for automated purchase announcements to admin numbers when orders are placed. Store owners configure their own credentials in Store \u2192 WhatsApp." }), _jsx(Input, { label: "Phone Number ID", value: waPhoneNumberId, onChange: (e) => setWaPhoneNumberId(e.target.value), placeholder: "987654321098765", helperText: "From Meta for Developers \u2192 App \u2192 WhatsApp \u2192 API Setup" }), _jsx(MaskedInput, { label: "Cloud API System User Token", value: waCloudApiToken, onChange: setWaCloudApiToken, placeholder: "EAAxxxxxxxx\u2026", helperText: "Long-lived system user access token with WhatsApp Business permissions" }), _jsx(Input, { label: "Admin Notify Numbers", value: waAdminNotifyNumbers, onChange: (e) => setWaAdminNotifyNumbers(e.target.value), placeholder: "919876543210,918765432109", helperText: "Comma-separated, digits-only, include country code. These receive a WhatsApp message when any order is placed." }), _jsx(Text, { size: "xs", color: "muted", children: "Approved Meta message templates for the buyer-facing WhatsApp order-updates addon (Fees tab). Meta rejects business-initiated free-text WhatsApp messages outside a 24h customer-service window \u2014 a real template name here is required for that notification type to actually deliver. Leave blank to skip WhatsApp for that type (in-app + email still fire)." }), _jsx(Input, { label: "Template language code", value: waTemplateLanguage, onChange: (e) => setWaTemplateLanguage(e.target.value), placeholder: "en", helperText: "BCP-47 code the templates below were approved in, e.g. en or en_US." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Order placed template name", value: waTemplateOrderPlaced, onChange: (e) => setWaTemplateOrderPlaced(e.target.value), placeholder: "order_placed_update" }), _jsx(Input, { label: "Order confirmed template name", value: waTemplateOrderConfirmed, onChange: (e) => setWaTemplateOrderConfirmed(e.target.value), placeholder: "order_confirmed_update" }), _jsx(Input, { label: "Order shipped template name", value: waTemplateOrderShipped, onChange: (e) => setWaTemplateOrderShipped(e.target.value), placeholder: "order_shipped_update" }), _jsx(Input, { label: "Order delivered template name", value: waTemplateOrderDelivered, onChange: (e) => setWaTemplateOrderDelivered(e.target.value), placeholder: "order_delivered_update" }), _jsx(Input, { label: "Order cancelled template name", value: waTemplateOrderCancelled, onChange: (e) => setWaTemplateOrderCancelled(e.target.value), placeholder: "order_cancelled_update" }), _jsx(Input, { label: "Refund initiated template name", value: waTemplateRefundInitiated, onChange: (e) => setWaTemplateRefundInitiated(e.target.value), placeholder: "refund_initiated_update" })] })] }) }), _jsx(TabsContent, { value: "notifications", children: _jsxs(SettingsTabForm, { id: "notifications", label: "Notifications", children: [_jsx(Text, { size: "xs", color: "muted", children: "In-app notifications are always on. Enable external channels below to let the platform fan out to email, WhatsApp, or SMS. Users can further restrict which types they receive." }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Outbound messaging budget" }), _jsxs(Text, { size: "xs", color: "muted", children: ["The master switches. These suppress ", _jsx(Span, { weight: "semibold", children: "user-facing" }), " messages only \u2014 the daily status digest always reaches staff, so turning customer email off never leaves the site unwatched. Transactional messages (checkout verification codes, order receipts) also keep sending, because suppressing those breaks checkout rather than quietening it."] }), _jsx(Toggle, { label: "Send user-facing email", checked: msgEmailEnabled, onChange: setMsgEmailEnabled }), _jsx(Toggle, { label: "Send user-facing WhatsApp", checked: msgWhatsappEnabled, onChange: setMsgWhatsappEnabled }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Daily email ceiling", type: "number", value: String(msgCeilingEmail), onChange: (e) => setMsgCeilingEmail(Number(e.target.value) || 0), helperText: "Resend's free tier is 100/day. 80 leaves headroom for password-reset mail and in-flight sends." }), _jsx(Input, { label: "Daily WhatsApp ceiling", type: "number", value: String(msgCeilingWhatsapp), onChange: (e) => setMsgCeilingWhatsapp(Number(e.target.value) || 0), helperText: "A sanity bound. Meta bills per conversation, not per message." })] }), _jsx(Text, { size: "xs", color: "muted", children: "Some notification types never email regardless of these settings \u2014 losing an auction, being outbid, marketing, review activity and ticket updates are shown in the notification bell only. That is deliberate: those were the highest-volume sends and the ones most likely to exhaust the day's allowance. A support reply can still be emailed one-off from the ticket screen." })] }), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", children: [_jsxs(Row, { justify: "between", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "In-app (notification bell)" }), _jsx(Span, { color: "success", surface: "success-surface", size: "xs", weight: "semibold", rounded: "full", padding: "pill-xs", children: "Always on" })] }), _jsx(Text, { size: "xs", color: "muted", children: "Displayed in the notification bell and inbox. Cannot be disabled." })] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-email-notifications", children: _jsx(Toggle, { label: "Email notifications", checked: notifEmailEnabled, onChange: setNotifEmailEnabled }) }), notifEmailEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Select, { label: "Minimum priority to send email", options: PRIORITY_OPTIONS, value: notifEmailMinPriority, onValueChange: setNotifEmailMinPriority }), _jsx(Text, { size: "xs", weight: "medium", color: "muted", className: "pt-[0.25rem]", children: "Resend API (for transactional email)" }), _jsx(MaskedInput, { label: "Resend API Key", value: resendApiKey, onChange: setResendApiKey, placeholder: "re_live_\u2026", helperText: "Get your key at resend.com \u2014 used for all transactional notifications." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "From email", value: notifFromEmail, onChange: (e) => setNotifFromEmail(e.target.value), placeholder: "noreply@letitrip.in", type: "email" }), _jsx(Input, { label: "From name", value: notifFromName, onChange: (e) => setNotifFromName(e.target.value), placeholder: "LetItRip" })] }), _jsx(Text, { size: "xs", weight: "medium", color: "muted", className: "pt-[0.25rem]", children: "Notification types (leave empty to send all types)" }), _jsx(PaginatedSelect, { ariaLabel: "Notification types", multiple: true, options: NOTIF_TYPE_OPTIONS, value: notifEmailTypes, onChange: (values) => setNotifEmailTypes(values), placeholder: "All notification types" })] }))] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-daily-digest", children: _jsx(Toggle, { label: "Daily status digest", checked: digestEnabled, onChange: setDigestEnabled }) }), digestEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Text, { size: "xs", color: "muted", children: "Sent every morning at 10:00 IST with the previous 24 hours of order activity. Its arrival doubles as the platform health check \u2014 if it stops landing, something needs a look." }), _jsx(Textarea, { label: "Recipients (To)", value: digestRecipients, onChange: (e) => setDigestRecipients(e.target.value), placeholder: "mohasin@letitrip.in", rows: 3, helperText: "One address per line. Each address is billed as a separate send against the daily allowance \u2014 keep this list short." })] }))] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-whatsapp-notifications", children: _jsx(Toggle, { label: "WhatsApp notifications", checked: notifWhatsappEnabled, onChange: setNotifWhatsappEnabled }) }), notifWhatsappEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Select, { label: "Minimum priority to send WhatsApp", options: PRIORITY_OPTIONS, value: notifWhatsappMinPriority, onValueChange: setNotifWhatsappMinPriority }), _jsx(Toggle, { label: "Enable WhatsApp OTP (for login and verification)", checked: notifWhatsappOtpEnabled, onChange: setNotifWhatsappOtpEnabled }), _jsx(Text, { size: "xs", color: "muted", children: "WhatsApp credentials are configured in the WhatsApp tab (\u246C). OTP messages use the same phone number." }), _jsx(PaginatedSelect, { multiple: true, ariaLabel: "Notification types to send over WhatsApp", options: NOTIF_TYPE_OPTIONS, value: notifWhatsappTypes, onChange: (values) => setNotifWhatsappTypes(values), placeholder: "All notification types" }), _jsx(Text, { size: "xs", color: "muted", children: "Leave empty to send all types." })] }))] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Toggle, { label: "SMS notifications", checked: notifSmsEnabled, onChange: setNotifSmsEnabled }), notifSmsEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Select, { label: "Minimum priority to send SMS", options: PRIORITY_OPTIONS, value: notifSmsMinPriority, onValueChange: setNotifSmsMinPriority }), _jsx(Text, { size: "xs", color: "muted", children: "SMS gateway credentials (e.g. Twilio, MSG91) can be configured in the Integrations tab once an SMS provider is connected." })] }))] })] }) }), _jsx(TabsContent, { value: "legal", children: _jsx(SettingsTabForm, { id: "legal", label: "Legal", children: [
|
|
950
|
-
["Terms of Service", termsHtml, setTermsHtml],
|
|
951
|
-
["Privacy Policy", privacyHtml, setPrivacyHtml],
|
|
952
|
-
["Refund Policy", refundHtml, setRefundHtml],
|
|
953
|
-
["Shipping Policy", shippingPolicyHtml, setShippingPolicyHtml],
|
|
954
|
-
["Cookie Policy", cookieHtml, setCookieHtml],
|
|
955
|
-
["Our Ethics", ethicsHtml, setEthicsHtml],
|
|
956
|
-
["Code of Conduct", conductHtml, setConductHtml],
|
|
957
|
-
["Cancellation Policy", cancellationHtml, setCancellationHtml],
|
|
958
|
-
["Grievance Redressal", grievanceHtml, setGrievanceHtml],
|
|
959
|
-
].map(([label, value, setter]) => (_jsx(Textarea, { label: label, value: value, onChange: (e) => setter(e.target.value), placeholder: `Enter ${label} HTML here…`, rows: 6, className: "font-mono" }, label))) }) })] }), _jsx(SaveAllBar, { isPending: saveAllMutation.isPending, onSave: handleSaveAll })] }, "settings-form"),
|
|
960
|
-
] }));
|
|
1462
|
+
return (_jsxs(_Fragment, { children: [_jsx(AdminComposableRegion, { pageId: "admin-site", initialCards: pageRegionCards }), _jsx(StackedViewShell, { portal: "admin", ...rest, title: labels.title ?? "Site Settings", sections: [
|
|
1463
|
+
isLoading ? (_jsx(Alert, { variant: "info", title: "Loading", children: "Fetching site settings\u2026" }, "loading")) : null,
|
|
1464
|
+
error ? (_jsx(Alert, { variant: "error", title: "Load failed", children: error instanceof Error ? error.message : "Unknown error" }, "error")) : null,
|
|
1465
|
+
_jsxs(FormShellContext.Provider, { value: shellCtx, children: [_jsxs(Tabs, { value: activeTab,
|
|
1466
|
+
/*
|
|
1467
|
+
* `Tabs` hands back a bare string, so it is narrowed here rather
|
|
1468
|
+
* than cast. An unknown value is ignored instead of being written
|
|
1469
|
+
* into state — the same reason `?tab=` is validated on the way in.
|
|
1470
|
+
*/
|
|
1471
|
+
onChange: (next) => {
|
|
1472
|
+
if (isSiteSettingsTabId(next))
|
|
1473
|
+
setActiveTab(next);
|
|
1474
|
+
}, children: [_jsx(TabsList, { children: SITE_SETTINGS_TABS.map((tab) => (_jsx(TabsTrigger, { value: tab.id, children: tab.label }, tab.id))) }), _jsx(TabsContent, { value: "about", children: _jsx(SectionForm, { sections: aboutSections, values: aboutForm, onChange: (partial) => setAboutForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsAboutFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "branding", children: _jsx(SectionForm, { sections: brandingSections, values: brandingForm, onChange: (partial) => setBrandingForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsBrandingFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "appearance", children: _jsx(SectionForm, { sections: appearanceSections, values: appearanceForm, onChange: (partial) => setAppearanceForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsAppearanceFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "themes", children: _jsx(SettingsTabForm, { id: "themes", label: "Themes", children: _jsx(ThemeManagerView, { value: themeRegistry, onChange: setThemeRegistry, previewOrigin: "/" }) }) }), _jsx(TabsContent, { value: "announcement", children: _jsx(SectionForm, { sections: announcementSections, values: announcementForm, onChange: (partial) => setAnnouncementForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsAnnouncementFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "seo", children: _jsx(SectionForm, { sections: seoSections, values: seoForm, onChange: (partial) => setSeoForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsSeoFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "contact", children: _jsx(SectionForm, { sections: contactSections, values: contactForm, onChange: (partial) => setContactForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsContactFormSchema, hideActions: true }) }), _jsxs(TabsContent, { value: "watermark", children: [_jsx(SectionForm, { sections: watermarkSections, values: watermarkForm, onChange: (partial) => setWatermarkForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsWatermarkFormSchema, hideActions: true }), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "xs", color: "muted", children: "Preview (text watermark only)" }), _jsx(Row, { surface: "default", justify: "end", align: "end", className: `relative h-32 ${__O.hidden}`, rounded: "default", children: _jsx(Span, { ref: watermarkPreviewRef, weight: "medium", color: "faint", padding: "1", className: "select-none", children: watermarkForm.watermarkText }) })] })] }), _jsx(TabsContent, { value: "fees", children: _jsx(SectionForm, { sections: feesSections, values: feesForm, onChange: (partial) => setFeesForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsFeesFormSchema, hideActions: true }) }), _jsxs(TabsContent, { value: "procurement", children: [_jsx(Text, { size: "xs", color: "muted", className: "mb-2", children: "Used to compute each procurement shipment's labor cost (hours spent \u00D7 hourly rate) and its estimated processing time (hours spent \u00F7 max hours/day)." }), _jsx(SectionForm, { sections: procurementSections, values: procurementForm, onChange: (partial) => setProcurementForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsProcurementFormSchema, hideActions: true })] }), _jsx(TabsContent, { value: "emi", children: _jsx(SectionForm, { sections: emiSections, values: emiForm, onChange: (partial) => setEmiForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsEmiFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "gst", children: _jsx(SectionForm, { sections: gstSections, values: gstForm, onChange: (partial) => setGstForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsGstFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "listings", children: _jsx(SectionForm, { sections: listingsSections, values: listingsForm, onChange: (partial) => setListingsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsListingsFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "integrations", children: _jsx(SectionForm, { sections: integrationsSections, values: integrationsForm, onChange: (partial) => setIntegrationsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsIntegrationsFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "shipping", children: _jsx(SectionForm, { sections: shippingSections, values: shippingForm, onChange: (partial) => setShippingForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsShippingFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "collector-drop", children: _jsx(SectionForm, { sections: collectorDropSections, values: collectorDropForm, onChange: (partial) => setCollectorDropForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsCollectorDropFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "limits", children: _jsx(SectionForm, { sections: limitsSections, values: limitsForm, onChange: (partial) => setLimitsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsLimitsFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "whatsapp", children: _jsx(SectionForm, { sections: whatsappSections, values: whatsappForm, onChange: (partial) => setWhatsappForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsWhatsappFormSchema, hideActions: true }) }), _jsxs(TabsContent, { value: "notifications", children: [_jsx(Text, { size: "xs", color: "muted", className: "mb-2", children: "In-app notifications are always on. Enable external channels below to let the platform fan out to email, WhatsApp, or SMS. Users can further restrict which types they receive." }), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", className: "mb-4", children: [_jsxs(Row, { justify: "between", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "In-app (notification bell)" }), _jsx(Span, { color: "success", surface: "success-surface", size: "xs", weight: "semibold", rounded: "full", padding: "pill-xs", children: "Always on" })] }), _jsx(Text, { size: "xs", color: "muted", children: "Displayed in the notification bell and inbox. Cannot be disabled." })] }), _jsx(SectionForm, { sections: notificationsSections, values: notificationsForm, onChange: (partial) => setNotificationsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsNotificationsFormSchema, hideActions: true })] }), _jsx(TabsContent, { value: "legal", children: _jsx(SectionForm, { sections: legalSections, values: legalForm, onChange: (partial) => setLegalForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsLegalFormSchema, hideActions: true }) })] }), _jsx(SaveAllBar, { isPending: saveAllMutation.isPending, onSave: handleSaveAll })] }, "settings-form"),
|
|
1475
|
+
] })] }));
|
|
961
1476
|
}
|