@mohasinac/appkit 4.52.5 → 4.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.js +10 -3
- package/dist/_internal/server/features/checkout/data.d.ts +15 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +4 -0
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +1 -1
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +1 -0
- 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/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 +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
- 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 +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/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/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +65 -0
- package/dist/_internal/shared/search/match.js +263 -0
- package/dist/client.d.ts +8 -7
- package/dist/client.js +12 -5
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +68 -0
- package/dist/constants/api-endpoints.js +32 -0
- package/dist/constants/field-names.d.ts +7 -1
- package/dist/constants/field-names.js +36 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
- package/dist/features/addresses/repository/addresses.repository.js +65 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +24 -37
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +1 -1
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +62 -1
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +33 -7
- package/dist/features/auth/repository/user.repository.js +100 -15
- package/dist/features/auth/schemas/firestore.d.ts +63 -12
- package/dist/features/auth/schemas/firestore.js +11 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/repository/categories.repository.d.ts +1 -0
- package/dist/features/categories/repository/categories.repository.js +31 -1
- package/dist/features/categories/schemas/index.d.ts +2 -2
- package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
- package/dist/features/categories/utils/taxonomy-visual.js +58 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/api/route.js +2 -2
- package/dist/features/homepage/api/sections/route.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/index.d.ts +0 -2
- package/dist/features/homepage/components/index.js +0 -1
- package/dist/features/homepage/repository/homepage.repository.js +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +6 -0
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/layout/AppLayoutShell.d.ts +11 -0
- package/dist/features/layout/AppLayoutShell.js +64 -12
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.js +1 -1
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +23 -6
- package/dist/features/payments/repository/payout.repository.js +63 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/ProductDetailPageView.js +2 -1
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.js +13 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/types/index.d.ts +1 -1
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/repository/search.repository.js +2 -2
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +9 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.js +0 -1
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +0 -4
- package/dist/features/seller/components/index.js +0 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/index.js +8 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +192 -22
- package/dist/index.d.ts +10 -23
- package/dist/index.js +27 -19
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +4 -4
- package/dist/next/routing/route-map.js +25 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +11 -9
- package/dist/providers/db-firebase/base.repository.js +19 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +13 -20
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.js +16 -2
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/homepage-sections-seed-data.js +39 -23
- package/dist/seed/index.d.ts +1 -0
- package/dist/seed/index.js +1 -0
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +1 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.js +5 -1
- package/dist/server.d.ts +18 -3
- package/dist/server.js +59 -3
- package/dist/styles.css +237 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +14 -8
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +6 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/seed-cli.mjs +3 -0
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
|
@@ -27,6 +27,8 @@ import { apiClient } from "../../../http/index.js";
|
|
|
27
27
|
import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
|
|
28
28
|
import { ProductForm } from "../../products/components/ProductForm.js";
|
|
29
29
|
import { normalizeListingType } from "../../products/utils/listing-type.js";
|
|
30
|
+
import { ALL_LISTING_TYPES } from "../../../_internal/shared/listing-types/feature-flags.js";
|
|
31
|
+
import { pluginFor } from "../../../_internal/shared/listing-types/_registry.js";
|
|
30
32
|
import { GroupSettingsPanel } from "../../products/components/GroupSettingsPanel.js";
|
|
31
33
|
import { GroupInlineSelect } from "../../seller/components/GroupInlineSelect.js";
|
|
32
34
|
import { CategoryQuickCreateForm } from "./CategoryQuickCreateForm.js";
|
|
@@ -39,38 +41,12 @@ const __P = {
|
|
|
39
41
|
const __O = {
|
|
40
42
|
yAuto: "overflow-y-auto",
|
|
41
43
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (lt === "prize-draw")
|
|
49
|
-
return "prize-draw";
|
|
50
|
-
if (lt === "classified")
|
|
51
|
-
return "classified";
|
|
52
|
-
if (lt === "digital-code")
|
|
53
|
-
return "digital-code";
|
|
54
|
-
if (lt === "live")
|
|
55
|
-
return "live";
|
|
56
|
-
return "standard";
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* SB1-G Phase 4 — applies the selected mode by writing the canonical
|
|
60
|
-
* `listingType` discriminator. Nothing else needs to be written for the mode flip.
|
|
61
|
-
*/
|
|
62
|
-
function applyMode(product, mode) {
|
|
63
|
-
const map = {
|
|
64
|
-
standard: "standard",
|
|
65
|
-
auction: "auction",
|
|
66
|
-
preorder: "pre-order",
|
|
67
|
-
"prize-draw": "prize-draw",
|
|
68
|
-
classified: "classified",
|
|
69
|
-
"digital-code": "digital-code",
|
|
70
|
-
live: "live",
|
|
71
|
-
};
|
|
72
|
-
return { ...product, listingType: map[mode] };
|
|
73
|
-
}
|
|
44
|
+
const modeFromProduct = (product) => normalizeListingType(product);
|
|
45
|
+
/** SB1-G Phase 4 — `listingType` is the only listing-kind field on the schema. */
|
|
46
|
+
const applyMode = (product, mode) => ({
|
|
47
|
+
...product,
|
|
48
|
+
listingType: mode,
|
|
49
|
+
});
|
|
74
50
|
async function loadStoreOptions(query, page) {
|
|
75
51
|
const params = new URLSearchParams({ page: String(page), pageSize: "25" });
|
|
76
52
|
if (query)
|
|
@@ -115,12 +91,24 @@ const EMPTY_PRODUCT = {
|
|
|
115
91
|
// SB1-G Phase 4 — listingType is the only listing-kind field on the schema.
|
|
116
92
|
listingType: "standard",
|
|
117
93
|
};
|
|
118
|
-
export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded, enabledListingTypes, initialData, ...rest }) {
|
|
94
|
+
export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded, enabledListingTypes, initialData, initialListingType, ...rest }) {
|
|
119
95
|
const isEdit = Boolean(productId);
|
|
120
|
-
const
|
|
121
|
-
const [
|
|
96
|
+
const startType = initialListingType ?? "standard";
|
|
97
|
+
const [product, setProduct] = React.useState(() => applyMode(EMPTY_PRODUCT, startType));
|
|
98
|
+
const [mode, setMode] = React.useState(startType);
|
|
122
99
|
const [deleteOpen, setDeleteOpen] = React.useState(false);
|
|
123
100
|
const { showToast } = useToast();
|
|
101
|
+
/*
|
|
102
|
+
* One tab per listing type, in registry order, labelled by the plugin.
|
|
103
|
+
*
|
|
104
|
+
* `enabledListingTypes` narrows it when a caller passes one — but the type
|
|
105
|
+
* the editor is CURRENTLY on always survives the filter. Without that, an
|
|
106
|
+
* admin opening an existing listing of a disabled type gets a Tabs component
|
|
107
|
+
* whose `value` matches no trigger: no tab reads as selected, and the next
|
|
108
|
+
* save still writes that type back, so the control silently disagrees with
|
|
109
|
+
* the record it is editing.
|
|
110
|
+
*/
|
|
111
|
+
const modeTabs = React.useMemo(() => ALL_LISTING_TYPES.filter((t) => !enabledListingTypes || enabledListingTypes.includes(t) || t === mode).map((t) => ({ value: t, label: pluginFor(t).typeLabel })), [enabledListingTypes, mode]);
|
|
124
112
|
const productQuery = useQuery({
|
|
125
113
|
queryKey: ["admin", "product", productId],
|
|
126
114
|
queryFn: async () => {
|
|
@@ -198,7 +186,7 @@ export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded
|
|
|
198
186
|
label: "Listing type",
|
|
199
187
|
required: true,
|
|
200
188
|
fields: ["listingType"],
|
|
201
|
-
render: () => (_jsx(Stack, { gap: "md", children: _jsxs(Card, { variant: "outlined", padding: "lg", children: [_jsx(Text, { className: __P.sectionLabel, color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Listing Type" }), _jsxs(Tabs, { value: mode, onChange: handleModeChange, children: [
|
|
189
|
+
render: () => (_jsx(Stack, { gap: "md", children: _jsxs(Card, { variant: "outlined", padding: "lg", children: [_jsx(Text, { className: __P.sectionLabel, color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Listing Type" }), _jsxs(Tabs, { value: mode, onChange: handleModeChange, children: [_jsx(TabsList, { children: modeTabs.map((t) => (_jsx(TabsTrigger, { value: t.value, children: t.label }, t.value))) }), modeTabs.map((t) => (_jsx(TabsContent, { value: t.value }, t.value)))] })] }) })),
|
|
202
190
|
},
|
|
203
191
|
{
|
|
204
192
|
id: "classification",
|
|
@@ -239,7 +227,6 @@ export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded
|
|
|
239
227
|
// Live validation — re-run on every product change, not just on submit.
|
|
240
228
|
React.useEffect(() => {
|
|
241
229
|
validate(product);
|
|
242
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
243
230
|
}, [product, validate]);
|
|
244
231
|
/*
|
|
245
232
|
* ONE submit path. The sidebar button used `form="product-editor-form"` to
|
|
@@ -140,6 +140,16 @@ export function AdminProductsView({ children, ...props }) {
|
|
|
140
140
|
throw err;
|
|
141
141
|
}
|
|
142
142
|
}, [showToast, overrides]);
|
|
143
|
+
/*
|
|
144
|
+
* 🛑 ABOVE the `children` short-circuit, for the same reason as its twin in
|
|
145
|
+
* `AdminOrdersView`: a hook below a conditional return does not run on every
|
|
146
|
+
* render, so the hook ORDER differs between the two paths and React reads one
|
|
147
|
+
* hook's state into another's slot.
|
|
148
|
+
*
|
|
149
|
+
* Spans every listing type unless the Type chips narrow it, which is what
|
|
150
|
+
* makes the middle tab read "Sold & Ended" here rather than one or the other.
|
|
151
|
+
*/
|
|
152
|
+
const scope = useAvailabilityScope(ALL_LISTING_TYPES);
|
|
143
153
|
if (React.Children.count(children) > 0) {
|
|
144
154
|
return (_jsx(ListingLayout, { portal: "admin", ...props, children: children }));
|
|
145
155
|
}
|
|
@@ -151,9 +161,6 @@ export function AdminProductsView({ children, ...props }) {
|
|
|
151
161
|
void handleToggle(row.id, key, v);
|
|
152
162
|
} }, key))) })),
|
|
153
163
|
};
|
|
154
|
-
// Spans every listing type unless the Type chips narrow it, which is what
|
|
155
|
-
// makes the middle tab read "Sold & Ended" here rather than one or the other.
|
|
156
|
-
const scope = useAvailabilityScope(ALL_LISTING_TYPES);
|
|
157
164
|
const config = {
|
|
158
165
|
portal: "admin",
|
|
159
166
|
title: "Products",
|
|
@@ -69,7 +69,7 @@ export function AdminScammersView({ children, ...props }) {
|
|
|
69
69
|
{ value: sortBy("incidentCount", "DESC"), label: "Most incidents" },
|
|
70
70
|
],
|
|
71
71
|
columns: SCAMMER_COLUMNS,
|
|
72
|
-
mapRows: (response) => toRecordArray(response.
|
|
72
|
+
mapRows: (response) => toRecordArray(response.items).map((item, index) => ({
|
|
73
73
|
id: toStringValue(item.id, `scammer-${index}`),
|
|
74
74
|
primary: Array.isArray(item.displayNames)
|
|
75
75
|
? item.displayNames.join(", ")
|
|
@@ -426,7 +426,6 @@ export function AdminSectionsView({ children }) {
|
|
|
426
426
|
setCollectionCardsBuilder(pick(DEFAULT_COLLECTION_CARDS_BUILDER));
|
|
427
427
|
break;
|
|
428
428
|
}
|
|
429
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- 25 stable setters
|
|
430
429
|
}, []);
|
|
431
430
|
/*
|
|
432
431
|
* Reset to the type's defaults when the admin picks a different type while
|
|
@@ -974,10 +973,6 @@ export function AdminSectionsView({ children }) {
|
|
|
974
973
|
const sectionOrderMap = React.useMemo(() => {
|
|
975
974
|
return new Map(sections.map((section) => [section.id, section.order]));
|
|
976
975
|
}, [sections]);
|
|
977
|
-
// If children exist, render passthrough mode (detail view)
|
|
978
|
-
if (hasChildren) {
|
|
979
|
-
return _jsx(_Fragment, { children: children });
|
|
980
|
-
}
|
|
981
976
|
// Map sections data to listing rows
|
|
982
977
|
const rows = sections.map((section) => ({
|
|
983
978
|
id: section.id,
|
|
@@ -1067,6 +1062,27 @@ export function AdminSectionsView({ children }) {
|
|
|
1067
1062
|
onGoToSection: nav.goToSection,
|
|
1068
1063
|
fieldToSectionIndex: nav.fieldToSectionIndex,
|
|
1069
1064
|
});
|
|
1065
|
+
/*
|
|
1066
|
+
* Passthrough mode (detail view).
|
|
1067
|
+
*
|
|
1068
|
+
* 🛑 The short-circuit sits HERE, after every hook, rather than ~170 lines
|
|
1069
|
+
* up where it used to. Four hooks had accumulated below it — `modalSections`,
|
|
1070
|
+
* `draft`, `nav`, `form` — so passing children skipped all four and the hook
|
|
1071
|
+
* ORDER changed between the two render paths, which is how React ends up
|
|
1072
|
+
* reading one hook's state out of another's slot. The comment on
|
|
1073
|
+
* `sectionOrderMap` above is the record of this same bug being fixed once
|
|
1074
|
+
* already, one hook at a time.
|
|
1075
|
+
*
|
|
1076
|
+
* Moving the RETURN rather than the hooks is deliberate and costs nothing:
|
|
1077
|
+
* a hook must run on every render either way, so hoisting four declarations
|
|
1078
|
+
* past 170 lines of dependent state would do identical work with far more
|
|
1079
|
+
* room to reorder something by accident. `useFormShellState` claims no
|
|
1080
|
+
* bottom bar — `useFormBottomActions` lives in `SectionForm` — so running it
|
|
1081
|
+
* here has no side effect on the detail view below.
|
|
1082
|
+
*/
|
|
1083
|
+
if (hasChildren) {
|
|
1084
|
+
return _jsx(_Fragment, { children: children });
|
|
1085
|
+
}
|
|
1070
1086
|
return (_jsxs(_Fragment, { children: [_jsxs(Div, { paddingX: "x-sm-md", padding: "y-md", children: [_jsxs(Row, { className: "mb-4", align: "center", justify: "between", gap: "3", children: [_jsxs(Div, { children: [_jsx(Text, { size: "base", weight: "semibold", color: "primary", children: "Homepage Sections" }), _jsx(Text, { size: "sm", color: "muted", children: "Manage homepage sections and their display order" })] }), _jsx(Row, { align: "center", gap: "sm", children: _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => setIsModalOpen(true), children: "Manage Sections" }) })] }), errorMessage && (_jsx(Div, { textSize: "sm", className: "mb-4 border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "xl", children: errorMessage })), _jsx(DataTable, { rows: rows, isLoading: isLoading, emptyLabel: "No sections found" })] }), _jsxs(Stack, { className: `mt-4 ${__P.p4}`, gap: "3", rounded: "xl", surface: "default", border: "default", children: [_jsxs(Row, { align: "center", justify: "between", gap: "3", children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Reorder Sections" }), _jsxs(Row, { align: "center", gap: "sm", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: reindexDraft, disabled: reorderSections.isPending || reorderDraft.length === 0, children: "Reindex 1..N" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: undoReorderChange, disabled: reorderSections.isPending || !canUndoReorderChanges, children: "Undo unsaved" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: resetToServerOrder, disabled: reorderSections.isPending || !hasReorderChanges, children: "Reset to server" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => reorderSections.mutate(), disabled: !hasReorderChanges || reorderSections.isPending, children: reorderSections.isPending ? "Saving order..." : "Save order" })] })] }), reorderDraft.length === 0 ? (_jsx(Text, { size: "sm", color: "muted", children: "No sections to reorder." })) : (_jsx(Stack, { gap: "sm", children: reorderDraft.map((item, index) => (_jsxs(Div, { layout: "grid", gap: "2", align: "center", className: "grid-cols-[auto_1fr_auto_auto_auto]", rounded: "md", padding: "xs", border: "default", draggable: true, onDragStart: () => setDragIndex(index), onDragOver: (event) => event.preventDefault(), onDrop: () => handleReorderDrop(index), onDragEnd: () => setDragIndex(null), children: [_jsx(Text, { size: "sm", weight: "semibold", color: "muted", children: "\u2261" }), _jsxs(Text, { size: "sm", color: "primary", children: [item.type, " #", item.order] }), _jsx(Input, { type: "number", min: 1, max: reorderDraft.length, value: String(item.order), onChange: (event) => updateReorderItemOrder(index, Number(event.target.value) || 1), className: "w-24" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, -1), disabled: index === 0, children: "Up" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, 1), disabled: index === reorderDraft.length - 1, children: "Down" })] }, `reorder-${item.id}`))) }))] }), _jsx(Modal, { isOpen: isModalOpen, onClose: () => setIsModalOpen(false), title: "Manage Homepage Section", size: "lg", children: _jsxs(FormShellContext.Provider, { value: form.shellCtx, children: [_jsx(FormErrorSummary, {}), _jsx(SectionForm, { sections: modalSections, values: draft,
|
|
1071
1087
|
/*
|
|
1072
1088
|
* Each control writes through its own setter — `setMode`,
|
|
@@ -55,7 +55,7 @@ export function AdminSessionsView({ children, ...props }) {
|
|
|
55
55
|
// Opening a row is what makes the destructive actions beside it
|
|
56
56
|
// safe to offer at all.
|
|
57
57
|
onRowClick: (row) => setDetail(row),
|
|
58
|
-
mapRows: (response) => toRecordArray(response.
|
|
58
|
+
mapRows: (response) => toRecordArray(response.items).map((item, index) => {
|
|
59
59
|
const deviceInfo = (item.deviceInfo ?? {});
|
|
60
60
|
const userLabel = toStringValue(item.user &&
|
|
61
61
|
item.user?.displayName, toStringValue(item.userId, `user-${index}`));
|
|
@@ -11,7 +11,19 @@ export function AdminSublistingCategoriesView({ onBulkDelete, }) {
|
|
|
11
11
|
const config = {
|
|
12
12
|
portal: "admin",
|
|
13
13
|
title: "Sub-listing Categories",
|
|
14
|
-
|
|
14
|
+
/*
|
|
15
|
+
* Restored 2026-10-17, same reasoning as `AdminBrandsView`. `itemCode` is
|
|
16
|
+
* named because it is genuinely in `buildCategorySearchTxt`'s source list —
|
|
17
|
+
* the store-side sibling route was reaching for exactly that lookup with an
|
|
18
|
+
* in-memory `.includes()` over one page, which could not find a code that
|
|
19
|
+
* sorted past the page boundary.
|
|
20
|
+
*/
|
|
21
|
+
search: {
|
|
22
|
+
placeholder: "Search by name, item code or description…",
|
|
23
|
+
mode: "partial",
|
|
24
|
+
fields: ["name", "itemCode", "description"],
|
|
25
|
+
commit: "debounce",
|
|
26
|
+
},
|
|
15
27
|
emptyLabel: "No sub-listing categories found",
|
|
16
28
|
filterKeys: [],
|
|
17
29
|
defaultSort: sortBy("name", "ASC"),
|
|
@@ -38,6 +50,15 @@ export function AdminSublistingCategoriesView({ onBulkDelete, }) {
|
|
|
38
50
|
getTotal: (response, mappedRows) => typeof response.total === "number" ? response.total : mappedRows.length,
|
|
39
51
|
buildFilters: () => undefined,
|
|
40
52
|
rowHrefTemplate: String(ROUTES.ADMIN.SUBLISTING_CATEGORIES_EDIT("{id}")),
|
|
53
|
+
/*
|
|
54
|
+
* `/admin/sublisting-categories/new`, its ROUTES key and its POST route all
|
|
55
|
+
* already existed — the list simply never linked to them, so the page was
|
|
56
|
+
* reachable only by typing the URL (Root Cause #37's shape).
|
|
57
|
+
*/
|
|
58
|
+
primaryAction: {
|
|
59
|
+
label: "Add Sub-listing Category",
|
|
60
|
+
href: String(ROUTES.ADMIN.SUBLISTING_CATEGORIES_NEW),
|
|
61
|
+
},
|
|
41
62
|
buildBulkActions: onBulkDelete
|
|
42
63
|
? (selection) => [
|
|
43
64
|
buildBulkAction(ACTIONS.ADMIN["delete-sublisting-category"], async () => {
|
|
@@ -78,7 +78,7 @@ export function AdminTeamView({ children, onBulkRemove, ...props }) {
|
|
|
78
78
|
{ value: sortBy("createdAt", "ASC"), label: "Oldest" },
|
|
79
79
|
{ value: "displayName", label: "Name A–Z" },
|
|
80
80
|
],
|
|
81
|
-
mapRows: (response) => toRecordArray(response.
|
|
81
|
+
mapRows: (response) => toRecordArray(response.items).map((item, index) => ({
|
|
82
82
|
id: toStringValue(item.id ?? item.uid, `employee-${index}`),
|
|
83
83
|
primary: toStringValue(item.displayName, "Unnamed employee"),
|
|
84
84
|
secondary: [
|
|
@@ -71,7 +71,6 @@ export function AdminTesterChecklistItemEditorView({ itemId, onSaved, onDeleted,
|
|
|
71
71
|
isActive: item.isActive ?? true,
|
|
72
72
|
adminOnly: item.adminOnly ?? false,
|
|
73
73
|
});
|
|
74
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
75
74
|
}, [itemQuery.data]);
|
|
76
75
|
const saveMutation = useApiMutation({
|
|
77
76
|
errorMessage: "Failed to save checklist item.",
|
|
@@ -120,7 +120,7 @@ export function AdminUsersView({ children, ...props }) {
|
|
|
120
120
|
{ value: sortBy("createdAt", "ASC"), label: "Oldest" },
|
|
121
121
|
{ value: "displayName", label: "Name A–Z" },
|
|
122
122
|
],
|
|
123
|
-
mapRows: (response) => toRecordArray(response.
|
|
123
|
+
mapRows: (response) => toRecordArray(response.items).map((item, index) => {
|
|
124
124
|
const isDisabled = Boolean(item.isDisabled ?? item.disabled);
|
|
125
125
|
const isHardBanned = isDisabled && Boolean(item.hardBanReason);
|
|
126
126
|
const softBanCount = Array.isArray(item.softBans) ? item.softBans.length : 0;
|
|
@@ -136,9 +136,10 @@ export interface ListingViewConfig<TResponse, TRow extends {
|
|
|
136
136
|
renderCards?: (rows: TRow[], view: "grid" | "list", selection: ListingSelectionContext<TRow>, isLoading: boolean) => React.ReactNode;
|
|
137
137
|
primaryAction?: {
|
|
138
138
|
label: string;
|
|
139
|
-
onClick
|
|
139
|
+
onClick?: (panel: {
|
|
140
140
|
openCreatePanel: () => void;
|
|
141
141
|
}) => void;
|
|
142
|
+
href?: string;
|
|
142
143
|
icon?: React.ReactNode;
|
|
143
144
|
};
|
|
144
145
|
/** Extra arbitrary content in the toolbar (e.g. export buttons). Rendered alongside primaryAction. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Plus } from "lucide-react";
|
|
4
|
-
import { BulkActionBar, Button, Div, ListingFilterDrawer, ListingToolbar, Pagination, Row, SideDrawer, StickyToolbar } from "../../../ui/index.js";
|
|
4
|
+
import { BulkActionBar, Button, Div, ListingFilterDrawer, ListingToolbar, Pagination, Row, SideDrawer, StickyToolbar, TextLink } from "../../../ui/index.js";
|
|
5
5
|
import { useBottomActions } from "../../layout/index.js";
|
|
6
6
|
import { useAdminListing } from "../hooks/useAdminListing.js";
|
|
7
7
|
import { getResourceIcon } from "../../../ui/columns/column-renderers.js";
|
|
@@ -91,9 +91,14 @@ export function DataListingView({ config, }) {
|
|
|
91
91
|
// Passing this is what renders the box — ListingToolbar gates on it.
|
|
92
92
|
// Undefined when the config declares no search, so a view whose
|
|
93
93
|
// endpoint cannot search no longer shows an input that does nothing.
|
|
94
|
-
onSearchChange: searchEnabled ? setSearchInput : undefined, onSearchCommit: searchEnabled ? commitSearch : undefined, sortValue: table.get("sort") || config.defaultSort, sortOptions: config.sortOptions, onSortChange: (v) => table.set("sort", v), showTableView: !config.hideTableView, toggles: config.toggles, view: view, onViewChange: (v) => setView(v), onResetAll: resetAll, hasActiveState: hasActiveState, extra: config.primaryAction || config.toolbarExtra ? (_jsxs(Row, { align: "center", gap: "sm", children: [config.toolbarExtra, config.primaryAction &&
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
onSearchChange: searchEnabled ? setSearchInput : undefined, onSearchCommit: searchEnabled ? commitSearch : undefined, sortValue: table.get("sort") || config.defaultSort, sortOptions: config.sortOptions, onSortChange: (v) => table.set("sort", v), showTableView: !config.hideTableView, toggles: config.toggles, view: view, onViewChange: (v) => setView(v), onResetAll: resetAll, hasActiveState: hasActiveState, extra: config.primaryAction || config.toolbarExtra ? (_jsxs(Row, { align: "center", gap: "sm", children: [config.toolbarExtra, config.primaryAction &&
|
|
95
|
+
(config.primaryAction.href ? (
|
|
96
|
+
// `asChild` so the create PAGE is a real anchor — middle-click
|
|
97
|
+
// and copy-link work, and it is not a button that happens to
|
|
98
|
+
// navigate (a Known-TS-Pattern this repo bans outright).
|
|
99
|
+
_jsx(Button, { gap: "sm", size: "sm", asChild: true, children: _jsxs(TextLink, { variant: "inherit", href: config.primaryAction.href, children: [config.primaryAction.icon ?? _jsx(Plus, { className: "h-4 w-4" }), config.primaryAction.label] }) })) : (_jsxs(Button, { gap: "sm", size: "sm", onClick: () => config.primaryAction.onClick?.({
|
|
100
|
+
openCreatePanel: panel.openCreatePanel,
|
|
101
|
+
}), children: [config.primaryAction.icon ?? _jsx(Plus, { className: "h-4 w-4" }), config.primaryAction.label] })))] })) : undefined }), config.renderAboveContent?.(), bulkActionItems && (_jsx(BulkActionBar, { selectedCount: selection.selectedCount, onClearSelection: selection.clearSelection, actions: bulkActionItems })), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: (p) => table.setPage(p), pageSize: pageSize, onPageSizeChange: setPageSize, paginationConfig: { showPageSizeSelector: true, pageSizeOptions: [10, 25, 50, 100] } }) }) })), _jsxs(Div, { paddingX: "x-sm-md", padding: "y-md", children: [errorMessage && (_jsx(Div, { textSize: "sm", className: "mb-4 border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "xl", children: errorMessage })), view === "table" && !config.hideTableView && !isMobile ? (_jsx(DataTable, { columns: config.columns, rows: rows, resourceIcon: resourceIcon, isLoading: isLoading, emptyLabel: config.emptyLabel ?? `No ${config.title.toLowerCase()} found`, selectedIds: selection.selectedIdSet, onToggleSelect: selection.toggle, onToggleSelectAll: (next) => next
|
|
97
102
|
? selection.setSelectedIds(rows.map((r) => r.id))
|
|
98
103
|
: selection.clearSelection(), rowHrefTemplate: config.rowHrefTemplate, onRowClick: config.onRowClick
|
|
99
104
|
? (row) => config.onRowClick(row, {
|
|
@@ -8,11 +8,9 @@ import { ADMIN_ENDPOINTS } from "../../../../constants/api-endpoints.js";
|
|
|
8
8
|
import { PAGE_VIEW_ENTITY_TYPES } from "../../../analytics/types.js";
|
|
9
9
|
const ENTITY_TYPE_OPTIONS = PAGE_VIEW_ENTITY_TYPES.map((t) => ({ value: t, label: t }));
|
|
10
10
|
function today() {
|
|
11
|
-
// eslint-disable-next-line lir/no-raw-date
|
|
12
11
|
return new Date().toISOString().slice(0, 10);
|
|
13
12
|
}
|
|
14
13
|
function daysAgo(n) {
|
|
15
|
-
// eslint-disable-next-line lir/no-raw-date
|
|
16
14
|
const d = new Date();
|
|
17
15
|
d.setDate(d.getDate() - n);
|
|
18
16
|
return d.toISOString().slice(0, 10);
|
|
@@ -69,7 +69,7 @@ export declare function useAdminListing<TResponse, TRow extends {
|
|
|
69
69
|
refetch: () => void;
|
|
70
70
|
currentPage: number;
|
|
71
71
|
totalPages: number;
|
|
72
|
-
selection: import("../../../
|
|
72
|
+
selection: import("../../../react").UseBulkSelectionReturn;
|
|
73
73
|
defaultSort: string;
|
|
74
74
|
pageSize: number;
|
|
75
75
|
setPageSize: (next: number) => void;
|
|
@@ -6,7 +6,14 @@ import { serverLogger } from "../../../monitoring/server-logger.js";
|
|
|
6
6
|
* Manages site-wide configuration settings (singleton document)
|
|
7
7
|
*/
|
|
8
8
|
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase/index.js";
|
|
9
|
-
|
|
9
|
+
/*
|
|
10
|
+
* The DEFINING module, not the `core` barrel — Root Cause #18. `core/index.ts`
|
|
11
|
+
* re-exports `unitOfWork`, which imports this very repository, so reaching
|
|
12
|
+
* `cacheManager` through the barrel closed a six-module import cycle
|
|
13
|
+
* (`audit-import-cycles` component 2). `CacheManager.ts` imports nothing from
|
|
14
|
+
* here, so the deep path has one direction only.
|
|
15
|
+
*/
|
|
16
|
+
import { cacheManager } from "../../../core/CacheManager.js";
|
|
10
17
|
import { SITE_SETTINGS_COLLECTION, DEFAULT_SITE_SETTINGS_DATA, } from "../schemas/index.js";
|
|
11
18
|
import { DatabaseError } from "../../../errors/index.js";
|
|
12
19
|
import { decryptSecret, encryptSecret, maskSecret } from "../../../security/index.js";
|
|
@@ -73,13 +80,11 @@ export class SiteSettingsRepository extends BaseRepository {
|
|
|
73
80
|
const encrypted = { ...existing };
|
|
74
81
|
for (const [key, value] of Object.entries(updates)) {
|
|
75
82
|
if (typeof value === "string" && value.trim()) {
|
|
76
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
83
|
encrypted[key] = encryptSecret(value.trim());
|
|
78
84
|
}
|
|
79
85
|
else if (value !== undefined && typeof value !== "string") {
|
|
80
86
|
// Non-string credential fields (e.g. whatsappTemplates: Record<string,string>)
|
|
81
87
|
// are stored as-is — they are not secret values to encrypt.
|
|
82
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
88
|
encrypted[key] = value;
|
|
84
89
|
}
|
|
85
90
|
// Empty / undefined → keep whatever was already stored
|
|
@@ -14,7 +14,7 @@ export type NotificationType = (typeof NOTIFICATION_TYPE_VALUES)[number];
|
|
|
14
14
|
* Runtime array for the same reason as the type union above — and
|
|
15
15
|
* `catalogueItem` was being sent with an `as never` cast rather than added.
|
|
16
16
|
*/
|
|
17
|
-
export declare const NOTIFICATION_RELATED_TYPE_VALUES: readonly ["order", "product", "bid", "review", "blog", "user", "offer", "support_ticket", "scammer", "catalogueItem", "payout", "store", "conversation"];
|
|
17
|
+
export declare const NOTIFICATION_RELATED_TYPE_VALUES: readonly ["order", "product", "bid", "review", "blog", "user", "offer", "support_ticket", "scammer", "catalogueItem", "payout", "store", "conversation", "event"];
|
|
18
18
|
export type NotificationRelatedType = (typeof NOTIFICATION_RELATED_TYPE_VALUES)[number];
|
|
19
19
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
20
20
|
export type NotificationPriority = "low" | "normal" | "high";
|
|
@@ -525,6 +525,46 @@ export interface SiteSettingsDocument extends BaseDocument {
|
|
|
525
525
|
chat?: {
|
|
526
526
|
enabled: boolean;
|
|
527
527
|
};
|
|
528
|
+
/**
|
|
529
|
+
* The public search index — the browser-side artifact, not the per-listing
|
|
530
|
+
* search boxes, which this flag cannot reach.
|
|
531
|
+
*
|
|
532
|
+
* ## 🛑 Why a group of its own and not `featureFlags`
|
|
533
|
+
*
|
|
534
|
+
* The plan for this feature said "a kill switch in `siteSettings.featureFlags`".
|
|
535
|
+
* That group was DELETED on 2026-08-29 because 11 of its 14 keys had zero
|
|
536
|
+
* readers, and the two survivors moved into `payment` as real settings. Its
|
|
537
|
+
* deletion note draws the line this honours: *"A flag is a temporary switch
|
|
538
|
+
* around unfinished work."* This is exactly that — so it is a flag, and it
|
|
539
|
+
* earns the one thing the deleted keys could not show: a named reader
|
|
540
|
+
* (`useSearchIndex`).
|
|
541
|
+
*
|
|
542
|
+
* 🛑 It is NOT in `payment` or any other existing group, and that is
|
|
543
|
+
* defensive rather than tidy. `AdminSiteSettingsView.buildFullPayload`
|
|
544
|
+
* writes `payment: { phonepeEnabled, upiManualEnabled, codEnabled,
|
|
545
|
+
* otpCheckoutThreshold }` — the WHOLE group, from four pieces of form
|
|
546
|
+
* state — so any fifth key in there is silently erased the next time an
|
|
547
|
+
* admin saves anything on that page (Root Cause #76). A kill switch that a
|
|
548
|
+
* routine save turns back on is worse than none, because it fails in the
|
|
549
|
+
* direction of the thing it exists to stop.
|
|
550
|
+
*
|
|
551
|
+
* ## 🛑 Default ON — the opposite polarity to `chat.enabled`
|
|
552
|
+
*
|
|
553
|
+
* `chat` is an opt-in feature and its readers test `=== true`. This is a
|
|
554
|
+
* kill switch on the primary path, so its reader tests `!== false`: an
|
|
555
|
+
* absent field, an unseeded document and a failed settings fetch must all
|
|
556
|
+
* mean "search works". The only state that disables it is somebody
|
|
557
|
+
* deliberately writing `false`.
|
|
558
|
+
*
|
|
559
|
+
* Recovery exists because the index can be wrong in a way nothing errors
|
|
560
|
+
* on — a bad patch, a schema the client does not understand — and the
|
|
561
|
+
* alternative route back is a Vercel deploy. Flipping this sends every
|
|
562
|
+
* client to the server `SEARCH_SOURCES` path, which is why that path is
|
|
563
|
+
* kept rather than deleted.
|
|
564
|
+
*/
|
|
565
|
+
search?: {
|
|
566
|
+
indexEnabled?: boolean;
|
|
567
|
+
};
|
|
528
568
|
emailSettings: {
|
|
529
569
|
fromName: string;
|
|
530
570
|
fromEmail: string;
|
|
@@ -756,6 +796,27 @@ export declare const SITE_SETTINGS_INDEXED_FIELDS: readonly [];
|
|
|
756
796
|
*/
|
|
757
797
|
export declare const DEFAULT_SITE_SETTINGS_THEME: SiteSettingsTheme;
|
|
758
798
|
export declare const DEFAULT_SITE_SETTINGS_DATA: Partial<SiteSettingsDocument>;
|
|
799
|
+
/**
|
|
800
|
+
* 🛑 DEAD, AND IT DISAGREES WITH THE REAL PROJECTION. Do not add to it.
|
|
801
|
+
*
|
|
802
|
+
* Measured 2026-10-19 while adding `search`: this constant has **zero
|
|
803
|
+
* consumers** — it is re-exported from the barrel and read by nothing. The
|
|
804
|
+
* list that actually decides what leaves the server is
|
|
805
|
+
* `PUBLIC_SITE_SETTINGS_FIELDS` in
|
|
806
|
+
* `_internal/server/features/site-settings/adapters.ts`, which is audited by
|
|
807
|
+
* `audit-public-projection-parity`.
|
|
808
|
+
*
|
|
809
|
+
* The two already disagree, in the dangerous direction: this one names
|
|
810
|
+
* `commissions` (the real projection marks it PRIVATE — "internal economics")
|
|
811
|
+
* and `featureFlags`, a settings group DELETED in 2026-08-29. So anyone who
|
|
812
|
+
* reached for it as authoritative would publish platform fee structure and
|
|
813
|
+
* key a feature off a group that no longer exists.
|
|
814
|
+
*
|
|
815
|
+
* Left in place rather than deleted here only because removing a barrel
|
|
816
|
+
* export is a breaking change that needs its own version bump; it belongs
|
|
817
|
+
* with the other search-subsystem deletions. Adding a field to it would make
|
|
818
|
+
* it look maintained, which is the one thing it must not look.
|
|
819
|
+
*/
|
|
759
820
|
export declare const SITE_SETTINGS_PUBLIC_FIELDS: readonly ["siteName", "motto", "logo", "background", "contact.email", "contact.phone", "payment", "commissions", "socialLinks", "seo", "features", "featureFlags", "faq.variables", "announcementBar"];
|
|
760
821
|
export type SiteSettingsUpdateInput = Partial<Omit<SiteSettingsDocument, "id" | "createdAt" | "updatedAt">>;
|
|
761
822
|
export declare const DEFAULT_TRUST_BAR_ITEMS: TrustBarItem[];
|
|
@@ -114,6 +114,17 @@ export const NOTIFICATION_RELATED_TYPE_VALUES = [
|
|
|
114
114
|
"store",
|
|
115
115
|
// D9 — the chat thread the message belongs to.
|
|
116
116
|
"conversation",
|
|
117
|
+
/*
|
|
118
|
+
* The event a raffle win belongs to. Added 2026-10-19 with the raffle-winner
|
|
119
|
+
* notification: `runTriggerEventRaffle` recorded a winner and told nobody,
|
|
120
|
+
* so the only way to learn you had won was to revisit the event page.
|
|
121
|
+
*
|
|
122
|
+
* Declared here rather than sent behind an `as never` — see the note above
|
|
123
|
+
* this array about `catalogueItem`, and the exhaustiveness check in
|
|
124
|
+
* `resolveNotificationActionUrl` that makes the destination a compile-time
|
|
125
|
+
* question.
|
|
126
|
+
*/
|
|
127
|
+
"event",
|
|
117
128
|
];
|
|
118
129
|
export const NOTIFICATIONS_COLLECTION = "notifications";
|
|
119
130
|
export const NOTIFICATIONS_INDEXED_FIELDS = [
|
|
@@ -337,6 +348,27 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
|
|
|
337
348
|
navConfig: {},
|
|
338
349
|
disabledRoutes: [],
|
|
339
350
|
};
|
|
351
|
+
/**
|
|
352
|
+
* 🛑 DEAD, AND IT DISAGREES WITH THE REAL PROJECTION. Do not add to it.
|
|
353
|
+
*
|
|
354
|
+
* Measured 2026-10-19 while adding `search`: this constant has **zero
|
|
355
|
+
* consumers** — it is re-exported from the barrel and read by nothing. The
|
|
356
|
+
* list that actually decides what leaves the server is
|
|
357
|
+
* `PUBLIC_SITE_SETTINGS_FIELDS` in
|
|
358
|
+
* `_internal/server/features/site-settings/adapters.ts`, which is audited by
|
|
359
|
+
* `audit-public-projection-parity`.
|
|
360
|
+
*
|
|
361
|
+
* The two already disagree, in the dangerous direction: this one names
|
|
362
|
+
* `commissions` (the real projection marks it PRIVATE — "internal economics")
|
|
363
|
+
* and `featureFlags`, a settings group DELETED in 2026-08-29. So anyone who
|
|
364
|
+
* reached for it as authoritative would publish platform fee structure and
|
|
365
|
+
* key a feature off a group that no longer exists.
|
|
366
|
+
*
|
|
367
|
+
* Left in place rather than deleted here only because removing a barrel
|
|
368
|
+
* export is a breaking change that needs its own version bump; it belongs
|
|
369
|
+
* with the other search-subsystem deletions. Adding a field to it would make
|
|
370
|
+
* it look maintained, which is the one thing it must not look.
|
|
371
|
+
*/
|
|
340
372
|
export const SITE_SETTINGS_PUBLIC_FIELDS = [
|
|
341
373
|
"siteName",
|
|
342
374
|
"motto",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BidDocument } from "../schemas";
|
|
1
|
+
import type { BidDocument, BidPlain } from "../schemas";
|
|
2
2
|
import type { FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
3
3
|
export interface PlaceBidInput {
|
|
4
4
|
productId: string;
|
|
@@ -6,7 +6,7 @@ export interface PlaceBidInput {
|
|
|
6
6
|
autoMaxBid?: number;
|
|
7
7
|
}
|
|
8
8
|
export interface PlaceBidResult {
|
|
9
|
-
bid:
|
|
9
|
+
bid: BidPlain;
|
|
10
10
|
}
|
|
11
11
|
export declare function placeBid(userId: string, userEmail: string, input: PlaceBidInput): Promise<PlaceBidResult>;
|
|
12
12
|
export interface BuyNowAuctionInput {
|
|
@@ -150,12 +150,18 @@ export async function placeBid(userId, userEmail, input) {
|
|
|
150
150
|
visibleBid = newCap;
|
|
151
151
|
bumpedPreviousVisible = Math.min(prevCap, target);
|
|
152
152
|
}
|
|
153
|
-
const bid = await bidRepository.
|
|
153
|
+
const bid = await bidRepository.createBid({
|
|
154
154
|
productId,
|
|
155
155
|
productTitle: product.title,
|
|
156
156
|
userId,
|
|
157
157
|
userName: profile?.displayName ?? userEmail ?? "Anonymous",
|
|
158
|
-
|
|
158
|
+
/*
|
|
159
|
+
* 🛑 Revealed, not passed through. `profile` comes from a user read, which
|
|
160
|
+
* is ciphertext-by-default now — and `createBid` ENCRYPTS what it is given,
|
|
161
|
+
* so the raw value would be encrypted a SECOND time and become
|
|
162
|
+
* undecryptable. The `userEmail` parameter is already plaintext.
|
|
163
|
+
*/
|
|
164
|
+
userEmail: (profile ? userRepository.revealUser(profile).email : null) ?? userEmail ?? "",
|
|
159
165
|
bidAmount: visibleBid,
|
|
160
166
|
currency: product.currency || getDefaultCurrency(),
|
|
161
167
|
bidDate: new Date(),
|
|
@@ -333,12 +339,18 @@ export async function buyNowAuction(userId, userName, userEmail, input) {
|
|
|
333
339
|
// buyout price by the buyer" means. It starts `active`/`isWinning: false`
|
|
334
340
|
// like any other bid (bidRepository.create forces both) and is promoted to
|
|
335
341
|
// `won` by claimAuctionForCheckout when the order actually lands.
|
|
336
|
-
const bid = await bidRepository.
|
|
342
|
+
const bid = await bidRepository.createBid({
|
|
337
343
|
productId,
|
|
338
344
|
productTitle: product.title,
|
|
339
345
|
userId,
|
|
340
346
|
userName: profile?.displayName ?? userName ?? userEmail ?? "Anonymous",
|
|
341
|
-
|
|
347
|
+
/*
|
|
348
|
+
* 🛑 Revealed, not passed through. `profile` comes from a user read, which
|
|
349
|
+
* is ciphertext-by-default now — and `createBid` ENCRYPTS what it is given,
|
|
350
|
+
* so the raw value would be encrypted a SECOND time and become
|
|
351
|
+
* undecryptable. The `userEmail` parameter is already plaintext.
|
|
352
|
+
*/
|
|
353
|
+
userEmail: (profile ? userRepository.revealUser(profile).email : null) ?? userEmail ?? "",
|
|
342
354
|
bidAmount: buyNowPrice,
|
|
343
355
|
currency,
|
|
344
356
|
bidDate: new Date(),
|
|
@@ -80,6 +80,10 @@ export function AuctionBottomActions(props) {
|
|
|
80
80
|
? `${formatCurrency(currentBid, currency)} · ${bidCount} bid${bidCount !== 1 ? "s" : ""}`
|
|
81
81
|
: `Sign in to see the bid · ${bidCount} bid${bidCount !== 1 ? "s" : ""}`,
|
|
82
82
|
desktop: "after-scroll",
|
|
83
|
+
// The inline bid panel on the detail page. The dock stays shut until
|
|
84
|
+
// a bidder has actually seen it and scrolled past — beside it, the
|
|
85
|
+
// dock would just be a second "Place bid" button.
|
|
86
|
+
ctaAnchorId: "auction-bid-form",
|
|
83
87
|
});
|
|
84
88
|
return (_jsx(Modal, { isOpen: open, onClose: () => setOpen(false), size: "md", title: "Place your bid", children: _jsx(PlaceBidFormClient, { ...props }) }));
|
|
85
89
|
}
|