1+ "use client" ;
2+
3+ import { useRef } from "react" ;
4+
15import clsx from "clsx" ;
26
7+ import { useVirtualizer } from "@tanstack/react-virtual" ;
8+
39import UniversityCard from "../../ui/UniverSityCard" ;
410
511import { ListUniversity } from "@/types/university" ;
@@ -11,11 +17,51 @@ type UniversityCardsProps = {
1117 showCapacity ?: boolean ;
1218} ;
1319
14- const UniversityCards = ( { colleges, style, className, showCapacity = true } : UniversityCardsProps ) => (
15- < div className = { clsx ( "flex flex-col gap-2.5" , className ) } style = { style } >
16- { colleges . map ( ( university ) => (
17- < UniversityCard key = { university . id } university = { university } showCapacity = { showCapacity } />
18- ) ) }
19- </ div >
20- ) ;
20+ const ITEM_HEIGHT = 101 ;
21+
22+ const UniversityCards = ( { colleges, style, className, showCapacity = true } : UniversityCardsProps ) => {
23+ const parentRef = useRef < HTMLDivElement > ( null ) ;
24+
25+ const virtualizer = useVirtualizer ( {
26+ count : colleges . length ,
27+ getScrollElement : ( ) => parentRef . current ,
28+ estimateSize : ( ) => ITEM_HEIGHT ,
29+ overscan : 5 ,
30+ } ) ;
31+
32+ return (
33+ < div
34+ ref = { parentRef }
35+ className = { clsx ( "h-[calc(100vh-200px)] overflow-auto" , className ) }
36+ style = { style }
37+ >
38+ < div
39+ style = { {
40+ height : `${ virtualizer . getTotalSize ( ) } px` ,
41+ width : "100%" ,
42+ position : "relative" ,
43+ } }
44+ >
45+ { virtualizer . getVirtualItems ( ) . map ( ( virtualItem ) => (
46+ < div
47+ key = { colleges [ virtualItem . index ] . id }
48+ style = { {
49+ position : "absolute" ,
50+ top : 0 ,
51+ left : 0 ,
52+ width : "100%" ,
53+ height : `${ virtualItem . size } px` ,
54+ transform : `translateY(${ virtualItem . start } px)` ,
55+ } }
56+ >
57+ < div className = "pb-2.5" >
58+ < UniversityCard university = { colleges [ virtualItem . index ] } showCapacity = { showCapacity } />
59+ </ div >
60+ </ div >
61+ ) ) }
62+ </ div >
63+ </ div >
64+ ) ;
65+ } ;
66+
2167export default UniversityCards ;
0 commit comments