@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
|
@@ -2,365 +2,18 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
5
|
-
import {
|
|
5
|
+
import { Button, Checkbox, ConfirmDeleteModal, Div, Form, FormActions, Input, Modal, Select, Text, Textarea, useToast, } from "../../../ui";
|
|
6
6
|
import { apiClient } from "../../../http";
|
|
7
|
-
import { ADMIN_ENDPOINTS } from "../../../constants";
|
|
7
|
+
import { ADMIN_ENDPOINTS, DEMO_ENDPOINTS } from "../../../constants";
|
|
8
8
|
import { useAdminSectionsListing } from "../hooks/useAdminSectionsListing";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"stats",
|
|
13
|
-
"trust-indicators",
|
|
14
|
-
"categories",
|
|
15
|
-
"brands",
|
|
16
|
-
"products",
|
|
17
|
-
"pre-orders",
|
|
18
|
-
"auctions",
|
|
19
|
-
"banner",
|
|
20
|
-
"features",
|
|
21
|
-
"reviews",
|
|
22
|
-
"whatsapp-community",
|
|
23
|
-
"faq",
|
|
24
|
-
"blog-articles",
|
|
25
|
-
"newsletter",
|
|
26
|
-
"stores",
|
|
27
|
-
"events",
|
|
28
|
-
];
|
|
29
|
-
const DEFAULT_PRODUCTS_BUILDER = {
|
|
30
|
-
title: "Featured Products",
|
|
31
|
-
subtitle: "",
|
|
32
|
-
maxItems: 18,
|
|
33
|
-
status: "published",
|
|
34
|
-
sortBy: "featured",
|
|
35
|
-
featuredOnly: true,
|
|
36
|
-
inStockOnly: true,
|
|
37
|
-
autoScroll: false,
|
|
38
|
-
scrollInterval: 5000,
|
|
39
|
-
resourceMode: "automatic",
|
|
40
|
-
selectedCategoryIds: [],
|
|
41
|
-
manualResourceIds: "",
|
|
42
|
-
};
|
|
43
|
-
const DEFAULT_AUCTIONS_BUILDER = {
|
|
44
|
-
title: "Live Auctions",
|
|
45
|
-
subtitle: "",
|
|
46
|
-
maxItems: 18,
|
|
47
|
-
status: "active",
|
|
48
|
-
sortBy: "ending-soon",
|
|
49
|
-
autoScroll: false,
|
|
50
|
-
scrollInterval: 5000,
|
|
51
|
-
resourceMode: "automatic",
|
|
52
|
-
selectedCategoryIds: [],
|
|
53
|
-
manualResourceIds: "",
|
|
54
|
-
};
|
|
55
|
-
const DEFAULT_STATS_BUILDER = {
|
|
56
|
-
title: "Marketplace Stats",
|
|
57
|
-
stats: [
|
|
58
|
-
{ key: "products", label: "Products Listed", value: "10,000+" },
|
|
59
|
-
{ key: "sellers", label: "Verified Sellers", value: "2,000+" },
|
|
60
|
-
{ key: "buyers", label: "Happy Buyers", value: "50,000+" },
|
|
61
|
-
{ key: "rating", label: "Average Rating", value: "4.8/5" },
|
|
62
|
-
],
|
|
63
|
-
};
|
|
64
|
-
const DEFAULT_PRE_ORDERS_BUILDER = {
|
|
65
|
-
title: "Reserve Before It Ships",
|
|
66
|
-
subtitle: "",
|
|
67
|
-
maxItems: 18,
|
|
68
|
-
status: "active",
|
|
69
|
-
sortBy: "shipping-soon",
|
|
70
|
-
autoScroll: false,
|
|
71
|
-
scrollInterval: 5000,
|
|
72
|
-
resourceMode: "automatic",
|
|
73
|
-
selectedCategoryIds: [],
|
|
74
|
-
manualResourceIds: "",
|
|
75
|
-
};
|
|
76
|
-
const DEFAULT_STORES_BUILDER = {
|
|
77
|
-
title: "Featured Stores",
|
|
78
|
-
subtitle: "",
|
|
79
|
-
maxItems: 8,
|
|
80
|
-
status: "active",
|
|
81
|
-
sortBy: "rating-desc",
|
|
82
|
-
verifiedOnly: true,
|
|
83
|
-
autoScroll: false,
|
|
84
|
-
scrollInterval: 5000,
|
|
85
|
-
resourceMode: "automatic",
|
|
86
|
-
selectedCategoryIds: [],
|
|
87
|
-
manualResourceIds: "",
|
|
88
|
-
};
|
|
89
|
-
const DEFAULT_EVENTS_BUILDER = {
|
|
90
|
-
title: "Events & Offers",
|
|
91
|
-
subtitle: "",
|
|
92
|
-
maxItems: 6,
|
|
93
|
-
status: "active",
|
|
94
|
-
sortBy: "start-date",
|
|
95
|
-
featuredOnly: false,
|
|
96
|
-
autoScroll: false,
|
|
97
|
-
scrollInterval: 5000,
|
|
98
|
-
resourceMode: "automatic",
|
|
99
|
-
selectedCategoryIds: [],
|
|
100
|
-
manualResourceIds: "",
|
|
101
|
-
};
|
|
102
|
-
const SUPPORTED_TYPED_BUILDERS = [
|
|
103
|
-
"products",
|
|
104
|
-
"auctions",
|
|
105
|
-
"stats",
|
|
106
|
-
"pre-orders",
|
|
107
|
-
"stores",
|
|
108
|
-
"events",
|
|
109
|
-
];
|
|
110
|
-
function parseCsvValues(value) {
|
|
111
|
-
return value
|
|
112
|
-
.split(",")
|
|
113
|
-
.map((part) => part.trim())
|
|
114
|
-
.filter(Boolean);
|
|
115
|
-
}
|
|
116
|
-
function toNumberValue(value, fallback) {
|
|
117
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
118
|
-
return value;
|
|
119
|
-
}
|
|
120
|
-
if (typeof value === "string") {
|
|
121
|
-
const parsed = Number(value);
|
|
122
|
-
if (Number.isFinite(parsed)) {
|
|
123
|
-
return parsed;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return fallback;
|
|
127
|
-
}
|
|
128
|
-
function toStringValue(value, fallback = "") {
|
|
129
|
-
return typeof value === "string" ? value : fallback;
|
|
130
|
-
}
|
|
131
|
-
function toBooleanValue(value, fallback = false) {
|
|
132
|
-
return typeof value === "boolean" ? value : fallback;
|
|
133
|
-
}
|
|
134
|
-
function toStringArray(value) {
|
|
135
|
-
return Array.isArray(value)
|
|
136
|
-
? value.filter((item) => typeof item === "string")
|
|
137
|
-
: [];
|
|
138
|
-
}
|
|
139
|
-
function buildProductsConfig(builder) {
|
|
140
|
-
return {
|
|
141
|
-
title: builder.title,
|
|
142
|
-
subtitle: builder.subtitle || undefined,
|
|
143
|
-
maxProducts: builder.maxItems,
|
|
144
|
-
rows: 2,
|
|
145
|
-
itemsPerRow: 3,
|
|
146
|
-
mobileItemsPerRow: 1,
|
|
147
|
-
autoScroll: builder.autoScroll,
|
|
148
|
-
scrollInterval: builder.scrollInterval,
|
|
149
|
-
filters: {
|
|
150
|
-
categoryIds: builder.selectedCategoryIds,
|
|
151
|
-
status: builder.status,
|
|
152
|
-
sortBy: builder.sortBy,
|
|
153
|
-
featuredOnly: builder.featuredOnly,
|
|
154
|
-
inStockOnly: builder.inStockOnly,
|
|
155
|
-
},
|
|
156
|
-
resources: {
|
|
157
|
-
mode: builder.resourceMode,
|
|
158
|
-
ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
function buildAuctionsConfig(builder) {
|
|
163
|
-
return {
|
|
164
|
-
title: builder.title,
|
|
165
|
-
subtitle: builder.subtitle || undefined,
|
|
166
|
-
maxAuctions: builder.maxItems,
|
|
167
|
-
rows: 2,
|
|
168
|
-
itemsPerRow: 3,
|
|
169
|
-
mobileItemsPerRow: 1,
|
|
170
|
-
autoScroll: builder.autoScroll,
|
|
171
|
-
scrollInterval: builder.scrollInterval,
|
|
172
|
-
filters: {
|
|
173
|
-
categoryIds: builder.selectedCategoryIds,
|
|
174
|
-
status: builder.status,
|
|
175
|
-
sortBy: builder.sortBy,
|
|
176
|
-
},
|
|
177
|
-
resources: {
|
|
178
|
-
mode: builder.resourceMode,
|
|
179
|
-
ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
|
|
180
|
-
},
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
function buildStatsConfig(builder) {
|
|
184
|
-
return {
|
|
185
|
-
title: builder.title || undefined,
|
|
186
|
-
stats: builder.stats.map((item, index) => ({
|
|
187
|
-
key: item.key.trim() || `stat-${index + 1}`,
|
|
188
|
-
label: item.label,
|
|
189
|
-
value: item.value,
|
|
190
|
-
})),
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
function buildPreOrdersConfig(builder) {
|
|
194
|
-
return {
|
|
195
|
-
title: builder.title,
|
|
196
|
-
subtitle: builder.subtitle || undefined,
|
|
197
|
-
maxItems: builder.maxItems,
|
|
198
|
-
rows: 2,
|
|
199
|
-
itemsPerRow: 3,
|
|
200
|
-
mobileItemsPerRow: 1,
|
|
201
|
-
autoScroll: builder.autoScroll,
|
|
202
|
-
scrollInterval: builder.scrollInterval,
|
|
203
|
-
filters: {
|
|
204
|
-
categoryIds: builder.selectedCategoryIds,
|
|
205
|
-
status: builder.status,
|
|
206
|
-
sortBy: builder.sortBy,
|
|
207
|
-
},
|
|
208
|
-
resources: {
|
|
209
|
-
mode: builder.resourceMode,
|
|
210
|
-
ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
|
|
211
|
-
},
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
function buildStoresConfig(builder) {
|
|
215
|
-
return {
|
|
216
|
-
title: builder.title,
|
|
217
|
-
subtitle: builder.subtitle || undefined,
|
|
218
|
-
maxStores: builder.maxItems,
|
|
219
|
-
autoScroll: builder.autoScroll,
|
|
220
|
-
scrollInterval: builder.scrollInterval,
|
|
221
|
-
filters: {
|
|
222
|
-
categoryIds: builder.selectedCategoryIds,
|
|
223
|
-
status: builder.status,
|
|
224
|
-
sortBy: builder.sortBy,
|
|
225
|
-
verifiedOnly: builder.verifiedOnly,
|
|
226
|
-
},
|
|
227
|
-
resources: {
|
|
228
|
-
mode: builder.resourceMode,
|
|
229
|
-
ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
function buildEventsConfig(builder) {
|
|
234
|
-
return {
|
|
235
|
-
title: builder.title,
|
|
236
|
-
subtitle: builder.subtitle || undefined,
|
|
237
|
-
maxEvents: builder.maxItems,
|
|
238
|
-
autoScroll: builder.autoScroll,
|
|
239
|
-
scrollInterval: builder.scrollInterval,
|
|
240
|
-
filters: {
|
|
241
|
-
categoryIds: builder.selectedCategoryIds,
|
|
242
|
-
status: builder.status,
|
|
243
|
-
sortBy: builder.sortBy,
|
|
244
|
-
featuredOnly: builder.featuredOnly,
|
|
245
|
-
},
|
|
246
|
-
resources: {
|
|
247
|
-
mode: builder.resourceMode,
|
|
248
|
-
ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
|
|
249
|
-
},
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
function parseProductsBuilder(config) {
|
|
253
|
-
const filters = (config.filters ?? {});
|
|
254
|
-
const resources = (config.resources ?? {});
|
|
255
|
-
return {
|
|
256
|
-
title: toStringValue(config.title, DEFAULT_PRODUCTS_BUILDER.title),
|
|
257
|
-
subtitle: toStringValue(config.subtitle),
|
|
258
|
-
maxItems: toNumberValue(config.maxProducts, DEFAULT_PRODUCTS_BUILDER.maxItems),
|
|
259
|
-
status: toStringValue(filters.status, DEFAULT_PRODUCTS_BUILDER.status),
|
|
260
|
-
sortBy: toStringValue(filters.sortBy, DEFAULT_PRODUCTS_BUILDER.sortBy),
|
|
261
|
-
featuredOnly: toBooleanValue(filters.featuredOnly, DEFAULT_PRODUCTS_BUILDER.featuredOnly),
|
|
262
|
-
inStockOnly: toBooleanValue(filters.inStockOnly, DEFAULT_PRODUCTS_BUILDER.inStockOnly),
|
|
263
|
-
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_PRODUCTS_BUILDER.autoScroll),
|
|
264
|
-
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_PRODUCTS_BUILDER.scrollInterval),
|
|
265
|
-
resourceMode: toStringValue(resources.mode, DEFAULT_PRODUCTS_BUILDER.resourceMode),
|
|
266
|
-
selectedCategoryIds: toStringArray(filters.categoryIds),
|
|
267
|
-
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
function parseAuctionsBuilder(config) {
|
|
271
|
-
const filters = (config.filters ?? {});
|
|
272
|
-
const resources = (config.resources ?? {});
|
|
273
|
-
return {
|
|
274
|
-
title: toStringValue(config.title, DEFAULT_AUCTIONS_BUILDER.title),
|
|
275
|
-
subtitle: toStringValue(config.subtitle),
|
|
276
|
-
maxItems: toNumberValue(config.maxAuctions, DEFAULT_AUCTIONS_BUILDER.maxItems),
|
|
277
|
-
status: toStringValue(filters.status, DEFAULT_AUCTIONS_BUILDER.status),
|
|
278
|
-
sortBy: toStringValue(filters.sortBy, DEFAULT_AUCTIONS_BUILDER.sortBy),
|
|
279
|
-
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_AUCTIONS_BUILDER.autoScroll),
|
|
280
|
-
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_AUCTIONS_BUILDER.scrollInterval),
|
|
281
|
-
resourceMode: toStringValue(resources.mode, DEFAULT_AUCTIONS_BUILDER.resourceMode),
|
|
282
|
-
selectedCategoryIds: toStringArray(filters.categoryIds),
|
|
283
|
-
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
function parseStatsBuilder(config) {
|
|
287
|
-
const statsArray = Array.isArray(config.stats) ? config.stats : [];
|
|
288
|
-
const parsedStats = statsArray
|
|
289
|
-
.slice(0, 4)
|
|
290
|
-
.map((item, index) => {
|
|
291
|
-
const row = (item ?? {});
|
|
292
|
-
return {
|
|
293
|
-
key: toStringValue(row.key, `stat-${index + 1}`),
|
|
294
|
-
label: toStringValue(row.label),
|
|
295
|
-
value: toStringValue(row.value),
|
|
296
|
-
};
|
|
297
|
-
});
|
|
298
|
-
while (parsedStats.length < 4) {
|
|
299
|
-
parsedStats.push({
|
|
300
|
-
key: `stat-${parsedStats.length + 1}`,
|
|
301
|
-
label: "",
|
|
302
|
-
value: "",
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
return {
|
|
306
|
-
title: toStringValue(config.title, DEFAULT_STATS_BUILDER.title),
|
|
307
|
-
stats: parsedStats,
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
function parsePreOrdersBuilder(config) {
|
|
311
|
-
const filters = (config.filters ?? {});
|
|
312
|
-
const resources = (config.resources ?? {});
|
|
313
|
-
return {
|
|
314
|
-
title: toStringValue(config.title, DEFAULT_PRE_ORDERS_BUILDER.title),
|
|
315
|
-
subtitle: toStringValue(config.subtitle),
|
|
316
|
-
maxItems: toNumberValue(config.maxItems, DEFAULT_PRE_ORDERS_BUILDER.maxItems),
|
|
317
|
-
status: toStringValue(filters.status, DEFAULT_PRE_ORDERS_BUILDER.status),
|
|
318
|
-
sortBy: toStringValue(filters.sortBy, DEFAULT_PRE_ORDERS_BUILDER.sortBy),
|
|
319
|
-
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_PRE_ORDERS_BUILDER.autoScroll),
|
|
320
|
-
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_PRE_ORDERS_BUILDER.scrollInterval),
|
|
321
|
-
resourceMode: toStringValue(resources.mode, DEFAULT_PRE_ORDERS_BUILDER.resourceMode),
|
|
322
|
-
selectedCategoryIds: toStringArray(filters.categoryIds),
|
|
323
|
-
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
function parseStoresBuilder(config) {
|
|
327
|
-
const filters = (config.filters ?? {});
|
|
328
|
-
const resources = (config.resources ?? {});
|
|
329
|
-
return {
|
|
330
|
-
title: toStringValue(config.title, DEFAULT_STORES_BUILDER.title),
|
|
331
|
-
subtitle: toStringValue(config.subtitle),
|
|
332
|
-
maxItems: toNumberValue(config.maxStores, DEFAULT_STORES_BUILDER.maxItems),
|
|
333
|
-
status: toStringValue(filters.status, DEFAULT_STORES_BUILDER.status),
|
|
334
|
-
sortBy: toStringValue(filters.sortBy, DEFAULT_STORES_BUILDER.sortBy),
|
|
335
|
-
verifiedOnly: toBooleanValue(filters.verifiedOnly, DEFAULT_STORES_BUILDER.verifiedOnly),
|
|
336
|
-
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_STORES_BUILDER.autoScroll),
|
|
337
|
-
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_STORES_BUILDER.scrollInterval),
|
|
338
|
-
resourceMode: toStringValue(resources.mode, DEFAULT_STORES_BUILDER.resourceMode),
|
|
339
|
-
selectedCategoryIds: toStringArray(filters.categoryIds),
|
|
340
|
-
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
function parseEventsBuilder(config) {
|
|
344
|
-
const filters = (config.filters ?? {});
|
|
345
|
-
const resources = (config.resources ?? {});
|
|
346
|
-
return {
|
|
347
|
-
title: toStringValue(config.title, DEFAULT_EVENTS_BUILDER.title),
|
|
348
|
-
subtitle: toStringValue(config.subtitle),
|
|
349
|
-
maxItems: toNumberValue(config.maxEvents, DEFAULT_EVENTS_BUILDER.maxItems),
|
|
350
|
-
status: toStringValue(filters.status, DEFAULT_EVENTS_BUILDER.status),
|
|
351
|
-
sortBy: toStringValue(filters.sortBy, DEFAULT_EVENTS_BUILDER.sortBy),
|
|
352
|
-
featuredOnly: toBooleanValue(filters.featuredOnly, DEFAULT_EVENTS_BUILDER.featuredOnly),
|
|
353
|
-
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_EVENTS_BUILDER.autoScroll),
|
|
354
|
-
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_EVENTS_BUILDER.scrollInterval),
|
|
355
|
-
resourceMode: toStringValue(resources.mode, DEFAULT_EVENTS_BUILDER.resourceMode),
|
|
356
|
-
selectedCategoryIds: toStringArray(filters.categoryIds),
|
|
357
|
-
manualResourceIds: toStringArray(resources.ids).join(", "),
|
|
358
|
-
};
|
|
359
|
-
}
|
|
9
|
+
import { DataTable } from "./DataTable";
|
|
10
|
+
import { SECTION_TYPE_OPTIONS, SUPPORTED_TYPED_BUILDERS, RESOURCE_SORT_OPTIONS, FAQ_CATEGORY_OPTIONS, DEFAULT_PRODUCTS_BUILDER, DEFAULT_AUCTIONS_BUILDER, DEFAULT_STATS_BUILDER, DEFAULT_PRE_ORDERS_BUILDER, DEFAULT_STORES_BUILDER, DEFAULT_EVENTS_BUILDER, DEFAULT_SOCIAL_FEED_BUILDER, DEFAULT_WELCOME_BUILDER, DEFAULT_TRUST_INDICATORS_BUILDER, DEFAULT_CATEGORIES_BUILDER, DEFAULT_BRANDS_BUILDER, DEFAULT_BANNER_BUILDER, DEFAULT_FEATURES_BUILDER, DEFAULT_REVIEWS_BUILDER, DEFAULT_WHATSAPP_BUILDER, DEFAULT_FAQ_BUILDER, DEFAULT_BLOG_BUILDER, DEFAULT_NEWSLETTER_BUILDER, DEFAULT_CAROUSEL_BUILDER, DEFAULT_CUSTOM_CARDS_BUILDER, DEFAULT_GOOGLE_REVIEWS_BUILDER, } from "./sections/adminSectionsTypes";
|
|
11
|
+
import { toStringValue, buildProductsConfig, buildAuctionsConfig, buildStatsConfig, buildPreOrdersConfig, buildStoresConfig, buildEventsConfig, buildSocialFeedConfig, buildWelcomeConfig, buildTrustIndicatorsConfig, buildCategoriesConfig, buildBrandsConfig, buildBannerConfig, buildFeaturesConfig, buildReviewsConfig, buildWhatsAppConfig, buildFAQConfig, buildBlogConfig, buildNewsletterConfig, buildCarouselConfig, buildCustomCardsConfig, buildGoogleReviewsConfig, parseProductsBuilder, parseAuctionsBuilder, parseStatsBuilder, parsePreOrdersBuilder, parseStoresBuilder, parseEventsBuilder, parseSocialFeedBuilder, parseWelcomeBuilder, parseTrustIndicatorsBuilder, parseCategoriesBuilder, parseBrandsBuilder, parseBannerBuilder, parseFeaturesBuilder, parseReviewsBuilder, parseWhatsAppBuilder, parseFAQBuilder, parseBlogBuilder, parseNewsletterBuilder, parseCarouselBuilder, parseCustomCardsBuilder, parseGoogleReviewsBuilder, } from "./sections/adminSectionsBuildParse";
|
|
360
12
|
export function AdminSectionsView({ children }) {
|
|
361
13
|
const hasChildren = React.Children.count(children) > 0;
|
|
362
14
|
const queryClient = useQueryClient();
|
|
363
15
|
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
16
|
+
const [seedResetOpen, setSeedResetOpen] = React.useState(false);
|
|
364
17
|
const [mode, setMode] = React.useState("create");
|
|
365
18
|
const [selectedSectionId, setSelectedSectionId] = React.useState("");
|
|
366
19
|
const [sectionType, setSectionType] = React.useState("products");
|
|
@@ -373,11 +26,26 @@ export function AdminSectionsView({ children }) {
|
|
|
373
26
|
const [preOrdersBuilder, setPreOrdersBuilder] = React.useState(DEFAULT_PRE_ORDERS_BUILDER);
|
|
374
27
|
const [storesBuilder, setStoresBuilder] = React.useState(DEFAULT_STORES_BUILDER);
|
|
375
28
|
const [eventsBuilder, setEventsBuilder] = React.useState(DEFAULT_EVENTS_BUILDER);
|
|
29
|
+
const [socialFeedBuilder, setSocialFeedBuilder] = React.useState(DEFAULT_SOCIAL_FEED_BUILDER);
|
|
30
|
+
const [welcomeBuilder, setWelcomeBuilder] = React.useState(DEFAULT_WELCOME_BUILDER);
|
|
31
|
+
const [trustIndicatorsBuilder, setTrustIndicatorsBuilder] = React.useState(DEFAULT_TRUST_INDICATORS_BUILDER);
|
|
32
|
+
const [categoriesBuilder, setCategoriesBuilder] = React.useState(DEFAULT_CATEGORIES_BUILDER);
|
|
33
|
+
const [brandsBuilder, setBrandsBuilder] = React.useState(DEFAULT_BRANDS_BUILDER);
|
|
34
|
+
const [bannerBuilder, setBannerBuilder] = React.useState(DEFAULT_BANNER_BUILDER);
|
|
35
|
+
const [featuresBuilder, setFeaturesBuilder] = React.useState(DEFAULT_FEATURES_BUILDER);
|
|
36
|
+
const [reviewsBuilder, setReviewsBuilder] = React.useState(DEFAULT_REVIEWS_BUILDER);
|
|
37
|
+
const [whatsappBuilder, setWhatsappBuilder] = React.useState(DEFAULT_WHATSAPP_BUILDER);
|
|
38
|
+
const [faqBuilder, setFaqBuilder] = React.useState(DEFAULT_FAQ_BUILDER);
|
|
39
|
+
const [blogBuilder, setBlogBuilder] = React.useState(DEFAULT_BLOG_BUILDER);
|
|
40
|
+
const [newsletterBuilder, setNewsletterBuilder] = React.useState(DEFAULT_NEWSLETTER_BUILDER);
|
|
41
|
+
const [carouselBuilder, setCarouselBuilder] = React.useState(DEFAULT_CAROUSEL_BUILDER);
|
|
42
|
+
const [customCardsBuilder, setCustomCardsBuilder] = React.useState(DEFAULT_CUSTOM_CARDS_BUILDER);
|
|
43
|
+
const [googleReviewsBuilder, setGoogleReviewsBuilder] = React.useState(DEFAULT_GOOGLE_REVIEWS_BUILDER);
|
|
376
44
|
const [reorderDraft, setReorderDraft] = React.useState([]);
|
|
377
45
|
const [reorderServerSnapshot, setReorderServerSnapshot] = React.useState([]);
|
|
378
46
|
const [reorderUndoStack, setReorderUndoStack] = React.useState([]);
|
|
379
47
|
const [dragIndex, setDragIndex] = React.useState(null);
|
|
380
|
-
const
|
|
48
|
+
const toast = useToast();
|
|
381
49
|
const isTypedBuilder = SUPPORTED_TYPED_BUILDERS.includes(sectionType);
|
|
382
50
|
const { sections, isLoading, errorMessage } = useAdminSectionsListing({
|
|
383
51
|
page: 1,
|
|
@@ -405,25 +73,30 @@ export function AdminSectionsView({ children }) {
|
|
|
405
73
|
.filter((item) => item !== null);
|
|
406
74
|
}, [categoriesQuery.data?.items]);
|
|
407
75
|
const typedConfig = React.useMemo(() => {
|
|
408
|
-
|
|
409
|
-
return buildProductsConfig(productsBuilder);
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
return
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
return
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
return
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
return
|
|
76
|
+
switch (sectionType) {
|
|
77
|
+
case "products": return buildProductsConfig(productsBuilder);
|
|
78
|
+
case "auctions": return buildAuctionsConfig(auctionsBuilder);
|
|
79
|
+
case "stats": return buildStatsConfig(statsBuilder);
|
|
80
|
+
case "pre-orders": return buildPreOrdersConfig(preOrdersBuilder);
|
|
81
|
+
case "stores": return buildStoresConfig(storesBuilder);
|
|
82
|
+
case "events": return buildEventsConfig(eventsBuilder);
|
|
83
|
+
case "social-feed": return buildSocialFeedConfig(socialFeedBuilder);
|
|
84
|
+
case "welcome": return buildWelcomeConfig(welcomeBuilder);
|
|
85
|
+
case "trust-indicators": return buildTrustIndicatorsConfig(trustIndicatorsBuilder);
|
|
86
|
+
case "categories": return buildCategoriesConfig(categoriesBuilder);
|
|
87
|
+
case "brands": return buildBrandsConfig(brandsBuilder);
|
|
88
|
+
case "banner": return buildBannerConfig(bannerBuilder);
|
|
89
|
+
case "features": return buildFeaturesConfig(featuresBuilder);
|
|
90
|
+
case "reviews": return buildReviewsConfig(reviewsBuilder);
|
|
91
|
+
case "whatsapp-community": return buildWhatsAppConfig(whatsappBuilder);
|
|
92
|
+
case "faq": return buildFAQConfig(faqBuilder);
|
|
93
|
+
case "blog-articles": return buildBlogConfig(blogBuilder);
|
|
94
|
+
case "newsletter": return buildNewsletterConfig(newsletterBuilder);
|
|
95
|
+
case "carousel": return buildCarouselConfig(carouselBuilder);
|
|
96
|
+
case "custom-cards": return buildCustomCardsConfig(customCardsBuilder);
|
|
97
|
+
case "google-reviews": return buildGoogleReviewsConfig(googleReviewsBuilder);
|
|
98
|
+
default: return null;
|
|
422
99
|
}
|
|
423
|
-
if (sectionType === "events") {
|
|
424
|
-
return buildEventsConfig(eventsBuilder);
|
|
425
|
-
}
|
|
426
|
-
return null;
|
|
427
100
|
}, [
|
|
428
101
|
sectionType,
|
|
429
102
|
productsBuilder,
|
|
@@ -432,6 +105,21 @@ export function AdminSectionsView({ children }) {
|
|
|
432
105
|
preOrdersBuilder,
|
|
433
106
|
storesBuilder,
|
|
434
107
|
eventsBuilder,
|
|
108
|
+
socialFeedBuilder,
|
|
109
|
+
welcomeBuilder,
|
|
110
|
+
trustIndicatorsBuilder,
|
|
111
|
+
categoriesBuilder,
|
|
112
|
+
brandsBuilder,
|
|
113
|
+
bannerBuilder,
|
|
114
|
+
featuresBuilder,
|
|
115
|
+
reviewsBuilder,
|
|
116
|
+
whatsappBuilder,
|
|
117
|
+
faqBuilder,
|
|
118
|
+
blogBuilder,
|
|
119
|
+
newsletterBuilder,
|
|
120
|
+
carouselBuilder,
|
|
121
|
+
customCardsBuilder,
|
|
122
|
+
googleReviewsBuilder,
|
|
435
123
|
]);
|
|
436
124
|
React.useEffect(() => {
|
|
437
125
|
if (!typedConfig) {
|
|
@@ -484,11 +172,25 @@ export function AdminSectionsView({ children }) {
|
|
|
484
172
|
},
|
|
485
173
|
onSuccess: async () => {
|
|
486
174
|
await queryClient.invalidateQueries({ queryKey: ["admin", "sections", "listing"] });
|
|
487
|
-
|
|
175
|
+
toast.showToast(mode === "create" ? "Section created." : "Section updated.", "success");
|
|
488
176
|
setIsModalOpen(false);
|
|
489
177
|
},
|
|
490
178
|
onError: (error) => {
|
|
491
|
-
|
|
179
|
+
toast.showToast(error instanceof Error ? error.message : "Failed to save section.", "error");
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
const resetSeed = useMutation({
|
|
183
|
+
mutationFn: () => apiClient.post(DEMO_ENDPOINTS.SEED, {
|
|
184
|
+
action: "load",
|
|
185
|
+
collections: ["homepageSections"],
|
|
186
|
+
}),
|
|
187
|
+
onSuccess: async () => {
|
|
188
|
+
await queryClient.invalidateQueries({ queryKey: ["admin", "sections", "listing"] });
|
|
189
|
+
setSeedResetOpen(false);
|
|
190
|
+
toast.showToast("Homepage sections seed data reloaded.", "success");
|
|
191
|
+
},
|
|
192
|
+
onError: () => {
|
|
193
|
+
toast.showToast("Seed reset failed.", "error");
|
|
492
194
|
},
|
|
493
195
|
});
|
|
494
196
|
const reorderSections = useMutation({
|
|
@@ -501,10 +203,10 @@ export function AdminSectionsView({ children }) {
|
|
|
501
203
|
await queryClient.invalidateQueries({ queryKey: ["admin", "sections", "listing"] });
|
|
502
204
|
setReorderServerSnapshot(cloneReorderItems(reorderDraft));
|
|
503
205
|
setReorderUndoStack([]);
|
|
504
|
-
|
|
206
|
+
toast.showToast("Section order updated.", "success");
|
|
505
207
|
},
|
|
506
208
|
onError: (error) => {
|
|
507
|
-
|
|
209
|
+
toast.showToast(error instanceof Error ? error.message : "Failed to reorder sections.", "error");
|
|
508
210
|
},
|
|
509
211
|
});
|
|
510
212
|
React.useEffect(() => {
|
|
@@ -518,46 +220,140 @@ export function AdminSectionsView({ children }) {
|
|
|
518
220
|
setOrder(String(selected.order ?? ""));
|
|
519
221
|
const selectedConfig = (selected.config ?? {});
|
|
520
222
|
setConfigJson(JSON.stringify(selectedConfig, null, 2));
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
223
|
+
switch (selected.type) {
|
|
224
|
+
case "products":
|
|
225
|
+
setProductsBuilder(parseProductsBuilder(selectedConfig));
|
|
226
|
+
break;
|
|
227
|
+
case "auctions":
|
|
228
|
+
setAuctionsBuilder(parseAuctionsBuilder(selectedConfig));
|
|
229
|
+
break;
|
|
230
|
+
case "stats":
|
|
231
|
+
setStatsBuilder(parseStatsBuilder(selectedConfig));
|
|
232
|
+
break;
|
|
233
|
+
case "pre-orders":
|
|
234
|
+
setPreOrdersBuilder(parsePreOrdersBuilder(selectedConfig));
|
|
235
|
+
break;
|
|
236
|
+
case "stores":
|
|
237
|
+
setStoresBuilder(parseStoresBuilder(selectedConfig));
|
|
238
|
+
break;
|
|
239
|
+
case "events":
|
|
240
|
+
setEventsBuilder(parseEventsBuilder(selectedConfig));
|
|
241
|
+
break;
|
|
242
|
+
case "social-feed":
|
|
243
|
+
setSocialFeedBuilder(parseSocialFeedBuilder(selectedConfig));
|
|
244
|
+
break;
|
|
245
|
+
case "welcome":
|
|
246
|
+
setWelcomeBuilder(parseWelcomeBuilder(selectedConfig));
|
|
247
|
+
break;
|
|
248
|
+
case "trust-indicators":
|
|
249
|
+
setTrustIndicatorsBuilder(parseTrustIndicatorsBuilder(selectedConfig));
|
|
250
|
+
break;
|
|
251
|
+
case "categories":
|
|
252
|
+
setCategoriesBuilder(parseCategoriesBuilder(selectedConfig));
|
|
253
|
+
break;
|
|
254
|
+
case "brands":
|
|
255
|
+
setBrandsBuilder(parseBrandsBuilder(selectedConfig));
|
|
256
|
+
break;
|
|
257
|
+
case "banner":
|
|
258
|
+
setBannerBuilder(parseBannerBuilder(selectedConfig));
|
|
259
|
+
break;
|
|
260
|
+
case "features":
|
|
261
|
+
setFeaturesBuilder(parseFeaturesBuilder(selectedConfig));
|
|
262
|
+
break;
|
|
263
|
+
case "reviews":
|
|
264
|
+
setReviewsBuilder(parseReviewsBuilder(selectedConfig));
|
|
265
|
+
break;
|
|
266
|
+
case "whatsapp-community":
|
|
267
|
+
setWhatsappBuilder(parseWhatsAppBuilder(selectedConfig));
|
|
268
|
+
break;
|
|
269
|
+
case "faq":
|
|
270
|
+
setFaqBuilder(parseFAQBuilder(selectedConfig));
|
|
271
|
+
break;
|
|
272
|
+
case "blog-articles":
|
|
273
|
+
setBlogBuilder(parseBlogBuilder(selectedConfig));
|
|
274
|
+
break;
|
|
275
|
+
case "newsletter":
|
|
276
|
+
setNewsletterBuilder(parseNewsletterBuilder(selectedConfig));
|
|
277
|
+
break;
|
|
278
|
+
case "carousel":
|
|
279
|
+
setCarouselBuilder(parseCarouselBuilder(selectedConfig));
|
|
280
|
+
break;
|
|
281
|
+
case "custom-cards":
|
|
282
|
+
setCustomCardsBuilder(parseCustomCardsBuilder(selectedConfig));
|
|
283
|
+
break;
|
|
284
|
+
case "google-reviews":
|
|
285
|
+
setGoogleReviewsBuilder(parseGoogleReviewsBuilder(selectedConfig));
|
|
286
|
+
break;
|
|
538
287
|
}
|
|
539
288
|
}, [mode, sections, selectedSectionId]);
|
|
540
289
|
React.useEffect(() => {
|
|
541
290
|
if (!isModalOpen || mode !== "create") {
|
|
542
291
|
return;
|
|
543
292
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
293
|
+
switch (sectionType) {
|
|
294
|
+
case "products":
|
|
295
|
+
setProductsBuilder(DEFAULT_PRODUCTS_BUILDER);
|
|
296
|
+
break;
|
|
297
|
+
case "auctions":
|
|
298
|
+
setAuctionsBuilder(DEFAULT_AUCTIONS_BUILDER);
|
|
299
|
+
break;
|
|
300
|
+
case "stats":
|
|
301
|
+
setStatsBuilder(DEFAULT_STATS_BUILDER);
|
|
302
|
+
break;
|
|
303
|
+
case "pre-orders":
|
|
304
|
+
setPreOrdersBuilder(DEFAULT_PRE_ORDERS_BUILDER);
|
|
305
|
+
break;
|
|
306
|
+
case "stores":
|
|
307
|
+
setStoresBuilder(DEFAULT_STORES_BUILDER);
|
|
308
|
+
break;
|
|
309
|
+
case "events":
|
|
310
|
+
setEventsBuilder(DEFAULT_EVENTS_BUILDER);
|
|
311
|
+
break;
|
|
312
|
+
case "social-feed":
|
|
313
|
+
setSocialFeedBuilder(DEFAULT_SOCIAL_FEED_BUILDER);
|
|
314
|
+
break;
|
|
315
|
+
case "welcome":
|
|
316
|
+
setWelcomeBuilder(DEFAULT_WELCOME_BUILDER);
|
|
317
|
+
break;
|
|
318
|
+
case "trust-indicators":
|
|
319
|
+
setTrustIndicatorsBuilder(DEFAULT_TRUST_INDICATORS_BUILDER);
|
|
320
|
+
break;
|
|
321
|
+
case "categories":
|
|
322
|
+
setCategoriesBuilder(DEFAULT_CATEGORIES_BUILDER);
|
|
323
|
+
break;
|
|
324
|
+
case "brands":
|
|
325
|
+
setBrandsBuilder(DEFAULT_BRANDS_BUILDER);
|
|
326
|
+
break;
|
|
327
|
+
case "banner":
|
|
328
|
+
setBannerBuilder(DEFAULT_BANNER_BUILDER);
|
|
329
|
+
break;
|
|
330
|
+
case "features":
|
|
331
|
+
setFeaturesBuilder(DEFAULT_FEATURES_BUILDER);
|
|
332
|
+
break;
|
|
333
|
+
case "reviews":
|
|
334
|
+
setReviewsBuilder(DEFAULT_REVIEWS_BUILDER);
|
|
335
|
+
break;
|
|
336
|
+
case "whatsapp-community":
|
|
337
|
+
setWhatsappBuilder(DEFAULT_WHATSAPP_BUILDER);
|
|
338
|
+
break;
|
|
339
|
+
case "faq":
|
|
340
|
+
setFaqBuilder(DEFAULT_FAQ_BUILDER);
|
|
341
|
+
break;
|
|
342
|
+
case "blog-articles":
|
|
343
|
+
setBlogBuilder(DEFAULT_BLOG_BUILDER);
|
|
344
|
+
break;
|
|
345
|
+
case "newsletter":
|
|
346
|
+
setNewsletterBuilder(DEFAULT_NEWSLETTER_BUILDER);
|
|
347
|
+
break;
|
|
348
|
+
case "carousel":
|
|
349
|
+
setCarouselBuilder(DEFAULT_CAROUSEL_BUILDER);
|
|
350
|
+
break;
|
|
351
|
+
case "custom-cards":
|
|
352
|
+
setCustomCardsBuilder(DEFAULT_CUSTOM_CARDS_BUILDER);
|
|
353
|
+
break;
|
|
354
|
+
case "google-reviews":
|
|
355
|
+
setGoogleReviewsBuilder(DEFAULT_GOOGLE_REVIEWS_BUILDER);
|
|
356
|
+
break;
|
|
561
357
|
}
|
|
562
358
|
}, [isModalOpen, mode, sectionType]);
|
|
563
359
|
function toggleCategorySelection(ids, categoryId, checked) {
|
|
@@ -658,15 +454,7 @@ export function AdminSectionsView({ children }) {
|
|
|
658
454
|
{ label: "All", value: "all" },
|
|
659
455
|
{ label: "Published", value: "published" },
|
|
660
456
|
{ label: "Draft", value: "draft" },
|
|
661
|
-
] }), _jsx(Select, { label: "Sort", value: productsBuilder.sortBy, onValueChange: (value) => setProductsBuilder((prev) => ({
|
|
662
|
-
...prev,
|
|
663
|
-
sortBy: value,
|
|
664
|
-
})), options: [
|
|
665
|
-
{ label: "Featured", value: "featured" },
|
|
666
|
-
{ label: "Newest", value: "newest" },
|
|
667
|
-
{ label: "Price (Low to High)", value: "price-asc" },
|
|
668
|
-
{ label: "Price (High to Low)", value: "price-desc" },
|
|
669
|
-
] }), _jsx(Select, { label: "Resource mode", value: productsBuilder.resourceMode, onValueChange: (value) => setProductsBuilder((prev) => ({
|
|
457
|
+
] }), _jsx(Select, { label: "Sort by", value: productsBuilder.sortBy, onValueChange: (value) => setProductsBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: productsBuilder.filterByCategory, onChange: (e) => setProductsBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-pokemon-cards" }), _jsx(Select, { label: "Max items to show", value: String(productsBuilder.maxCount), onValueChange: (v) => setProductsBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: productsBuilder.loop, label: "Loop carousel", onChange: (e) => setProductsBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: productsBuilder.resourceMode, onValueChange: (value) => setProductsBuilder((prev) => ({
|
|
670
458
|
...prev,
|
|
671
459
|
resourceMode: value,
|
|
672
460
|
})), options: [
|
|
@@ -704,14 +492,7 @@ export function AdminSectionsView({ children }) {
|
|
|
704
492
|
{ label: "Active", value: "active" },
|
|
705
493
|
{ label: "Scheduled", value: "scheduled" },
|
|
706
494
|
{ label: "Ended", value: "ended" },
|
|
707
|
-
] }), _jsx(Select, { label: "Sort", value: auctionsBuilder.sortBy, onValueChange: (value) => setAuctionsBuilder((prev) => ({
|
|
708
|
-
...prev,
|
|
709
|
-
sortBy: value,
|
|
710
|
-
})), options: [
|
|
711
|
-
{ label: "Ending Soon", value: "ending-soon" },
|
|
712
|
-
{ label: "Highest Bid", value: "highest-bid" },
|
|
713
|
-
{ label: "Newest", value: "newest" },
|
|
714
|
-
] }), _jsx(Select, { label: "Resource mode", value: auctionsBuilder.resourceMode, onValueChange: (value) => setAuctionsBuilder((prev) => ({
|
|
495
|
+
] }), _jsx(Select, { label: "Sort by", value: auctionsBuilder.sortBy, onValueChange: (value) => setAuctionsBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: auctionsBuilder.filterByCategory, onChange: (e) => setAuctionsBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-pokemon-cards" }), _jsx(Select, { label: "Max items to show", value: String(auctionsBuilder.maxCount), onValueChange: (v) => setAuctionsBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: auctionsBuilder.loop, label: "Loop carousel", onChange: (e) => setAuctionsBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: auctionsBuilder.resourceMode, onValueChange: (value) => setAuctionsBuilder((prev) => ({
|
|
715
496
|
...prev,
|
|
716
497
|
resourceMode: value,
|
|
717
498
|
})), options: [
|
|
@@ -761,15 +542,7 @@ export function AdminSectionsView({ children }) {
|
|
|
761
542
|
{ label: "Active", value: "active" },
|
|
762
543
|
{ label: "Upcoming", value: "upcoming" },
|
|
763
544
|
{ label: "Closed", value: "closed" },
|
|
764
|
-
] }), _jsx(Select, { label: "Sort", value: preOrdersBuilder.sortBy, onValueChange: (value) => setPreOrdersBuilder((prev) => ({
|
|
765
|
-
...prev,
|
|
766
|
-
sortBy: value,
|
|
767
|
-
})), options: [
|
|
768
|
-
{ label: "Shipping Soon", value: "shipping-soon" },
|
|
769
|
-
{ label: "Newest", value: "newest" },
|
|
770
|
-
{ label: "Price (Low to High)", value: "price-asc" },
|
|
771
|
-
{ label: "Price (High to Low)", value: "price-desc" },
|
|
772
|
-
] }), _jsx(Select, { label: "Resource mode", value: preOrdersBuilder.resourceMode, onValueChange: (value) => setPreOrdersBuilder((prev) => ({
|
|
545
|
+
] }), _jsx(Select, { label: "Sort by", value: preOrdersBuilder.sortBy, onValueChange: (value) => setPreOrdersBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: preOrdersBuilder.filterByCategory, onChange: (e) => setPreOrdersBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-beyblade-tops" }), _jsx(Select, { label: "Max items to show", value: String(preOrdersBuilder.maxCount), onValueChange: (v) => setPreOrdersBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: preOrdersBuilder.loop, label: "Loop carousel", onChange: (e) => setPreOrdersBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: preOrdersBuilder.resourceMode, onValueChange: (value) => setPreOrdersBuilder((prev) => ({
|
|
773
546
|
...prev,
|
|
774
547
|
resourceMode: value,
|
|
775
548
|
})), options: [
|
|
@@ -803,14 +576,7 @@ export function AdminSectionsView({ children }) {
|
|
|
803
576
|
{ label: "Active", value: "active" },
|
|
804
577
|
{ label: "Pending", value: "pending" },
|
|
805
578
|
{ label: "Disabled", value: "disabled" },
|
|
806
|
-
] }), _jsx(Select, { label: "Sort", value: storesBuilder.sortBy, onValueChange: (value) => setStoresBuilder((prev) => ({
|
|
807
|
-
...prev,
|
|
808
|
-
sortBy: value,
|
|
809
|
-
})), options: [
|
|
810
|
-
{ label: "Rating (High to Low)", value: "rating-desc" },
|
|
811
|
-
{ label: "Newest", value: "newest" },
|
|
812
|
-
{ label: "Popular", value: "popular" },
|
|
813
|
-
] }), _jsx(Select, { label: "Resource mode", value: storesBuilder.resourceMode, onValueChange: (value) => setStoresBuilder((prev) => ({
|
|
579
|
+
] }), _jsx(Select, { label: "Sort by", value: storesBuilder.sortBy, onValueChange: (value) => setStoresBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: storesBuilder.filterByCategory, onChange: (e) => setStoresBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-pokemon-cards" }), _jsx(Select, { label: "Max items to show", value: String(storesBuilder.maxCount), onValueChange: (v) => setStoresBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: storesBuilder.loop, label: "Loop carousel", onChange: (e) => setStoresBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: storesBuilder.resourceMode, onValueChange: (value) => setStoresBuilder((prev) => ({
|
|
814
580
|
...prev,
|
|
815
581
|
resourceMode: value,
|
|
816
582
|
})), options: [
|
|
@@ -847,14 +613,7 @@ export function AdminSectionsView({ children }) {
|
|
|
847
613
|
{ label: "Active", value: "active" },
|
|
848
614
|
{ label: "Upcoming", value: "upcoming" },
|
|
849
615
|
{ label: "Ended", value: "ended" },
|
|
850
|
-
] }), _jsx(Select, { label: "Sort", value: eventsBuilder.sortBy, onValueChange: (value) => setEventsBuilder((prev) => ({
|
|
851
|
-
...prev,
|
|
852
|
-
sortBy: value,
|
|
853
|
-
})), options: [
|
|
854
|
-
{ label: "Start Date", value: "start-date" },
|
|
855
|
-
{ label: "Newest", value: "newest" },
|
|
856
|
-
{ label: "Popular", value: "popular" },
|
|
857
|
-
] }), _jsx(Select, { label: "Resource mode", value: eventsBuilder.resourceMode, onValueChange: (value) => setEventsBuilder((prev) => ({
|
|
616
|
+
] }), _jsx(Select, { label: "Sort by", value: eventsBuilder.sortBy, onValueChange: (value) => setEventsBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: eventsBuilder.filterByCategory, onChange: (e) => setEventsBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-events" }), _jsx(Select, { label: "Max items to show", value: String(eventsBuilder.maxCount), onValueChange: (v) => setEventsBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: eventsBuilder.loop, label: "Loop carousel", onChange: (e) => setEventsBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: eventsBuilder.resourceMode, onValueChange: (value) => setEventsBuilder((prev) => ({
|
|
858
617
|
...prev,
|
|
859
618
|
resourceMode: value,
|
|
860
619
|
})), options: [
|
|
@@ -879,26 +638,156 @@ export function AdminSectionsView({ children }) {
|
|
|
879
638
|
scrollInterval: Math.max(1000, Number(event.target.value) || 1000),
|
|
880
639
|
})) })] }));
|
|
881
640
|
}
|
|
641
|
+
function renderFAQBuilder() {
|
|
642
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "FAQ Section Builder" }), _jsx(Input, { label: "Section title", value: faqBuilder.title, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: faqBuilder.subtitle, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Display count", type: "number", min: 1, max: 20, value: String(faqBuilder.displayCount), onChange: (e) => setFaqBuilder((prev) => ({ ...prev, displayCount: Math.min(20, Math.max(1, Number(e.target.value) || 1)) })) }), _jsx(Checkbox, { checked: faqBuilder.showOnHomepage, label: "Show on homepage", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, showOnHomepage: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.expandedByDefault, label: "Expanded by default", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, expandedByDefault: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.linkToFullPage, label: "Link to full FAQ page", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, linkToFullPage: e.target.checked })) }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Categories" }), _jsx(Div, { className: "grid grid-cols-2 gap-2", children: FAQ_CATEGORY_OPTIONS.map((opt) => (_jsx(Checkbox, { checked: faqBuilder.categories.includes(opt.value), label: opt.label, onChange: (e) => setFaqBuilder((prev) => ({
|
|
643
|
+
...prev,
|
|
644
|
+
categories: e.target.checked
|
|
645
|
+
? [...prev.categories, opt.value]
|
|
646
|
+
: prev.categories.filter((c) => c !== opt.value),
|
|
647
|
+
})) }, opt.value))) })] })] }));
|
|
648
|
+
}
|
|
649
|
+
function renderBlogBuilder() {
|
|
650
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Blog Articles Builder" }), _jsx(Input, { label: "Section title", value: blogBuilder.title, onChange: (e) => setBlogBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "Max articles", value: String(blogBuilder.maxArticles), onValueChange: (v) => setBlogBuilder((prev) => ({ ...prev, maxArticles: Number(v) })), options: [{ label: "3", value: "3" }, { label: "4", value: "4" }, { label: "6", value: "6" }] }), _jsx(Checkbox, { checked: blogBuilder.showReadTime, label: "Show read time", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showReadTime: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showAuthor, label: "Show author", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showAuthor: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showThumbnails, label: "Show thumbnails", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showThumbnails: e.target.checked })) })] }));
|
|
651
|
+
}
|
|
652
|
+
function renderNewsletterBuilder() {
|
|
653
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Newsletter Section Builder" }), _jsx(Input, { label: "Title", value: newsletterBuilder.title, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Textarea, { label: "Description", value: newsletterBuilder.description, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 2 }), _jsx(Input, { label: "Email placeholder", value: newsletterBuilder.placeholder, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, placeholder: e.target.value })) }), _jsx(Input, { label: "Button text", value: newsletterBuilder.buttonText, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, buttonText: e.target.value })) }), _jsx(Input, { label: "Privacy text", value: newsletterBuilder.privacyText, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, privacyText: e.target.value })) }), _jsx(Input, { label: "Privacy link", value: newsletterBuilder.privacyLink, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, privacyLink: e.target.value })), placeholder: "/privacy" })] }));
|
|
654
|
+
}
|
|
655
|
+
function renderBannerBuilder() {
|
|
656
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Banner Section Builder" }), _jsx(Select, { label: "Height", value: bannerBuilder.height, onValueChange: (v) => setBannerBuilder((prev) => ({ ...prev, height: v })), options: [{ label: "Small (200px)", value: "sm" }, { label: "Medium (300px)", value: "md" }, { label: "Large (400px)", value: "lg" }, { label: "Extra Large (500px)", value: "xl" }] }), _jsx(Input, { label: "Background image URL", type: "url", value: bannerBuilder.backgroundImage, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, backgroundImage: e.target.value })), placeholder: "https://..." }), _jsx(Input, { label: "Background color (CSS token)", value: bannerBuilder.backgroundColor, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, backgroundColor: e.target.value })), placeholder: "var(--appkit-color-primary)" }), _jsx(Input, { label: "Gradient from (CSS token)", value: bannerBuilder.gradientFrom, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, gradientFrom: e.target.value })), placeholder: "var(--appkit-color-primary)" }), _jsx(Input, { label: "Gradient to (CSS token)", value: bannerBuilder.gradientTo, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, gradientTo: e.target.value })), placeholder: "var(--appkit-color-secondary)" }), _jsx(Input, { label: "Content title", value: bannerBuilder.contentTitle, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentTitle: e.target.value })) }), _jsx(Input, { label: "Content subtitle", value: bannerBuilder.contentSubtitle, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentSubtitle: e.target.value })) }), _jsx(Textarea, { label: "Content description", value: bannerBuilder.contentDescription, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentDescription: e.target.value })), rows: 2 }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Buttons (max 3)" }), bannerBuilder.buttons.map((btn, index) => (_jsxs(Div, { className: "space-y-2 rounded-md border border-zinc-200 p-2 dark:border-slate-700", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs text-zinc-500", children: ["Button ", index + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setBannerBuilder((prev) => ({ ...prev, buttons: prev.buttons.filter((_, i) => i !== index) })), children: "Remove" })] }), _jsx(Input, { label: "Text", value: btn.text, onChange: (e) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], text: e.target.value }; return { ...prev, buttons: next }; }) }), _jsx(Input, { label: "Link", value: btn.link, onChange: (e) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], link: e.target.value }; return { ...prev, buttons: next }; }) }), _jsx(Select, { label: "Variant", value: btn.variant, onValueChange: (v) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], variant: v }; return { ...prev, buttons: next }; }), options: [{ label: "Primary", value: "primary" }, { label: "Secondary", value: "secondary" }, { label: "Outline", value: "outline" }] })] }, `banner-btn-${index}`))), bannerBuilder.buttons.length < 3 ? (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setBannerBuilder((prev) => ({ ...prev, buttons: [...prev.buttons, { text: "", link: "", variant: "primary" }] })), children: "+ Add button" })) : null] }), _jsx(Checkbox, { checked: bannerBuilder.clickable, label: "Make entire banner clickable", onChange: (e) => setBannerBuilder((prev) => ({ ...prev, clickable: e.target.checked })) }), bannerBuilder.clickable ? (_jsx(Input, { label: "Click link", value: bannerBuilder.clickLink, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, clickLink: e.target.value })), placeholder: "/products" })) : null] }));
|
|
657
|
+
}
|
|
658
|
+
function renderFeaturesBuilder() {
|
|
659
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Features Section Builder" }), _jsx(Input, { label: "Section title", value: featuresBuilder.title, onChange: (e) => setFeaturesBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Feature items" }), featuresBuilder.features.map((feature, index) => (_jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Input, { value: feature, onChange: (e) => setFeaturesBuilder((prev) => { const next = [...prev.features]; next[index] = e.target.value; return { ...prev, features: next }; }), className: "flex-1" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setFeaturesBuilder((prev) => ({ ...prev, features: prev.features.filter((_, i) => i !== index) })), children: "\u2715" })] }, `feat-${index}`))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setFeaturesBuilder((prev) => ({ ...prev, features: [...prev.features, ""] })), children: "+ Add feature" })] })] }));
|
|
660
|
+
}
|
|
661
|
+
function renderReviewsBuilder() {
|
|
662
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Reviews Section Builder" }), _jsx(Input, { label: "Section title", value: reviewsBuilder.title, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "Reviews source", value: reviewsBuilder.source, onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, source: v })), options: [
|
|
663
|
+
{ label: "Platform reviews (LetItRip)", value: "platform" },
|
|
664
|
+
{ label: "Google Business Reviews", value: "google" },
|
|
665
|
+
] }), reviewsBuilder.source === "google" ? (_jsx(Input, { label: "Google Place ID", value: reviewsBuilder.placeId, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, placeId: e.target.value })), placeholder: "ChIJ...", helperText: "Find your Place ID at maps.google.com/placesinventory" })) : null, _jsx(Select, { label: "Max reviews", value: String(reviewsBuilder.maxReviews), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, maxReviews: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Select, { label: "Items per view", value: String(reviewsBuilder.itemsPerView), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, itemsPerView: Number(v) })), options: [{ label: "1", value: "1" }, { label: "2", value: "2" }, { label: "3", value: "3" }] }), _jsx(Checkbox, { checked: reviewsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(reviewsBuilder.scrollInterval), onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) })] }));
|
|
666
|
+
}
|
|
667
|
+
function renderWhatsAppBuilder() {
|
|
668
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "WhatsApp Community Builder" }), _jsx(Input, { label: "Title", value: whatsappBuilder.title, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Textarea, { label: "Description", value: whatsappBuilder.description, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 2 }), _jsx(Input, { label: "WhatsApp group link", type: "url", value: whatsappBuilder.groupLink, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, groupLink: e.target.value })), placeholder: "https://chat.whatsapp.com/..." }), _jsx(Input, { label: "Member count", type: "number", min: 0, value: String(whatsappBuilder.memberCount), onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, memberCount: Math.max(0, Number(e.target.value) || 0) })) }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Benefits" }), whatsappBuilder.benefits.map((benefit, index) => (_jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Input, { value: benefit, onChange: (e) => setWhatsappBuilder((prev) => { const next = [...prev.benefits]; next[index] = e.target.value; return { ...prev, benefits: next }; }), className: "flex-1" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setWhatsappBuilder((prev) => ({ ...prev, benefits: prev.benefits.filter((_, i) => i !== index) })), children: "\u2715" })] }, `wb-${index}`))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setWhatsappBuilder((prev) => ({ ...prev, benefits: [...prev.benefits, ""] })), children: "+ Add benefit" })] }), _jsx(Input, { label: "Button text", value: whatsappBuilder.buttonText, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, buttonText: e.target.value })) }), _jsx(Input, { label: "Testimonial (optional)", value: whatsappBuilder.testimonial, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, testimonial: e.target.value })) })] }));
|
|
669
|
+
}
|
|
670
|
+
function renderWelcomeBuilder() {
|
|
671
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Welcome Section Builder" }), _jsx(Input, { label: "Headline (h1)", value: welcomeBuilder.h1, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, h1: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: welcomeBuilder.subtitle, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Textarea, { label: "Description", value: welcomeBuilder.description, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 3 }), _jsx(Checkbox, { checked: welcomeBuilder.showCTA, label: "Show CTA button", onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, showCTA: e.target.checked })) }), welcomeBuilder.showCTA ? (_jsxs(_Fragment, { children: [_jsx(Input, { label: "CTA text", value: welcomeBuilder.ctaText, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, ctaText: e.target.value })) }), _jsx(Input, { label: "CTA link", value: welcomeBuilder.ctaLink, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, ctaLink: e.target.value })), placeholder: "/products" })] })) : null] }));
|
|
672
|
+
}
|
|
673
|
+
function renderTrustIndicatorsBuilder() {
|
|
674
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Trust Indicators Builder" }), _jsx(Input, { label: "Section title", value: trustIndicatorsBuilder.title, onChange: (e) => setTrustIndicatorsBuilder((prev) => ({ ...prev, title: e.target.value })) }), trustIndicatorsBuilder.indicators.map((ind, index) => (_jsxs(Div, { className: "space-y-2 rounded-md border border-zinc-200 p-3 dark:border-slate-700", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: ["Indicator ", index + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setTrustIndicatorsBuilder((prev) => ({ ...prev, indicators: prev.indicators.filter((_, i) => i !== index) })), children: "Remove" })] }), _jsx(Input, { label: "Icon (emoji or text)", value: ind.icon, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], icon: e.target.value }; return { ...prev, indicators: next }; }) }), _jsx(Input, { label: "Title", value: ind.title, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], title: e.target.value }; return { ...prev, indicators: next }; }) }), _jsx(Input, { label: "Description", value: ind.description, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], description: e.target.value }; return { ...prev, indicators: next }; }) })] }, ind.id))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setTrustIndicatorsBuilder((prev) => ({ ...prev, indicators: [...prev.indicators, { id: `ti-${Date.now()}`, icon: "✨", title: "", description: "" }] })), children: "+ Add indicator" })] }));
|
|
675
|
+
}
|
|
676
|
+
function renderCategoriesBuilder() {
|
|
677
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Categories Section Builder" }), _jsx(Input, { label: "Section title", value: categoriesBuilder.title, onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Max categories (4\u201312)", type: "number", min: 4, max: 12, value: String(categoriesBuilder.maxCategories), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, maxCategories: Math.min(12, Math.max(4, Number(e.target.value) || 4)) })) }), _jsx(Checkbox, { checked: categoriesBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(categoriesBuilder.scrollInterval), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) })] }));
|
|
678
|
+
}
|
|
679
|
+
function renderBrandsBuilder() {
|
|
680
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Brands Section Builder" }), _jsx(Input, { label: "Section title", value: brandsBuilder.title, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: brandsBuilder.subtitle, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Max brands", type: "number", min: 1, max: 30, value: String(brandsBuilder.maxBrands), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, maxBrands: Math.max(1, Number(e.target.value) || 1) })) }), _jsx(Checkbox, { checked: brandsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(brandsBuilder.scrollInterval), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) })] }));
|
|
681
|
+
}
|
|
682
|
+
function renderCarouselBuilder() {
|
|
683
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Carousel Section Builder" }), _jsx(Input, { label: "Section title", value: carouselBuilder.title, onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, title: e.target.value })), placeholder: "Hero Carousel" }), _jsx(Select, { label: "Slide height", value: carouselBuilder.height, onValueChange: (value) => setCarouselBuilder((prev) => ({ ...prev, height: value })), options: [
|
|
684
|
+
{ label: "Viewport (100vh)", value: "viewport" },
|
|
685
|
+
{ label: "Tall (80vh)", value: "tall" },
|
|
686
|
+
{ label: "Medium (60vh)", value: "medium" },
|
|
687
|
+
] }), _jsx(Input, { label: "Default autoplay delay (ms)", type: "number", min: 1000, step: 500, value: String(carouselBuilder.defaultAutoplayDelayMs), onChange: (e) => setCarouselBuilder((prev) => ({
|
|
688
|
+
...prev,
|
|
689
|
+
defaultAutoplayDelayMs: Math.max(1000, Number(e.target.value) || 5000),
|
|
690
|
+
})) }), _jsx(Checkbox, { checked: carouselBuilder.pauseOnHover, label: "Pause on hover", onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, pauseOnHover: e.target.checked })) }), _jsx(Checkbox, { checked: carouselBuilder.showDots, label: "Show navigation dots", onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, showDots: e.target.checked })) }), _jsx(Checkbox, { checked: carouselBuilder.showArrows, label: "Show prev/next arrows", onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, showArrows: e.target.checked })) })] }));
|
|
691
|
+
}
|
|
692
|
+
function renderCustomCardsBuilder() {
|
|
693
|
+
function addCard() {
|
|
694
|
+
setCustomCardsBuilder((prev) => ({
|
|
695
|
+
...prev,
|
|
696
|
+
cards: [
|
|
697
|
+
...prev.cards,
|
|
698
|
+
{
|
|
699
|
+
id: `card-${prev.cards.length + 1}`,
|
|
700
|
+
image: "",
|
|
701
|
+
imageAlt: "",
|
|
702
|
+
eyebrow: "",
|
|
703
|
+
title: "",
|
|
704
|
+
body: "",
|
|
705
|
+
link: "",
|
|
706
|
+
backgroundColor: "",
|
|
707
|
+
textColor: "",
|
|
708
|
+
borderRadius: "md",
|
|
709
|
+
shadowLevel: "sm",
|
|
710
|
+
},
|
|
711
|
+
],
|
|
712
|
+
}));
|
|
713
|
+
}
|
|
714
|
+
function removeCard(index) {
|
|
715
|
+
setCustomCardsBuilder((prev) => ({
|
|
716
|
+
...prev,
|
|
717
|
+
cards: prev.cards.filter((_, i) => i !== index),
|
|
718
|
+
}));
|
|
719
|
+
}
|
|
720
|
+
function updateCard(index, patch) {
|
|
721
|
+
setCustomCardsBuilder((prev) => {
|
|
722
|
+
const next = [...prev.cards];
|
|
723
|
+
next[index] = { ...next[index], ...patch };
|
|
724
|
+
return { ...prev, cards: next };
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Custom Cards Builder" }), _jsx(Input, { label: "Section title", value: customCardsBuilder.title, onChange: (e) => setCustomCardsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "Layout", value: customCardsBuilder.layout, onValueChange: (value) => setCustomCardsBuilder((prev) => ({ ...prev, layout: value })), options: [
|
|
728
|
+
{ label: "Grid", value: "grid" },
|
|
729
|
+
{ label: "Row (horizontal scroll)", value: "row" },
|
|
730
|
+
{ label: "Masonry", value: "masonry" },
|
|
731
|
+
] }), _jsx(Select, { label: "Columns", value: String(customCardsBuilder.columns), onValueChange: (value) => setCustomCardsBuilder((prev) => ({ ...prev, columns: Number(value) })), options: [
|
|
732
|
+
{ label: "1 column", value: "1" },
|
|
733
|
+
{ label: "2 columns", value: "2" },
|
|
734
|
+
{ label: "3 columns", value: "3" },
|
|
735
|
+
{ label: "4 columns", value: "4" },
|
|
736
|
+
] }), _jsx(Checkbox, { checked: customCardsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setCustomCardsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(customCardsBuilder.scrollIntervalMs), onChange: (e) => setCustomCardsBuilder((prev) => ({
|
|
737
|
+
...prev,
|
|
738
|
+
scrollIntervalMs: Math.max(1000, Number(e.target.value) || 4000),
|
|
739
|
+
})) }), _jsxs(Div, { className: "space-y-3", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: ["Cards (", customCardsBuilder.cards.length, ")"] }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: addCard, children: "Add card" })] }), customCardsBuilder.cards.map((card, index) => (_jsxs(Div, { className: "space-y-3 rounded-md border border-zinc-200 p-3 dark:border-slate-700", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: ["Card ", index + 1] }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => removeCard(index), children: "Remove" })] }), _jsx(Input, { label: "ID / slug", value: card.id, onChange: (e) => updateCard(index, { id: e.target.value }), placeholder: "card-1" }), _jsx(Input, { label: "Image URL", value: card.image, onChange: (e) => updateCard(index, { image: e.target.value }), placeholder: "https://..." }), _jsx(Input, { label: "Image alt text", value: card.imageAlt, onChange: (e) => updateCard(index, { imageAlt: e.target.value }) }), _jsx(Input, { label: "Eyebrow (small label above title)", value: card.eyebrow, onChange: (e) => updateCard(index, { eyebrow: e.target.value }) }), _jsx(Input, { label: "Title", value: card.title, onChange: (e) => updateCard(index, { title: e.target.value }) }), _jsx(Input, { label: "Body / description", value: card.body, onChange: (e) => updateCard(index, { body: e.target.value }) }), _jsx(Input, { label: "Link (href)", value: card.link, onChange: (e) => updateCard(index, { link: e.target.value }), placeholder: "/categories/..." }), _jsx(Input, { label: "Background colour", value: card.backgroundColor, onChange: (e) => updateCard(index, { backgroundColor: e.target.value }), placeholder: "#ffffff or var(--appkit-color-primary)" }), _jsx(Input, { label: "Text colour", value: card.textColor, onChange: (e) => updateCard(index, { textColor: e.target.value }), placeholder: "#000000" }), _jsx(Select, { label: "Border radius", value: card.borderRadius, onValueChange: (value) => updateCard(index, { borderRadius: value }), options: [
|
|
740
|
+
{ label: "None", value: "none" },
|
|
741
|
+
{ label: "Small", value: "sm" },
|
|
742
|
+
{ label: "Medium", value: "md" },
|
|
743
|
+
{ label: "Large", value: "lg" },
|
|
744
|
+
{ label: "XL", value: "xl" },
|
|
745
|
+
{ label: "Full (pill)", value: "full" },
|
|
746
|
+
] }), _jsx(Select, { label: "Shadow level", value: card.shadowLevel, onValueChange: (value) => updateCard(index, { shadowLevel: value }), options: [
|
|
747
|
+
{ label: "None", value: "none" },
|
|
748
|
+
{ label: "Small", value: "sm" },
|
|
749
|
+
{ label: "Medium", value: "md" },
|
|
750
|
+
{ label: "Large", value: "lg" },
|
|
751
|
+
] })] }, `custom-card-${index}`))), customCardsBuilder.cards.length === 0 ? (_jsx(Text, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "No cards added yet. Click \"Add card\" to start." })) : null] })] }));
|
|
752
|
+
}
|
|
753
|
+
function renderGoogleReviewsBuilder() {
|
|
754
|
+
return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Google Reviews Builder" }), _jsx(Input, { label: "Google Place ID", value: googleReviewsBuilder.placeId, onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, placeId: e.target.value })), placeholder: "ChIJ...", helperText: "Find your Place ID at developers.google.com/maps/documentation/places/web-service/place-id" }), _jsx(Input, { label: "Max reviews to show", type: "number", min: 1, max: 20, value: String(googleReviewsBuilder.maxReviews), onChange: (e) => setGoogleReviewsBuilder((prev) => ({
|
|
755
|
+
...prev,
|
|
756
|
+
maxReviews: Math.max(1, Math.min(20, Number(e.target.value) || 6)),
|
|
757
|
+
})) }), _jsx(Select, { label: "Minimum star rating to show", value: String(googleReviewsBuilder.minRating), onValueChange: (value) => setGoogleReviewsBuilder((prev) => ({ ...prev, minRating: Number(value) })), options: [
|
|
758
|
+
{ label: "All ratings (0★+)", value: "0" },
|
|
759
|
+
{ label: "3★ and above", value: "3" },
|
|
760
|
+
{ label: "4★ and above", value: "4" },
|
|
761
|
+
{ label: "5★ only", value: "5" },
|
|
762
|
+
] }), _jsx(Select, { label: "Layout", value: googleReviewsBuilder.layout, onValueChange: (value) => setGoogleReviewsBuilder((prev) => ({ ...prev, layout: value })), options: [
|
|
763
|
+
{ label: "Grid", value: "grid" },
|
|
764
|
+
{ label: "Carousel", value: "carousel" },
|
|
765
|
+
] }), _jsx(Checkbox, { checked: googleReviewsBuilder.showRating, label: "Show star rating on each review", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, showRating: e.target.checked })) }), _jsx(Checkbox, { checked: googleReviewsBuilder.showDate, label: "Show review date", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, showDate: e.target.checked })) }), _jsx(Checkbox, { checked: googleReviewsBuilder.linkToGoogleMaps, label: "Link to Google Maps listing", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, linkToGoogleMaps: e.target.checked })) }), googleReviewsBuilder.linkToGoogleMaps ? (_jsx(Input, { label: "Google Maps URL", value: googleReviewsBuilder.googleMapsUrl, onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, googleMapsUrl: e.target.value })), placeholder: "https://maps.google.com/..." })) : null] }));
|
|
766
|
+
}
|
|
882
767
|
function renderTypedBuilder() {
|
|
883
|
-
|
|
884
|
-
return renderProductsBuilder();
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
return
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
return
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
return
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
return
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
return
|
|
768
|
+
switch (sectionType) {
|
|
769
|
+
case "products": return renderProductsBuilder();
|
|
770
|
+
case "auctions": return renderAuctionsBuilder();
|
|
771
|
+
case "stats": return renderStatsBuilder();
|
|
772
|
+
case "pre-orders": return renderPreOrdersBuilder();
|
|
773
|
+
case "stores": return renderStoresBuilder();
|
|
774
|
+
case "events": return renderEventsBuilder();
|
|
775
|
+
case "welcome": return renderWelcomeBuilder();
|
|
776
|
+
case "trust-indicators": return renderTrustIndicatorsBuilder();
|
|
777
|
+
case "categories": return renderCategoriesBuilder();
|
|
778
|
+
case "brands": return renderBrandsBuilder();
|
|
779
|
+
case "banner": return renderBannerBuilder();
|
|
780
|
+
case "features": return renderFeaturesBuilder();
|
|
781
|
+
case "reviews": return renderReviewsBuilder();
|
|
782
|
+
case "whatsapp-community": return renderWhatsAppBuilder();
|
|
783
|
+
case "faq": return renderFAQBuilder();
|
|
784
|
+
case "blog-articles": return renderBlogBuilder();
|
|
785
|
+
case "newsletter": return renderNewsletterBuilder();
|
|
786
|
+
case "carousel": return renderCarouselBuilder();
|
|
787
|
+
case "custom-cards": return renderCustomCardsBuilder();
|
|
788
|
+
case "google-reviews": return renderGoogleReviewsBuilder();
|
|
789
|
+
default: return null;
|
|
900
790
|
}
|
|
901
|
-
return null;
|
|
902
791
|
}
|
|
903
792
|
// If children exist, render passthrough mode (detail view)
|
|
904
793
|
if (hasChildren) {
|
|
@@ -917,12 +806,12 @@ export function AdminSectionsView({ children }) {
|
|
|
917
806
|
}, [sections]);
|
|
918
807
|
const hasReorderChanges = reorderDraft.some((item) => sectionOrderMap.get(item.id) !== item.order);
|
|
919
808
|
const canUndoReorderChanges = reorderUndoStack.length > 0;
|
|
920
|
-
return (_jsxs(_Fragment, { children: [_jsx(
|
|
809
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "py-4 px-3 sm:px-4", children: [_jsxs(Div, { className: "mb-4 flex items-center justify-between gap-3", children: [_jsxs(Div, { children: [_jsx(Text, { className: "text-base font-semibold text-zinc-900 dark:text-zinc-100", children: "Homepage Sections" }), _jsx(Text, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "Manage homepage sections and their display order" })] }), _jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setSeedResetOpen(true), children: "Reset seed data" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => setIsModalOpen(true), children: "Manage Sections" })] })] }), errorMessage && (_jsx("div", { className: "mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-900/60 dark:bg-red-950/40 dark:text-red-200", children: errorMessage })), _jsx(DataTable, { rows: rows, isLoading: isLoading, emptyLabel: "No sections found" })] }), _jsxs(Div, { className: "mt-4 space-y-3 rounded-xl border border-zinc-200 bg-white p-4 dark:border-slate-700 dark:bg-slate-900", children: [_jsxs(Div, { className: "flex items-center justify-between gap-3", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-900 dark:text-zinc-100", children: "Reorder Sections" }), _jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: reindexDraft, disabled: reorderSections.isPending || reorderDraft.length === 0, children: "Reindex 1..N" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: undoReorderChange, disabled: reorderSections.isPending || !canUndoReorderChanges, children: "Undo unsaved" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: resetToServerOrder, disabled: reorderSections.isPending || !hasReorderChanges, children: "Reset to server" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => reorderSections.mutate(), disabled: !hasReorderChanges || reorderSections.isPending, children: reorderSections.isPending ? "Saving order..." : "Save order" })] })] }), reorderDraft.length === 0 ? (_jsx(Text, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "No sections to reorder." })) : (_jsx(Div, { className: "space-y-2", children: reorderDraft.map((item, index) => (_jsxs(Div, { className: "grid grid-cols-[auto_1fr_auto_auto_auto] items-center gap-2 rounded-md border border-zinc-200 p-2 dark:border-slate-700", draggable: true, onDragStart: () => setDragIndex(index), onDragOver: (event) => event.preventDefault(), onDrop: () => {
|
|
921
810
|
if (dragIndex !== null) {
|
|
922
811
|
moveItemToIndex(dragIndex, index);
|
|
923
812
|
}
|
|
924
813
|
setDragIndex(null);
|
|
925
|
-
}, onDragEnd: () => setDragIndex(null), children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-500 dark:text-zinc-400", children: "\u2261" }), _jsxs(Text, { className: "text-sm text-zinc-800 dark:text-zinc-200", children: [item.type, " #", item.order] }), _jsx(Input, { type: "number", min: 1, max: reorderDraft.length, value: String(item.order), onChange: (event) => updateReorderItemOrder(index, Number(event.target.value) || 1), className: "w-24" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, -1), disabled: index === 0, children: "Up" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, 1), disabled: index === reorderDraft.length - 1, children: "Down" })] }, `reorder-${item.id}`))) }))] }),
|
|
814
|
+
}, onDragEnd: () => setDragIndex(null), children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-500 dark:text-zinc-400", children: "\u2261" }), _jsxs(Text, { className: "text-sm text-zinc-800 dark:text-zinc-200", children: [item.type, " #", item.order] }), _jsx(Input, { type: "number", min: 1, max: reorderDraft.length, value: String(item.order), onChange: (event) => updateReorderItemOrder(index, Number(event.target.value) || 1), className: "w-24" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, -1), disabled: index === 0, children: "Up" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, 1), disabled: index === reorderDraft.length - 1, children: "Down" })] }, `reorder-${item.id}`))) }))] }), _jsx(ConfirmDeleteModal, { isOpen: seedResetOpen, onClose: () => setSeedResetOpen(false), onConfirm: () => resetSeed.mutate(), title: "Reset homepage sections seed data?", message: "This will reload the 19 default homepage sections from seed data. Any manual changes made in Firestore will be overwritten.", confirmText: "Reset seed", cancelText: "Cancel", isDeleting: resetSeed.isPending, variant: "danger" }), _jsx(Modal, { isOpen: isModalOpen, onClose: () => setIsModalOpen(false), title: "Manage Homepage Section", size: "lg", children: _jsxs(Form, { className: "space-y-4", onSubmit: (event) => {
|
|
926
815
|
event.preventDefault();
|
|
927
816
|
saveSection.mutate();
|
|
928
817
|
}, children: [_jsx(Select, { label: "Mode", value: mode, onValueChange: (value) => setMode(value), options: [
|