crush-level-web/src/app/(main)/home/components/Character/index.tsx

41 lines
1.3 KiB
TypeScript
Raw Normal View History

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;