diff --git a/apps/university-web/src/apis/universities/api.ts b/apps/university-web/src/apis/universities/api.ts index a418af231..9585b4f8e 100644 --- a/apps/university-web/src/apis/universities/api.ts +++ b/apps/university-web/src/apis/universities/api.ts @@ -31,7 +31,7 @@ export interface RecommendedUniversitiesResponseRecommendedUniversitiesItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: RecommendedUniversitiesResponseRecommendedUniversitiesItemLanguageRequirementsItem[]; } @@ -52,7 +52,7 @@ export interface WishListResponseItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: WishListResponseItemLanguageRequirementsItem[]; } @@ -91,7 +91,7 @@ export interface UniversityDetailResponse { logoImageUrl: string; backgroundImageUrl: string; detailsForLocal: string; - studentCapacity: number; + studentCapacity: number | null; tuitionFeeType: string; semesterAvailableForDispatch: string; languageRequirements: UniversityDetailResponseLanguageRequirementsItem[]; @@ -116,7 +116,7 @@ export interface SearchTextResponseUnivApplyInfoPreviewsItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: SearchTextResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem[]; homeUniversityName?: HomeUniversityName; } @@ -138,7 +138,7 @@ export interface SearchFilterResponseUnivApplyInfoPreviewsItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: SearchFilterResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem[]; } diff --git a/apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx b/apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx index f18248dc0..37c8cd10a 100644 --- a/apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx +++ b/apps/university-web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetail/index.tsx @@ -14,6 +14,11 @@ interface UniversityDetailProps { } const UniversityDetail = ({ university, koreanName }: UniversityDetailProps) => { + const capacityLabel = + university.studentCapacity === null || university.studentCapacity === undefined + ? "모집 인원 미정" + : `모집 ${university.studentCapacity}명`; + return (
@@ -39,7 +44,7 @@ const UniversityDetail = ({ university, koreanName }: UniversityDetailProps) =>
{}0회 파견 {university.country} - 모집 {university.studentCapacity}명 + {capacityLabel}
const imageUrl = resolveMetadataImageUrl(universityData.backgroundImageUrl); const countryExchangeKeyword = `${universityData.country} 교환학생`; - const description = `${convertedKoreanName}(${universityData.englishName}) ${countryExchangeKeyword} 프로그램. 모집인원 ${universityData.studentCapacity}명. ${homeUniversityInfo?.shortName || ""} 학생을 위한 교환학생 정보.`; + const capacityDescription = + universityData.studentCapacity === null || universityData.studentCapacity === undefined + ? "모집인원 미정" + : `모집인원 ${universityData.studentCapacity}명`; + const description = `${convertedKoreanName}(${universityData.englishName}) ${countryExchangeKeyword} 프로그램. ${capacityDescription}. ${homeUniversityInfo?.shortName || ""} 학생을 위한 교환학생 정보.`; const title = `${convertedKoreanName} - ${countryExchangeKeyword} 정보 | 솔리드커넥션`; return { diff --git a/apps/university-web/src/components/ui/UniverSityCard/index.tsx b/apps/university-web/src/components/ui/UniverSityCard/index.tsx index 810f02420..8bf12e118 100644 --- a/apps/university-web/src/components/ui/UniverSityCard/index.tsx +++ b/apps/university-web/src/components/ui/UniverSityCard/index.tsx @@ -14,6 +14,10 @@ type UniversityCardProps = { const UniversityCard = ({ university, showCapacity = true, linkPrefix = "/university" }: UniversityCardProps) => { const convertedKoreanName = university.koreanName; + const capacityLabel = + university.studentCapacity === null || university.studentCapacity === undefined + ? "모집 인원 미정" + : `모집 ${university.studentCapacity}명`; const mappedHomeUniversitySlug = getHomeUniversitySlugByName(university.homeUniversityName); const hasExplicitPrefix = linkPrefix !== "/university"; @@ -51,7 +55,7 @@ const UniversityCard = ({ university, showCapacity = true, linkPrefix = "/univer {university.country} | {university.region} - {showCapacity && 모집 {university.studentCapacity}명} + {showCapacity && {capacityLabel}}
{university.languageRequirements.slice(0, 3).map((requirement) => { diff --git a/apps/university-web/src/types/university.ts b/apps/university-web/src/types/university.ts index 3885d73a9..fb3791d38 100644 --- a/apps/university-web/src/types/university.ts +++ b/apps/university-web/src/types/university.ts @@ -57,7 +57,7 @@ export interface University { backgroundImageUrl: string; detailsForLocal: string; // 지역 정보 - studentCapacity: number; + studentCapacity: number | null; tuitionFeeType: string; // 등록금 납부 유형 semesterAvailableForDispatch: string; // 파견 가능 학기 @@ -85,7 +85,7 @@ export interface ListUniversity { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: LanguageRequirement[]; } diff --git a/apps/web/src/apis/universities/api.ts b/apps/web/src/apis/universities/api.ts index a418af231..9585b4f8e 100644 --- a/apps/web/src/apis/universities/api.ts +++ b/apps/web/src/apis/universities/api.ts @@ -31,7 +31,7 @@ export interface RecommendedUniversitiesResponseRecommendedUniversitiesItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: RecommendedUniversitiesResponseRecommendedUniversitiesItemLanguageRequirementsItem[]; } @@ -52,7 +52,7 @@ export interface WishListResponseItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: WishListResponseItemLanguageRequirementsItem[]; } @@ -91,7 +91,7 @@ export interface UniversityDetailResponse { logoImageUrl: string; backgroundImageUrl: string; detailsForLocal: string; - studentCapacity: number; + studentCapacity: number | null; tuitionFeeType: string; semesterAvailableForDispatch: string; languageRequirements: UniversityDetailResponseLanguageRequirementsItem[]; @@ -116,7 +116,7 @@ export interface SearchTextResponseUnivApplyInfoPreviewsItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: SearchTextResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem[]; homeUniversityName?: HomeUniversityName; } @@ -138,7 +138,7 @@ export interface SearchFilterResponseUnivApplyInfoPreviewsItem { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: SearchFilterResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem[]; } diff --git a/apps/web/src/app/my/favorite/_ui/FavoriteContent/_hooks/useSortedUniversities.ts b/apps/web/src/app/my/favorite/_ui/FavoriteContent/_hooks/useSortedUniversities.ts index ea05c9563..d2fa146d3 100644 --- a/apps/web/src/app/my/favorite/_ui/FavoriteContent/_hooks/useSortedUniversities.ts +++ b/apps/web/src/app/my/favorite/_ui/FavoriteContent/_hooks/useSortedUniversities.ts @@ -28,7 +28,9 @@ const useSortedUniversities = (): UseSortedUniversitiesReturn => { switch (sequence) { // '모집인원 순'일 경우 studentCapacity를 기준으로 내림차순 정렬 case filterType.NUMBER_OF_RECRUIT: - return newWishUniversity.sort((a: University, b: University) => b.studentCapacity - a.studentCapacity); + return newWishUniversity.sort( + (a: University, b: University) => (b.studentCapacity ?? -1) - (a.studentCapacity ?? -1), + ); default: return wishUniversity; // 원본 순서(최신순) 그대로 반환 } diff --git a/apps/web/src/components/ui/UniverSityCard/index.tsx b/apps/web/src/components/ui/UniverSityCard/index.tsx index 9bbbf1b44..6a3e5842e 100644 --- a/apps/web/src/components/ui/UniverSityCard/index.tsx +++ b/apps/web/src/components/ui/UniverSityCard/index.tsx @@ -14,6 +14,10 @@ type UniversityCardProps = { const UniversityCard = ({ university, showCapacity = true, linkPrefix = "/university" }: UniversityCardProps) => { const convertedKoreanName = university.koreanName; + const capacityLabel = + university.studentCapacity === null || university.studentCapacity === undefined + ? "모집 인원 미정" + : `모집 ${university.studentCapacity}명`; const mappedHomeUniversitySlug = getHomeUniversitySlugByName(university.homeUniversityName); const hasExplicitPrefix = linkPrefix !== "/university"; @@ -55,7 +59,7 @@ const UniversityCard = ({ university, showCapacity = true, linkPrefix = "/univer {university.country} | {university.region} - {showCapacity && 모집 {university.studentCapacity}명} + {showCapacity && {capacityLabel}}
{university.languageRequirements.slice(0, 3).map((requirement) => { diff --git a/apps/web/src/types/university.ts b/apps/web/src/types/university.ts index 3885d73a9..fb3791d38 100644 --- a/apps/web/src/types/university.ts +++ b/apps/web/src/types/university.ts @@ -57,7 +57,7 @@ export interface University { backgroundImageUrl: string; detailsForLocal: string; // 지역 정보 - studentCapacity: number; + studentCapacity: number | null; tuitionFeeType: string; // 등록금 납부 유형 semesterAvailableForDispatch: string; // 파견 가능 학기 @@ -85,7 +85,7 @@ export interface ListUniversity { country: string; logoImageUrl: string; backgroundImageUrl: string; - studentCapacity: number; + studentCapacity: number | null; languageRequirements: LanguageRequirement[]; }