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

43 lines
1.4 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}
enableLazyRender
lazyRenderMargin="500px"
2025-12-18 10:14:12 +00:00
columns={(width) => {
2025-12-19 10:22:04 +00:00
const cardWidth = width > 1200 ? 256 : width > 588 ? 200 : width > 375 ? 170 : 150;
2025-12-18 10:14:12 +00:00
return Math.floor(width / cardWidth);
}}
2025-12-11 11:31:56 +00:00
renderItem={(character) => <AIStandardCard character={character} />}
2025-12-18 10:59:55 +00:00
getItemKey={(character, index) => character.id + index}
2025-12-11 11:31:56 +00:00
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;