@mohasinac/appkit 2.3.2 → 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 +44 -12
- package/dist/client.js +22 -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 +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 +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 +112 -16
- package/dist/index.js +133 -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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Support Ticket Firestore Document Types & Constants
|
|
3
|
+
*
|
|
4
|
+
* Canonical types for the supportTickets collection. Tickets are the primary
|
|
5
|
+
* channel through which users contest bans and report order/billing issues.
|
|
6
|
+
*
|
|
7
|
+
* Collection: supportTickets
|
|
8
|
+
* Document ID prefix: ticket- (semantic, no auto-ID)
|
|
9
|
+
*
|
|
10
|
+
* Ticket creation rules (enforced server-side, never client-trusted):
|
|
11
|
+
* - Max 2 active general tickets per user
|
|
12
|
+
* - Max 1 ticket per active (non-completed) order
|
|
13
|
+
* - No guest creation — authentication required
|
|
14
|
+
* - No creation if user has create_support_tickets soft ban
|
|
15
|
+
* - No new ticket in the same category while existing one is waiting_on_user
|
|
16
|
+
*/
|
|
17
|
+
export declare const TicketCategoryValues: {
|
|
18
|
+
readonly ORDER_ISSUE: "order_issue";
|
|
19
|
+
readonly BILLING_PAYMENT: "billing_payment";
|
|
20
|
+
readonly ACCOUNT: "account";
|
|
21
|
+
readonly LISTING_DISPUTE: "listing_dispute";
|
|
22
|
+
readonly SCAM_REPORT: "scam_report";
|
|
23
|
+
readonly REFUND_REQUEST: "refund_request";
|
|
24
|
+
readonly AUCTION_DISPUTE: "auction_dispute";
|
|
25
|
+
readonly GENERAL: "general";
|
|
26
|
+
};
|
|
27
|
+
export type TicketCategory = (typeof TicketCategoryValues)[keyof typeof TicketCategoryValues];
|
|
28
|
+
export declare const TicketStatusValues: {
|
|
29
|
+
readonly OPEN: "open";
|
|
30
|
+
readonly IN_PROGRESS: "in_progress";
|
|
31
|
+
readonly WAITING_ON_USER: "waiting_on_user";
|
|
32
|
+
readonly RESOLVED: "resolved";
|
|
33
|
+
readonly CLOSED: "closed";
|
|
34
|
+
};
|
|
35
|
+
export type TicketStatus = (typeof TicketStatusValues)[keyof typeof TicketStatusValues];
|
|
36
|
+
export declare const TicketPriorityValues: {
|
|
37
|
+
readonly LOW: "low";
|
|
38
|
+
readonly NORMAL: "normal";
|
|
39
|
+
readonly HIGH: "high";
|
|
40
|
+
readonly URGENT: "urgent";
|
|
41
|
+
};
|
|
42
|
+
export type TicketPriority = (typeof TicketPriorityValues)[keyof typeof TicketPriorityValues];
|
|
43
|
+
/** Statuses considered "active" for limit-enforcement purposes. */
|
|
44
|
+
export declare const ACTIVE_TICKET_STATUSES: TicketStatus[];
|
|
45
|
+
/** Order statuses that are eligible for a support ticket. */
|
|
46
|
+
export declare const ELIGIBLE_ORDER_STATUSES_FOR_TICKET: readonly ["PENDING", "PROCESSING", "SHIPPED", "RETURN_REQUESTED"];
|
|
47
|
+
export interface TicketMessage {
|
|
48
|
+
id: string;
|
|
49
|
+
authorId: string;
|
|
50
|
+
authorRole: "user" | "support" | "admin";
|
|
51
|
+
/** Plain text or safe HTML body. */
|
|
52
|
+
body: string;
|
|
53
|
+
/** Media URLs (screenshots, attachments — /media/ proxy URLs, never raw Storage). */
|
|
54
|
+
attachments?: string[];
|
|
55
|
+
createdAt: Date;
|
|
56
|
+
}
|
|
57
|
+
export interface SupportTicketDocument {
|
|
58
|
+
id: string;
|
|
59
|
+
userId: string;
|
|
60
|
+
/** Denormalized — for admin table display. */
|
|
61
|
+
userEmail: string;
|
|
62
|
+
/** Denormalized — for admin table display. */
|
|
63
|
+
userDisplayName: string;
|
|
64
|
+
category: TicketCategory;
|
|
65
|
+
subject: string;
|
|
66
|
+
/** Initial description written by the user when opening the ticket. */
|
|
67
|
+
description: string;
|
|
68
|
+
/** Linked order ID — required when category === "order_issue". */
|
|
69
|
+
orderId?: string;
|
|
70
|
+
status: TicketStatus;
|
|
71
|
+
priority: TicketPriority;
|
|
72
|
+
/** UID of the assigned employee. */
|
|
73
|
+
assignedTo?: string;
|
|
74
|
+
/** Denormalized display name of the assignee. */
|
|
75
|
+
assignedToName?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Internal-only notes visible only to admins/employees, never shown to the ticket author.
|
|
78
|
+
* Append-only — never overwrite, always append with timestamp.
|
|
79
|
+
*/
|
|
80
|
+
internalNotes?: string;
|
|
81
|
+
/** Threaded conversation. Ordered by createdAt asc. */
|
|
82
|
+
messages: TicketMessage[];
|
|
83
|
+
resolvedAt?: Date;
|
|
84
|
+
closedAt?: Date;
|
|
85
|
+
createdAt: Date;
|
|
86
|
+
updatedAt: Date;
|
|
87
|
+
}
|
|
88
|
+
export type SupportTicketCreateInput = Pick<SupportTicketDocument, "userId" | "userEmail" | "userDisplayName" | "category" | "subject" | "description" | "orderId">;
|
|
89
|
+
export type SupportTicketUpdateInput = Partial<Pick<SupportTicketDocument, "status" | "priority" | "assignedTo" | "assignedToName" | "internalNotes" | "resolvedAt" | "closedAt">>;
|
|
90
|
+
export declare const SUPPORT_TICKET_COLLECTION: "supportTickets";
|
|
91
|
+
export declare const SUPPORT_TICKET_ID_PREFIX: "ticket-";
|
|
92
|
+
export declare const SUPPORT_TICKET_INDEXED_FIELDS: readonly ["userId", "status", "category", "priority", "assignedTo", "orderId", "createdAt", "updatedAt"];
|
|
93
|
+
export declare const DEFAULT_SUPPORT_TICKET_DATA: Partial<SupportTicketDocument>;
|
|
94
|
+
export declare const SUPPORT_TICKET_FIELDS: {
|
|
95
|
+
readonly ID: "id";
|
|
96
|
+
readonly USER_ID: "userId";
|
|
97
|
+
readonly USER_EMAIL: "userEmail";
|
|
98
|
+
readonly USER_DISPLAY_NAME: "userDisplayName";
|
|
99
|
+
readonly CATEGORY: "category";
|
|
100
|
+
readonly SUBJECT: "subject";
|
|
101
|
+
readonly DESCRIPTION: "description";
|
|
102
|
+
readonly ORDER_ID: "orderId";
|
|
103
|
+
readonly STATUS: "status";
|
|
104
|
+
readonly PRIORITY: "priority";
|
|
105
|
+
readonly ASSIGNED_TO: "assignedTo";
|
|
106
|
+
readonly ASSIGNED_TO_NAME: "assignedToName";
|
|
107
|
+
readonly INTERNAL_NOTES: "internalNotes";
|
|
108
|
+
readonly MESSAGES: "messages";
|
|
109
|
+
readonly RESOLVED_AT: "resolvedAt";
|
|
110
|
+
readonly CLOSED_AT: "closedAt";
|
|
111
|
+
readonly CREATED_AT: "createdAt";
|
|
112
|
+
readonly UPDATED_AT: "updatedAt";
|
|
113
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Support Ticket Firestore Document Types & Constants
|
|
3
|
+
*
|
|
4
|
+
* Canonical types for the supportTickets collection. Tickets are the primary
|
|
5
|
+
* channel through which users contest bans and report order/billing issues.
|
|
6
|
+
*
|
|
7
|
+
* Collection: supportTickets
|
|
8
|
+
* Document ID prefix: ticket- (semantic, no auto-ID)
|
|
9
|
+
*
|
|
10
|
+
* Ticket creation rules (enforced server-side, never client-trusted):
|
|
11
|
+
* - Max 2 active general tickets per user
|
|
12
|
+
* - Max 1 ticket per active (non-completed) order
|
|
13
|
+
* - No guest creation — authentication required
|
|
14
|
+
* - No creation if user has create_support_tickets soft ban
|
|
15
|
+
* - No new ticket in the same category while existing one is waiting_on_user
|
|
16
|
+
*/
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// ENUMS
|
|
19
|
+
// ============================================================================
|
|
20
|
+
export const TicketCategoryValues = {
|
|
21
|
+
ORDER_ISSUE: "order_issue",
|
|
22
|
+
BILLING_PAYMENT: "billing_payment",
|
|
23
|
+
ACCOUNT: "account",
|
|
24
|
+
LISTING_DISPUTE: "listing_dispute",
|
|
25
|
+
SCAM_REPORT: "scam_report",
|
|
26
|
+
REFUND_REQUEST: "refund_request",
|
|
27
|
+
AUCTION_DISPUTE: "auction_dispute",
|
|
28
|
+
GENERAL: "general",
|
|
29
|
+
};
|
|
30
|
+
export const TicketStatusValues = {
|
|
31
|
+
OPEN: "open",
|
|
32
|
+
IN_PROGRESS: "in_progress",
|
|
33
|
+
WAITING_ON_USER: "waiting_on_user",
|
|
34
|
+
RESOLVED: "resolved",
|
|
35
|
+
CLOSED: "closed",
|
|
36
|
+
};
|
|
37
|
+
export const TicketPriorityValues = {
|
|
38
|
+
LOW: "low",
|
|
39
|
+
NORMAL: "normal",
|
|
40
|
+
HIGH: "high",
|
|
41
|
+
URGENT: "urgent",
|
|
42
|
+
};
|
|
43
|
+
/** Statuses considered "active" for limit-enforcement purposes. */
|
|
44
|
+
export const ACTIVE_TICKET_STATUSES = [
|
|
45
|
+
"open",
|
|
46
|
+
"in_progress",
|
|
47
|
+
"waiting_on_user",
|
|
48
|
+
];
|
|
49
|
+
/** Order statuses that are eligible for a support ticket. */
|
|
50
|
+
export const ELIGIBLE_ORDER_STATUSES_FOR_TICKET = [
|
|
51
|
+
"PENDING",
|
|
52
|
+
"PROCESSING",
|
|
53
|
+
"SHIPPED",
|
|
54
|
+
"RETURN_REQUESTED",
|
|
55
|
+
];
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// COLLECTION CONSTANTS
|
|
58
|
+
// ============================================================================
|
|
59
|
+
export const SUPPORT_TICKET_COLLECTION = "supportTickets";
|
|
60
|
+
export const SUPPORT_TICKET_ID_PREFIX = "ticket-";
|
|
61
|
+
export const SUPPORT_TICKET_INDEXED_FIELDS = [
|
|
62
|
+
"userId",
|
|
63
|
+
"status",
|
|
64
|
+
"category",
|
|
65
|
+
"priority",
|
|
66
|
+
"assignedTo",
|
|
67
|
+
"orderId",
|
|
68
|
+
"createdAt",
|
|
69
|
+
"updatedAt",
|
|
70
|
+
];
|
|
71
|
+
export const DEFAULT_SUPPORT_TICKET_DATA = {
|
|
72
|
+
status: "open",
|
|
73
|
+
priority: "normal",
|
|
74
|
+
messages: [],
|
|
75
|
+
};
|
|
76
|
+
export const SUPPORT_TICKET_FIELDS = {
|
|
77
|
+
ID: "id",
|
|
78
|
+
USER_ID: "userId",
|
|
79
|
+
USER_EMAIL: "userEmail",
|
|
80
|
+
USER_DISPLAY_NAME: "userDisplayName",
|
|
81
|
+
CATEGORY: "category",
|
|
82
|
+
SUBJECT: "subject",
|
|
83
|
+
DESCRIPTION: "description",
|
|
84
|
+
ORDER_ID: "orderId",
|
|
85
|
+
STATUS: "status",
|
|
86
|
+
PRIORITY: "priority",
|
|
87
|
+
ASSIGNED_TO: "assignedTo",
|
|
88
|
+
ASSIGNED_TO_NAME: "assignedToName",
|
|
89
|
+
INTERNAL_NOTES: "internalNotes",
|
|
90
|
+
MESSAGES: "messages",
|
|
91
|
+
RESOLVED_AT: "resolvedAt",
|
|
92
|
+
CLOSED_AT: "closedAt",
|
|
93
|
+
CREATED_AT: "createdAt",
|
|
94
|
+
UPDATED_AT: "updatedAt",
|
|
95
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export interface SellerWhatsAppSettingsViewProps {
|
|
2
|
+
/** Whether this store has the whatsapp_catalog_sync capability */
|
|
3
|
+
hasCapability: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function SellerWhatsAppSettingsView({ hasCapability }: SellerWhatsAppSettingsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
5
|
+
import { Alert, Button, Form, FormActions, Input, Toggle, useToast, } from "../../../ui";
|
|
6
|
+
import { apiClient } from "../../../http";
|
|
7
|
+
import { WHATSAPP_SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
|
|
8
|
+
import { buildPurchaseAnnouncementMessage } from "../helpers/whatsapp";
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Sub-components
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
function MaskedTokenInput({ label, value, onChange, placeholder, helperText, }) {
|
|
13
|
+
const [revealed, setRevealed] = React.useState(false);
|
|
14
|
+
return (_jsxs("div", { className: "relative", children: [_jsx(Input, { label: label, value: value, onChange: (e) => onChange(e.target.value), type: revealed ? "text" : "password", placeholder: placeholder, helperText: helperText }), _jsx("button", { type: "button", onClick: () => setRevealed((r) => !r), className: "absolute right-3 top-8 text-xs text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200", children: revealed ? "Hide" : "Reveal" })] }));
|
|
15
|
+
}
|
|
16
|
+
const STEPS = [
|
|
17
|
+
{
|
|
18
|
+
n: 1,
|
|
19
|
+
title: "Create a Meta Business Account",
|
|
20
|
+
body: "Go to business.facebook.com and create (or use) a Meta Business Manager account.",
|
|
21
|
+
checkKey: undefined,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
n: 2,
|
|
25
|
+
title: "Set up a WhatsApp Business App",
|
|
26
|
+
body: "In Meta for Developers, create an App → add the WhatsApp product → note your Phone Number ID and WABA ID from the API Setup page.",
|
|
27
|
+
checkKey: "wabaId",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
n: 3,
|
|
31
|
+
title: "Generate a System User access token",
|
|
32
|
+
body: 'In Meta Business Manager → System Users → create a System User → assign "WhatsApp Business Management" + "WhatsApp Business Messaging" permissions → generate a token.',
|
|
33
|
+
checkKey: "accessToken",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
n: 4,
|
|
37
|
+
title: "Create a WhatsApp Catalog",
|
|
38
|
+
body: "In Meta Commerce Manager → Catalogs → create a catalog → copy the Catalog ID.",
|
|
39
|
+
checkKey: "catalogId",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
n: 5,
|
|
43
|
+
title: "Paste credentials below and save",
|
|
44
|
+
body: "Fill the form below and click Save & Connect. Once connected, you can sync your products.",
|
|
45
|
+
checkKey: "connected",
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
const STATUS_COLOR = {
|
|
49
|
+
success: "bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300",
|
|
50
|
+
partial: "bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300",
|
|
51
|
+
failed: "bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300",
|
|
52
|
+
};
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Main component
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
export function SellerWhatsAppSettingsView({ hasCapability }) {
|
|
57
|
+
const queryClient = useQueryClient();
|
|
58
|
+
const { showToast } = useToast();
|
|
59
|
+
const { data, isLoading } = useQuery({
|
|
60
|
+
queryKey: ["store", "whatsapp-settings"],
|
|
61
|
+
queryFn: async () => {
|
|
62
|
+
const res = await apiClient.get(WHATSAPP_SELLER_ENDPOINTS.SETTINGS);
|
|
63
|
+
return (res?.whatsappConfig ?? null);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const cfg = data ?? null;
|
|
67
|
+
// Connection form state
|
|
68
|
+
const [phoneNumber, setPhoneNumber] = React.useState("");
|
|
69
|
+
const [wabaId, setWabaId] = React.useState("");
|
|
70
|
+
const [catalogId, setCatalogId] = React.useState("");
|
|
71
|
+
const [accessToken, setAccessToken] = React.useState("");
|
|
72
|
+
const [syncEnabled, setSyncEnabled] = React.useState(false);
|
|
73
|
+
React.useEffect(() => {
|
|
74
|
+
if (!cfg)
|
|
75
|
+
return;
|
|
76
|
+
setPhoneNumber(cfg.phoneNumber ?? "");
|
|
77
|
+
setWabaId(cfg.wabaId ?? "");
|
|
78
|
+
setCatalogId(cfg.catalogId ?? "");
|
|
79
|
+
setAccessToken(cfg.accessToken ?? "");
|
|
80
|
+
setSyncEnabled(cfg.catalogSyncEnabled ?? false);
|
|
81
|
+
}, [cfg]);
|
|
82
|
+
// Save mutation
|
|
83
|
+
const saveMutation = useMutation({
|
|
84
|
+
mutationFn: async () => {
|
|
85
|
+
const payload = {
|
|
86
|
+
catalogSyncEnabled: syncEnabled,
|
|
87
|
+
};
|
|
88
|
+
if (phoneNumber)
|
|
89
|
+
payload.phoneNumber = phoneNumber;
|
|
90
|
+
if (wabaId)
|
|
91
|
+
payload.wabaId = wabaId;
|
|
92
|
+
if (catalogId)
|
|
93
|
+
payload.catalogId = catalogId;
|
|
94
|
+
// Only send accessToken if user has typed a new value (not the masked placeholder)
|
|
95
|
+
if (accessToken && accessToken !== "••••••")
|
|
96
|
+
payload.accessToken = accessToken;
|
|
97
|
+
return apiClient.put(WHATSAPP_SELLER_ENDPOINTS.SETTINGS, payload);
|
|
98
|
+
},
|
|
99
|
+
onSuccess: () => {
|
|
100
|
+
showToast("WhatsApp settings saved", "success");
|
|
101
|
+
void queryClient.invalidateQueries({ queryKey: ["store", "whatsapp-settings"] });
|
|
102
|
+
},
|
|
103
|
+
onError: (err) => {
|
|
104
|
+
const msg = err instanceof Error ? err.message : "Failed to save settings";
|
|
105
|
+
showToast(msg, "error");
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
// Catalog sync mutation
|
|
109
|
+
const syncMutation = useMutation({
|
|
110
|
+
mutationFn: async () => apiClient.post(WHATSAPP_SELLER_ENDPOINTS.CATALOG_SYNC, {}),
|
|
111
|
+
onSuccess: (res) => {
|
|
112
|
+
const r = res ?? {};
|
|
113
|
+
showToast(`Synced ${r.successCount ?? 0} product${(r.successCount ?? 0) !== 1 ? "s" : ""} to WhatsApp catalog`, "success");
|
|
114
|
+
void queryClient.invalidateQueries({ queryKey: ["store", "whatsapp-settings"] });
|
|
115
|
+
},
|
|
116
|
+
onError: (err) => {
|
|
117
|
+
const msg = err instanceof Error ? err.message : "Sync failed";
|
|
118
|
+
showToast(msg, "error");
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
if (!hasCapability) {
|
|
122
|
+
return (_jsx("div", { className: "max-w-xl mx-auto py-8 px-4", children: _jsxs(Alert, { variant: "warning", children: [_jsx("p", { className: "font-medium", children: "WhatsApp catalog sync is not enabled for your store." }), _jsx("p", { className: "text-sm mt-1", children: "Contact LetItRip support to request access to the WhatsApp Business integration." })] }) }));
|
|
123
|
+
}
|
|
124
|
+
return (_jsxs("div", { className: "max-w-2xl mx-auto space-y-8 py-6 px-4", children: [_jsxs("section", { children: [_jsx("h2", { className: "text-base font-semibold text-zinc-900 dark:text-zinc-100 mb-4", children: "How to connect your WhatsApp Business account" }), _jsx("ol", { className: "space-y-3", children: STEPS.map((step) => {
|
|
125
|
+
const done = step.checkKey === undefined
|
|
126
|
+
? false
|
|
127
|
+
: step.checkKey === "connected"
|
|
128
|
+
? cfg?.connected === true
|
|
129
|
+
: Boolean(cfg?.[step.checkKey]);
|
|
130
|
+
return (_jsxs("li", { className: "flex gap-3", children: [_jsx("span", { className: `flex-shrink-0 w-6 h-6 rounded-full text-xs font-bold flex items-center justify-center mt-0.5 ${done
|
|
131
|
+
? "bg-green-500 text-white"
|
|
132
|
+
: "bg-zinc-200 dark:bg-zinc-700 text-zinc-600 dark:text-zinc-300"}`, children: done ? "✓" : step.n }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium text-zinc-900 dark:text-zinc-100", children: step.title }), _jsx("p", { className: "text-xs text-zinc-500 dark:text-zinc-400 mt-0.5", children: step.body })] })] }, step.n));
|
|
133
|
+
}) })] }), _jsxs("section", { className: "border border-zinc-200 dark:border-zinc-700 rounded-xl p-5", children: [_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsx("h2", { className: "text-sm font-semibold text-zinc-900 dark:text-zinc-100", children: "Connection" }), isLoading ? null : cfg?.connected ? (_jsx("span", { className: "text-xs font-medium px-2 py-0.5 rounded-full bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300", children: "Connected" })) : (_jsx("span", { className: "text-xs font-medium px-2 py-0.5 rounded-full bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400", children: "Not configured" }))] }), _jsxs(Form, { onSubmit: (e) => {
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
saveMutation.mutate();
|
|
136
|
+
}, className: "space-y-4", children: [_jsx(Input, { label: "WhatsApp Business Phone Number", value: phoneNumber, onChange: (e) => setPhoneNumber(e.target.value), placeholder: "919876543210", helperText: "Digits only, include country code (e.g. 91 for India)" }), _jsx(Input, { label: "WABA ID (WhatsApp Business Account ID)", value: wabaId, onChange: (e) => setWabaId(e.target.value), placeholder: "123456789012345", helperText: "From Meta Business Manager \u2192 WhatsApp Accounts" }), _jsx(Input, { label: "Catalog ID", value: catalogId, onChange: (e) => setCatalogId(e.target.value), placeholder: "987654321098765", helperText: "From Meta Commerce Manager \u2192 Catalogs" }), _jsx(MaskedTokenInput, { label: "System User Access Token", value: accessToken, onChange: setAccessToken, placeholder: "EAAxxxxxxxx\u2026", helperText: "Long-lived token with WhatsApp Business permissions" }), _jsx(FormActions, { align: "right", children: _jsx(Button, { type: "submit", isLoading: saveMutation.isPending, disabled: saveMutation.isPending, children: saveMutation.isPending ? "Saving…" : "Save & Connect" }) })] })] }), _jsxs("section", { className: "border border-zinc-200 dark:border-zinc-700 rounded-xl p-5", children: [_jsx("h2", { className: "text-sm font-semibold text-zinc-900 dark:text-zinc-100 mb-4", children: "Catalog Sync" }), _jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm text-zinc-700 dark:text-zinc-300", children: "Enable catalog sync" }), _jsx("p", { className: "text-xs text-zinc-500 dark:text-zinc-400", children: "When enabled, your published standard products can be synced to WhatsApp." })] }), _jsx(Toggle, { checked: syncEnabled, onChange: setSyncEnabled, disabled: !cfg?.connected })] }), cfg?.lastCatalogSyncAt && (_jsxs("div", { className: "flex items-center gap-2 text-xs text-zinc-500 dark:text-zinc-400 mb-3", children: [_jsxs("span", { children: ["Last sync: ", new Date(cfg.lastCatalogSyncAt).toLocaleString("en-IN")] }), cfg.lastSyncCount !== undefined && _jsxs("span", { children: ["\u00B7 ", cfg.lastSyncCount, " products"] }), cfg.lastSyncStatus && (_jsx("span", { className: `px-1.5 py-0.5 rounded ${STATUS_COLOR[cfg.lastSyncStatus] ?? ""}`, children: cfg.lastSyncStatus }))] })), _jsx("p", { className: "text-xs text-zinc-400 dark:text-zinc-500 mb-3", children: "Only published standard products are synced. Auctions and pre-orders are excluded. Batches of up to 50 products per call." }), _jsx(Button, { onClick: () => syncMutation.mutate(), isLoading: syncMutation.isPending, disabled: !cfg?.connected || !syncEnabled || syncMutation.isPending, variant: "secondary", children: syncMutation.isPending ? "Syncing…" : "Sync Now" })] }), _jsxs("section", { className: "border border-zinc-200 dark:border-zinc-700 rounded-xl p-5", children: [_jsx("h2", { className: "text-sm font-semibold text-zinc-900 dark:text-zinc-100 mb-2", children: "Purchase Announcement Preview" }), _jsx("p", { className: "text-xs text-zinc-500 dark:text-zinc-400 mb-3", children: "This message is sent automatically to your phone and the platform admin when a new order is placed." }), _jsx("div", { className: "bg-zinc-50 dark:bg-zinc-800/60 rounded-lg px-4 py-3 text-sm text-zinc-700 dark:text-zinc-200 font-mono", children: buildPurchaseAnnouncementMessage({
|
|
137
|
+
buyerName: "Ravi K.",
|
|
138
|
+
firstItemName: "Charizard PSA 9",
|
|
139
|
+
additionalItemCount: 2,
|
|
140
|
+
totalAmount: 450000,
|
|
141
|
+
orderId: "order-3-20260510-a1b2c3",
|
|
142
|
+
}) })] })] }));
|
|
143
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CheckoutMessageInput, StatusNotificationInput, WebhookVerifyInput, IncomingWebhookPayload, SendWhatsAppInput, StatusMessageInput } from "../types";
|
|
1
|
+
import type { CheckoutMessageInput, StatusNotificationInput, WebhookVerifyInput, IncomingWebhookPayload, SendWhatsAppInput, StatusMessageInput, WaBusinessSendInput, CatalogSyncInput, CatalogSyncResult, PurchaseAnnouncementInput } from "../types";
|
|
2
2
|
export declare function buildCheckoutMessageURL(input: CheckoutMessageInput): string;
|
|
3
3
|
export declare function buildStatusNotificationURL(input: StatusNotificationInput): string;
|
|
4
4
|
export declare function verifyWebhookSignature(input: WebhookVerifyInput): boolean;
|
|
@@ -13,6 +13,28 @@ export declare function parseIncomingWebhookPayload(rawBody: string, contentType
|
|
|
13
13
|
* Pass a custom `statusMessages` map to override the defaults.
|
|
14
14
|
*/
|
|
15
15
|
export declare function buildStatusMessage(input: StatusMessageInput, statusMessages?: Record<string, string>): string;
|
|
16
|
+
/**
|
|
17
|
+
* Send a WhatsApp message via Meta WhatsApp Business Cloud API.
|
|
18
|
+
* Distinct from the Twilio-based sendWhatsAppMessage — used for server-initiated
|
|
19
|
+
* platform announcements. Returns true on success, false on any failure.
|
|
20
|
+
*/
|
|
21
|
+
export declare function sendWhatsAppBusinessMessage(input: WaBusinessSendInput): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Sync a store's products to a Meta Commerce Catalog via items_batch API.
|
|
24
|
+
* Batches at 50 items per call (Meta limit). Returns aggregate results.
|
|
25
|
+
*/
|
|
26
|
+
export declare function syncProductsToCatalog(input: CatalogSyncInput): Promise<CatalogSyncResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Build a plain-text purchase announcement message for WhatsApp.
|
|
29
|
+
* Sent to admin numbers and store owner when a new order is placed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildPurchaseAnnouncementMessage(input: PurchaseAnnouncementInput): string;
|
|
32
|
+
/**
|
|
33
|
+
* Build a wa.me share link with a pre-filled message.
|
|
34
|
+
* Opens WhatsApp contact picker — user selects group manually.
|
|
35
|
+
* This is the only API-compliant way to target a WhatsApp group.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildGroupShareLink(message: string): string;
|
|
16
38
|
/**
|
|
17
39
|
* Send an outbound WhatsApp message via Twilio REST API.
|
|
18
40
|
* Returns true on success, false on failure.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHmac, timingSafeEqual } from "crypto";
|
|
2
2
|
import { getDefaultCurrencySymbol, getDefaultLocale, } from "../../../core/baseline-resolver";
|
|
3
|
+
const META_GRAPH_BASE = "https://graph.facebook.com/v20.0";
|
|
3
4
|
export function buildCheckoutMessageURL(input) {
|
|
4
5
|
const { waNumber, cart, total, address, isPreorder = false } = input;
|
|
5
6
|
const prefix = isPreorder ? "\uD83D\uDD16 *PRE-ORDER*\n\n" : "";
|
|
@@ -97,6 +98,109 @@ export function buildStatusMessage(input, statusMessages = DEFAULT_STATUS_MESSAG
|
|
|
97
98
|
: "";
|
|
98
99
|
return template.replace("{id}", orderId).replace("{tracking}", trackingLine);
|
|
99
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Send a WhatsApp message via Meta WhatsApp Business Cloud API.
|
|
103
|
+
* Distinct from the Twilio-based sendWhatsAppMessage — used for server-initiated
|
|
104
|
+
* platform announcements. Returns true on success, false on any failure.
|
|
105
|
+
*/
|
|
106
|
+
export async function sendWhatsAppBusinessMessage(input) {
|
|
107
|
+
const { toPhone, message, phoneNumberId, accessToken } = input;
|
|
108
|
+
const cleanPhone = toPhone.replace(/\D/g, "");
|
|
109
|
+
if (!cleanPhone || !phoneNumberId || !accessToken)
|
|
110
|
+
return false;
|
|
111
|
+
try {
|
|
112
|
+
const res = await fetch(`${META_GRAPH_BASE}/${phoneNumberId}/messages`, {
|
|
113
|
+
method: "POST",
|
|
114
|
+
headers: {
|
|
115
|
+
"Content-Type": "application/json",
|
|
116
|
+
Authorization: `Bearer ${accessToken}`,
|
|
117
|
+
},
|
|
118
|
+
body: JSON.stringify({
|
|
119
|
+
messaging_product: "whatsapp",
|
|
120
|
+
to: cleanPhone,
|
|
121
|
+
type: "text",
|
|
122
|
+
text: { body: message },
|
|
123
|
+
}),
|
|
124
|
+
});
|
|
125
|
+
return res.ok;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Sync a store's products to a Meta Commerce Catalog via items_batch API.
|
|
133
|
+
* Batches at 50 items per call (Meta limit). Returns aggregate results.
|
|
134
|
+
*/
|
|
135
|
+
export async function syncProductsToCatalog(input) {
|
|
136
|
+
const { catalogId, accessToken, products } = input;
|
|
137
|
+
const result = {
|
|
138
|
+
handles: [],
|
|
139
|
+
successCount: 0,
|
|
140
|
+
failureCount: 0,
|
|
141
|
+
errors: [],
|
|
142
|
+
};
|
|
143
|
+
const BATCH_SIZE = 50;
|
|
144
|
+
for (let i = 0; i < products.length; i += BATCH_SIZE) {
|
|
145
|
+
const batch = products.slice(i, i + BATCH_SIZE);
|
|
146
|
+
const requests = batch.map((p) => ({
|
|
147
|
+
method: "UPDATE",
|
|
148
|
+
retailer_id: p.id,
|
|
149
|
+
data: {
|
|
150
|
+
name: p.title,
|
|
151
|
+
description: p.description,
|
|
152
|
+
// Meta expects "<amount> <ISO_CURRENCY>" e.g. "450.00 INR"
|
|
153
|
+
price: `${(p.price / 100).toFixed(2)} ${p.currency}`,
|
|
154
|
+
image_url: p.imageUrl,
|
|
155
|
+
availability: p.availability,
|
|
156
|
+
condition: p.condition,
|
|
157
|
+
...(p.link ? { url: p.link } : {}),
|
|
158
|
+
},
|
|
159
|
+
}));
|
|
160
|
+
try {
|
|
161
|
+
const res = await fetch(`${META_GRAPH_BASE}/${catalogId}/items_batch`, {
|
|
162
|
+
method: "POST",
|
|
163
|
+
headers: {
|
|
164
|
+
"Content-Type": "application/json",
|
|
165
|
+
Authorization: `Bearer ${accessToken}`,
|
|
166
|
+
},
|
|
167
|
+
body: JSON.stringify({ requests }),
|
|
168
|
+
});
|
|
169
|
+
const json = (await res.json());
|
|
170
|
+
if (res.ok && json.handles) {
|
|
171
|
+
result.handles.push(...json.handles);
|
|
172
|
+
result.successCount += batch.length;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
result.failureCount += batch.length;
|
|
176
|
+
result.errors.push(json.error?.message ?? `Batch ${i / BATCH_SIZE + 1} failed`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
result.failureCount += batch.length;
|
|
181
|
+
result.errors.push(String(err));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build a plain-text purchase announcement message for WhatsApp.
|
|
188
|
+
* Sent to admin numbers and store owner when a new order is placed.
|
|
189
|
+
*/
|
|
190
|
+
export function buildPurchaseAnnouncementMessage(input) {
|
|
191
|
+
const { buyerName, firstItemName, additionalItemCount, totalAmount, orderId } = input;
|
|
192
|
+
const extra = additionalItemCount > 0 ? ` + ${additionalItemCount} more item${additionalItemCount > 1 ? "s" : ""}` : "";
|
|
193
|
+
const amount = (totalAmount / 100).toLocaleString("en-IN");
|
|
194
|
+
return `🛍️ New order! ${buyerName} purchased ${firstItemName}${extra} for ₹${amount}. Order #${orderId}`;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Build a wa.me share link with a pre-filled message.
|
|
198
|
+
* Opens WhatsApp contact picker — user selects group manually.
|
|
199
|
+
* This is the only API-compliant way to target a WhatsApp group.
|
|
200
|
+
*/
|
|
201
|
+
export function buildGroupShareLink(message) {
|
|
202
|
+
return `https://wa.me/?text=${encodeURIComponent(message)}`;
|
|
203
|
+
}
|
|
100
204
|
/**
|
|
101
205
|
* Send an outbound WhatsApp message via Twilio REST API.
|
|
102
206
|
* Returns true on success, false on failure.
|
|
@@ -40,6 +40,55 @@ export interface SendWhatsAppInput {
|
|
|
40
40
|
/** Twilio from number, e.g. "whatsapp:+14155238886" */
|
|
41
41
|
fromNumber: string;
|
|
42
42
|
}
|
|
43
|
+
/** Input for sending a message via Meta WhatsApp Business Cloud API. */
|
|
44
|
+
export interface WaBusinessSendInput {
|
|
45
|
+
/** Digits-only phone number with country code, e.g. "919876543210" */
|
|
46
|
+
toPhone: string;
|
|
47
|
+
message: string;
|
|
48
|
+
/** Meta Phone Number ID (from Meta for Developers > App > WhatsApp > API Setup) */
|
|
49
|
+
phoneNumberId: string;
|
|
50
|
+
/** Meta system user access token */
|
|
51
|
+
accessToken: string;
|
|
52
|
+
}
|
|
53
|
+
/** A product mapped to the Meta Commerce API catalog item format. */
|
|
54
|
+
export interface CatalogSyncProduct {
|
|
55
|
+
/** Firestore product ID — used as Meta `retailer_id` */
|
|
56
|
+
id: string;
|
|
57
|
+
title: string;
|
|
58
|
+
description: string;
|
|
59
|
+
/** Price in paise (will be converted to INR: price/100) */
|
|
60
|
+
price: number;
|
|
61
|
+
currency: string;
|
|
62
|
+
/** URL of the first product image */
|
|
63
|
+
imageUrl: string;
|
|
64
|
+
availability: "in stock" | "out of stock";
|
|
65
|
+
condition: "new" | "used" | "refurbished";
|
|
66
|
+
/** Canonical product page URL, e.g. /products/{slug} */
|
|
67
|
+
link?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface CatalogSyncInput {
|
|
70
|
+
catalogId: string;
|
|
71
|
+
/** Meta access token with catalog management permission */
|
|
72
|
+
accessToken: string;
|
|
73
|
+
products: CatalogSyncProduct[];
|
|
74
|
+
}
|
|
75
|
+
export interface CatalogSyncResult {
|
|
76
|
+
/** Meta batch request handles */
|
|
77
|
+
handles: string[];
|
|
78
|
+
successCount: number;
|
|
79
|
+
failureCount: number;
|
|
80
|
+
errors: string[];
|
|
81
|
+
}
|
|
82
|
+
/** Input for building a purchase announcement message. */
|
|
83
|
+
export interface PurchaseAnnouncementInput {
|
|
84
|
+
buyerName: string;
|
|
85
|
+
firstItemName: string;
|
|
86
|
+
/** 0 if only one item in the order */
|
|
87
|
+
additionalItemCount: number;
|
|
88
|
+
/** Total order amount in paise */
|
|
89
|
+
totalAmount: number;
|
|
90
|
+
orderId: string;
|
|
91
|
+
}
|
|
43
92
|
/** Known order status values — extend as needed per project. */
|
|
44
93
|
export type OrderStatusKey = "pending_payment" | "payment_confirmed" | "processing" | "shipped" | "out_for_delivery" | "delivered" | "cancelled" | "refund_initiated" | string;
|
|
45
94
|
export interface StatusMessageInput {
|
|
@@ -2,9 +2,7 @@ import React from "react";
|
|
|
2
2
|
import type { WishlistItem, WishlistResponse } from "../types";
|
|
3
3
|
export type WishlistTab = "products" | "auctions" | "categories" | "stores";
|
|
4
4
|
export interface WishlistViewProps {
|
|
5
|
-
/** Authenticated user id — required to fetch wishlist */
|
|
6
5
|
userId?: string;
|
|
7
|
-
/** Optional initial SSR data */
|
|
8
6
|
initialData?: WishlistResponse;
|
|
9
7
|
labels?: {
|
|
10
8
|
title?: string;
|
|
@@ -12,21 +10,13 @@ export interface WishlistViewProps {
|
|
|
12
10
|
emptyTitle?: string;
|
|
13
11
|
emptyDescription?: string;
|
|
14
12
|
};
|
|
15
|
-
/** Render tab bar (receives active tab and setter) */
|
|
16
13
|
renderTabs?: (activeTab: WishlistTab, onTabChange: (tab: WishlistTab) => void) => React.ReactNode;
|
|
17
|
-
/** Render search input */
|
|
18
14
|
renderSearch?: (value: string, onChange: (v: string) => void) => React.ReactNode;
|
|
19
|
-
/** Render sort dropdown */
|
|
20
15
|
renderSort?: (value: string, onChange: (v: string) => void) => React.ReactNode;
|
|
21
|
-
/** Render view mode toggle */
|
|
22
16
|
renderViewToggle?: (mode: string, onToggle: (m: string) => void) => React.ReactNode;
|
|
23
|
-
/** Render the products grid */
|
|
24
17
|
renderProducts?: (items: WishlistItem[], isLoading: boolean) => React.ReactNode;
|
|
25
|
-
/** Render coming-soon placeholder for non-products tabs */
|
|
26
18
|
renderTabPlaceholder?: (tab: WishlistTab) => React.ReactNode;
|
|
27
|
-
/** Render bulk action bar */
|
|
28
19
|
renderBulkActions?: (selectedIds: string[], onClearSelection: () => void) => React.ReactNode;
|
|
29
|
-
/** Render pagination */
|
|
30
20
|
renderPagination?: (total: number) => React.ReactNode;
|
|
31
21
|
className?: string;
|
|
32
22
|
}
|