11import Image from "next/image" ;
22import Link from "next/link" ;
33
4+ import clsx from "clsx" ;
5+
46import { shortenLanguageTestName } from "@/utils/universityUtils" ;
57
68import CheveronRightFilled from "@/components/ui/icon/ChevronRightFilled" ;
@@ -10,66 +12,87 @@ import { ListUniversity } from "@/types/university";
1012type UniversityCardsProps = {
1113 colleges : ListUniversity [ ] ;
1214 style ?: React . CSSProperties ;
15+ className ?: string ;
16+ showCapacity ?: boolean ;
1317} ;
1418
15- const UniversityCards = ( { colleges, style } : UniversityCardsProps ) => (
16- < div className = "flex flex-col gap-2.5" style = { style } >
19+ const UniversityCards = ( { colleges, style, className , showCapacity = true } : UniversityCardsProps ) => (
20+ < div className = { clsx ( "flex flex-col gap-2.5" , className ) } style = { style } >
1721 { colleges . map ( ( university ) => (
18- < UniversityCard key = { university . id } university = { university } />
22+ < UniversityCard key = { university . id } university = { university } showCapacity = { showCapacity } />
1923 ) ) }
2024 </ div >
2125) ;
2226export default UniversityCards ;
2327
2428type UniversityCardProps = {
2529 university : ListUniversity ;
30+ showCapacity ?: boolean ;
2631} ;
2732
28- export const UniversityCard = ( { university } : UniversityCardProps ) => {
33+ export const UniversityCard = ( { university, showCapacity = true } : UniversityCardProps ) => {
2934 const convertedKoreanName =
3035 university . term !== process . env . NEXT_PUBLIC_CURRENT_TERM
3136 ? `${ university . koreanName } (${ university . term } )`
3237 : university . koreanName ;
3338
3439 return (
3540 < Link
36- className = "relative mx-5 flex h-[91px] overflow-hidden rounded-lg border border-solid border-k-100 px-5 py-3 hover:-translate-y-0.5 hover:shadow-md hover:shadow-black/10"
41+ className = "relative h-[91px] overflow-hidden rounded-lg border border-solid border-k-100 hover:-translate-y-0.5 hover:shadow-md hover:shadow-black/10"
3742 href = { `/university/${ university . id } ` }
3843 >
39- < div className = "flex flex-shrink-0 items-center" >
40- < Image
41- className = "h-14 w-14 rounded-full object-cover"
42- src = { `${ process . env . NEXT_PUBLIC_IMAGE_URL } /${ university . logoImageUrl } ` }
43- width = { 100 }
44- height = { 100 }
45- alt = { convertedKoreanName || "대학 이미지" }
46- />
47- </ div >
44+ < div className = "flex justify-between px-5 py-3.5" >
45+ < div className = "flex gap-[23.5px]" >
46+ < UniversityLogo logoImageUrl = { university . logoImageUrl } />
4847
49- < div className = "ml-[22px] flex flex-grow flex-col" >
50- < span className = "truncate text-base font-bold leading-normal text-k-700" > { convertedKoreanName } </ span >
51- < div className = "flex items-center justify-between" >
52- < span className = "text-sm font-medium leading-normal text-k-500" >
53- { university . country } | { university . region }
54- </ span >
55- < div className = "flex items-center" >
56- < span className = "text-xs font-semibold leading-normal text-primary" >
57- 모집 { university . studentCapacity } 명
58- </ span >
59- < CheveronRightFilled color = "black" opacity = "0.54" />
48+ < div className = "flex flex-col" >
49+ < span className = "truncate text-base font-bold leading-normal text-k-700" > { convertedKoreanName } </ span >
50+ < div className = "flex items-center gap-2.5" >
51+ < span className = "text-xs font-medium leading-normal text-k-500" >
52+ { university . country } | { university . region }
53+ </ span >
54+ { showCapacity && (
55+ < span className = "text-xs font-semibold leading-normal text-primary" >
56+ 모집 { university . studentCapacity } 명
57+ </ span >
58+ ) }
59+ </ div >
60+ < LanguageRequirements languageRequirements = { university . languageRequirements } />
6061 </ div >
6162 </ div >
62- < div className = "flex gap-4" >
63- { university . languageRequirements . slice ( 0 , 3 ) . map ( ( requirement ) => (
64- < span
65- key = { requirement . languageTestType }
66- className = "whitespace-nowrap text-xs font-medium leading-normal text-k-500"
67- >
68- { shortenLanguageTestName ( requirement . languageTestType ) } { requirement . minScore }
69- </ span >
70- ) ) }
63+ < div className = "flex items-center" >
64+ < CheveronRightFilled color = "black" opacity = "0.54" />
7165 </ div >
7266 </ div >
7367 </ Link >
7468 ) ;
7569} ;
70+
71+ const UniversityLogo = ( { logoImageUrl } : { logoImageUrl : string } ) => (
72+ < div className = "flex flex-shrink-0 items-center" >
73+ < Image
74+ className = "h-14 w-14 rounded-full object-cover"
75+ src = { `${ process . env . NEXT_PUBLIC_IMAGE_URL } /${ logoImageUrl } ` }
76+ width = { 62 }
77+ height = { 62 }
78+ alt = "대학 이미지"
79+ />
80+ </ div >
81+ ) ;
82+
83+ const LanguageRequirements = ( {
84+ languageRequirements,
85+ } : {
86+ languageRequirements : ListUniversity [ "languageRequirements" ] ;
87+ } ) => (
88+ < div className = "flex gap-4" >
89+ { languageRequirements . slice ( 0 , 3 ) . map ( ( requirement ) => (
90+ < span
91+ key = { requirement . languageTestType }
92+ className = "whitespace-nowrap text-xs font-medium leading-normal text-k-500"
93+ >
94+ { shortenLanguageTestName ( requirement . languageTestType ) } { requirement . minScore }
95+ </ span >
96+ ) ) }
97+ </ div >
98+ ) ;
0 commit comments