1- import React , { useCallback , useEffect , useRef } from 'react' ;
1+ import { useEffect , useState } from 'react' ;
22import * as S from './index.styled' ;
33import Card from './Card' ;
44import { useNavigate } from 'react-router' ;
55import useMediaQueries from '@/hooks/useMediaQueries' ;
66import WhiteContentContainer from '@/layouts/WhiteContentContainer' ;
7- import { useFarmingLogsInfiniteQuery } from '@/services/query/useFarmingLogInfiniteQuery ' ;
7+ import { useFarmingLogQuery } from '@/services/query/useFarmingLogInQuery ' ;
88import useFarmingLogStore from '@/stores/farminglogStore' ;
99import CardSkeleton from './CardSkeleton' ;
1010
11+
12+ import jumpArrow_left from '@/assets/Icons/pagenation_1.png' ;
13+ import jumpArrow_right from '@/assets/Icons/pagenation_1.png' ;
14+ import nextArrow_left from '@/assets/Icons/pagenation_2.png' ;
15+ import nextArrow_right from '@/assets/Icons/pagenation_2.png' ;
16+
1117import EditImage from '@/assets/Icons/edit-3.png' ;
1218
1319export default function View ( ) {
1420 const navigate = useNavigate ( ) ;
15- const { isApp, isMobile, isDesktop } = useMediaQueries ( ) ;
21+ const { isApp, isMobile, isDesktop, isTablet } = useMediaQueries ( ) ;
22+ const [ currentPage , setCurrentPage ] = useState < number > ( 0 ) ;
23+ const handleScrollTop = ( ) => {
24+ window . scrollTo ( { top : 0 } ) ;
25+ } ;
1626
1727 const {
1828 data,
19- fetchNextPage,
20- hasNextPage,
21- isFetchingNextPage,
22- isFetching,
2329 isLoading,
2430 error,
2531 refetch
26- } = useFarmingLogsInfiniteQuery ( ) ;
32+ } = useFarmingLogQuery ( currentPage , 10 ) ; // 10개씩 페이지네이션
2733 const { isNeedRefresh, setIsNeedRefresh } = useFarmingLogStore ( ) ;
2834
2935 useEffect ( ( ) => {
@@ -33,22 +39,49 @@ export default function View() {
3339 }
3440 } , [ isNeedRefresh , refetch , setIsNeedRefresh ] ) ;
3541
36- // 마지막 카드 요소를 관찰하여 다음 페이지를 불러오기 위한 IntersectionObserver
37- const observerRef = useRef < IntersectionObserver | null > ( null ) ;
38- const lastLogRef = useCallback (
39- ( node : HTMLDivElement ) => {
40- if ( isFetchingNextPage ) return ;
41- if ( observerRef . current ) observerRef . current . disconnect ( ) ;
4242
43- observerRef . current = new IntersectionObserver ( ( entries ) => {
44- if ( entries [ 0 ] . isIntersecting && hasNextPage ) {
45- fetchNextPage ( ) ;
46- }
47- } ) ;
48- if ( node ) observerRef . current . observe ( node ) ;
49- } ,
50- [ isFetchingNextPage , fetchNextPage , hasNextPage ]
51- ) ;
43+ // 페이지 번호 배열 생성
44+ const generatePageNumbers = ( ) => {
45+ if ( ! data ) return [ ] ;
46+
47+ const totalPages = data . totalPages ;
48+ const current = data . number ; // 현재 페이지 번호 (0시작)
49+ const pages : number [ ] = [ ] ;
50+
51+ // 최대 5개의 페이지 번호만 표시
52+ const maxVisiblePages = 5 ;
53+ let startPage = Math . max ( 0 , current - Math . floor ( maxVisiblePages / 2 ) ) ;
54+ const endPage = Math . min ( totalPages - 1 , startPage + maxVisiblePages - 1 ) ;
55+
56+ // 시작 페이지 조정
57+ if ( endPage - startPage < maxVisiblePages - 1 ) {
58+ startPage = Math . max ( 0 , endPage - maxVisiblePages + 1 ) ;
59+ }
60+
61+ for ( let i = startPage ; i <= endPage ; i ++ ) {
62+ pages . push ( i ) ;
63+ }
64+
65+ return pages ;
66+ } ;
67+
68+ // 페이지네이션 핸들러
69+ const handlePageChange = ( page : number ) => {
70+ setCurrentPage ( page ) ;
71+ handleScrollTop ( ) ; //위로 올라가라잇
72+ } ;
73+
74+ const handlePreviousPage = ( ) => {
75+ if ( data && ! data . first ) {
76+ setCurrentPage ( currentPage - 1 ) ;
77+ }
78+ } ;
79+
80+ const handleNextPage = ( ) => {
81+ if ( data && ! data . last ) {
82+ setCurrentPage ( currentPage + 1 ) ;
83+ }
84+ } ;
5285
5386 // 로딩 또는 에러 상태 처리
5487 if ( isLoading ) return (
@@ -80,37 +113,64 @@ export default function View() {
80113 $isMobile = { isMobile }
81114 $isDesktop = { isDesktop }
82115 >
83- { data . pages . map ( ( page , pageIndex ) => (
84- < React . Fragment key = { pageIndex } >
85- { page . content . map ( ( log , idx ) => {
86- // 마지막 페이지의 마지막 요소에 ref 적용
87- const isLastItem =
88- pageIndex === data . pages . length - 1 &&
89- idx === page . content . length - 1 ;
90- return (
91- < div
92- key = { log . farmingLogId }
93- ref = { isLastItem ? lastLogRef : null }
94- >
95- < Card data = { log } />
96- </ div >
97- ) ;
98- } ) }
99- </ React . Fragment >
116+ { data ?. content . map ( ( log ) => (
117+ < div key = { log . farmingLogId } >
118+ < Card data = { log } />
119+ </ div >
100120 ) ) }
121+ { /* 페이지네이션 */ }
122+ { data && data . content . length > 0 && (
123+ < S . PaginationContainer >
124+ < S . PaginationButton >
125+ < S . PaginationButtonText
126+ onClick = { ( ) => setCurrentPage ( 0 ) }
127+ $disabled = { data ?. first }
128+ $isMobile = { isMobile }
129+ $isTablet = { isTablet }
130+ >
131+ < img src = { jumpArrow_left } alt = "jumpArrow" />
132+ </ S . PaginationButtonText >
133+ < S . PaginationButtonText
134+ onClick = { handlePreviousPage }
135+ $disabled = { data ?. first }
136+ $isMobile = { isMobile }
137+ $isTablet = { isTablet }
138+ >
139+ < img src = { nextArrow_left } alt = "nextArrow" />
140+ </ S . PaginationButtonText >
141+
142+ { generatePageNumbers ( ) . map ( ( pageNum ) => (
143+ < S . PaginationPageButton
144+ key = { pageNum }
145+ onClick = { ( ) => handlePageChange ( pageNum ) }
146+ $active = { pageNum === currentPage }
147+ $isMobile = { isMobile }
148+ $isTablet = { isTablet }
149+ >
150+ { pageNum + 1 }
151+ </ S . PaginationPageButton >
152+ ) ) }
153+
154+ < S . PaginationButtonText
155+ onClick = { handleNextPage }
156+ $disabled = { data ?. last }
157+ $isMobile = { isMobile }
158+ $isTablet = { isTablet }
159+ >
160+ < img src = { nextArrow_right } alt = "nextArrow_right" />
161+ </ S . PaginationButtonText >
162+ < S . PaginationButtonText
163+ onClick = { ( ) => setCurrentPage ( data . totalPages - 1 ) }
164+ $disabled = { data ?. last }
165+ $isMobile = { isMobile }
166+ $isTablet = { isTablet }
167+ >
168+ < img src = { jumpArrow_right } alt = "jumpArrow_right" />
169+ </ S . PaginationButtonText >
170+ </ S . PaginationButton >
171+ </ S . PaginationContainer >
172+ ) }
101173 </ S . FarmingLogCardContainer >
102- { isFetchingNextPage && < div > 로딩중...</ div > }
103- { ! hasNextPage && ! isFetching && (
104- < S . EndOfList >
105- < S . EndOfListText
106- $isApp = { isApp }
107- $isMobile = { isMobile }
108- $isDesktop = { isDesktop }
109- >
110- 더 이상 글이 없습니다.
111- </ S . EndOfListText >
112- </ S . EndOfList >
113- ) }
114174 < S . FarmingLogWriteButton
115175 $isApp = { isApp }
116176 $isMobile = { isMobile }
0 commit comments