import React, { useEffect, useRef, useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Table, Form, Spinner } from 'react-bootstrap'; import { ChevronUp, ChevronDown } from 'lucide-react'; import { toggleCreatorSelection, selectAllCreators, clearCreatorSelection, fetchPrivateCreators, } from '../store/slices/creatorsSlice'; import { setSortBy } from '../store/slices/filtersSlice'; import '../styles/DatabaseList.scss'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { Link } from 'react-router-dom'; export default function PrivateCreatorList({ path }) { const dispatch = useDispatch(); const { privateCreators, status, selectedCreators, hasMore, isLoadingMore, pagination } = useSelector( (state) => state.creators ); const { sortBy, sortDirection } = useSelector((state) => state.filters); const observer = useRef(); const loadingRef = useCallback( (node) => { if (isLoadingMore) return; if (observer.current) observer.current.disconnect(); observer.current = new IntersectionObserver((entries) => { if (entries[0].isIntersecting && hasMore) { const nextPage = pagination?.current_page + 1; dispatch(fetchPrivateCreators({ path, page: nextPage })); } }); if (node) observer.current.observe(node); }, [isLoadingMore, hasMore, pagination, path, dispatch] ); // 组件加载时获取创作者数据 useEffect(() => { dispatch(fetchPrivateCreators({ path, page: 1 })); }, [path,dispatch]); useEffect(() => { console.log(privateCreators); }, [privateCreators]); // 处理全选/取消全选 const handleSelectAll = (e) => { if (e.target.checked) { dispatch(selectAllCreators()); } else { dispatch(clearCreatorSelection()); } }; // 处理单个创作者选择 const handleSelectCreator = (creatorId) => { dispatch(toggleCreatorSelection(creatorId)); }; // 处理排序 const handleSort = (field) => { dispatch(setSortBy(field)); }; // 渲染排序图标 const renderSortIcon = (field) => { if (sortBy === field) { return sortDirection === 'asc' ? : ; } return null; }; // 根据类别获取样式类名 const getCategoryClassName = (category) => { const categoryMap = { 'Phones & Electronics': 'phones', 'Womenswear & Underwear': 'women', 'Sports & Outdoor': 'sports', 'Food & Beverage': 'food', Health: 'health', Kitchenware: 'kitchen', }; return categoryMap[category] || ''; }; // 如果正在加载且没有数据,显示加载中 if (status === 'loading' && (!privateCreators || privateCreators.length === 0)) { return (
Loading...
); } // 如果加载失败,显示错误信息 if (status === 'failed') { return
Failed to load creators. Please try again later.
; } return (
{!privateCreators || privateCreators.length <= 0 ? ( ) : ( privateCreators.map((creator) => ( )) )}
0} onChange={handleSelectAll} /> handleSort('name')} style={{ width: '180px' }}> Creator {renderSortIcon('name')} handleSort('category')} style={{ width: '180px' }} > Category {renderSortIcon('category')} handleSort('e_commerce_level')}> E-commerce Level {renderSortIcon('e_commerce_level')} handleSort('exposure_level')}> Exposure Level {renderSortIcon('exposure_level')} handleSort('followers')}> Followers {renderSortIcon('followers')} handleSort('gmv')}> GMV {renderSortIcon('gmv')} handleSort('avg_video_views')}> Avg. Video Views {renderSortIcon('avg_video_views')} Pricing # Collab Latest Collab. E-commerce Profile
No creators found matching your filters.
handleSelectCreator(creator.creator_id)} />
{creator.name} {creator.status && }
{creator.name}
{creator.category} {creator.e_commerce_level} {creator.exposure_level} {creator.followers}
{creator.gmv}
Items Sold: {creator.soldPercentage}
{creator.avg_video_views} {creator.pricing} {creator.collab_count} {creator.latestCollab} {creator.hasEcommerce ?
: null}
{creator.hasTiktok && (
)}
{hasMore && (
Loading more...
)}
); }