Skip to content

Commit ed6e050

Browse files
authored
Merge pull request #296 from manNomi/feat/static-university-page
feat : 대학정보 페이지 정적 변경 및 가상화 적용
2 parents 8e50881 + 99e23eb commit ed6e050

File tree

2 files changed

+65
-15
lines changed

2 files changed

+65
-15
lines changed

src/app/university/[id]/page.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,29 @@ import TopDetailNavigation from "@/components/layout/TopDetailNavigation";
55

66
import UniversityDetail from "./UniversityDetail";
77

8-
import { University } from "@/types/university";
9-
108
import { getUniversityDetail } from "@/api/university/server/getUniversityDetail";
9+
import { getAllUniversities } from "@/api/university/server/getSearchUniversitiesByText";
10+
11+
export const revalidate = false;
1112

12-
export const revalidate = 60; // ISR 재생성 주기 설정
13+
export async function generateStaticParams() {
14+
const universities = await getAllUniversities();
15+
16+
return universities.map((university) => ({
17+
id: String(university.id),
18+
}));
19+
}
1320

1421
type MetadataProps = {
1522
params: Promise<{ id: string }>;
16-
searchParams: Promise<{ [key: string]: string | string[] | undefined }>;
1723
};
1824

1925
export async function generateMetadata(
20-
{ params, searchParams }: MetadataProps,
21-
parent: ResolvingMetadata,
26+
{ params }: MetadataProps,
27+
_parent: ResolvingMetadata,
2228
): Promise<Metadata> {
23-
// read route params
2429
const { id } = await params;
2530

26-
// fetch data
2731
const universityData = await getUniversityDetail(Number(id));
2832

2933
if (!universityData) {
Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
"use client";
2+
3+
import { useRef } from "react";
4+
15
import clsx from "clsx";
26

7+
import { useVirtualizer } from "@tanstack/react-virtual";
8+
39
import UniversityCard from "../../ui/UniverSityCard";
410

511
import { 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+
2167
export default UniversityCards;

0 commit comments

Comments
 (0)