@mohasinac/appkit 2.3.2 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +48 -12
- package/dist/client.js +25 -6
- package/dist/constants/api-endpoints.d.ts +380 -22
- package/dist/constants/api-endpoints.js +66 -13
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/core/hooks/useSyncManager.d.ts +1 -0
- package/dist/core/hooks/useSyncManager.js +83 -0
- package/dist/core/integration-keys.d.ts +4 -0
- package/dist/core/integration-keys.js +8 -0
- package/dist/features/about/components/FAQPageView.js +9 -11
- package/dist/features/about/components/PolicyPageView.js +32 -11
- package/dist/features/about/components/PublicProfileView.js +77 -11
- package/dist/features/account/components/AddressesIndexListing.js +63 -38
- package/dist/features/account/components/UserOffersPanel.d.ts +8 -0
- package/dist/features/account/components/UserOffersPanel.js +81 -0
- package/dist/features/account/components/UserSettingsView.d.ts +2 -1
- package/dist/features/account/components/UserSettingsView.js +2 -1
- package/dist/features/account/components/UserSidebar.d.ts +6 -1
- package/dist/features/account/components/UserSidebar.js +48 -42
- package/dist/features/account/components/index.d.ts +2 -0
- package/dist/features/account/components/index.js +1 -0
- package/dist/features/admin/actions/admin-actions.d.ts +1 -1
- package/dist/features/admin/actions/admin-actions.js +13 -3
- package/dist/features/admin/components/AdminAdEditorView.js +6 -7
- package/dist/features/admin/components/AdminAllEventEntriesView.d.ts +4 -0
- package/dist/features/admin/components/AdminAllEventEntriesView.js +102 -0
- package/dist/features/admin/components/AdminBidsView.js +94 -8
- package/dist/features/admin/components/AdminBlogEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminBlogEditorView.js +162 -0
- package/dist/features/admin/components/AdminBlogView.d.ts +4 -1
- package/dist/features/admin/components/AdminBlogView.js +61 -31
- package/dist/features/admin/components/AdminBrandEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminBrandEditorView.js +104 -0
- package/dist/features/admin/components/AdminBrandsView.d.ts +4 -0
- package/dist/features/admin/components/AdminBrandsView.js +76 -0
- package/dist/features/admin/components/AdminCarouselEditorView.d.ts +8 -0
- package/dist/features/admin/components/AdminCarouselEditorView.js +204 -0
- package/dist/features/admin/components/AdminCarouselView.js +153 -34
- package/dist/features/admin/components/AdminCartsView.d.ts +4 -0
- package/dist/features/admin/components/AdminCartsView.js +82 -0
- package/dist/features/admin/components/AdminCategoriesView.d.ts +4 -1
- package/dist/features/admin/components/AdminCategoriesView.js +66 -48
- package/dist/features/admin/components/AdminCategoryEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminCategoryEditorView.js +115 -0
- package/dist/features/admin/components/AdminContactEditorView.d.ts +11 -0
- package/dist/features/admin/components/AdminContactEditorView.js +32 -0
- package/dist/features/admin/components/AdminContactView.js +111 -20
- package/dist/features/admin/components/AdminCouponEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminCouponEditorView.js +179 -0
- package/dist/features/admin/components/AdminCouponsView.d.ts +4 -1
- package/dist/features/admin/components/AdminCouponsView.js +57 -9
- package/dist/features/admin/components/AdminDashboardView.js +3 -0
- package/dist/features/admin/components/AdminFaqEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminFaqEditorView.js +128 -0
- package/dist/features/admin/components/AdminFaqsView.d.ts +4 -1
- package/dist/features/admin/components/AdminFaqsView.js +55 -23
- package/dist/features/admin/components/AdminFeatureFlagsView.js +33 -24
- package/dist/features/admin/components/AdminListingScaffold.d.ts +7 -1
- package/dist/features/admin/components/AdminListingScaffold.js +2 -2
- package/dist/features/admin/components/AdminMediaView.js +18 -8
- package/dist/features/admin/components/AdminNavEditorView.d.ts +20 -0
- package/dist/features/admin/components/AdminNavEditorView.js +84 -0
- package/dist/features/admin/components/AdminNavigationView.d.ts +1 -7
- package/dist/features/admin/components/AdminNavigationView.js +84 -72
- package/dist/features/admin/components/AdminNewsletterView.js +102 -20
- package/dist/features/admin/components/AdminNotificationsView.d.ts +4 -0
- package/dist/features/admin/components/AdminNotificationsView.js +119 -0
- package/dist/features/admin/components/AdminOrderEditorView.d.ts +8 -0
- package/dist/features/admin/components/AdminOrderEditorView.js +74 -0
- package/dist/features/admin/components/AdminOrdersView.js +64 -8
- package/dist/features/admin/components/AdminPayoutsView.js +122 -13
- package/dist/features/admin/components/AdminProductEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminProductEditorView.js +143 -0
- package/dist/features/admin/components/AdminProductsView.d.ts +4 -1
- package/dist/features/admin/components/AdminProductsView.js +119 -30
- package/dist/features/admin/components/AdminReturnRequestsView.d.ts +5 -0
- package/dist/features/admin/components/AdminReturnRequestsView.js +101 -0
- package/dist/features/admin/components/AdminReviewsView.js +138 -28
- package/dist/features/admin/components/AdminSectionsView.js +361 -472
- package/dist/features/admin/components/AdminSessionsView.d.ts +4 -0
- package/dist/features/admin/components/AdminSessionsView.js +119 -0
- package/dist/features/admin/components/AdminSidebar.d.ts +18 -3
- package/dist/features/admin/components/AdminSidebar.js +51 -4
- package/dist/features/admin/components/AdminSiteSettingsView.d.ts +7 -0
- package/dist/features/admin/components/AdminSiteSettingsView.js +319 -0
- package/dist/features/admin/components/AdminStoreAddressesView.d.ts +5 -0
- package/dist/features/admin/components/AdminStoreAddressesView.js +52 -0
- package/dist/features/admin/components/AdminStoreEditorView.d.ts +9 -0
- package/dist/features/admin/components/AdminStoreEditorView.js +55 -0
- package/dist/features/admin/components/AdminStoresView.js +62 -20
- package/dist/features/admin/components/AdminUserEditorView.d.ts +10 -0
- package/dist/features/admin/components/AdminUserEditorView.js +72 -0
- package/dist/features/admin/components/AdminUsersView.js +70 -36
- package/dist/features/admin/components/AdminWishlistsView.d.ts +4 -0
- package/dist/features/admin/components/AdminWishlistsView.js +53 -0
- package/dist/features/admin/components/BrandQuickCreateForm.d.ts +5 -0
- package/dist/features/admin/components/BrandQuickCreateForm.js +36 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +5 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.js +35 -0
- package/dist/features/admin/components/DataTable.d.ts +4 -2
- package/dist/features/admin/components/DataTable.js +26 -6
- package/dist/features/admin/components/index.d.ts +47 -1
- package/dist/features/admin/components/index.js +23 -0
- package/dist/features/admin/components/sections/adminSectionsBuildParse.d.ts +48 -0
- package/dist/features/admin/components/sections/adminSectionsBuildParse.js +653 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +298 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +278 -0
- package/dist/features/admin/schemas/firestore.d.ts +26 -0
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/admin/types/product.types.d.ts +2 -3
- package/dist/features/auctions/actions/bid-actions.js +6 -2
- package/dist/features/auctions/components/AuctionDetailPageView.d.ts +3 -1
- package/dist/features/auctions/components/AuctionDetailPageView.js +38 -12
- package/dist/features/auctions/components/AuctionFilters.d.ts +3 -1
- package/dist/features/auctions/components/AuctionFilters.js +6 -2
- package/dist/features/auctions/components/CollapsibleBidHistory.d.ts +7 -0
- package/dist/features/auctions/components/CollapsibleBidHistory.js +8 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +4 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +43 -9
- package/dist/features/auctions/components/MarketplaceAuctionGrid.js +1 -0
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +18 -0
- package/dist/features/auctions/components/PlaceBidFormClient.js +33 -0
- package/dist/features/auctions/hooks/useAuctions.d.ts +1 -0
- package/dist/features/auctions/hooks/useAuctions.js +1 -0
- package/dist/features/auctions/schemas/index.d.ts +22 -12
- package/dist/features/auth/actions/profile-actions.d.ts +5 -3
- package/dist/features/auth/actions/profile-actions.js +30 -11
- package/dist/features/auth/auth-helpers.js +1 -0
- package/dist/features/auth/components/LoginForm.js +2 -1
- package/dist/features/auth/hooks/useAuth.js +16 -4
- package/dist/features/auth/permissions/constants.d.ts +63 -0
- package/dist/features/auth/permissions/constants.js +323 -0
- package/dist/features/auth/schemas/firestore.d.ts +20 -0
- package/dist/features/auth/schemas/index.d.ts +4 -4
- package/dist/features/auth/schemas/index.js +3 -2
- package/dist/features/auth/types/index.d.ts +1 -1
- package/dist/features/before-after/schemas/index.d.ts +2 -2
- package/dist/features/blog/actions/blog-actions.d.ts +15 -15
- package/dist/features/blog/components/BlogFilters.js +1 -1
- package/dist/features/blog/components/BlogIndexListing.js +57 -5
- package/dist/features/blog/components/BlogIndexPageView.js +14 -2
- package/dist/features/blog/components/BlogPostForm.js +6 -2
- package/dist/features/blog/components/BlogPostView.js +2 -1
- package/dist/features/blog/hooks/useBlog.d.ts +2 -0
- package/dist/features/blog/hooks/useBlog.js +2 -0
- package/dist/features/blog/schemas/index.d.ts +46 -12
- package/dist/features/brands/actions/brand-actions.d.ts +2 -0
- package/dist/features/brands/actions/brand-actions.js +5 -0
- package/dist/features/brands/index.d.ts +3 -0
- package/dist/features/brands/index.js +3 -0
- package/dist/features/brands/repository/brands.repository.d.ts +13 -0
- package/dist/features/brands/repository/brands.repository.js +60 -0
- package/dist/features/brands/schemas/index.d.ts +33 -0
- package/dist/features/brands/schemas/index.js +15 -0
- package/dist/features/brands/server.d.ts +7 -0
- package/dist/features/brands/server.js +7 -0
- package/dist/features/cart/actions/cart-actions.js +2 -2
- package/dist/features/cart/components/CartDrawer.d.ts +5 -1
- package/dist/features/cart/components/CartDrawer.js +3 -3
- package/dist/features/cart/hooks/useCartCount.d.ts +3 -2
- package/dist/features/cart/hooks/useCartCount.js +4 -2
- package/dist/features/cart/hooks/useGuestCartMerge.js +1 -1
- package/dist/features/cart/index.d.ts +1 -0
- package/dist/features/cart/index.js +1 -0
- package/dist/features/cart/repository/cart.repository.d.ts +5 -1
- package/dist/features/cart/repository/cart.repository.js +36 -5
- package/dist/features/cart/schemas/firestore.d.ts +25 -6
- package/dist/features/cart/schemas/firestore.js +2 -2
- package/dist/features/cart/schemas/index.d.ts +9 -9
- package/dist/features/cart/schemas/index.js +1 -1
- package/dist/features/cart/types/index.d.ts +1 -1
- package/dist/features/cart/utils/pending-ops.d.ts +33 -0
- package/dist/features/cart/utils/pending-ops.js +102 -0
- package/dist/features/categories/components/BrandDetailPageView.d.ts +4 -0
- package/dist/features/categories/components/BrandDetailPageView.js +54 -0
- package/dist/features/categories/components/BrandDetailTabs.d.ts +10 -0
- package/dist/features/categories/components/BrandDetailTabs.js +22 -0
- package/dist/features/categories/components/CategoriesIndexListing.d.ts +3 -1
- package/dist/features/categories/components/CategoriesIndexListing.js +83 -7
- package/dist/features/categories/components/CategoryDetailPageView.js +42 -21
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -7
- package/dist/features/categories/components/CategoryFilters.js +1 -1
- package/dist/features/categories/components/CategoryForm.js +10 -4
- package/dist/features/categories/components/CategoryProductsListing.d.ts +4 -1
- package/dist/features/categories/components/CategoryProductsListing.js +34 -5
- package/dist/features/categories/components/ConcernCard.js +1 -1
- package/dist/features/categories/hooks/useCategories.js +2 -0
- package/dist/features/categories/repository/categories.repository.js +2 -3
- package/dist/features/categories/schemas/firestore.d.ts +23 -2
- package/dist/features/categories/schemas/firestore.js +8 -0
- package/dist/features/categories/schemas/index.d.ts +8 -8
- package/dist/features/categories/types/index.d.ts +1 -0
- package/dist/features/collections/schemas/index.d.ts +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +2 -2
- package/dist/features/events/components/AdminEventsView.d.ts +4 -1
- package/dist/features/events/components/AdminEventsView.js +64 -38
- package/dist/features/events/components/EventCard.js +1 -1
- package/dist/features/events/components/EventFilters.js +1 -1
- package/dist/features/events/components/EventPollWidget.d.ts +12 -0
- package/dist/features/events/components/EventPollWidget.js +62 -0
- package/dist/features/events/components/EventsIndexListing.js +57 -5
- package/dist/features/events/components/EventsListPageView.js +1 -1
- package/dist/features/events/components/index.d.ts +2 -0
- package/dist/features/events/components/index.js +1 -0
- package/dist/features/events/hooks/useEvents.d.ts +1 -0
- package/dist/features/events/hooks/useEvents.js +1 -0
- package/dist/features/events/repository/events.repository.js +3 -0
- package/dist/features/events/schemas/firestore.d.ts +1 -0
- package/dist/features/events/schemas/index.d.ts +44 -0
- package/dist/features/events/types/index.d.ts +2 -0
- package/dist/features/faq/actions/faq-actions.d.ts +16 -16
- package/dist/features/faq/hooks/useFaqList.js +1 -1
- package/dist/features/faq/schemas/firestore.d.ts +2 -2
- package/dist/features/faq/schemas/firestore.js +2 -1
- package/dist/features/faq/schemas/index.d.ts +4 -4
- package/dist/features/filters/FilterFacetSection.d.ts +1 -0
- package/dist/features/filters/FilterFacetSection.js +13 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/grouped/schemas/firestore.d.ts +32 -0
- package/dist/features/grouped/schemas/firestore.js +19 -0
- package/dist/features/homepage/components/AdSlot.d.ts +1 -3
- package/dist/features/homepage/components/AdSlot.js +15 -14
- package/dist/features/homepage/components/BlogArticlesSection.d.ts +3 -1
- package/dist/features/homepage/components/BlogArticlesSection.js +2 -2
- package/dist/features/homepage/components/BrandsSection.d.ts +3 -1
- package/dist/features/homepage/components/BrandsSection.js +4 -3
- package/dist/features/homepage/components/CustomCardsSection.d.ts +3 -0
- package/dist/features/homepage/components/CustomCardsSection.js +76 -0
- package/dist/features/homepage/components/EventsSection.d.ts +3 -1
- package/dist/features/homepage/components/EventsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedAuctionsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedPreOrdersSection.js +2 -2
- package/dist/features/homepage/components/FeaturedProductsSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedProductsSection.js +8 -3
- package/dist/features/homepage/components/FeaturedStoresSection.d.ts +3 -1
- package/dist/features/homepage/components/FeaturedStoresSection.js +2 -2
- package/dist/features/homepage/components/GoogleReviewsSection.d.ts +3 -0
- package/dist/features/homepage/components/GoogleReviewsSection.js +65 -0
- package/dist/features/homepage/components/HeroCarousel.js +128 -84
- package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +2 -20
- package/dist/features/homepage/components/MarketplaceHomepageView.js +73 -230
- package/dist/features/homepage/components/SectionCarousel.d.ts +1 -1
- package/dist/features/homepage/components/SectionCarousel.js +2 -0
- package/dist/features/homepage/components/ShopByCategorySection.d.ts +3 -1
- package/dist/features/homepage/components/ShopByCategorySection.js +8 -4
- package/dist/features/homepage/components/SocialFeedSection.d.ts +3 -0
- package/dist/features/homepage/components/SocialFeedSection.js +86 -0
- package/dist/features/homepage/components/SocialPostCard.d.ts +7 -0
- package/dist/features/homepage/components/SocialPostCard.js +39 -0
- package/dist/features/homepage/components/StatsCounterSection.js +1 -1
- package/dist/features/homepage/components/WelcomeSection.js +1 -1
- package/dist/features/homepage/components/WhatsAppCommunitySection.js +1 -1
- package/dist/features/homepage/hooks/useActiveAd.d.ts +23 -0
- package/dist/features/homepage/hooks/useActiveAd.js +20 -0
- package/dist/features/homepage/hooks/useBlogArticles.d.ts +1 -0
- package/dist/features/homepage/hooks/useBlogArticles.js +10 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +4 -1
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +8 -4
- package/dist/features/homepage/hooks/useFeaturedPreOrders.d.ts +4 -1
- package/dist/features/homepage/hooks/useFeaturedPreOrders.js +8 -4
- package/dist/features/homepage/hooks/useFeaturedProducts.d.ts +1 -0
- package/dist/features/homepage/hooks/useFeaturedProducts.js +6 -3
- package/dist/features/homepage/hooks/useFeaturedStores.d.ts +3 -1
- package/dist/features/homepage/hooks/useFeaturedStores.js +2 -1
- package/dist/features/homepage/hooks/useHomepageEvents.d.ts +3 -1
- package/dist/features/homepage/hooks/useHomepageEvents.js +2 -1
- package/dist/features/homepage/hooks/useTopBrands.d.ts +3 -1
- package/dist/features/homepage/hooks/useTopBrands.js +2 -1
- package/dist/features/homepage/index.d.ts +2 -0
- package/dist/features/homepage/index.js +1 -0
- package/dist/features/homepage/lib/google-reviews-fetcher.d.ts +14 -0
- package/dist/features/homepage/lib/google-reviews-fetcher.js +27 -0
- package/dist/features/homepage/lib/live-stats.d.ts +14 -0
- package/dist/features/homepage/lib/live-stats.js +62 -0
- package/dist/features/homepage/lib/section-defaults.d.ts +11 -0
- package/dist/features/homepage/lib/section-defaults.js +45 -0
- package/dist/features/homepage/lib/section-helpers.d.ts +5 -0
- package/dist/features/homepage/lib/section-helpers.js +25 -0
- package/dist/features/homepage/lib/section-renderer.d.ts +33 -0
- package/dist/features/homepage/lib/section-renderer.js +164 -0
- package/dist/features/homepage/lib/social-feed-fetcher.d.ts +5 -0
- package/dist/features/homepage/lib/social-feed-fetcher.js +193 -0
- package/dist/features/homepage/schemas/firestore.d.ts +180 -29
- package/dist/features/homepage/schemas/firestore.js +5 -0
- package/dist/features/homepage/types/index.d.ts +48 -19
- package/dist/features/layout/AppLayoutShell.d.ts +6 -1
- package/dist/features/layout/AppLayoutShell.js +25 -9
- package/dist/features/layout/BottomActions.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +15 -1
- package/dist/features/layout/BottomNavbar.js +8 -2
- package/dist/features/layout/FooterLayout.d.ts +7 -1
- package/dist/features/layout/FooterLayout.js +3 -3
- package/dist/features/layout/ListingLayout.js +2 -2
- package/dist/features/layout/MainNavbar.d.ts +6 -14
- package/dist/features/layout/MainNavbar.js +4 -16
- package/dist/features/layout/NavItem.js +1 -1
- package/dist/features/layout/NavbarLayout.d.ts +3 -1
- package/dist/features/layout/NavbarLayout.js +5 -5
- package/dist/features/layout/TitleBar.d.ts +4 -2
- package/dist/features/layout/TitleBar.js +5 -3
- package/dist/features/layout/TitleBarLayout.d.ts +3 -1
- package/dist/features/layout/TitleBarLayout.js +2 -2
- package/dist/features/layout/index.d.ts +1 -1
- package/dist/features/media/MediaPickerModal.d.ts +30 -0
- package/dist/features/media/MediaPickerModal.js +72 -0
- package/dist/features/media/index.d.ts +3 -1
- package/dist/features/media/index.js +1 -0
- package/dist/features/media/types/index.d.ts +12 -0
- package/dist/features/media/types/index.js +4 -2
- package/dist/features/media/upload/MediaUploadField.d.ts +5 -1
- package/dist/features/media/upload/MediaUploadField.js +56 -3
- package/dist/features/messages/schemas/firestore.d.ts +36 -0
- package/dist/features/messages/schemas/firestore.js +16 -0
- package/dist/features/orders/repository/orders.repository.d.ts +2 -2
- package/dist/features/orders/repository/orders.repository.js +2 -2
- package/dist/features/orders/schemas/firestore.d.ts +17 -4
- package/dist/features/orders/schemas/firestore.js +2 -2
- package/dist/features/orders/schemas/index.d.ts +18 -18
- package/dist/features/orders/schemas/index.js +3 -3
- package/dist/features/orders/types/index.d.ts +1 -1
- package/dist/features/orders/utils/order-splitter.d.ts +1 -1
- package/dist/features/orders/utils/order-splitter.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +4 -4
- package/dist/features/payments/repository/payout.repository.js +7 -7
- package/dist/features/payments/schemas/firestore.d.ts +6 -6
- package/dist/features/payments/schemas/firestore.js +6 -6
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +11 -10
- package/dist/features/pre-orders/components/PreOrderActionsClient.d.ts +11 -0
- package/dist/features/pre-orders/components/PreOrderActionsClient.js +28 -0
- package/dist/features/pre-orders/components/PreOrderDetailPageView.d.ts +2 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +27 -9
- package/dist/features/pre-orders/components/PreOrderFilters.d.ts +3 -1
- package/dist/features/pre-orders/components/PreOrderFilters.js +9 -6
- package/dist/features/pre-orders/components/PreOrdersIndexListing.d.ts +3 -1
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +132 -36
- package/dist/features/pre-orders/components/PreOrdersListView.js +3 -3
- package/dist/features/pre-orders/components/PreorderCard.js +1 -1
- package/dist/features/pre-orders/schemas/index.d.ts +10 -0
- package/dist/features/products/actions/product-actions.d.ts +2 -2
- package/dist/features/products/actions/product-actions.js +5 -5
- package/dist/features/products/api/[id]/route.js +5 -2
- package/dist/features/products/api/route.js +10 -14
- package/dist/features/products/columns/productTableColumns.js +2 -2
- package/dist/features/products/components/AuctionDetailView.d.ts +2 -1
- package/dist/features/products/components/AuctionDetailView.js +2 -2
- package/dist/features/products/components/AuctionsIndexListing.d.ts +3 -1
- package/dist/features/products/components/AuctionsIndexListing.js +93 -31
- package/dist/features/products/components/BidHistory.d.ts +2 -1
- package/dist/features/products/components/BidHistory.js +18 -2
- package/dist/features/products/components/MakeOfferButton.d.ts +10 -0
- package/dist/features/products/components/MakeOfferButton.js +68 -0
- package/dist/features/products/components/ProductDetailPageView.d.ts +11 -1
- package/dist/features/products/components/ProductDetailPageView.js +27 -8
- package/dist/features/products/components/ProductFilters.d.ts +7 -1
- package/dist/features/products/components/ProductFilters.js +4 -2
- package/dist/features/products/components/ProductForm.d.ts +19 -1
- package/dist/features/products/components/ProductForm.js +24 -6
- package/dist/features/products/components/ProductGrid.d.ts +10 -2
- package/dist/features/products/components/ProductGrid.js +76 -29
- package/dist/features/products/components/ProductsIndexListing.js +131 -45
- package/dist/features/products/components/RelatedProductsCarousel.js +1 -1
- package/dist/features/products/components/ShareButton.d.ts +7 -0
- package/dist/features/products/components/ShareButton.js +22 -0
- package/dist/features/products/components/index.d.ts +2 -0
- package/dist/features/products/components/index.js +1 -0
- package/dist/features/products/hooks/useProducts.d.ts +7 -0
- package/dist/features/products/hooks/useProducts.js +6 -4
- package/dist/features/products/repository/products.repository.d.ts +4 -8
- package/dist/features/products/repository/products.repository.js +17 -50
- package/dist/features/products/schemas/firestore.d.ts +11 -9
- package/dist/features/products/schemas/firestore.js +11 -3
- package/dist/features/products/schemas/index.d.ts +51 -50
- package/dist/features/products/schemas/index.js +2 -5
- package/dist/features/products/types/index.d.ts +13 -5
- package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
- package/dist/features/promotions/actions/coupon-actions.js +1 -1
- package/dist/features/promotions/actions/seller-coupon-actions.js +11 -6
- package/dist/features/promotions/api/route.js +3 -3
- package/dist/features/promotions/components/CouponCard.js +16 -7
- package/dist/features/promotions/components/CouponsIndexListing.js +3 -9
- package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
- package/dist/features/promotions/hooks/usePromotions.js +2 -2
- package/dist/features/promotions/repository/coupons.repository.d.ts +21 -15
- package/dist/features/promotions/repository/coupons.repository.js +97 -125
- package/dist/features/promotions/schemas/firestore.d.ts +31 -2
- package/dist/features/promotions/schemas/firestore.js +29 -0
- package/dist/features/promotions/schemas/index.d.ts +9 -12
- package/dist/features/promotions/schemas/index.js +1 -2
- package/dist/features/promotions/types/index.d.ts +1 -2
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewDetailPageView.js +5 -9
- package/dist/features/reviews/components/ReviewFilters.js +1 -1
- package/dist/features/reviews/components/ReviewsIndexListing.js +58 -7
- package/dist/features/reviews/components/ReviewsList.js +2 -2
- package/dist/features/reviews/hooks/useReviews.d.ts +1 -0
- package/dist/features/reviews/hooks/useReviews.js +2 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +9 -4
- package/dist/features/reviews/repository/reviews.repository.js +18 -7
- package/dist/features/reviews/schemas/firestore.d.ts +5 -2
- package/dist/features/reviews/schemas/firestore.js +1 -0
- package/dist/features/reviews/schemas/index.d.ts +19 -16
- package/dist/features/reviews/schemas/index.js +3 -2
- package/dist/features/reviews/types/index.d.ts +3 -2
- package/dist/features/scams/actions/scam-actions.d.ts +29 -0
- package/dist/features/scams/actions/scam-actions.js +62 -0
- package/dist/features/scams/components/ScamProfileView.d.ts +10 -0
- package/dist/features/scams/components/ScamProfileView.js +51 -0
- package/dist/features/scams/components/ScamRegistryView.d.ts +6 -0
- package/dist/features/scams/components/ScamRegistryView.js +41 -0
- package/dist/features/scams/components/index.d.ts +4 -0
- package/dist/features/scams/components/index.js +2 -0
- package/dist/features/scams/constants/scam-types.d.ts +38 -0
- package/dist/features/scams/constants/scam-types.js +443 -0
- package/dist/features/scams/repository/scammer.repository.d.ts +67 -0
- package/dist/features/scams/repository/scammer.repository.js +160 -0
- package/dist/features/scams/schemas/firestore.d.ts +362 -0
- package/dist/features/scams/schemas/firestore.js +233 -0
- package/dist/features/search/components/Search.d.ts +12 -2
- package/dist/features/search/components/Search.js +26 -7
- package/dist/features/search/components/index.d.ts +1 -1
- package/dist/features/search/hooks/useNavSuggestions.d.ts +1 -1
- package/dist/features/search/hooks/useNavSuggestions.js +2 -2
- package/dist/features/search/schemas/index.d.ts +7 -7
- package/dist/features/seller/actions/offer-actions.js +52 -36
- package/dist/features/seller/actions/seller-actions.js +19 -13
- package/dist/features/seller/api/products/route.js +9 -4
- package/dist/features/seller/components/SellerAddressesView.d.ts +3 -12
- package/dist/features/seller/components/SellerAddressesView.js +144 -4
- package/dist/features/seller/components/SellerAuctionsView.js +58 -5
- package/dist/features/seller/components/SellerBidsView.d.ts +4 -0
- package/dist/features/seller/components/SellerBidsView.js +131 -0
- package/dist/features/seller/components/SellerCouponEditorView.d.ts +19 -0
- package/dist/features/seller/components/SellerCouponEditorView.js +67 -0
- package/dist/features/seller/components/SellerCouponsView.d.ts +5 -3
- package/dist/features/seller/components/SellerCouponsView.js +135 -13
- package/dist/features/seller/components/SellerCreateProductView.d.ts +4 -10
- package/dist/features/seller/components/SellerCreateProductView.js +4 -3
- package/dist/features/seller/components/SellerEditProductView.d.ts +4 -10
- package/dist/features/seller/components/SellerEditProductView.js +4 -3
- package/dist/features/seller/components/SellerOffersPanel.d.ts +20 -0
- package/dist/features/seller/components/SellerOffersPanel.js +138 -0
- package/dist/features/seller/components/SellerOffersView.js +56 -5
- package/dist/features/seller/components/SellerOrdersView.d.ts +2 -1
- package/dist/features/seller/components/SellerOrdersView.js +185 -16
- package/dist/features/seller/components/SellerPayoutRequestView.d.ts +7 -0
- package/dist/features/seller/components/SellerPayoutRequestView.js +63 -0
- package/dist/features/seller/components/SellerPayoutSettingsView.d.ts +3 -10
- package/dist/features/seller/components/SellerPayoutSettingsView.js +89 -3
- package/dist/features/seller/components/SellerPayoutsView.js +56 -5
- package/dist/features/seller/components/SellerProductShell.d.ts +68 -0
- package/dist/features/seller/components/SellerProductShell.js +179 -0
- package/dist/features/seller/components/SellerProductsView.d.ts +2 -3
- package/dist/features/seller/components/SellerProductsView.js +194 -18
- package/dist/features/seller/components/SellerReviewsView.d.ts +5 -0
- package/dist/features/seller/components/SellerReviewsView.js +100 -0
- package/dist/features/seller/components/SellerShippingView.d.ts +3 -11
- package/dist/features/seller/components/SellerShippingView.js +87 -3
- package/dist/features/seller/components/SellerSidebar.d.ts +11 -3
- package/dist/features/seller/components/SellerSidebar.js +52 -8
- package/dist/features/seller/components/SellerStorefrontView.d.ts +26 -11
- package/dist/features/seller/components/SellerStorefrontView.js +45 -7
- package/dist/features/seller/components/index.d.ts +16 -2
- package/dist/features/seller/components/index.js +7 -0
- package/dist/features/seller/hooks/useSellerListingData.d.ts +3 -1
- package/dist/features/seller/hooks/useSellerListingData.js +6 -4
- package/dist/features/seller/repository/offer.repository.d.ts +3 -3
- package/dist/features/seller/repository/offer.repository.js +6 -6
- package/dist/features/seller/schemas/firestore.d.ts +7 -7
- package/dist/features/seller/schemas/firestore.js +4 -4
- package/dist/features/seller/schemas/index.d.ts +16 -16
- package/dist/features/shell/FormShell.d.ts +29 -0
- package/dist/features/shell/FormShell.js +103 -0
- package/dist/features/shell/QuickFormDrawer.d.ts +29 -0
- package/dist/features/shell/QuickFormDrawer.js +117 -0
- package/dist/features/shell/StepForm.d.ts +44 -0
- package/dist/features/shell/StepForm.js +81 -0
- package/dist/features/shell/index.d.ts +6 -0
- package/dist/features/shell/index.js +3 -0
- package/dist/features/stores/actions/store-query-actions.js +3 -3
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/products/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/components/InteractiveStoreCard.d.ts +2 -2
- package/dist/features/stores/components/InteractiveStoreCard.js +21 -7
- package/dist/features/stores/components/StoreAboutView.js +1 -1
- package/dist/features/stores/components/StoreAuctionsListing.d.ts +5 -2
- package/dist/features/stores/components/StoreAuctionsListing.js +81 -8
- package/dist/features/stores/components/StoreAuctionsPageView.js +8 -7
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -0
- package/dist/features/stores/components/StoreDetailLayoutView.js +29 -5
- package/dist/features/stores/components/StoreHeader.js +2 -1
- package/dist/features/stores/components/StorePreOrdersListing.d.ts +4 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +59 -7
- package/dist/features/stores/components/StorePreOrdersPageView.js +8 -7
- package/dist/features/stores/components/StoreProductsListing.d.ts +5 -2
- package/dist/features/stores/components/StoreProductsListing.js +97 -8
- package/dist/features/stores/components/StoreProductsPageView.js +8 -7
- package/dist/features/stores/components/StoreReviewsListing.js +2 -2
- package/dist/features/stores/components/StoresIndexListing.js +74 -11
- package/dist/features/stores/components/StoresListView.js +1 -1
- package/dist/features/stores/hooks/useStores.d.ts +1 -0
- package/dist/features/stores/hooks/useStores.js +1 -0
- package/dist/features/stores/schemas/firestore.d.ts +34 -0
- package/dist/features/stores/schemas/index.d.ts +8 -8
- package/dist/features/sublisting/schemas/firestore.d.ts +30 -0
- package/dist/features/sublisting/schemas/firestore.js +19 -0
- package/dist/features/support/schemas/firestore.d.ts +113 -0
- package/dist/features/support/schemas/firestore.js +95 -0
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +5 -0
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +143 -0
- package/dist/features/whatsapp-bot/components/index.d.ts +2 -0
- package/dist/features/whatsapp-bot/components/index.js +1 -0
- package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +23 -1
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +104 -0
- package/dist/features/whatsapp-bot/server.d.ts +1 -0
- package/dist/features/whatsapp-bot/server.js +1 -0
- package/dist/features/whatsapp-bot/types/index.d.ts +49 -0
- package/dist/features/wishlist/components/WishlistView.d.ts +0 -10
- package/dist/features/wishlist/components/WishlistView.js +13 -6
- package/dist/features/wishlist/hooks/useWishlist.js +2 -0
- package/dist/features/wishlist/hooks/useWishlistCount.d.ts +11 -3
- package/dist/features/wishlist/hooks/useWishlistCount.js +89 -25
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/features/wishlist/schemas/index.d.ts +2 -2
- package/dist/features/wishlist/types/index.d.ts +16 -0
- package/dist/http/api-handler.js +8 -1
- package/dist/index.d.ts +114 -16
- package/dist/index.js +136 -28
- package/dist/monitoring/server-logger.js +9 -3
- package/dist/next/routing/route-map.d.ts +120 -6
- package/dist/next/routing/route-map.js +53 -2
- package/dist/providers/db-firebase/realtime.d.ts +1 -1
- package/dist/react/contexts/SessionContext.js +17 -26
- package/dist/react/hooks/useBulkSelection.d.ts +7 -24
- package/dist/react/hooks/useBulkSelection.js +27 -34
- package/dist/react/hooks/useLongPress.d.ts +3 -16
- package/dist/react/hooks/useLongPress.js +6 -25
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +2 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.js +2 -0
- package/dist/seed/actions/demo-seed-actions.d.ts +2 -2
- package/dist/seed/actions/demo-seed-actions.js +1 -1
- package/dist/seed/anime-figures-seed-data.d.ts +8 -0
- package/dist/seed/anime-figures-seed-data.js +1033 -0
- package/dist/seed/beyblade-seed-data.js +206 -24
- package/dist/seed/bids-seed-data.d.ts +4 -10
- package/dist/seed/bids-seed-data.js +365 -238
- package/dist/seed/blog-posts-seed-data.d.ts +3 -2
- package/dist/seed/blog-posts-seed-data.js +250 -511
- package/dist/seed/brands-seed-data.d.ts +7 -0
- package/dist/seed/brands-seed-data.js +410 -0
- package/dist/seed/carousel-slides-seed-data.d.ts +3 -2
- package/dist/seed/carousel-slides-seed-data.js +177 -216
- package/dist/seed/cart-seed-data.d.ts +9 -9
- package/dist/seed/cart-seed-data.js +73 -73
- package/dist/seed/categories-seed-data.d.ts +4 -2
- package/dist/seed/categories-seed-data.js +720 -879
- package/dist/seed/conversations-seed-data.d.ts +8 -0
- package/dist/seed/conversations-seed-data.js +388 -0
- package/dist/seed/cosplay-accessories-seed-data.d.ts +8 -0
- package/dist/seed/cosplay-accessories-seed-data.js +647 -0
- package/dist/seed/coupon-usage-seed-data.d.ts +25 -0
- package/dist/seed/coupon-usage-seed-data.js +69 -0
- package/dist/seed/coupons-seed-data.d.ts +6 -3
- package/dist/seed/coupons-seed-data.js +375 -3
- package/dist/seed/events-seed-data.d.ts +4 -2
- package/dist/seed/events-seed-data.js +128 -430
- package/dist/seed/factories/cart.factory.d.ts +0 -1
- package/dist/seed/factories/cart.factory.js +2 -2
- package/dist/seed/faq-seed-data.d.ts +11 -18
- package/dist/seed/faq-seed-data.js +786 -1817
- package/dist/seed/grouped-listings-seed-data.d.ts +8 -0
- package/dist/seed/grouped-listings-seed-data.js +201 -0
- package/dist/seed/homepage-sections-seed-data.d.ts +3 -13
- package/dist/seed/homepage-sections-seed-data.js +228 -252
- package/dist/seed/hot-wheels-seed-data.js +285 -38
- package/dist/seed/index.d.ts +12 -11
- package/dist/seed/index.js +10 -12
- package/dist/seed/letitrip-official-seed-data.d.ts +8 -0
- package/dist/seed/letitrip-official-seed-data.js +399 -0
- package/dist/seed/manifest.d.ts +15 -0
- package/dist/seed/manifest.js +140 -0
- package/dist/seed/notifications-seed-data.d.ts +4 -2
- package/dist/seed/notifications-seed-data.js +117 -440
- package/dist/seed/orders-seed-data.d.ts +4 -2
- package/dist/seed/orders-seed-data.js +1090 -521
- package/dist/seed/payouts-seed-data.d.ts +4 -2
- package/dist/seed/payouts-seed-data.js +522 -145
- package/dist/seed/pokemon-carousel-slides-seed-data.js +6 -1
- package/dist/seed/pokemon-categories-seed-data.js +81 -81
- package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +1 -1
- package/dist/seed/pokemon-homepage-sections-seed-data.js +116 -23
- package/dist/seed/pokemon-products-seed-data.d.ts +1 -1
- package/dist/seed/pokemon-products-seed-data.js +83 -73
- package/dist/seed/pokemon-seed-bundle.d.ts +5 -1
- package/dist/seed/pokemon-seed-bundle.js +21 -2
- package/dist/seed/pokemon-stores-seed-data.js +85 -9
- package/dist/seed/pokemon-users-seed-data.js +107 -8
- package/dist/seed/products-auctions-seed-data.d.ts +10 -0
- package/dist/seed/products-auctions-seed-data.js +689 -0
- package/dist/seed/products-preorders-seed-data.d.ts +9 -0
- package/dist/seed/products-preorders-seed-data.js +483 -0
- package/dist/seed/products-seed-data.js +34 -13
- package/dist/seed/products-standard-seed-data.d.ts +8 -0
- package/dist/seed/products-standard-seed-data.js +4179 -0
- package/dist/seed/retro-gaming-seed-data.d.ts +8 -0
- package/dist/seed/retro-gaming-seed-data.js +801 -0
- package/dist/seed/reviews-seed-data.d.ts +4 -17
- package/dist/seed/reviews-seed-data.js +1043 -515
- package/dist/seed/scammers-seed-data.d.ts +17 -0
- package/dist/seed/scammers-seed-data.js +118 -0
- package/dist/seed/site-settings-seed-data.js +25 -2
- package/dist/seed/store-addresses-seed-data.js +188 -84
- package/dist/seed/stores-seed-data.d.ts +3 -9
- package/dist/seed/stores-seed-data.js +212 -102
- package/dist/seed/sublisting-categories-seed-data.d.ts +7 -0
- package/dist/seed/sublisting-categories-seed-data.js +315 -0
- package/dist/seed/transformers-seed-data.js +34 -14
- package/dist/seed/users-seed-data.d.ts +3 -2
- package/dist/seed/users-seed-data.js +531 -440
- package/dist/seed/wishlists-seed-data.js +13 -13
- package/dist/server.d.ts +9 -2
- package/dist/server.js +12 -4
- package/dist/tokens/tokens.css +76 -31
- package/dist/ui/components/Avatar.style.css +10 -12
- package/dist/ui/components/BaseListingCard.d.ts +8 -3
- package/dist/ui/components/BaseListingCard.js +17 -6
- package/dist/ui/components/BaseListingCard.style.css +3 -1
- package/dist/ui/components/BulkActionsBar.d.ts +16 -0
- package/dist/ui/components/BulkActionsBar.js +22 -0
- package/dist/ui/components/Button.style.css +23 -23
- package/dist/ui/components/Card.style.css +60 -62
- package/dist/ui/components/Checkbox.style.css +19 -21
- package/dist/ui/components/DashboardStatsCard.style.css +12 -14
- package/dist/ui/components/Drawer.style.css +18 -14
- package/dist/ui/components/Dropdown.style.css +25 -27
- package/dist/ui/components/EmptyState.style.css +2 -4
- package/dist/ui/components/HorizontalScroller.d.ts +3 -1
- package/dist/ui/components/HorizontalScroller.js +116 -21
- package/dist/ui/components/HorizontalScroller.style.css +2 -2
- package/dist/ui/components/ImageLightbox.d.ts +0 -9
- package/dist/ui/components/ImageLightbox.js +43 -9
- package/dist/ui/components/InlineCreateSelect.d.ts +38 -0
- package/dist/ui/components/InlineCreateSelect.js +70 -0
- package/dist/ui/components/ListingLayout.style.css +41 -77
- package/dist/ui/components/ListingToolbar.d.ts +54 -0
- package/dist/ui/components/ListingToolbar.js +34 -0
- package/dist/ui/components/Modal.style.css +14 -10
- package/dist/ui/components/PageLoader.d.ts +11 -0
- package/dist/ui/components/PageLoader.js +21 -0
- package/dist/ui/components/Radio.style.css +34 -36
- package/dist/ui/components/RichTextEditor.js +1 -1
- package/dist/ui/components/RowActionMenu.d.ts +1 -0
- package/dist/ui/components/RowActionMenu.js +4 -2
- package/dist/ui/components/SectionTabs.js +1 -1
- package/dist/ui/components/SectionTabs.style.css +1 -0
- package/dist/ui/components/SideModal.style.css +4 -8
- package/dist/ui/components/Slider.style.css +2 -4
- package/dist/ui/components/Tabs.style.css +8 -10
- package/dist/ui/components/Toast.style.css +22 -24
- package/dist/ui/components/Toggle.style.css +11 -13
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/rich-text/RichText.js +2 -1
- package/dist/ui/rich-text/RichText.style.css +292 -5
- package/dist/ui/rich-text/RichTextRenderer.d.ts +15 -0
- package/dist/ui/rich-text/RichTextRenderer.js +15 -0
- package/dist/utils/id-generators.d.ts +10 -0
- package/dist/utils/id-generators.js +12 -0
- package/dist/validation/schemas.d.ts +9 -9
- package/package.json +5 -1
- package/README.md +0 -116
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { DatabaseError } from "../../../errors";
|
|
2
|
+
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
3
|
+
import { increment } from "../../../contracts/field-ops";
|
|
4
|
+
import { SCAMMER_COLLECTION, SCAMMER_FIELDS, SCAMMER_INCIDENTS_SUBCOLLECTION, SCAMMER_COMMENTS_SUBCOLLECTION, DEFAULT_SCAMMER_DATA, } from "../schemas/firestore";
|
|
5
|
+
class ScammerRepository extends BaseRepository {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(SCAMMER_COLLECTION);
|
|
8
|
+
}
|
|
9
|
+
async listVerified(model) {
|
|
10
|
+
const baseQuery = this.getCollection().where(SCAMMER_FIELDS.STATUS, "==", "verified");
|
|
11
|
+
return this.sieveQuery(model, ScammerRepository.SIEVE_FIELDS, {
|
|
12
|
+
baseQuery,
|
|
13
|
+
defaultPageSize: 20,
|
|
14
|
+
maxPageSize: 50,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async listAll(model) {
|
|
18
|
+
return this.sieveQuery(model, ScammerRepository.SIEVE_FIELDS, {
|
|
19
|
+
defaultPageSize: 50,
|
|
20
|
+
maxPageSize: 200,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async findBySeoSlug(seoSlug) {
|
|
24
|
+
try {
|
|
25
|
+
const snap = await this.getCollection()
|
|
26
|
+
.where(SCAMMER_FIELDS.SEO_SLUG, "==", seoSlug)
|
|
27
|
+
.limit(1)
|
|
28
|
+
.get();
|
|
29
|
+
if (snap.empty)
|
|
30
|
+
return null;
|
|
31
|
+
return this.mapDoc(snap.docs[0]);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new DatabaseError(`Failed to find scammer by seoSlug: ${error instanceof Error ? error.message : String(error)}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async create(input) {
|
|
38
|
+
try {
|
|
39
|
+
const now = new Date();
|
|
40
|
+
const id = input.displayNames[0]
|
|
41
|
+
? `scammer-${input.displayNames[0].toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "").slice(0, 40)}-${Date.now().toString(36)}`
|
|
42
|
+
: `scammer-${Date.now().toString(36)}`;
|
|
43
|
+
const data = prepareForFirestore({
|
|
44
|
+
...DEFAULT_SCAMMER_DATA,
|
|
45
|
+
...input,
|
|
46
|
+
id,
|
|
47
|
+
seoSlug: id,
|
|
48
|
+
relatedScammerIds: [],
|
|
49
|
+
mergedFromIds: [],
|
|
50
|
+
tags: [],
|
|
51
|
+
views: 0,
|
|
52
|
+
incidentCount: 0,
|
|
53
|
+
commentCount: 0,
|
|
54
|
+
contestCount: 0,
|
|
55
|
+
isContested: false,
|
|
56
|
+
status: "pending_review",
|
|
57
|
+
createdAt: now,
|
|
58
|
+
updatedAt: now,
|
|
59
|
+
});
|
|
60
|
+
await this.getCollection().doc(id).set(data);
|
|
61
|
+
return { ...data, id };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new DatabaseError(`Failed to create scammer profile: ${error instanceof Error ? error.message : String(error)}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async adminUpdate(id, input) {
|
|
68
|
+
try {
|
|
69
|
+
const data = prepareForFirestore({ ...input, updatedAt: new Date() });
|
|
70
|
+
await this.getCollection().doc(id).update(data);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw new DatabaseError(`Failed to update scammer profile: ${error instanceof Error ? error.message : String(error)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async incrementViews(id) {
|
|
77
|
+
try {
|
|
78
|
+
await this.getCollection()
|
|
79
|
+
.doc(id)
|
|
80
|
+
.update({ [SCAMMER_FIELDS.VIEWS]: increment(1) });
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Fire-and-forget by design.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Search for profiles whose phones, upiIds, emails, or displayNames arrays
|
|
88
|
+
* contain any of the given values. Used for duplicate detection on new reports.
|
|
89
|
+
*/
|
|
90
|
+
async findByContactField(field, value) {
|
|
91
|
+
try {
|
|
92
|
+
const snap = await this.getCollection()
|
|
93
|
+
.where(field, "array-contains", value)
|
|
94
|
+
.limit(5)
|
|
95
|
+
.get();
|
|
96
|
+
return snap.docs.map((d) => this.mapDoc(d));
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new DatabaseError(`Failed to search scammer by ${field}: ${error instanceof Error ? error.message : String(error)}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async listPublicIncidents(scammerId) {
|
|
103
|
+
try {
|
|
104
|
+
const snap = await this.db
|
|
105
|
+
.collection(SCAMMER_COLLECTION)
|
|
106
|
+
.doc(scammerId)
|
|
107
|
+
.collection(SCAMMER_INCIDENTS_SUBCOLLECTION)
|
|
108
|
+
.where("status", "==", "verified")
|
|
109
|
+
.orderBy("createdAt", "desc")
|
|
110
|
+
.limit(20)
|
|
111
|
+
.get();
|
|
112
|
+
return snap.docs.map((d) => this.mapDoc(d));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async listPublicComments(scammerId) {
|
|
119
|
+
try {
|
|
120
|
+
const snap = await this.db
|
|
121
|
+
.collection(SCAMMER_COLLECTION)
|
|
122
|
+
.doc(scammerId)
|
|
123
|
+
.collection(SCAMMER_COMMENTS_SUBCOLLECTION)
|
|
124
|
+
.where("isHidden", "==", false)
|
|
125
|
+
.orderBy("createdAt", "desc")
|
|
126
|
+
.limit(30)
|
|
127
|
+
.get();
|
|
128
|
+
return snap.docs.map((d) => this.mapDoc(d));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async findManyById(ids) {
|
|
135
|
+
if (!ids.length)
|
|
136
|
+
return [];
|
|
137
|
+
try {
|
|
138
|
+
const results = await Promise.all(ids.slice(0, 5).map((id) => this.findById(id).catch(() => null)));
|
|
139
|
+
return results.filter((d) => d !== null && d.status === "verified");
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
ScammerRepository.SIEVE_FIELDS = {
|
|
147
|
+
id: { canFilter: true, canSort: false },
|
|
148
|
+
status: { canFilter: true, canSort: true },
|
|
149
|
+
scamType: { canFilter: true, canSort: true },
|
|
150
|
+
scamPlatform: { canFilter: true, canSort: true },
|
|
151
|
+
reportedBy: { canFilter: true, canSort: false },
|
|
152
|
+
verifiedBy: { canFilter: true, canSort: false },
|
|
153
|
+
isContested: { canFilter: true, canSort: false },
|
|
154
|
+
views: { canFilter: false, canSort: true },
|
|
155
|
+
incidentCount: { canFilter: false, canSort: true },
|
|
156
|
+
createdAt: { canFilter: true, canSort: true },
|
|
157
|
+
updatedAt: { canFilter: false, canSort: true },
|
|
158
|
+
};
|
|
159
|
+
const scammerRepository = new ScammerRepository();
|
|
160
|
+
export { ScammerRepository, scammerRepository };
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scam Registry Firestore Document Types & Constants
|
|
3
|
+
*
|
|
4
|
+
* Data model:
|
|
5
|
+
* scammerProfiles/{id} — canonical scammer identity (one per person)
|
|
6
|
+
* scammerProfiles/{id}/incidents/{id} — individual victim reports linked to this profile
|
|
7
|
+
* scammerProfiles/{id}/comments/{id} — public discussion; accused can post here
|
|
8
|
+
* scammerProfiles/{id}/contests/{id} — dispute submissions (accused or any user)
|
|
9
|
+
*
|
|
10
|
+
* SEO design intent: phones, UPI IDs, and emails are stored as plaintext and
|
|
11
|
+
* rendered as HTML text nodes so search engines index them. When a victim googles
|
|
12
|
+
* the number/UPI they received, this page must surface.
|
|
13
|
+
*
|
|
14
|
+
* Submission rules (enforced server-side):
|
|
15
|
+
* - Requires authentication (no guest submissions)
|
|
16
|
+
* - Requires scamAwarenessAcknowledgedAt on UserDocument
|
|
17
|
+
* - No submission if user has report_scammers soft ban
|
|
18
|
+
* - Max 5 pending submissions per user (prevents spam flooding)
|
|
19
|
+
* - All submissions start as "pending_review" — admin must verify before public display
|
|
20
|
+
*
|
|
21
|
+
* Suggestion matching (duplicate detection):
|
|
22
|
+
* - On new report submission, API queries existing profiles for overlapping
|
|
23
|
+
* phones[], upiIds[], emails[], displayNames[]
|
|
24
|
+
* - If matches found → suggest linking to existing profile (new incident) instead of new profile
|
|
25
|
+
* - SCAMMER_MATCH_FIELDS lists the Firestore array-contains fields used for this query
|
|
26
|
+
*/
|
|
27
|
+
import type { ScamType } from "../constants/scam-types";
|
|
28
|
+
export declare const ScammerStatusValues: {
|
|
29
|
+
readonly PENDING_REVIEW: "pending_review";
|
|
30
|
+
readonly VERIFIED: "verified";
|
|
31
|
+
readonly REJECTED: "rejected";
|
|
32
|
+
readonly REMOVED: "removed";
|
|
33
|
+
};
|
|
34
|
+
export type ScammerStatus = (typeof ScammerStatusValues)[keyof typeof ScammerStatusValues];
|
|
35
|
+
export declare const ScamPlatformValues: {
|
|
36
|
+
readonly WHATSAPP: "whatsapp";
|
|
37
|
+
readonly INSTAGRAM: "instagram";
|
|
38
|
+
readonly FACEBOOK: "facebook";
|
|
39
|
+
readonly TELEGRAM: "telegram";
|
|
40
|
+
readonly TWITTER: "twitter";
|
|
41
|
+
readonly OLX: "olx";
|
|
42
|
+
readonly FACEBOOK_MARKETPLACE: "facebook_marketplace";
|
|
43
|
+
readonly LETITRIP: "letitrip";
|
|
44
|
+
readonly IN_PERSON: "in_person";
|
|
45
|
+
readonly PHONE_CALL: "phone_call";
|
|
46
|
+
readonly OTHER: "other";
|
|
47
|
+
};
|
|
48
|
+
export type ScamPlatform = (typeof ScamPlatformValues)[keyof typeof ScamPlatformValues];
|
|
49
|
+
export declare const SocialPlatformValues: {
|
|
50
|
+
readonly INSTAGRAM: "instagram";
|
|
51
|
+
readonly FACEBOOK: "facebook";
|
|
52
|
+
readonly TWITTER: "twitter";
|
|
53
|
+
readonly YOUTUBE: "youtube";
|
|
54
|
+
readonly TELEGRAM: "telegram";
|
|
55
|
+
readonly WHATSAPP: "whatsapp";
|
|
56
|
+
readonly LINKEDIN: "linkedin";
|
|
57
|
+
readonly OLX: "olx";
|
|
58
|
+
readonly OTHER: "other";
|
|
59
|
+
};
|
|
60
|
+
export type SocialPlatform = (typeof SocialPlatformValues)[keyof typeof SocialPlatformValues];
|
|
61
|
+
export declare const ContestTypeValues: {
|
|
62
|
+
/** The named person claims they never scammed anyone. */
|
|
63
|
+
readonly ACCUSED_CONTESTING: "accused_contesting";
|
|
64
|
+
/** Any user flags the entire report as fabricated. */
|
|
65
|
+
readonly FALSE_REPORT: "false_report";
|
|
66
|
+
/** A detail is wrong (wrong phone, wrong name) but the scam is real. */
|
|
67
|
+
readonly INACCURATE_DETAILS: "inaccurate_details";
|
|
68
|
+
/** The name/alias matches but it's a different person entirely. */
|
|
69
|
+
readonly IDENTITY_MISTAKEN: "identity_mistaken";
|
|
70
|
+
};
|
|
71
|
+
export type ContestType = (typeof ContestTypeValues)[keyof typeof ContestTypeValues];
|
|
72
|
+
export declare const ContestStatusValues: {
|
|
73
|
+
readonly PENDING: "pending";
|
|
74
|
+
/** Contest accepted — profile edited or removed. */
|
|
75
|
+
readonly UPHELD: "upheld";
|
|
76
|
+
/** Contest rejected — report stands as verified. */
|
|
77
|
+
readonly DISMISSED: "dismissed";
|
|
78
|
+
};
|
|
79
|
+
export type ContestStatus = (typeof ContestStatusValues)[keyof typeof ContestStatusValues];
|
|
80
|
+
export interface ScammerSocialMedia {
|
|
81
|
+
platform: SocialPlatform;
|
|
82
|
+
/** Raw handle without @ prefix — stored as plaintext for SEO indexing. */
|
|
83
|
+
handle: string;
|
|
84
|
+
url?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface ScammerDocument {
|
|
87
|
+
id: string;
|
|
88
|
+
/** URL-safe slug — used in /scams/[slug]. Same as id. */
|
|
89
|
+
seoSlug: string;
|
|
90
|
+
/**
|
|
91
|
+
* Display names / aliases used by the scammer.
|
|
92
|
+
* Stored as plaintext array — all are indexed for suggestion matching.
|
|
93
|
+
*/
|
|
94
|
+
displayNames: string[];
|
|
95
|
+
/**
|
|
96
|
+
* Phone numbers in any format. Stored plaintext for SEO.
|
|
97
|
+
* Deduplication (trim, strip spaces/dashes) done server-side on write.
|
|
98
|
+
*/
|
|
99
|
+
phones: string[];
|
|
100
|
+
/**
|
|
101
|
+
* UPI IDs (e.g. 9876543210@paytm). Stored plaintext.
|
|
102
|
+
* Victims often google UPI IDs before paying — critical for SEO.
|
|
103
|
+
*/
|
|
104
|
+
upiIds: string[];
|
|
105
|
+
/** Email addresses used by the scammer. Stored plaintext for SEO. */
|
|
106
|
+
emails: string[];
|
|
107
|
+
/** Social media profiles where the scammer operated. */
|
|
108
|
+
socialMedia: ScammerSocialMedia[];
|
|
109
|
+
/** Primary scam type for this profile (most common across incidents). */
|
|
110
|
+
scamType: ScamType;
|
|
111
|
+
/** Platform where the initial/primary scam interaction occurred. */
|
|
112
|
+
scamPlatform: ScamPlatform;
|
|
113
|
+
/** Reporter's narrative for the first/primary incident. */
|
|
114
|
+
description: string;
|
|
115
|
+
/** Amount lost in INR paise (0 if none). Optional. */
|
|
116
|
+
amountLost?: number;
|
|
117
|
+
/** Item involved in the scam (e.g. "Charizard PSA 9"). Optional. */
|
|
118
|
+
itemInvolved?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Evidence URLs for the primary incident.
|
|
121
|
+
* Must be /media/ proxy URLs — never raw Firebase Storage URLs.
|
|
122
|
+
*/
|
|
123
|
+
evidence: string[];
|
|
124
|
+
/** UID of the user who first reported this scammer. */
|
|
125
|
+
reportedBy: string;
|
|
126
|
+
/**
|
|
127
|
+
* If true, reporter's identity is hidden on the public page.
|
|
128
|
+
* Admin records keep the uid; public page shows "Anonymous".
|
|
129
|
+
*/
|
|
130
|
+
reportedByAnon: boolean;
|
|
131
|
+
status: ScammerStatus;
|
|
132
|
+
/** UID of admin/employee who verified or rejected. */
|
|
133
|
+
verifiedBy?: string;
|
|
134
|
+
verifiedAt?: Date;
|
|
135
|
+
/** Internal note from the verifier — never shown publicly. */
|
|
136
|
+
verificationNote?: string;
|
|
137
|
+
/**
|
|
138
|
+
* Cross-links to other profiles that are the same person under different aliases.
|
|
139
|
+
* Used for "Also reported as:" links and merge context.
|
|
140
|
+
*/
|
|
141
|
+
relatedScammerIds: string[];
|
|
142
|
+
/**
|
|
143
|
+
* IDs of profiles that were merged INTO this one.
|
|
144
|
+
* Old profile pages redirect here; search results de-dup on these.
|
|
145
|
+
*/
|
|
146
|
+
mergedFromIds?: string[];
|
|
147
|
+
/** Admin/system tags for internal filtering (e.g. "high_value", "repeat_offender"). */
|
|
148
|
+
tags: string[];
|
|
149
|
+
/** Page view counter — incremented server-side. */
|
|
150
|
+
views: number;
|
|
151
|
+
/** Total verified + pending incident reports linked to this profile. */
|
|
152
|
+
incidentCount: number;
|
|
153
|
+
/** Total visible (non-hidden) comments on this profile. */
|
|
154
|
+
commentCount: number;
|
|
155
|
+
/** Total open (pending) contest submissions. */
|
|
156
|
+
contestCount: number;
|
|
157
|
+
/**
|
|
158
|
+
* True when ≥1 pending contest exists — surfaces in admin moderation queue.
|
|
159
|
+
* Reset to false when all contests are reviewed.
|
|
160
|
+
*/
|
|
161
|
+
isContested?: boolean;
|
|
162
|
+
createdAt: Date;
|
|
163
|
+
updatedAt: Date;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* One victim's report linked to an existing scammer profile.
|
|
167
|
+
*
|
|
168
|
+
* When a new submission matches an existing verified profile's phones/UPIs/emails,
|
|
169
|
+
* it is stored here instead of creating a duplicate top-level profile.
|
|
170
|
+
* The public detail page shows these in a table ("Other victims who reported this person").
|
|
171
|
+
*/
|
|
172
|
+
export interface ScammerIncidentDocument {
|
|
173
|
+
/** Firestore auto-ID — incidents never get semantic slugs. */
|
|
174
|
+
id: string;
|
|
175
|
+
/** Parent ScammerDocument id. */
|
|
176
|
+
scammerId: string;
|
|
177
|
+
reportedBy: string;
|
|
178
|
+
reportedByAnon: boolean;
|
|
179
|
+
scamType: ScamType;
|
|
180
|
+
scamPlatform: ScamPlatform;
|
|
181
|
+
description: string;
|
|
182
|
+
amountLost?: number;
|
|
183
|
+
itemInvolved?: string;
|
|
184
|
+
/** Evidence for this specific incident. /media/ proxy URLs only. */
|
|
185
|
+
evidence: string[];
|
|
186
|
+
/**
|
|
187
|
+
* Which contact details from this incident matched the parent profile.
|
|
188
|
+
* Stored so the admin can see why this was linked (not for public display).
|
|
189
|
+
*/
|
|
190
|
+
matchedPhones?: string[];
|
|
191
|
+
matchedUpiIds?: string[];
|
|
192
|
+
matchedEmails?: string[];
|
|
193
|
+
matchedNames?: string[];
|
|
194
|
+
/**
|
|
195
|
+
* Incidents follow the same review workflow as top-level profiles.
|
|
196
|
+
* pending_review → verified | rejected
|
|
197
|
+
*/
|
|
198
|
+
status: ScammerStatus;
|
|
199
|
+
verifiedBy?: string;
|
|
200
|
+
verifiedAt?: Date;
|
|
201
|
+
createdAt: Date;
|
|
202
|
+
}
|
|
203
|
+
export type ScammerIncidentCreateInput = Pick<ScammerIncidentDocument, "scammerId" | "reportedBy" | "reportedByAnon" | "scamType" | "scamPlatform" | "description" | "amountLost" | "itemInvolved" | "evidence" | "matchedPhones" | "matchedUpiIds" | "matchedEmails" | "matchedNames">;
|
|
204
|
+
export declare const SCAMMER_INCIDENTS_SUBCOLLECTION: "incidents";
|
|
205
|
+
export declare const DEFAULT_SCAMMER_INCIDENT_DATA: Partial<ScammerIncidentDocument>;
|
|
206
|
+
/**
|
|
207
|
+
* Public comment on a scammer profile page.
|
|
208
|
+
*
|
|
209
|
+
* Purpose: victims share additional context; the accused person can post their
|
|
210
|
+
* side of the story (isAccused flag); admins can post official notes.
|
|
211
|
+
*
|
|
212
|
+
* Rules:
|
|
213
|
+
* - Requires authentication — no anonymous comments
|
|
214
|
+
* - Max 500 chars per comment
|
|
215
|
+
* - isAccused is self-declared — admin reviews and can set isAccusedVerified
|
|
216
|
+
* - Hidden comments are still stored but not rendered to public
|
|
217
|
+
*/
|
|
218
|
+
export interface ScammerCommentDocument {
|
|
219
|
+
/** Firestore auto-ID. */
|
|
220
|
+
id: string;
|
|
221
|
+
scammerId: string;
|
|
222
|
+
authorId: string;
|
|
223
|
+
/** Denormalized — shown on comment. Anonymous if user deleted account. */
|
|
224
|
+
authorDisplayName: string;
|
|
225
|
+
authorRole: "user" | "support" | "admin";
|
|
226
|
+
/**
|
|
227
|
+
* Self-declared flag: commenter claims to be the person named in this profile.
|
|
228
|
+
* Admin should review before surfacing with visual "Accused" badge.
|
|
229
|
+
*/
|
|
230
|
+
isAccused: boolean;
|
|
231
|
+
/** Set by admin after verification. Governs the public "Accused" badge. */
|
|
232
|
+
isAccusedVerified?: boolean;
|
|
233
|
+
/**
|
|
234
|
+
* True when the commenter had an order matching this scammer's identity
|
|
235
|
+
* and the orderId is linked — shows "Verified Victim" badge.
|
|
236
|
+
*/
|
|
237
|
+
isVerifiedVictim: boolean;
|
|
238
|
+
/** Order ID used to verify victim status. Never shown on public page. */
|
|
239
|
+
linkedOrderId?: string;
|
|
240
|
+
/** Plain text, max 500 chars. */
|
|
241
|
+
body: string;
|
|
242
|
+
/** Simple upvote count — incremented server-side, never decremented. */
|
|
243
|
+
upvotes: number;
|
|
244
|
+
/** Admin moderation — hidden comments stay in DB for audit. */
|
|
245
|
+
isHidden: boolean;
|
|
246
|
+
hiddenBy?: string;
|
|
247
|
+
hiddenReason?: string;
|
|
248
|
+
createdAt: Date;
|
|
249
|
+
updatedAt?: Date;
|
|
250
|
+
}
|
|
251
|
+
export type ScammerCommentCreateInput = Pick<ScammerCommentDocument, "scammerId" | "authorId" | "authorDisplayName" | "authorRole" | "isAccused" | "isVerifiedVictim" | "linkedOrderId" | "body">;
|
|
252
|
+
export declare const SCAMMER_COMMENTS_SUBCOLLECTION: "comments";
|
|
253
|
+
export declare const DEFAULT_SCAMMER_COMMENT_DATA: Partial<ScammerCommentDocument>;
|
|
254
|
+
/** Max comment length enforced at API level. */
|
|
255
|
+
export declare const MAX_COMMENT_BODY_LENGTH = 500;
|
|
256
|
+
/**
|
|
257
|
+
* Dispute submission against a scammer profile.
|
|
258
|
+
*
|
|
259
|
+
* Two entry points on the public page:
|
|
260
|
+
* 1. "I am falsely accused" → type: accused_contesting (the named person)
|
|
261
|
+
* 2. "Report as inaccurate / false" → type: false_report | inaccurate_details | identity_mistaken
|
|
262
|
+
*
|
|
263
|
+
* All contests start as "pending" and surface in the admin moderation queue
|
|
264
|
+
* (scammerProfiles.isContested = true). Admin upholds or dismisses.
|
|
265
|
+
* On uphold: admin edits profile manually before marking upheld.
|
|
266
|
+
* On dismiss: profile status is unchanged; contest is archived.
|
|
267
|
+
*/
|
|
268
|
+
export interface ScammerContestDocument {
|
|
269
|
+
/** Firestore auto-ID. */
|
|
270
|
+
id: string;
|
|
271
|
+
scammerId: string;
|
|
272
|
+
contestType: ContestType;
|
|
273
|
+
contestedBy: string;
|
|
274
|
+
/**
|
|
275
|
+
* If true, contest submitter is anonymous on public-facing displays.
|
|
276
|
+
* UID is always stored for admin audit.
|
|
277
|
+
*/
|
|
278
|
+
contestedByAnon: boolean;
|
|
279
|
+
/** Contestant's explanation. Plain text, max 2000 chars. */
|
|
280
|
+
explanation: string;
|
|
281
|
+
/**
|
|
282
|
+
* Supporting evidence (e.g. proof of identity, transaction records).
|
|
283
|
+
* /media/ proxy URLs only.
|
|
284
|
+
*/
|
|
285
|
+
evidence: string[];
|
|
286
|
+
status: ContestStatus;
|
|
287
|
+
/** UID of admin/employee who reviewed. */
|
|
288
|
+
reviewedBy?: string;
|
|
289
|
+
reviewedAt?: Date;
|
|
290
|
+
/** Internal note — never shown to contest submitter or public. */
|
|
291
|
+
reviewNote?: string;
|
|
292
|
+
createdAt: Date;
|
|
293
|
+
}
|
|
294
|
+
export type ScammerContestCreateInput = Pick<ScammerContestDocument, "scammerId" | "contestType" | "contestedBy" | "contestedByAnon" | "explanation" | "evidence">;
|
|
295
|
+
export declare const SCAMMER_CONTESTS_SUBCOLLECTION: "contests";
|
|
296
|
+
export declare const DEFAULT_SCAMMER_CONTEST_DATA: Partial<ScammerContestDocument>;
|
|
297
|
+
export declare const CONTEST_TYPE_LABELS: Record<ContestType, string>;
|
|
298
|
+
export declare const CONTEST_STATUS_LABELS: Record<ContestStatus, string>;
|
|
299
|
+
/**
|
|
300
|
+
* Fields used to detect duplicate scammer profiles when a new report is submitted.
|
|
301
|
+
* API queries array-contains on each of these fields against the new report's values.
|
|
302
|
+
* Results are returned as "suggested existing profiles" for the reporter to confirm.
|
|
303
|
+
*
|
|
304
|
+
* Priority order: phones > upiIds > emails > displayNames
|
|
305
|
+
* A match on phones or upiIds is considered a strong match (likely same person).
|
|
306
|
+
* A match on displayNames only is a weak match (shown as "possibly same person").
|
|
307
|
+
*/
|
|
308
|
+
export declare const SCAMMER_MATCH_FIELDS: readonly ["phones", "upiIds", "emails", "displayNames"];
|
|
309
|
+
export type ScammerMatchField = (typeof SCAMMER_MATCH_FIELDS)[number];
|
|
310
|
+
/** Match strength returned by the suggestion API. */
|
|
311
|
+
export type ScammerMatchStrength = "strong" | "weak";
|
|
312
|
+
export interface ScammerSuggestion {
|
|
313
|
+
scammerId: string;
|
|
314
|
+
seoSlug: string;
|
|
315
|
+
displayNames: string[];
|
|
316
|
+
status: ScammerStatus;
|
|
317
|
+
/** Which fields caused this suggestion. */
|
|
318
|
+
matchedOn: ScammerMatchField[];
|
|
319
|
+
matchStrength: ScammerMatchStrength;
|
|
320
|
+
}
|
|
321
|
+
export declare const SCAMMER_COLLECTION: "scammerProfiles";
|
|
322
|
+
export declare const SCAMMER_ID_PREFIX: "scammer-";
|
|
323
|
+
export declare const SCAMMER_INDEXED_FIELDS: readonly ["status", "scamType", "scamPlatform", "reportedBy", "verifiedBy", "isContested", "views", "incidentCount", "createdAt", "updatedAt"];
|
|
324
|
+
export declare const DEFAULT_SCAMMER_DATA: Partial<ScammerDocument>;
|
|
325
|
+
/** Max pending submissions per user — prevents spam flooding. */
|
|
326
|
+
export declare const MAX_PENDING_SCAMMER_REPORTS_PER_USER = 5;
|
|
327
|
+
export type ScammerCreateInput = Pick<ScammerDocument, "displayNames" | "phones" | "upiIds" | "emails" | "socialMedia" | "scamType" | "scamPlatform" | "description" | "amountLost" | "itemInvolved" | "evidence" | "reportedBy" | "reportedByAnon">;
|
|
328
|
+
export type ScammerAdminUpdateInput = Partial<Pick<ScammerDocument, "status" | "verifiedBy" | "verifiedAt" | "verificationNote" | "relatedScammerIds" | "mergedFromIds" | "tags" | "displayNames" | "phones" | "upiIds" | "emails" | "socialMedia" | "isContested">>;
|
|
329
|
+
export declare const SCAMMER_FIELDS: {
|
|
330
|
+
readonly ID: "id";
|
|
331
|
+
readonly SEO_SLUG: "seoSlug";
|
|
332
|
+
readonly DISPLAY_NAMES: "displayNames";
|
|
333
|
+
readonly PHONES: "phones";
|
|
334
|
+
readonly UPI_IDS: "upiIds";
|
|
335
|
+
readonly EMAILS: "emails";
|
|
336
|
+
readonly SOCIAL_MEDIA: "socialMedia";
|
|
337
|
+
readonly SCAM_TYPE: "scamType";
|
|
338
|
+
readonly SCAM_PLATFORM: "scamPlatform";
|
|
339
|
+
readonly DESCRIPTION: "description";
|
|
340
|
+
readonly AMOUNT_LOST: "amountLost";
|
|
341
|
+
readonly ITEM_INVOLVED: "itemInvolved";
|
|
342
|
+
readonly EVIDENCE: "evidence";
|
|
343
|
+
readonly REPORTED_BY: "reportedBy";
|
|
344
|
+
readonly REPORTED_BY_ANON: "reportedByAnon";
|
|
345
|
+
readonly STATUS: "status";
|
|
346
|
+
readonly VERIFIED_BY: "verifiedBy";
|
|
347
|
+
readonly VERIFIED_AT: "verifiedAt";
|
|
348
|
+
readonly VERIFICATION_NOTE: "verificationNote";
|
|
349
|
+
readonly RELATED_SCAMMER_IDS: "relatedScammerIds";
|
|
350
|
+
readonly MERGED_FROM_IDS: "mergedFromIds";
|
|
351
|
+
readonly TAGS: "tags";
|
|
352
|
+
readonly VIEWS: "views";
|
|
353
|
+
readonly INCIDENT_COUNT: "incidentCount";
|
|
354
|
+
readonly COMMENT_COUNT: "commentCount";
|
|
355
|
+
readonly CONTEST_COUNT: "contestCount";
|
|
356
|
+
readonly IS_CONTESTED: "isContested";
|
|
357
|
+
readonly CREATED_AT: "createdAt";
|
|
358
|
+
readonly UPDATED_AT: "updatedAt";
|
|
359
|
+
};
|
|
360
|
+
export declare const SCAM_PLATFORM_LABELS: Record<ScamPlatform, string>;
|
|
361
|
+
export declare const SOCIAL_PLATFORM_LABELS: Record<SocialPlatform, string>;
|
|
362
|
+
export declare const SCAMMER_STATUS_LABELS: Record<ScammerStatus, string>;
|