1+ 'use client'
2+
3+ import { useEffect , useState } from "react" ;
4+ import { useInView } from "react-intersection-observer" ;
5+ import { Wine } from "@/app/types/wine" ;
6+ import { Alert , List , Spinner } from "flowbite-react" ;
7+ import Link from "next/link" ;
8+ import { WineListItemSummaryInformation } from "@/app/components/main-layout/wine-list-item-summary-information" ;
9+ import { getRaking } from "@/app/lib/raking" ;
10+
11+ export function RakingList ( { initialRaking} : { initialRaking : Wine [ ] } ) {
12+ const [ raking , setRaking ] = useState ( initialRaking ) ;
13+ const [ page , setPage ] = useState ( 2 ) ;
14+ const [ isMoreRaking , setIsMoreRaking ] = useState < boolean > ( true ) ;
15+ const { ref, inView} = useInView ( ) ;
16+
17+ async function loadMoreRakingResults ( ) {
18+ const moreSearchResult = await getRaking ( page ) ;
19+ setRaking ( prevResults => [ ...prevResults , ...moreSearchResult ] ) ;
20+ if ( moreSearchResult . length <= 0 ) {
21+ setIsMoreRaking ( false ) ;
22+ }
23+ }
24+
25+ useEffect ( ( ) => {
26+ if ( inView ) {
27+ // noinspection JSIgnoredPromiseFromCall
28+ loadMoreRakingResults ( ) ;
29+ setPage ( prevPage => prevPage + 1 ) ;
30+ }
31+ // eslint-disable-next-line react-hooks/exhaustive-deps
32+ } , [ inView ] ) ;
33+
34+ const searchResultItem = raking . map ( ( item , index ) => (
35+ < List . Item key = { item . id } className = { "" + (
36+ ( index === 0 ) ? "gold-number" : ( index === 1 ? "sliver-number" : ( ( index === 2 ) && "bronze-number" ) ) ) } >
37+ < Link href = { "/wine/" + item . id }
38+ className = { "inline-block py-3" } >
39+ < div className = { "inline-flex flex-col" } >
40+ < div className = { "hover:underline" } >
41+ { item . name }
42+ </ div >
43+ < WineListItemSummaryInformation item = { item } />
44+ </ div >
45+ </ Link >
46+ </ List . Item >
47+ ) ) ;
48+
49+ return (
50+ < >
51+ < Alert color = "info" >
52+ 와인 이름이 중복된 경우에는 와이너리, 산도 등이 달라 실제로는 다른 와인이니 착오 없으시길 바랍니다. 비비노 평점과 리뷰 개수는 현재의 수치와 다를 수 있습니다.
53+ </ Alert >
54+ < List ordered className = "divide-y space-y-0 divide-gray-200 dark:divide-gray-700 text-black items-center bold-list-numbers" >
55+ { searchResultItem }
56+ { isMoreRaking && (
57+ < li ref = { ref } className = { "py-3 block text-center" } >
58+ < Spinner size = "xl" color = { "rose" } />
59+ </ li >
60+ ) }
61+ </ List >
62+ </ >
63+ ) ;
64+ }
0 commit comments