1+ import { useState } from 'react' ;
2+ import { useLocation , useNavigate } from 'react-router-dom' ;
3+
4+ /**
5+ * 리스트 페이지의 네비게이션 관리를 위한 커스텀 훅
6+ * 페이지네이션, 검색, URL 쿼리 파라미터 관리를 담당
7+ */
8+ export function useListNavigation ( defaultBbsId ) {
9+ const location = useLocation ( ) ;
10+ const navigate = useNavigate ( ) ;
11+
12+ // URL 쿼리 파라미터에서 검색 조건 추출
13+ const getSearchConditionFromURL = ( ) => {
14+ const searchParams = new URLSearchParams ( location . search ) ;
15+ return {
16+ bbsId : defaultBbsId ,
17+ pageIndex : parseInt ( searchParams . get ( 'page' ) ) || 1 ,
18+ searchCnd : searchParams . get ( 'searchCnd' ) || "0" ,
19+ searchWrd : searchParams . get ( 'searchWrd' ) || "" ,
20+ } ;
21+ } ;
22+
23+ const [ searchCondition , setSearchCondition ] = useState (
24+ location . state ?. searchCondition || getSearchConditionFromURL ( )
25+ ) ;
26+
27+ // URL 쿼리 파라미터 업데이트
28+ const updateURL = ( newSearchCondition ) => {
29+ const searchParams = new URLSearchParams ( ) ;
30+ if ( newSearchCondition . pageIndex > 1 ) searchParams . set ( 'page' , newSearchCondition . pageIndex ) ;
31+ if ( newSearchCondition . searchCnd !== "0" ) searchParams . set ( 'searchCnd' , newSearchCondition . searchCnd ) ;
32+ if ( newSearchCondition . searchWrd ) searchParams . set ( 'searchWrd' , newSearchCondition . searchWrd ) ;
33+
34+ const newURL = `${ location . pathname } ${ searchParams . toString ( ) ? '?' + searchParams . toString ( ) : '' } ` ;
35+ navigate ( newURL , { replace : true } ) ;
36+ } ;
37+
38+ // 페이지 이동 핸들러
39+ const handlePageMove = ( pageIndex , cndRef , wrdRef , retrieveList ) => {
40+ const newSearchCondition = {
41+ ...searchCondition ,
42+ pageIndex,
43+ searchCnd : cndRef . current . value ,
44+ searchWrd : wrdRef . current . value ,
45+ } ;
46+
47+ updateURL ( newSearchCondition ) ;
48+ retrieveList ( newSearchCondition ) ;
49+ setSearchCondition ( newSearchCondition ) ;
50+ } ;
51+
52+ // 검색 핸들러
53+ const handleSearch = ( cndRef , wrdRef , retrieveList ) => {
54+ const newSearchCondition = {
55+ ...searchCondition ,
56+ pageIndex : 1 ,
57+ searchCnd : cndRef . current . value ,
58+ searchWrd : wrdRef . current . value ,
59+ } ;
60+
61+ updateURL ( newSearchCondition ) ;
62+ retrieveList ( newSearchCondition ) ;
63+ setSearchCondition ( newSearchCondition ) ;
64+ } ;
65+
66+ // 상세 페이지에서 목록으로 돌아갈 때의 URL 생성
67+ const getBackToListURL = ( baseURL , searchCondition ) => {
68+ const searchParams = new URLSearchParams ( ) ;
69+ if ( searchCondition ?. pageIndex > 1 ) searchParams . set ( 'page' , searchCondition . pageIndex ) ;
70+ if ( searchCondition ?. searchCnd !== "0" ) searchParams . set ( 'searchCnd' , searchCondition . searchCnd ) ;
71+ if ( searchCondition ?. searchWrd ) searchParams . set ( 'searchWrd' , searchCondition . searchWrd ) ;
72+
73+ return `${ baseURL } ${ searchParams . toString ( ) ? '?' + searchParams . toString ( ) : '' } ` ;
74+ } ;
75+
76+ return {
77+ searchCondition,
78+ setSearchCondition,
79+ handlePageMove,
80+ handleSearch,
81+ getBackToListURL
82+ } ;
83+ }
84+
85+ export default useListNavigation ;
0 commit comments