2025-12-11 11:31:56 +00:00
|
|
|
'use client';
|
|
|
|
|
import { InfiniteScrollList } from '@/components/ui/infinite-scroll-list';
|
|
|
|
|
import AIStandardCard from '@/components/features/ai-standard-card';
|
|
|
|
|
import useSmartInfiniteQuery from '../../useSmartInfiniteQuery';
|
|
|
|
|
import { fetchCharacters } from '@/services/editor';
|
|
|
|
|
import { useHomeStore } from '../../store';
|
|
|
|
|
import { useEffect } from 'react';
|
2025-12-09 09:13:46 +00:00
|
|
|
|
|
|
|
|
const Character = () => {
|
2025-12-11 11:31:56 +00:00
|
|
|
const selectedTags = useHomeStore((state) => state.selectedTags);
|
|
|
|
|
|
|
|
|
|
const { dataSource, isFirstLoading, isLoadingMore, noMoreData, onLoadMore, onSearch } =
|
|
|
|
|
useSmartInfiniteQuery<any, any>(fetchCharacters, {
|
|
|
|
|
queryKey: 'characters',
|
|
|
|
|
defaultQuery: { tagIds: selectedTags },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
onSearch({ tagIds: selectedTags });
|
|
|
|
|
}, [selectedTags]);
|
|
|
|
|
|
2025-12-09 09:13:46 +00:00
|
|
|
return (
|
2025-12-11 11:31:56 +00:00
|
|
|
<div className="mt-8">
|
|
|
|
|
<InfiniteScrollList<any>
|
|
|
|
|
items={dataSource}
|
2025-12-18 10:14:12 +00:00
|
|
|
columns={(width) => {
|
|
|
|
|
const cardWidth = width > 1200 ? 256 : width > 588 ? 200 : 170;
|
|
|
|
|
return Math.floor(width / cardWidth);
|
|
|
|
|
}}
|
2025-12-11 11:31:56 +00:00
|
|
|
renderItem={(character) => <AIStandardCard character={character} />}
|
|
|
|
|
getItemKey={(character) => character.id}
|
|
|
|
|
hasNextPage={!noMoreData}
|
|
|
|
|
isLoading={isFirstLoading || isLoadingMore}
|
|
|
|
|
fetchNextPage={onLoadMore}
|
|
|
|
|
/>
|
2025-12-09 09:13:46 +00:00
|
|
|
</div>
|
2025-12-11 11:31:56 +00:00
|
|
|
);
|
|
|
|
|
};
|
2025-12-09 09:13:46 +00:00
|
|
|
|
2025-12-11 11:31:56 +00:00
|
|
|
export default Character;
|