1
+ import { useState } from "react" ;
1
2
import styled from "styled-components" ;
2
3
import DetailHeader from "../../components/common/Header/DetailHeader" ;
3
4
import SideBar from "../../components/common/SideBar" ;
4
5
import SearchBox from "../../components/common/SearchBox" ;
5
6
import Table from "../../components/common/Table" ;
6
- import { TitledWineDataTypes } from "../../types/CommonTypes" ;
7
7
import { useNavigate } from "react-router-dom" ;
8
8
import { wineColumns } from "../../constants/constants" ;
9
9
import AdminHeader from "../../components/common/Header/AdminHeader" ;
10
+ import { useGetWineSearch } from "../../hooks/useGetWineSearch" ;
11
+ import { formatDate } from "../../utils/formatDate" ;
12
+ import Pagination from "../../components/common/Pagination" ;
10
13
11
14
export default function WinePage ( ) {
12
15
const navigate = useNavigate ( ) ;
13
16
14
- const titleData : TitledWineDataTypes [ ] = [
15
- //추후 api로 개별 와인 조회 예정이라 정적 데이터
16
- {
17
- id : "102391" ,
18
- name : "루이 로드레 크리스탈 2014" ,
19
- sort : "스파클링" ,
20
- region : "상파뉴" ,
21
- country : "프랑스" ,
22
- date : "2024-09-03" ,
23
- action1 : "-" ,
24
- action2 : "-" ,
25
- } ,
26
- {
27
- id : "102391" ,
28
- name : "루이 로드레 크리스탈 2014" ,
29
- sort : "스파클링" ,
30
- region : "상파뉴" ,
31
- country : "프랑스" ,
32
- date : "2024-09-03" ,
33
- action1 : "-" ,
34
- action2 : "-" ,
35
- } ,
36
- ] ;
17
+ const fieldNames = [ "searchName" , "wineSort" , "wineVariety" , "wineCountry" ] ;
18
+ const [ searchTrigger , setSearchTrigger ] = useState ( 0 ) ;
19
+ const [ page , setPage ] = useState ( 0 ) ;
20
+
21
+ // state를 필드 이름 기반으로 관리
22
+ const [ searchParams , setSearchParams ] = useState ( {
23
+ searchName : "" ,
24
+ wineSort : "" ,
25
+ wineVariety : "" ,
26
+ wineCountry : "" ,
27
+ } ) ;
28
+
29
+ const { data : WineData } = useGetWineSearch ( {
30
+ ...searchParams ,
31
+ page : page ,
32
+ size : 7 ,
33
+ sort : "name,ASC" ,
34
+ trigger : searchTrigger ,
35
+ } ) ;
36
+
37
+ const handleInputChange = ( index : number , value : string ) => {
38
+ const field = fieldNames [ index ] ;
39
+ setSearchParams ( ( prev ) => ( {
40
+ ...prev ,
41
+ [ field ] : value ,
42
+ } ) ) ;
43
+ } ;
44
+
45
+ const handleSearchClick = ( ) => {
46
+ setSearchTrigger ( ( prev ) => prev + 1 ) ;
47
+ } ;
37
48
38
49
const handleRowClick = ( id : string ) => {
39
50
navigate ( `/wine/${ id } ` ) ;
40
51
} ;
41
52
53
+ if ( ! WineData ) {
54
+ return < > </ > ;
55
+ }
56
+
42
57
return (
43
58
< Container >
44
59
< AdminHeader />
@@ -52,12 +67,35 @@ export default function WinePage() {
52
67
] }
53
68
/>
54
69
< InnerContainer >
55
- < SearchBox titles = { [ "와인명 :" , "종류 :" , "품종 :" , "생산지 :" ] } />
70
+ < SearchBox
71
+ titles = { [ "와인명 :" , "종류 :" , "품종 :" , "생산지 :" ] }
72
+ inputValues = { fieldNames . map (
73
+ ( name ) => searchParams [ name as keyof typeof searchParams ]
74
+ ) }
75
+ onInputChange = { handleInputChange }
76
+ onSearchClick = { handleSearchClick }
77
+ />
56
78
< Table
57
79
columns = { wineColumns }
58
- data = { titleData }
80
+ data = { ( WineData ?. result . content ?? [ ] ) . map ( ( wine ) => ( {
81
+ id : wine . wineId . toString ( ) , // 클릭용
82
+ wineId : wine . wineId . toString ( ) , // 출력용
83
+ name : wine . name ,
84
+ sort : wine . sort ,
85
+ variety : wine . variety ,
86
+ country : wine . country ,
87
+ createdAt : formatDate ( wine . createdAt ) ,
88
+ } ) ) }
59
89
onRowClick = { handleRowClick }
60
90
/>
91
+ < Pagination
92
+ currentPage = { page + 1 } // 서버는 0부터니까 사용자에게는 1부터 보여주기
93
+ totalPages = { WineData ?. result . totalPages || 1 }
94
+ onPageChange = { ( newPage ) => {
95
+ setPage ( newPage - 1 ) ; // 사용자는 1페이지부터 누르지만 서버는 0부터니까 -1
96
+ setSearchTrigger ( ( prev ) => prev + 1 ) ; // API 다시 요청
97
+ } }
98
+ />
61
99
</ InnerContainer >
62
100
</ ContentContainer >
63
101
</ Container >
0 commit comments