import { commonCodeApi } from "@/lib/api/commonCode"; import { queryKeys } from "@/lib/queryKeys"; import { useInfiniteScroll } from "@/hooks/useInfiniteScroll"; import type { CodeFilter } from "@/lib/schemas/commonCode"; import type { CodeInfo } from "@/types/commonCode"; /** * 코드 목록 무한 스크롤 훅 * 카테고리별로 코드 목록을 무한 스크롤로 로드 */ export function useCodesInfinite(categoryCode: string, filters?: CodeFilter) { return useInfiniteScroll({ queryKey: queryKeys.codes.infiniteList(categoryCode, filters), queryFn: async ({ pageParam, ...params }) => { // 첫 페이지는 20개, 이후는 10개씩 const pageSize = pageParam === 1 ? 20 : 10; const response = await commonCodeApi.codes.getList(categoryCode, { ...params, page: pageParam, size: pageSize, }); return { data: response.data || [], total: response.total, currentPage: pageParam, pageSize: pageSize, }; }, initialPageParam: 1, pageSize: 20, // 첫 페이지 기준 params: filters, staleTime: 5 * 60 * 1000, // 5분 캐싱 enabled: !!categoryCode, // categoryCode가 있을 때만 실행 // 커스텀 getNextPageParam 제공 getNextPageParam: (lastPage, allPages, lastPageParam) => { // 마지막 페이지의 데이터 개수가 요청한 페이지 크기보다 작으면 더 이상 페이지 없음 const currentPageSize = lastPageParam === 1 ? 20 : 10; const dataLength = lastPage.data?.length || 0; // 받은 데이터가 요청한 크기보다 작으면 마지막 페이지 if (dataLength < currentPageSize) { return undefined; } return lastPageParam + 1; }, }); }