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' ?
|
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. | ||||||||||||
|
|
{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 && (
|