11'use client' ;
22
33import { useInfiniteQuery , useQuery } from '@tanstack/react-query' ;
4- import { useEffect } from 'react' ;
4+ import { useEffect , useMemo } from 'react' ;
55import { useInView } from 'react-intersection-observer' ;
66import { useSearchParam } from '@/hooks/useSearchParam' ;
77import { Button , Dropdown , Check } from '@/components' ;
88import { postList , postSummary } from '@/apis' ;
99import { PATHS , SORT_TYPE } from '@/constants' ;
1010import { SortKey , SortValue } from '@/types' ;
11- import { convertDateToKST } from '@/utils' ;
11+ import { convertDateToKST } from '@/utils/dateUtil ' ;
1212import { Section , Summary } from './components' ;
1313
1414const sorts : Array < [ SortKey , SortValue ] > = Object . entries ( SORT_TYPE ) as Array < [ SortKey , SortValue ] > ;
@@ -22,7 +22,7 @@ export const Content = () => {
2222 const { ref, inView } = useInView ( ) ;
2323
2424 const { data : posts , fetchNextPage } = useInfiniteQuery ( {
25- queryKey : [ PATHS . POSTS , [ searchParams . asc , searchParams . sort ] ] , // Query Key
25+ queryKey : [ PATHS . POSTS , [ searchParams . asc , searchParams . sort ] ] ,
2626 queryFn : async ( { pageParam = '' } ) =>
2727 await postList (
2828 { asc : searchParams . asc === 'true' , sort : searchParams . sort || '' } ,
@@ -39,11 +39,17 @@ export const Content = () => {
3939 } ) ;
4040
4141 useEffect ( ( ) => {
42- if ( posts && posts . pages [ posts . pages ?. length - 1 ] . nextCursor !== null && inView ) {
43- fetchNextPage ( ) ;
44- }
42+ const pages = posts ?. pages ;
43+ if ( ! pages ?. length || ! inView ) return ;
44+
45+ const hasNextCursor = pages [ pages . length - 1 ] . nextCursor !== null ;
46+ if ( ! hasNextCursor ) return ;
47+
48+ fetchNextPage ( ) ;
4549 } , [ inView ] ) ;
4650
51+ const joinedPosts = useMemo ( ( ) => posts ?. pages . flatMap ( ( i ) => i . posts ) , [ posts ] ) ;
52+
4753 return (
4854 < div className = "flex w-full h-full gap-[30px] max-MBI:flex-col max-TBL:gap-[20px] overflow-hidden" >
4955 { summaries && < Summary { ...summaries } /> }
@@ -85,18 +91,9 @@ export const Content = () => {
8591 </ div >
8692 </ div >
8793 < div className = "w-full h-full flex flex-col gap-[30px] relative max-TBL:gap-[20px] overflow-auto" >
88- { posts ?. pages ?. map ( ( n ) =>
89- n . posts . map ( ( i , j ) =>
90- j !== n ?. posts . length - 1 ? (
91- < Section key = { i . id } { ...i } />
92- ) : (
93- < div className = "relative" key = { i . id } >
94- < div ref = { ref } className = "absolute" />
95- < Section { ...i } />
96- </ div >
97- ) ,
98- ) ,
99- ) }
94+ { joinedPosts ?. map ( ( item , index , array ) => (
95+ < Section key = { item . id } ref = { index === array . length - 1 ? ref : undefined } { ...item } />
96+ ) ) }
10097 </ div >
10198 </ div >
10299 </ div >
0 commit comments