@mohasinac/appkit 2.3.1 → 2.4.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/client.d.ts +54 -18
- package/dist/client.js +29 -10
- package/dist/constants/api-endpoints.d.ts +384 -22
- package/dist/constants/api-endpoints.js +68 -13
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/core/contact-submissions.repository.d.ts +32 -0
- package/dist/core/contact-submissions.repository.js +49 -0
- package/dist/core/hooks/useSyncManager.d.ts +1 -0
- package/dist/core/hooks/useSyncManager.js +83 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +1 -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/HowPayoutsWorkView.js +1 -1
- package/dist/features/about/components/PolicyPageView.js +32 -11
- package/dist/features/about/components/PublicProfileView.js +77 -11
- package/dist/features/account/components/AddressFilters.d.ts +5 -0
- package/dist/features/account/components/AddressFilters.js +20 -0
- package/dist/features/account/components/AddressesIndexListing.d.ts +6 -0
- package/dist/features/account/components/AddressesIndexListing.js +76 -0
- 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 +12 -3
- package/dist/features/account/components/UserSidebar.js +64 -10
- package/dist/features/account/components/index.d.ts +2 -0
- package/dist/features/account/components/index.js +1 -0
- package/dist/features/account/hooks/useAddresses.d.ts +7 -0
- package/dist/features/account/hooks/useAddresses.js +12 -1
- 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/actions/admin-read-actions.d.ts +12 -0
- package/dist/features/admin/actions/admin-read-actions.js +18 -0
- 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 +64 -10
- 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 +155 -20
- 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 +69 -26
- 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.d.ts +4 -0
- package/dist/features/admin/components/AdminContactView.js +141 -0
- 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 -6
- package/dist/features/admin/components/AdminFeatureFlagsView.js +33 -24
- package/dist/features/admin/components/AdminListingScaffold.d.ts +17 -2
- package/dist/features/admin/components/AdminListingScaffold.js +14 -3
- 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.d.ts +4 -0
- package/dist/features/admin/components/AdminNewsletterView.js +132 -0
- 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 +124 -7
- 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 +140 -6
- 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 -5
- 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 +73 -14
- 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 +5 -2
- package/dist/features/admin/components/DataTable.js +38 -4
- package/dist/features/admin/components/index.d.ts +53 -1
- package/dist/features/admin/components/index.js +26 -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/hooks/useAdminListingData.d.ts +3 -1
- package/dist/features/admin/hooks/useAdminListingData.js +12 -7
- package/dist/features/admin/schemas/firestore.d.ts +26 -0
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/admin/server.d.ts +3 -0
- package/dist/features/admin/server.js +2 -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 +125 -53
- package/dist/features/auctions/components/AuctionFilters.d.ts +10 -0
- package/dist/features/auctions/components/AuctionFilters.js +16 -0
- package/dist/features/auctions/components/AuctionsListView.d.ts +6 -1
- package/dist/features/auctions/components/AuctionsListView.js +37 -5
- 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 +18 -8
- 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/BlogFeaturedCard.d.ts +1 -7
- package/dist/features/blog/components/BlogFeaturedCard.js +4 -5
- package/dist/features/blog/components/BlogFilters.js +2 -1
- package/dist/features/blog/components/BlogIndexListing.js +66 -9
- package/dist/features/blog/components/BlogIndexPageView.d.ts +6 -1
- package/dist/features/blog/components/BlogIndexPageView.js +24 -4
- package/dist/features/blog/components/BlogListView.d.ts +2 -1
- package/dist/features/blog/components/BlogListView.js +10 -3
- 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 +117 -38
- package/dist/features/categories/components/CategoriesIndexPageView.d.ts +6 -1
- package/dist/features/categories/components/CategoriesIndexPageView.js +41 -2
- package/dist/features/categories/components/CategoryDetailPageView.js +47 -19
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +11 -0
- package/dist/features/categories/components/CategoryDetailTabs.js +22 -0
- package/dist/features/categories/components/CategoryFilters.js +2 -1
- package/dist/features/categories/components/CategoryForm.js +10 -4
- package/dist/features/categories/components/CategoryGrid.d.ts +2 -1
- package/dist/features/categories/components/CategoryGrid.js +8 -6
- package/dist/features/categories/components/CategoryProductsListing.d.ts +4 -1
- package/dist/features/categories/components/CategoryProductsListing.js +53 -13
- package/dist/features/categories/components/ConcernCard.js +1 -1
- package/dist/features/categories/components/index.d.ts +2 -0
- package/dist/features/categories/components/index.js +1 -0
- package/dist/features/categories/hooks/useCategories.d.ts +20 -0
- package/dist/features/categories/hooks/useCategories.js +52 -1
- package/dist/features/categories/hooks/useCategoryTree.d.ts +17 -0
- package/dist/features/categories/hooks/useCategoryTree.js +65 -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.d.ts +6 -0
- package/dist/features/events/components/AdminEventEditorView.js +203 -0
- package/dist/features/events/components/AdminEventsView.d.ts +4 -1
- package/dist/features/events/components/AdminEventsView.js +66 -14
- package/dist/features/events/components/EventCard.js +4 -2
- package/dist/features/events/components/EventFilters.js +2 -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 +92 -10
- package/dist/features/events/components/EventsListPageView.d.ts +6 -1
- package/dist/features/events/components/EventsListPageView.js +40 -7
- package/dist/features/events/components/index.d.ts +4 -0
- package/dist/features/events/components/index.js +2 -0
- package/dist/features/events/hooks/useEvents.d.ts +1 -0
- package/dist/features/events/hooks/useEvents.js +3 -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 +3 -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 +3 -3
- 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 +3 -3
- package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedAuctionsSection.js +3 -3
- package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedPreOrdersSection.js +3 -3
- 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 +3 -3
- 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 +129 -85
- package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +2 -20
- package/dist/features/homepage/components/MarketplaceHomepageView.js +73 -220
- package/dist/features/homepage/components/SectionCarousel.d.ts +1 -1
- package/dist/features/homepage/components/SectionCarousel.js +6 -4
- 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 +7 -1
- package/dist/features/homepage/types/index.d.ts +48 -19
- package/dist/features/layout/AppLayoutShell.d.ts +11 -2
- package/dist/features/layout/AppLayoutShell.js +30 -10
- 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.d.ts +3 -1
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +13 -8
- 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 +100 -14
- package/dist/features/pre-orders/components/PreOrderFilters.d.ts +10 -0
- package/dist/features/pre-orders/components/PreOrderFilters.js +24 -0
- package/dist/features/pre-orders/components/PreOrdersIndexListing.d.ts +4 -1
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +166 -11
- package/dist/features/pre-orders/components/PreOrdersListView.d.ts +6 -1
- package/dist/features/pre-orders/components/PreOrdersListView.js +26 -7
- package/dist/features/pre-orders/components/PreorderCard.js +1 -1
- package/dist/features/pre-orders/components/index.d.ts +2 -0
- package/dist/features/pre-orders/components/index.js +1 -0
- 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 +4 -1
- package/dist/features/products/components/AuctionsIndexListing.js +124 -10
- package/dist/features/products/components/BidHistory.d.ts +2 -1
- package/dist/features/products/components/BidHistory.js +18 -2
- package/dist/features/products/components/InteractiveProductCard.d.ts +2 -4
- package/dist/features/products/components/InteractiveProductCard.js +2 -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 +136 -26
- package/dist/features/products/components/ProductFilters.d.ts +13 -12
- package/dist/features/products/components/ProductFilters.js +8 -4
- 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 +16 -2
- package/dist/features/products/components/ProductGrid.js +80 -18
- package/dist/features/products/components/ProductTabsShell.d.ts +3 -11
- package/dist/features/products/components/ProductTabsShell.js +14 -14
- package/dist/features/products/components/ProductsIndexListing.js +160 -10
- package/dist/features/products/components/ProductsIndexPageView.d.ts +6 -1
- package/dist/features/products/components/ProductsIndexPageView.js +39 -6
- package/dist/features/products/components/RelatedProductsCarousel.d.ts +7 -0
- package/dist/features/products/components/RelatedProductsCarousel.js +11 -0
- 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 +3 -0
- package/dist/features/products/components/index.js +2 -0
- package/dist/features/products/hooks/useProducts.d.ts +7 -0
- package/dist/features/products/hooks/useProducts.js +20 -2
- package/dist/features/products/repository/products.repository.d.ts +9 -5
- package/dist/features/products/repository/products.repository.js +19 -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 +43 -42
- package/dist/features/products/schemas/index.js +2 -5
- package/dist/features/products/types/index.d.ts +24 -4
- 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.d.ts +9 -0
- package/dist/features/promotions/components/CouponsIndexListing.js +80 -0
- package/dist/features/promotions/components/PromotionsView.d.ts +11 -5
- package/dist/features/promotions/components/PromotionsView.js +6 -1
- package/dist/features/promotions/components/index.d.ts +4 -2
- package/dist/features/promotions/components/index.js +2 -1
- 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.d.ts +4 -0
- package/dist/features/reviews/components/ReviewDetailPageView.js +16 -0
- package/dist/features/reviews/components/ReviewDetailShell.d.ts +7 -0
- package/dist/features/reviews/components/ReviewDetailShell.js +80 -0
- package/dist/features/reviews/components/ReviewFilters.d.ts +3 -3
- package/dist/features/reviews/components/ReviewFilters.js +5 -4
- package/dist/features/reviews/components/ReviewsIndexListing.d.ts +4 -3
- package/dist/features/reviews/components/ReviewsIndexListing.js +86 -51
- package/dist/features/reviews/components/ReviewsIndexPageView.d.ts +6 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +49 -3
- package/dist/features/reviews/components/ReviewsList.js +9 -1
- package/dist/features/reviews/components/index.d.ts +1 -0
- package/dist/features/reviews/hooks/useReviews.d.ts +1 -0
- package/dist/features/reviews/hooks/useReviews.js +16 -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 +9 -3
- 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 +7 -0
- package/dist/features/scams/components/ScamProfileView.js +49 -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 +18 -6
- package/dist/features/seller/components/SellerSidebar.js +54 -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 +45 -1
- package/dist/features/seller/components/index.js +24 -0
- package/dist/features/seller/hooks/useSellerListingData.d.ts +3 -1
- package/dist/features/seller/hooks/useSellerListingData.js +6 -4
- package/dist/features/seller/hooks/useSellerStore.d.ts +2 -0
- package/dist/features/seller/hooks/useSellerStore.js +2 -0
- package/dist/features/seller/permission-map.d.ts +4 -2
- package/dist/features/seller/permission-map.js +16 -14
- 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 +18 -18
- 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.d.ts +1 -1
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +25 -20
- package/dist/features/stores/components/InteractiveStoreCard.d.ts +2 -7
- package/dist/features/stores/components/InteractiveStoreCard.js +24 -10
- 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 +103 -12
- 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 +30 -4
- package/dist/features/stores/components/StoreFilters.d.ts +5 -0
- package/dist/features/stores/components/StoreFilters.js +20 -0
- package/dist/features/stores/components/StoreHeader.js +3 -2
- package/dist/features/stores/components/StorePreOrdersListing.d.ts +7 -0
- package/dist/features/stores/components/StorePreOrdersListing.js +92 -0
- package/dist/features/stores/components/StorePreOrdersPageView.d.ts +4 -0
- package/dist/features/stores/components/StorePreOrdersPageView.js +22 -0
- package/dist/features/stores/components/StoreProductsListing.d.ts +5 -2
- package/dist/features/stores/components/StoreProductsListing.js +113 -14
- package/dist/features/stores/components/StoreProductsPageView.js +8 -7
- package/dist/features/stores/components/StoreReviewsListing.js +4 -9
- package/dist/features/stores/components/StoresIndexListing.js +106 -9
- package/dist/features/stores/components/StoresIndexPageView.d.ts +6 -1
- package/dist/features/stores/components/StoresIndexPageView.js +9 -2
- package/dist/features/stores/components/StoresListView.js +1 -1
- package/dist/features/stores/components/index.d.ts +3 -0
- package/dist/features/stores/components/index.js +1 -0
- package/dist/features/stores/hooks/useStores.d.ts +8 -1
- package/dist/features/stores/hooks/useStores.js +17 -3
- package/dist/features/stores/schemas/firestore.d.ts +34 -0
- package/dist/features/stores/schemas/index.d.ts +10 -10
- package/dist/features/stores/types/index.d.ts +3 -0
- 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/useGuestWishlist.d.ts +20 -0
- package/dist/features/wishlist/hooks/useGuestWishlist.js +49 -0
- package/dist/features/wishlist/hooks/useWishlist.js +2 -0
- package/dist/features/wishlist/hooks/useWishlistCount.d.ts +15 -0
- package/dist/features/wishlist/hooks/useWishlistCount.js +95 -0
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +56 -0
- package/dist/features/wishlist/hooks/useWishlistWithGuest.js +57 -0
- package/dist/features/wishlist/index.d.ts +3 -0
- package/dist/features/wishlist/index.js +3 -0
- package/dist/features/wishlist/schemas/index.d.ts +2 -2
- package/dist/features/wishlist/types/index.d.ts +16 -0
- package/dist/features/wishlist/utils/guest-wishlist.d.ts +22 -0
- package/dist/features/wishlist/utils/guest-wishlist.js +70 -0
- package/dist/http/api-handler.js +8 -1
- package/dist/index.d.ts +158 -13
- package/dist/index.js +188 -21
- package/dist/monitoring/server-logger.js +9 -3
- package/dist/next/routing/route-map.d.ts +184 -36
- package/dist/next/routing/route-map.js +81 -22
- 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/addresses-seed-data.js +62 -261
- 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.d.ts +7 -0
- package/dist/seed/beyblade-seed-data.js +1129 -0
- package/dist/seed/bids-seed-data.d.ts +4 -2
- package/dist/seed/bids-seed-data.js +343 -1067
- package/dist/seed/blog-posts-seed-data.d.ts +3 -2
- package/dist/seed/blog-posts-seed-data.js +258 -181
- 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 +8 -8
- package/dist/seed/cart-seed-data.js +73 -74
- 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 +4 -2
- package/dist/seed/coupons-seed-data.js +204 -338
- package/dist/seed/events-seed-data.d.ts +4 -2
- package/dist/seed/events-seed-data.js +125 -588
- 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 -41
- package/dist/seed/faq-seed-data.js +833 -1977
- 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.d.ts +7 -0
- package/dist/seed/hot-wheels-seed-data.js +1612 -0
- package/dist/seed/index.d.ts +12 -6
- package/dist/seed/index.js +10 -7
- 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.d.ts +4 -2
- package/dist/seed/pokemon-carousel-slides-seed-data.js +157 -268
- package/dist/seed/pokemon-categories-seed-data.d.ts +18 -21
- package/dist/seed/pokemon-categories-seed-data.js +445 -1025
- package/dist/seed/pokemon-coupons-seed-data.d.ts +6 -0
- package/dist/seed/pokemon-coupons-seed-data.js +465 -0
- package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +3 -2
- package/dist/seed/pokemon-homepage-sections-seed-data.js +120 -249
- package/dist/seed/pokemon-products-seed-data.d.ts +1 -1
- package/dist/seed/pokemon-products-seed-data.js +720 -48
- package/dist/seed/pokemon-seed-bundle.d.ts +36 -11
- package/dist/seed/pokemon-seed-bundle.js +60 -11
- package/dist/seed/pokemon-stores-seed-data.d.ts +2 -3
- package/dist/seed/pokemon-stores-seed-data.js +135 -34
- package/dist/seed/pokemon-users-seed-data.d.ts +2 -2
- package/dist/seed/pokemon-users-seed-data.js +344 -261
- 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 -2
- package/dist/seed/reviews-seed-data.js +1005 -441
- 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 +39 -16
- package/dist/seed/store-addresses-seed-data.js +187 -65
- 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.d.ts +7 -0
- package/dist/seed/transformers-seed-data.js +530 -0
- 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.d.ts +5 -1
- package/dist/seed/wishlists-seed-data.js +84 -6
- package/dist/server.d.ts +10 -2
- package/dist/server.js +14 -4
- package/dist/tokens/index.d.ts +6 -0
- package/dist/tokens/index.js +2 -0
- 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 +39 -30
- package/dist/ui/components/BaseListingCard.style.css +8 -6
- 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 +130 -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/SideDrawer.style.css +3 -11
- 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 +21 -2
- 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,80 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback } from "react";
|
|
4
|
+
import { Search, SlidersHorizontal, X } from "lucide-react";
|
|
5
|
+
import { useUrlTable } from "../../../react/hooks/useUrlTable";
|
|
6
|
+
import { Pagination, SortDropdown, Div, Text, Heading } from "../../../ui";
|
|
7
|
+
import { usePromotions } from "../hooks/usePromotions";
|
|
8
|
+
import { CouponCard } from "./CouponCard";
|
|
9
|
+
const COUPON_SORT_OPTIONS = [
|
|
10
|
+
{ value: "name", label: "Name A–Z" },
|
|
11
|
+
{ value: "-name", label: "Name Z–A" },
|
|
12
|
+
{ value: "-validity.endDate", label: "Expiring Soon" },
|
|
13
|
+
{ value: "-createdAt", label: "Newest First" },
|
|
14
|
+
{ value: "createdAt", label: "Oldest First" },
|
|
15
|
+
];
|
|
16
|
+
const COUPON_TYPES = [
|
|
17
|
+
{ value: "percentage", label: "% Off" },
|
|
18
|
+
{ value: "fixed", label: "Fixed Amount" },
|
|
19
|
+
{ value: "free_shipping", label: "Free Shipping" },
|
|
20
|
+
{ value: "buy_x_get_y", label: "Buy X Get Y" },
|
|
21
|
+
];
|
|
22
|
+
export function CouponsIndexListing({ initialCoupons, storeSlug, sellerId, }) {
|
|
23
|
+
const table = useUrlTable({ defaults: { pageSize: "12", sort: "-createdAt" } });
|
|
24
|
+
const [searchInput, setSearchInput] = useState(table.get("q") || "");
|
|
25
|
+
const [filterOpen, setFilterOpen] = useState(false);
|
|
26
|
+
// Build Sieve filter string
|
|
27
|
+
const buildFilters = () => {
|
|
28
|
+
const parts = ["validity.isActive==true"];
|
|
29
|
+
const typeFilter = table.get("type");
|
|
30
|
+
if (typeFilter)
|
|
31
|
+
parts.push(`type==${typeFilter}`);
|
|
32
|
+
const dateFrom = table.get("dateFrom");
|
|
33
|
+
if (dateFrom)
|
|
34
|
+
parts.push(`validity.startDate>=${dateFrom}`);
|
|
35
|
+
const dateTo = table.get("dateTo");
|
|
36
|
+
if (dateTo)
|
|
37
|
+
parts.push(`validity.endDate<=${dateTo}`);
|
|
38
|
+
if (sellerId)
|
|
39
|
+
parts.push(`sellerId==${sellerId}`);
|
|
40
|
+
return parts.join(",");
|
|
41
|
+
};
|
|
42
|
+
const { promotions: coupons, total, totalPages, isLoading } = usePromotions({
|
|
43
|
+
page: table.getNumber("page", 1),
|
|
44
|
+
pageSize: table.getNumber("pageSize", 12),
|
|
45
|
+
sort: table.get("sort") || "-createdAt",
|
|
46
|
+
filters: buildFilters(),
|
|
47
|
+
});
|
|
48
|
+
// Use initial data on first load if available and no search/filter active
|
|
49
|
+
const displayCoupons = !isLoading && coupons.length > 0
|
|
50
|
+
? coupons
|
|
51
|
+
: !isLoading && initialCoupons && !table.get("q") && !table.get("type")
|
|
52
|
+
? initialCoupons
|
|
53
|
+
: coupons;
|
|
54
|
+
const commitSearch = useCallback(() => {
|
|
55
|
+
table.set("q", searchInput.trim());
|
|
56
|
+
table.setPage(1);
|
|
57
|
+
}, [searchInput, table]);
|
|
58
|
+
const handleKeyDown = (e) => {
|
|
59
|
+
if (e.key === "Enter")
|
|
60
|
+
commitSearch();
|
|
61
|
+
};
|
|
62
|
+
const activeType = table.get("type");
|
|
63
|
+
const hasActiveFilters = !!activeType || !!table.get("dateFrom") || !!table.get("dateTo");
|
|
64
|
+
const clearFilters = () => {
|
|
65
|
+
table.set("type", "");
|
|
66
|
+
table.set("dateFrom", "");
|
|
67
|
+
table.set("dateTo", "");
|
|
68
|
+
table.setPage(1);
|
|
69
|
+
};
|
|
70
|
+
return (_jsxs("div", { className: "min-h-[40vh]", children: [_jsxs("div", { className: "sticky top-[var(--header-height,0px)] z-20 border-b border-zinc-200 dark:border-slate-700 bg-white/95 dark:bg-slate-900/95 backdrop-blur-sm py-2.5 px-4", children: [_jsxs("div", { className: "flex items-center gap-2.5 max-w-full", children: [_jsxs("button", { type: "button", onClick: () => setFilterOpen(true), className: `flex shrink-0 items-center gap-2 rounded-lg border px-3.5 py-2 text-sm font-medium transition-colors ${hasActiveFilters
|
|
71
|
+
? "border-primary bg-primary-50 text-primary-700 dark:bg-primary-900/30 dark:text-primary-300"
|
|
72
|
+
: "border-zinc-300 dark:border-slate-600 text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-slate-800"}`, children: [_jsx(SlidersHorizontal, { className: "h-4 w-4" }), _jsxs("span", { className: "hidden sm:inline", children: ["Filters", hasActiveFilters ? " •" : ""] })] }), _jsxs("div", { className: "flex flex-1 items-center overflow-hidden rounded-lg border border-zinc-300 dark:border-slate-600 bg-white dark:bg-slate-900", children: [_jsx("input", { type: "text", value: searchInput, onChange: (e) => setSearchInput(e.target.value), onKeyDown: handleKeyDown, placeholder: "Search by name or description\u2026", className: "min-w-0 flex-1 bg-transparent px-3 py-2 text-sm text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 outline-none" }), searchInput && (_jsx("button", { type: "button", onClick: () => { setSearchInput(""); table.set("q", ""); table.setPage(1); }, className: "p-2 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300", "aria-label": "Clear search", children: _jsx(X, { className: "h-3.5 w-3.5" }) })), _jsx("button", { type: "button", onClick: commitSearch, className: "flex shrink-0 items-center justify-center px-3 py-2 text-zinc-400 hover:text-primary dark:hover:text-primary-400 transition-colors", "aria-label": "Search", children: _jsx(Search, { className: "h-4 w-4" }) })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5 text-sm text-zinc-500 dark:text-zinc-400", children: [_jsx("span", { className: "hidden md:inline whitespace-nowrap", children: "Sort by" }), _jsx(SortDropdown, { value: table.get("sort") || "-createdAt", onChange: (v) => { table.set("sort", v); table.setPage(1); }, options: COUPON_SORT_OPTIONS })] })] }), hasActiveFilters && (_jsxs("div", { className: "flex flex-wrap items-center gap-2 mt-2", children: [activeType && (_jsxs("span", { className: "flex items-center gap-1 rounded-full bg-primary-50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300 text-xs font-medium px-2.5 py-1", children: [COUPON_TYPES.find((t) => t.value === activeType)?.label ?? activeType, _jsx("button", { type: "button", onClick: () => { table.set("type", ""); table.setPage(1); }, "aria-label": "Remove type filter", children: _jsx(X, { className: "h-3 w-3" }) })] })), table.get("dateFrom") && (_jsxs("span", { className: "flex items-center gap-1 rounded-full bg-primary-50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300 text-xs font-medium px-2.5 py-1", children: ["From: ", table.get("dateFrom"), _jsx("button", { type: "button", onClick: () => { table.set("dateFrom", ""); table.setPage(1); }, "aria-label": "Remove from-date filter", children: _jsx(X, { className: "h-3 w-3" }) })] })), table.get("dateTo") && (_jsxs("span", { className: "flex items-center gap-1 rounded-full bg-primary-50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300 text-xs font-medium px-2.5 py-1", children: ["To: ", table.get("dateTo"), _jsx("button", { type: "button", onClick: () => { table.set("dateTo", ""); table.setPage(1); }, "aria-label": "Remove to-date filter", children: _jsx(X, { className: "h-3 w-3" }) })] })), _jsx("button", { type: "button", onClick: clearFilters, className: "text-xs text-zinc-500 hover:text-zinc-700 dark:hover:text-zinc-300 underline", children: "Clear all" })] }))] }), _jsxs("div", { className: "py-6 px-4", children: [isLoading ? (_jsx("div", { className: "grid gap-3 md:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => (_jsxs("div", { className: "rounded-xl border-2 border-zinc-100 dark:border-slate-700 p-4 animate-pulse space-y-3", children: [_jsx("div", { className: "h-6 bg-zinc-200 dark:bg-slate-700 rounded w-2/3" }), _jsx("div", { className: "h-4 bg-zinc-200 dark:bg-slate-700 rounded w-full" }), _jsx("div", { className: "h-3 bg-zinc-200 dark:bg-slate-700 rounded w-1/2" })] }, i))) })) : displayCoupons.length === 0 ? (_jsx("div", { className: "py-16 text-center", children: _jsx(Text, { className: "text-zinc-400 dark:text-zinc-500", children: "No coupons match your search." }) })) : (_jsx("div", { className: "grid gap-3 md:grid-cols-2 lg:grid-cols-3", children: displayCoupons.map((coupon) => (_jsx(CouponCard, { coupon: coupon, labels: {
|
|
73
|
+
copy: "Copy",
|
|
74
|
+
copied: "Copied!",
|
|
75
|
+
expires: "Expires",
|
|
76
|
+
minOrder: "Min. order",
|
|
77
|
+
off: "OFF",
|
|
78
|
+
freeShipping: "Free Shipping",
|
|
79
|
+
} }, coupon.id))) })), totalPages > 1 && (_jsx("div", { className: "mt-8 flex justify-center", children: _jsx(Pagination, { currentPage: table.getNumber("page", 1), totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) })), !isLoading && total > 0 && (_jsx(Div, { className: "mt-4 text-center", children: _jsxs(Text, { className: "text-xs text-zinc-400 dark:text-zinc-500", children: [total, " coupon", total !== 1 ? "s" : "", " available"] }) }))] }), filterOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40 bg-black/40", "aria-hidden": "true", onClick: () => setFilterOpen(false) }), _jsxs("div", { className: "fixed inset-y-0 left-0 z-50 flex w-80 flex-col bg-white dark:bg-slate-900 shadow-2xl", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-zinc-200 dark:border-slate-700 px-4 py-3.5", children: [_jsxs("span", { className: "flex items-center gap-2 text-base font-semibold text-zinc-900 dark:text-zinc-100", children: [_jsx(SlidersHorizontal, { className: "h-4 w-4" }), "Filters"] }), _jsx("button", { type: "button", onClick: () => setFilterOpen(false), "aria-label": "Close filters", className: "rounded-lg p-1.5 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-slate-800 transition-colors", children: _jsx(X, { className: "h-5 w-5" }) })] }), _jsxs("div", { className: "flex-1 overflow-y-auto px-4 py-4 space-y-6", children: [_jsxs("div", { children: [_jsx(Heading, { level: 6, className: "text-xs font-semibold uppercase tracking-wider text-zinc-500 dark:text-zinc-400 mb-3", children: "Discount Type" }), _jsxs("div", { className: "space-y-2", children: [COUPON_TYPES.map((t) => (_jsxs("label", { className: "flex items-center gap-2 cursor-pointer text-sm text-zinc-700 dark:text-zinc-300", children: [_jsx("input", { type: "radio", name: "coupon-type", value: t.value, checked: table.get("type") === t.value, onChange: () => { table.set("type", t.value); table.setPage(1); }, className: "accent-primary" }), t.label] }, t.value))), table.get("type") && (_jsx("button", { type: "button", onClick: () => { table.set("type", ""); table.setPage(1); }, className: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 underline", children: "Clear type" }))] })] }), _jsxs("div", { children: [_jsx(Heading, { level: 6, className: "text-xs font-semibold uppercase tracking-wider text-zinc-500 dark:text-zinc-400 mb-3", children: "Valid Date Range" }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-xs text-zinc-500 dark:text-zinc-400 mb-1", children: "From date" }), _jsx("input", { type: "date", value: table.get("dateFrom") || "", onChange: (e) => { table.set("dateFrom", e.target.value); table.setPage(1); }, className: "w-full rounded-lg border border-zinc-300 dark:border-slate-600 bg-white dark:bg-slate-800 px-3 py-2 text-sm text-zinc-900 dark:text-zinc-100 outline-none focus:ring-2 focus:ring-primary" })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs text-zinc-500 dark:text-zinc-400 mb-1", children: "To date" }), _jsx("input", { type: "date", value: table.get("dateTo") || "", onChange: (e) => { table.set("dateTo", e.target.value); table.setPage(1); }, className: "w-full rounded-lg border border-zinc-300 dark:border-slate-600 bg-white dark:bg-slate-800 px-3 py-2 text-sm text-zinc-900 dark:text-zinc-100 outline-none focus:ring-2 focus:ring-primary" })] })] })] })] }), _jsxs("div", { className: "border-t border-zinc-200 dark:border-slate-700 px-4 py-3.5 flex gap-2", children: [_jsx("button", { type: "button", onClick: clearFilters, className: "flex-1 rounded-lg border border-zinc-300 dark:border-slate-600 py-2.5 text-sm font-medium text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-slate-800 transition-colors", children: "Clear all" }), _jsx("button", { type: "button", onClick: () => setFilterOpen(false), className: "flex-1 rounded-lg bg-primary py-2.5 text-sm font-semibold text-white hover:bg-primary-600 transition-colors", children: "Apply" })] })] })] }))] }));
|
|
80
|
+
}
|
|
@@ -9,12 +9,20 @@ export interface PromotionProductItem {
|
|
|
9
9
|
export interface PromotionsViewProductSectionProps {
|
|
10
10
|
title: string;
|
|
11
11
|
subtitle?: string;
|
|
12
|
-
/** Render the product grid — use your app's ProductGrid/ProductCard here */
|
|
13
12
|
renderProducts: () => React.ReactNode;
|
|
14
|
-
/** If false/undefined, the section is hidden */
|
|
15
13
|
hasProducts?: boolean;
|
|
16
14
|
}
|
|
17
15
|
export declare function PromotionsViewProductSection({ title, subtitle, renderProducts, hasProducts, }: PromotionsViewProductSectionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
16
|
+
export interface PromotionsHeroProps {
|
|
17
|
+
labels: {
|
|
18
|
+
exclusiveOffersBadge: string;
|
|
19
|
+
title: string;
|
|
20
|
+
subtitle: string;
|
|
21
|
+
};
|
|
22
|
+
heroBannerClass?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Slim hero banner for the promotions page — tabs + content live in the page. */
|
|
25
|
+
export declare function PromotionsHero({ labels, heroBannerClass, }: PromotionsHeroProps): import("react/jsx-runtime").JSX.Element;
|
|
18
26
|
export interface PromotionsViewProps {
|
|
19
27
|
labels: {
|
|
20
28
|
exclusiveOffersBadge: string;
|
|
@@ -32,12 +40,10 @@ export interface PromotionsViewProps {
|
|
|
32
40
|
};
|
|
33
41
|
hasContent: boolean;
|
|
34
42
|
heroBannerClass?: string;
|
|
35
|
-
/** Render the coupon grid */
|
|
36
43
|
renderCoupons?: () => React.ReactNode;
|
|
37
44
|
couponsCount?: number;
|
|
38
|
-
/** Render the promoted products section */
|
|
39
45
|
renderDealsSection?: () => React.ReactNode;
|
|
40
|
-
/** Render the featured products section */
|
|
41
46
|
renderFeaturedSection?: () => React.ReactNode;
|
|
42
47
|
}
|
|
48
|
+
/** @deprecated Use PromotionsHero + per-tab content in your page instead. */
|
|
43
49
|
export declare function PromotionsView({ labels, hasContent, heroBannerClass, renderCoupons, couponsCount, renderDealsSection, renderFeaturedSection, }: PromotionsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -5,6 +5,11 @@ export function PromotionsViewProductSection({ title, subtitle, renderProducts,
|
|
|
5
5
|
return null;
|
|
6
6
|
return (_jsxs(Section, { children: [_jsxs(Div, { className: "mb-6", children: [_jsx(Heading, { level: 2, children: title }), subtitle && (_jsx(Text, { variant: "secondary", className: "mt-1", children: subtitle }))] }), renderProducts()] }));
|
|
7
7
|
}
|
|
8
|
+
/** Slim hero banner for the promotions page — tabs + content live in the page. */
|
|
9
|
+
export function PromotionsHero({ labels, heroBannerClass = "bg-gradient-to-br from-rose-500 to-orange-500", }) {
|
|
10
|
+
return (_jsx(Div, { className: `${heroBannerClass} text-white py-14`, children: _jsxs(Div, { className: "max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 text-center", children: [_jsxs(Text, { className: "text-white font-medium mb-2 uppercase tracking-widest text-sm", children: ["\uD83C\uDF89 ", labels.exclusiveOffersBadge] }), _jsx(Heading, { level: 1, variant: "none", className: "text-white mb-4", children: labels.title }), _jsx(Text, { variant: "none", className: "text-lg text-white/90 max-w-2xl mx-auto", children: labels.subtitle })] }) }));
|
|
11
|
+
}
|
|
12
|
+
/** @deprecated Use PromotionsHero + per-tab content in your page instead. */
|
|
8
13
|
export function PromotionsView({ labels, hasContent, heroBannerClass = "bg-gradient-to-br from-rose-500 to-orange-500", renderCoupons, couponsCount = 0, renderDealsSection, renderFeaturedSection, }) {
|
|
9
|
-
return (_jsxs(Div, { className: "min-h-screen bg-white dark:bg-slate-900", children: [_jsx(
|
|
14
|
+
return (_jsxs(Div, { className: "min-h-screen bg-white dark:bg-slate-900", children: [_jsx(PromotionsHero, { labels: labels, heroBannerClass: heroBannerClass }), _jsxs(Div, { className: "max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12 space-y-12", children: [!hasContent && (_jsxs(Div, { className: "text-center py-16", children: [_jsx(Heading, { level: 2, className: "mb-2", children: labels.emptyDeals }), _jsx(Text, { variant: "secondary", children: labels.checkBack })] })), hasContent && (_jsxs(Div, { className: "space-y-12", children: [renderCoupons && (_jsxs(Section, { children: [_jsxs(Div, { className: "mb-6", children: [_jsx(Heading, { level: 2, children: labels.couponsTitle }), couponsCount > 0 && (_jsx(Text, { variant: "secondary", className: "mt-1", children: labels.couponsSubtitle }))] }), couponsCount > 0 ? (renderCoupons()) : (_jsx(Text, { variant: "secondary", size: "sm", children: labels.emptyCoupons }))] })), renderDealsSection?.(), renderFeaturedSection?.()] }))] })] }));
|
|
10
15
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { CouponCard } from "./CouponCard";
|
|
2
|
-
export {
|
|
3
|
-
export type {
|
|
2
|
+
export { CouponsIndexListing } from "./CouponsIndexListing";
|
|
3
|
+
export type { CouponsIndexListingProps } from "./CouponsIndexListing";
|
|
4
|
+
export { PromotionsView, PromotionsViewProductSection, PromotionsHero, } from "./PromotionsView";
|
|
5
|
+
export type { PromotionsViewProps, PromotionsViewProductSectionProps, PromotionProductItem, PromotionsHeroProps, } from "./PromotionsView";
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { CouponCard } from "./CouponCard";
|
|
2
|
-
export {
|
|
2
|
+
export { CouponsIndexListing } from "./CouponsIndexListing";
|
|
3
|
+
export { PromotionsView, PromotionsViewProductSection, PromotionsHero, } from "./PromotionsView";
|
|
@@ -7,8 +7,8 @@ export function usePromotions(params = {}, opts) {
|
|
|
7
7
|
sp.set("scope", params.scope);
|
|
8
8
|
if (params.isActive !== undefined)
|
|
9
9
|
sp.set("isActive", String(params.isActive));
|
|
10
|
-
if (params.
|
|
11
|
-
sp.set("
|
|
10
|
+
if (params.storeId)
|
|
11
|
+
sp.set("storeId", params.storeId);
|
|
12
12
|
if (params.page)
|
|
13
13
|
sp.set("page", String(params.page));
|
|
14
14
|
if (params.pageSize)
|
|
@@ -52,12 +52,14 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
52
52
|
*/
|
|
53
53
|
getCouponsExpiringSoon(days?: number): Promise<CouponDocument[]>;
|
|
54
54
|
/**
|
|
55
|
-
*
|
|
55
|
+
* Steps shared by all public validate methods:
|
|
56
|
+
* 1. Code format 2. DB lookup 3. Validity 4. Per-user limit
|
|
56
57
|
*
|
|
57
|
-
*
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
* Returns either an early-exit failure result or the resolved coupon.
|
|
59
|
+
*/
|
|
60
|
+
private _fetchAndValidateCoupon;
|
|
61
|
+
/**
|
|
62
|
+
* Validate coupon against a flat order total (no cart breakdown).
|
|
61
63
|
*/
|
|
62
64
|
validateCoupon(code: string, userId: string, orderTotal: number): Promise<{
|
|
63
65
|
valid: boolean;
|
|
@@ -66,15 +68,19 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
66
68
|
message?: string;
|
|
67
69
|
}>;
|
|
68
70
|
/**
|
|
69
|
-
*
|
|
71
|
+
* Record coupon usage after a successful checkout.
|
|
70
72
|
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* @
|
|
73
|
+
* Increments both the global coupon counter and the per-user usage doc so
|
|
74
|
+
* that subsequent `validateCoupon` calls respect `perUserLimit` and
|
|
75
|
+
* `totalLimit` correctly.
|
|
76
|
+
*
|
|
77
|
+
* @param couponId - Coupon document ID (e.g. "coupon-welcome10")
|
|
78
|
+
* @param couponCode - Human-readable code (e.g. "WELCOME10")
|
|
79
|
+
* @param userId - Buyer UID
|
|
80
|
+
* @param orderIds - All order IDs created in this checkout that used the coupon
|
|
81
|
+
* @param discountAmount - Total discount amount applied across all order groups
|
|
76
82
|
*/
|
|
77
|
-
applyCoupon(couponId: string, userId: string,
|
|
83
|
+
applyCoupon(couponId: string, couponCode: string, userId: string, orderIds: string[], discountAmount: number): Promise<void>;
|
|
78
84
|
/**
|
|
79
85
|
* Get user's coupon usage count for a specific coupon
|
|
80
86
|
*
|
|
@@ -109,7 +115,7 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
109
115
|
*
|
|
110
116
|
* @param sellerId - The seller's user UID
|
|
111
117
|
*/
|
|
112
|
-
|
|
118
|
+
getStoreCoupons(storeId: string): Promise<CouponDocument[]>;
|
|
113
119
|
/**
|
|
114
120
|
* Validate a coupon against the cart items and return a per-item breakdown.
|
|
115
121
|
*
|
|
@@ -130,7 +136,7 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
130
136
|
*/
|
|
131
137
|
validateCouponForCart(code: string, userId: string, cartItems: Array<{
|
|
132
138
|
productId: string;
|
|
133
|
-
|
|
139
|
+
storeId: string;
|
|
134
140
|
price: number;
|
|
135
141
|
quantity: number;
|
|
136
142
|
isPreOrder: boolean;
|
|
@@ -142,7 +148,7 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
142
148
|
eligibleSubtotal?: number;
|
|
143
149
|
eligibleProductIds?: string[];
|
|
144
150
|
scope?: "admin" | "seller";
|
|
145
|
-
|
|
151
|
+
storeId?: string;
|
|
146
152
|
message?: string;
|
|
147
153
|
}>;
|
|
148
154
|
static readonly SIEVE_FIELDS: {
|
|
@@ -4,23 +4,11 @@
|
|
|
4
4
|
* Manages coupon creation, validation, and usage tracking
|
|
5
5
|
*/
|
|
6
6
|
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
7
|
-
import { COUPONS_COLLECTION, isValidCouponCode, isCouponValid, canUserUseCoupon, calculateDiscount, createCouponId, } from "../schemas";
|
|
7
|
+
import { COUPONS_COLLECTION, COUPON_FIELDS, isValidCouponCode, isCouponValid, canUserUseCoupon, calculateDiscount, createCouponId, } from "../schemas";
|
|
8
8
|
import { USER_COLLECTION } from "../../auth/schemas";
|
|
9
9
|
import { DatabaseError } from "../../../errors";
|
|
10
|
-
import { increment, serverTimestamp } from "../../../contracts/field-ops";
|
|
10
|
+
import { increment, arrayUnion, serverTimestamp } from "../../../contracts/field-ops";
|
|
11
11
|
const COUPON_USAGE_SUBCOLLECTION = "couponUsage";
|
|
12
|
-
const COUPON_FIELDS = {
|
|
13
|
-
CODE: "code",
|
|
14
|
-
TYPE: "type",
|
|
15
|
-
CREATED_BY: "createdBy",
|
|
16
|
-
SELLER_ID: "sellerId",
|
|
17
|
-
CREATED_AT: "createdAt",
|
|
18
|
-
VALIDITY_FIELDS: {
|
|
19
|
-
IS_ACTIVE: "validity.isActive",
|
|
20
|
-
START_DATE: "validity.startDate",
|
|
21
|
-
END_DATE: "validity.endDate",
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
12
|
/**
|
|
25
13
|
* Repository for coupon management
|
|
26
14
|
*/
|
|
@@ -87,9 +75,9 @@ export class CouponsRepository extends BaseRepository {
|
|
|
87
75
|
// validity.isActive ASC + validity.endDate ASC (see firestore.indexes.json)
|
|
88
76
|
const snapshot = await this.db
|
|
89
77
|
.collection(this.collection)
|
|
90
|
-
.where(COUPON_FIELDS.
|
|
91
|
-
.where(COUPON_FIELDS.
|
|
92
|
-
.orderBy(COUPON_FIELDS.
|
|
78
|
+
.where(COUPON_FIELDS.VALIDITY.IS_ACTIVE, "==", true)
|
|
79
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, ">=", now)
|
|
80
|
+
.orderBy(COUPON_FIELDS.VALIDITY.END_DATE, "asc")
|
|
93
81
|
.get();
|
|
94
82
|
return snapshot.docs
|
|
95
83
|
.map((doc) => this.mapDoc(doc))
|
|
@@ -147,13 +135,13 @@ export class CouponsRepository extends BaseRepository {
|
|
|
147
135
|
try {
|
|
148
136
|
const now = new Date();
|
|
149
137
|
const futureDate = new Date(now.getTime() + days * 24 * 60 * 60 * 1000);
|
|
150
|
-
// Firestore-native range filter
|
|
138
|
+
// Firestore-native range filter — reuses the same composite index as getActiveCoupons()
|
|
151
139
|
const snapshot = await this.db
|
|
152
140
|
.collection(this.collection)
|
|
153
|
-
.where(COUPON_FIELDS.
|
|
154
|
-
.where(COUPON_FIELDS.
|
|
155
|
-
.where(COUPON_FIELDS.
|
|
156
|
-
.orderBy(COUPON_FIELDS.
|
|
141
|
+
.where(COUPON_FIELDS.VALIDITY.IS_ACTIVE, "==", true)
|
|
142
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, ">", now)
|
|
143
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, "<=", futureDate)
|
|
144
|
+
.orderBy(COUPON_FIELDS.VALIDITY.END_DATE, "asc")
|
|
157
145
|
.get();
|
|
158
146
|
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
159
147
|
}
|
|
@@ -161,99 +149,91 @@ export class CouponsRepository extends BaseRepository {
|
|
|
161
149
|
throw new DatabaseError(`Failed to retrieve expiring coupons: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
162
150
|
}
|
|
163
151
|
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Private helpers
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
164
155
|
/**
|
|
165
|
-
*
|
|
156
|
+
* Steps shared by all public validate methods:
|
|
157
|
+
* 1. Code format 2. DB lookup 3. Validity 4. Per-user limit
|
|
166
158
|
*
|
|
167
|
-
*
|
|
168
|
-
* @param userId - User ID attempting to use coupon
|
|
169
|
-
* @param orderTotal - Order total amount (for validation)
|
|
170
|
-
* @returns Promise<{valid: boolean, coupon?: CouponDocument, message?: string}>
|
|
159
|
+
* Returns either an early-exit failure result or the resolved coupon.
|
|
171
160
|
*/
|
|
172
|
-
async
|
|
173
|
-
// Validate code format
|
|
161
|
+
async _fetchAndValidateCoupon(code, userId) {
|
|
174
162
|
if (!isValidCouponCode(code)) {
|
|
175
|
-
return {
|
|
176
|
-
valid: false,
|
|
177
|
-
message: "Invalid coupon code format",
|
|
178
|
-
};
|
|
163
|
+
return { ok: false, result: { valid: false, message: "Invalid coupon code format" } };
|
|
179
164
|
}
|
|
180
|
-
// Get coupon from database
|
|
181
165
|
const coupon = await this.getCouponByCode(code);
|
|
182
166
|
if (!coupon) {
|
|
183
|
-
return {
|
|
184
|
-
valid: false,
|
|
185
|
-
message: "Coupon not found",
|
|
186
|
-
};
|
|
167
|
+
return { ok: false, result: { valid: false, message: "Coupon not found" } };
|
|
187
168
|
}
|
|
188
|
-
// Check if coupon is valid (active, date range, usage limits)
|
|
189
169
|
if (!isCouponValid(coupon)) {
|
|
190
|
-
return {
|
|
191
|
-
valid: false,
|
|
192
|
-
coupon,
|
|
193
|
-
message: "Coupon is not currently valid",
|
|
194
|
-
};
|
|
170
|
+
return { ok: false, result: { valid: false, coupon, message: "Coupon is not currently valid" } };
|
|
195
171
|
}
|
|
196
|
-
// Check minimum purchase requirement
|
|
197
|
-
if (coupon.discount.minPurchase &&
|
|
198
|
-
orderTotal < coupon.discount.minPurchase) {
|
|
199
|
-
return {
|
|
200
|
-
valid: false,
|
|
201
|
-
coupon,
|
|
202
|
-
message: "Minimum purchase requirement not met",
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
// Check user-specific usage limit
|
|
206
172
|
const userUsageCount = await this.getUserCouponUsageCount(userId, coupon.id);
|
|
207
173
|
if (!canUserUseCoupon(coupon, userUsageCount)) {
|
|
208
|
-
return {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
174
|
+
return { ok: false, result: { valid: false, coupon, message: "You have reached the usage limit for this coupon" } };
|
|
175
|
+
}
|
|
176
|
+
return { ok: true, coupon };
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Public validation methods
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Validate coupon against a flat order total (no cart breakdown).
|
|
183
|
+
*/
|
|
184
|
+
async validateCoupon(code, userId, orderTotal) {
|
|
185
|
+
const check = await this._fetchAndValidateCoupon(code, userId);
|
|
186
|
+
if (!check.ok)
|
|
187
|
+
return check.result;
|
|
188
|
+
const { coupon } = check;
|
|
189
|
+
if (coupon.discount.minPurchase && orderTotal < coupon.discount.minPurchase) {
|
|
190
|
+
return { valid: false, coupon, message: "Minimum purchase requirement not met" };
|
|
213
191
|
}
|
|
214
|
-
// Calculate discount
|
|
215
|
-
const discountAmount = calculateDiscount(coupon, orderTotal);
|
|
216
192
|
return {
|
|
217
193
|
valid: true,
|
|
218
194
|
coupon,
|
|
219
|
-
discountAmount,
|
|
195
|
+
discountAmount: calculateDiscount(coupon, orderTotal),
|
|
220
196
|
message: "Coupon is valid",
|
|
221
197
|
};
|
|
222
198
|
}
|
|
223
199
|
/**
|
|
224
|
-
*
|
|
200
|
+
* Record coupon usage after a successful checkout.
|
|
225
201
|
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
* @
|
|
202
|
+
* Increments both the global coupon counter and the per-user usage doc so
|
|
203
|
+
* that subsequent `validateCoupon` calls respect `perUserLimit` and
|
|
204
|
+
* `totalLimit` correctly.
|
|
205
|
+
*
|
|
206
|
+
* @param couponId - Coupon document ID (e.g. "coupon-welcome10")
|
|
207
|
+
* @param couponCode - Human-readable code (e.g. "WELCOME10")
|
|
208
|
+
* @param userId - Buyer UID
|
|
209
|
+
* @param orderIds - All order IDs created in this checkout that used the coupon
|
|
210
|
+
* @param discountAmount - Total discount amount applied across all order groups
|
|
231
211
|
*/
|
|
232
|
-
async applyCoupon(couponId, userId,
|
|
212
|
+
async applyCoupon(couponId, couponCode, userId, orderIds, discountAmount) {
|
|
233
213
|
try {
|
|
234
214
|
const batch = this.db.batch();
|
|
235
|
-
//
|
|
215
|
+
// Increment global coupon counters
|
|
236
216
|
const couponRef = this.db.collection(this.collection).doc(couponId);
|
|
237
217
|
batch.update(couponRef, {
|
|
238
218
|
"usage.currentUsage": increment(1),
|
|
239
|
-
"stats.
|
|
240
|
-
"stats.
|
|
219
|
+
"stats.totalDiscount": increment(discountAmount),
|
|
220
|
+
"stats.totalUses": increment(1),
|
|
241
221
|
updatedAt: new Date(),
|
|
242
222
|
});
|
|
243
|
-
//
|
|
244
|
-
const usageData = {
|
|
245
|
-
userId,
|
|
246
|
-
couponCode: "", // Will be filled by getCouponByCode
|
|
247
|
-
orderId,
|
|
248
|
-
discountAmount,
|
|
249
|
-
usedAt: new Date(),
|
|
250
|
-
};
|
|
223
|
+
// Upsert per-user usage doc — safe for perUserLimit > 1
|
|
251
224
|
const usageRef = this.db
|
|
252
225
|
.collection(USER_COLLECTION)
|
|
253
226
|
.doc(userId)
|
|
254
227
|
.collection(COUPON_USAGE_SUBCOLLECTION)
|
|
255
228
|
.doc(couponId);
|
|
256
|
-
|
|
229
|
+
// FieldValue sentinels (increment, arrayUnion) must NOT go through
|
|
230
|
+
// prepareForFirestore — it recurses into objects and Object.keys() on a
|
|
231
|
+
// FieldValue returns [] (non-enumerable internals), silently dropping them.
|
|
232
|
+
batch.set(usageRef, {
|
|
233
|
+
...prepareForFirestore({ userId, couponCode: couponCode.toUpperCase(), lastUsedAt: new Date() }),
|
|
234
|
+
usageCount: increment(1),
|
|
235
|
+
orders: arrayUnion(...orderIds),
|
|
236
|
+
}, { merge: true });
|
|
257
237
|
await batch.commit();
|
|
258
238
|
}
|
|
259
239
|
catch (error) {
|
|
@@ -275,7 +255,10 @@ export class CouponsRepository extends BaseRepository {
|
|
|
275
255
|
.collection(COUPON_USAGE_SUBCOLLECTION)
|
|
276
256
|
.doc(couponId)
|
|
277
257
|
.get();
|
|
278
|
-
|
|
258
|
+
if (!doc.exists)
|
|
259
|
+
return 0;
|
|
260
|
+
const data = doc.data();
|
|
261
|
+
return data.usageCount ?? 1;
|
|
279
262
|
}
|
|
280
263
|
catch {
|
|
281
264
|
return 0;
|
|
@@ -345,17 +328,17 @@ export class CouponsRepository extends BaseRepository {
|
|
|
345
328
|
*
|
|
346
329
|
* @param sellerId - The seller's user UID
|
|
347
330
|
*/
|
|
348
|
-
async
|
|
331
|
+
async getStoreCoupons(storeId) {
|
|
349
332
|
try {
|
|
350
333
|
const snapshot = await this.db
|
|
351
334
|
.collection(this.collection)
|
|
352
|
-
.where(COUPON_FIELDS.
|
|
335
|
+
.where(COUPON_FIELDS.STORE_ID, "==", storeId)
|
|
353
336
|
.orderBy(COUPON_FIELDS.CREATED_AT, "desc")
|
|
354
337
|
.get();
|
|
355
338
|
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
356
339
|
}
|
|
357
340
|
catch (error) {
|
|
358
|
-
throw new DatabaseError(`Failed to retrieve
|
|
341
|
+
throw new DatabaseError(`Failed to retrieve store coupons: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
359
342
|
}
|
|
360
343
|
}
|
|
361
344
|
/**
|
|
@@ -377,40 +360,27 @@ export class CouponsRepository extends BaseRepository {
|
|
|
377
360
|
* and `eligibleProductIds` (the `productId` values that qualify).
|
|
378
361
|
*/
|
|
379
362
|
async validateCouponForCart(code, userId, cartItems) {
|
|
380
|
-
|
|
381
|
-
if (!
|
|
382
|
-
return
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
}
|
|
388
|
-
if (!isCouponValid(coupon)) {
|
|
389
|
-
return { valid: false, coupon, message: "Coupon is not currently valid" };
|
|
390
|
-
}
|
|
391
|
-
const userUsageCount = await this.getUserCouponUsageCount(userId, coupon.id);
|
|
392
|
-
if (!canUserUseCoupon(coupon, userUsageCount)) {
|
|
393
|
-
return {
|
|
394
|
-
valid: false,
|
|
395
|
-
coupon,
|
|
396
|
-
message: "You have reached the usage limit for this coupon",
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
// Determine eligible items
|
|
400
|
-
// Pre-order items are always excluded
|
|
401
|
-
let eligible = cartItems.filter((item) => !item.isPreOrder);
|
|
363
|
+
const check = await this._fetchAndValidateCoupon(code, userId);
|
|
364
|
+
if (!check.ok)
|
|
365
|
+
return check.result;
|
|
366
|
+
const { coupon } = check;
|
|
367
|
+
// Determine eligible items — no blanket exclusion by product type.
|
|
368
|
+
// Coupon flags (applicableToAuctions) decide type eligibility below.
|
|
369
|
+
let eligible = [...cartItems];
|
|
402
370
|
const scope = coupon.scope ?? "admin";
|
|
403
371
|
if (scope === "seller") {
|
|
404
|
-
// Restrict to this
|
|
405
|
-
eligible = eligible.filter((item) => item.
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
372
|
+
// Restrict to this store's items
|
|
373
|
+
eligible = eligible.filter((item) => item.storeId === coupon.storeId);
|
|
374
|
+
}
|
|
375
|
+
// Apply product-type filter based on the coupon's own flag:
|
|
376
|
+
// true → auction-only coupon
|
|
377
|
+
// false → explicitly excludes auctions (but includes pre-orders & simple)
|
|
378
|
+
// undefined → no restriction; applies to all product types
|
|
379
|
+
if (coupon.applicableToAuctions === true) {
|
|
380
|
+
eligible = eligible.filter((item) => item.isAuction);
|
|
381
|
+
}
|
|
382
|
+
else if (coupon.applicableToAuctions === false) {
|
|
383
|
+
eligible = eligible.filter((item) => !item.isAuction);
|
|
414
384
|
}
|
|
415
385
|
// Apply product/category restrictions from the coupon itself
|
|
416
386
|
const { applicableProducts, applicableCategories, excludeProducts } = coupon.restrictions;
|
|
@@ -420,16 +390,18 @@ export class CouponsRepository extends BaseRepository {
|
|
|
420
390
|
if (excludeProducts && excludeProducts.length > 0) {
|
|
421
391
|
eligible = eligible.filter((item) => !excludeProducts.includes(item.productId));
|
|
422
392
|
}
|
|
423
|
-
// Note: category filtering requires product metadata
|
|
393
|
+
// Note: category filtering requires product metadata — skipped here but
|
|
424
394
|
// the restriction is stored and can be enforced by the order service.
|
|
425
395
|
void applicableCategories;
|
|
426
396
|
if (eligible.length === 0) {
|
|
427
397
|
return {
|
|
428
398
|
valid: false,
|
|
429
399
|
coupon,
|
|
430
|
-
message:
|
|
431
|
-
? "This coupon
|
|
432
|
-
:
|
|
400
|
+
message: coupon.applicableToAuctions === true
|
|
401
|
+
? "This coupon only applies to auction items"
|
|
402
|
+
: scope === "seller"
|
|
403
|
+
? "This coupon is not valid for the items in your cart from this seller"
|
|
404
|
+
: "No eligible items found for this coupon",
|
|
433
405
|
};
|
|
434
406
|
}
|
|
435
407
|
const eligibleSubtotal = eligible.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
@@ -449,7 +421,7 @@ export class CouponsRepository extends BaseRepository {
|
|
|
449
421
|
eligibleSubtotal,
|
|
450
422
|
eligibleProductIds: eligible.map((item) => item.productId),
|
|
451
423
|
scope,
|
|
452
|
-
|
|
424
|
+
storeId: coupon.storeId,
|
|
453
425
|
message: "Coupon is valid",
|
|
454
426
|
};
|
|
455
427
|
}
|
|
@@ -478,8 +450,8 @@ export class CouponsRepository extends BaseRepository {
|
|
|
478
450
|
async getExpiredActiveRefs(now) {
|
|
479
451
|
const snap = await this.db
|
|
480
452
|
.collection(this.collection)
|
|
481
|
-
.where(COUPON_FIELDS.
|
|
482
|
-
.where(COUPON_FIELDS.
|
|
453
|
+
.where(COUPON_FIELDS.VALIDITY.IS_ACTIVE, "==", true)
|
|
454
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, "<=", now)
|
|
483
455
|
.limit(500)
|
|
484
456
|
.get();
|
|
485
457
|
return snap.docs.map((d) => d.ref);
|
|
@@ -489,7 +461,7 @@ export class CouponsRepository extends BaseRepository {
|
|
|
489
461
|
*/
|
|
490
462
|
deactivateInBatch(batch, ref) {
|
|
491
463
|
batch.update(ref, {
|
|
492
|
-
[COUPON_FIELDS.
|
|
464
|
+
[COUPON_FIELDS.VALIDITY.IS_ACTIVE]: false,
|
|
493
465
|
updatedAt: serverTimestamp(),
|
|
494
466
|
});
|
|
495
467
|
}
|