1
1
'use client' ;
2
2
3
3
import { useInfiniteQuery , useQuery } from '@tanstack/react-query' ;
4
- import { useEffect } from 'react' ;
4
+ import { useEffect , useMemo } from 'react' ;
5
5
import { useInView } from 'react-intersection-observer' ;
6
6
import { useSearchParam } from '@/hooks/useSearchParam' ;
7
7
import { Button , Dropdown , Check } from '@/components' ;
8
8
import { postList , postSummary } from '@/apis' ;
9
9
import { PATHS , SORT_TYPE } from '@/constants' ;
10
10
import { SortKey , SortValue } from '@/types' ;
11
- import { convertDateToKST } from '@/utils' ;
11
+ import { convertDateToKST } from '@/utils/dateUtil ' ;
12
12
import { Section , Summary } from './components' ;
13
13
14
14
const sorts : Array < [ SortKey , SortValue ] > = Object . entries ( SORT_TYPE ) as Array < [ SortKey , SortValue ] > ;
@@ -22,7 +22,7 @@ export const Content = () => {
22
22
const { ref, inView } = useInView ( ) ;
23
23
24
24
const { data : posts , fetchNextPage } = useInfiniteQuery ( {
25
- queryKey : [ PATHS . POSTS , [ searchParams . asc , searchParams . sort ] ] , // Query Key
25
+ queryKey : [ PATHS . POSTS , [ searchParams . asc , searchParams . sort ] ] ,
26
26
queryFn : async ( { pageParam = '' } ) =>
27
27
await postList (
28
28
{ asc : searchParams . asc === 'true' , sort : searchParams . sort || '' } ,
@@ -39,11 +39,17 @@ export const Content = () => {
39
39
} ) ;
40
40
41
41
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 ( ) ;
45
49
} , [ inView ] ) ;
46
50
51
+ const joinedPosts = useMemo ( ( ) => posts ?. pages . flatMap ( ( i ) => i . posts ) , [ posts ] ) ;
52
+
47
53
return (
48
54
< div className = "flex w-full h-full gap-[30px] max-MBI:flex-col max-TBL:gap-[20px] overflow-hidden" >
49
55
{ summaries && < Summary { ...summaries } /> }
@@ -85,18 +91,9 @@ export const Content = () => {
85
91
</ div >
86
92
</ div >
87
93
< 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
+ ) ) }
100
97
</ div >
101
98
</ div >
102
99
</ div >
0 commit comments