Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion apps/web/src/apis/universities/getSearchFilter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useQuery } from "@tanstack/react-query";
import type { AxiosError } from "axios";
import { useMemo } from "react";
import { isMatchedHomeUniversityName } from "@/constants/university";
import type { CountryCode, HomeUniversityName, LanguageTestType, ListUniversity } from "@/types/university";
import { QueryKeys } from "../queryKeys";
import { type SearchFilterResponse, universitiesApi } from "./api";
Expand Down Expand Up @@ -53,7 +54,9 @@ const useGetUniversitySearchByFilter = (
// homeUniversityName으로 필터링
const filteredData = useMemo(() => {
if (!query.data || !homeUniversityName) return query.data;
return query.data.filter((university) => university.homeUniversityName === homeUniversityName);
return query.data.filter((university) =>
isMatchedHomeUniversityName(university.homeUniversityName, homeUniversityName),
);
}, [query.data, homeUniversityName]);

return {
Expand Down
5 changes: 4 additions & 1 deletion apps/web/src/apis/universities/getSearchText.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { useQuery } from "@tanstack/react-query";

import type { AxiosError } from "axios";
import { useMemo } from "react";
import { isMatchedHomeUniversityName } from "@/constants/university";
import type { HomeUniversityName, ListUniversity } from "@/types/university";
import { QueryKeys } from "../queryKeys";
import { type SearchTextResponse, universitiesApi } from "./api";
Expand Down Expand Up @@ -44,7 +45,9 @@ const useUniversitySearch = (searchValue: string, homeUniversityName?: HomeUnive

// homeUniversityName 필터링
if (homeUniversityName) {
filtered = filtered.filter((university) => university.homeUniversityName === homeUniversityName);
filtered = filtered.filter((university) =>
isMatchedHomeUniversityName(university.homeUniversityName, homeUniversityName),
);
}

// 검색어 필터링
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ import { IconSolidConnectionSmallLogo } from "@/public/svgs/my";

interface UniversityDetailPreparingFallbackProps {
backHref: string;
title?: string;
description?: string;
}

const UniversityDetailPreparingFallback = ({ backHref }: UniversityDetailPreparingFallbackProps) => {
const UniversityDetailPreparingFallback = ({
backHref,
title = "대학 정보를 준비중입니다.",
description = "아직 데이터가 준비되지 않았어요. 잠시 후 다시 확인해주세요.",
}: UniversityDetailPreparingFallbackProps) => {
return (
<div
className="flex min-h-[calc(100vh-56px)] flex-col items-center justify-center px-5 pb-24 pt-20 text-center"
Expand All @@ -15,8 +21,8 @@ const UniversityDetailPreparingFallback = ({ backHref }: UniversityDetailPrepari
aria-atomic="true"
>
<IconSolidConnectionSmallLogo />
<p className="mt-3 text-k-700 typo-sb-9">대학 정보를 준비중입니다.</p>
<p className="mt-1 text-k-400 typo-regular-3">아직 데이터가 준비되지 않았어요. 잠시 후 다시 확인해주세요.</p>
<p className="mt-3 text-k-700 typo-sb-9">{title}</p>
<p className="mt-1 text-k-400 typo-regular-3">{description}</p>
<Link
href={backHref}
className="mt-5 rounded-full border border-k-200 bg-k-0 px-5 py-2 text-k-700 typo-sb-11 transition-colors hover:bg-k-50"
Expand Down
18 changes: 12 additions & 6 deletions apps/web/src/app/university/[homeUniversity]/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { notFound } from "next/navigation";

import { getAllUniversities, getUniversityDetail, getUniversityDetailWithStatus } from "@/apis/universities/server";
import TopDetailNavigation from "@/components/layout/TopDetailNavigation";
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS } from "@/constants/university";
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS, isMatchedHomeUniversityName } from "@/constants/university";
import type { HomeUniversitySlug } from "@/types/university";

// UniversityDetail 컴포넌트
Expand All @@ -24,7 +24,9 @@ export async function generateStaticParams() {
if (!homeUniversityInfo) continue;

// 해당 홈대학에 속하는 대학들만 필터링
const filteredUniversities = universities.filter((uni) => uni.homeUniversityName === homeUniversityInfo.name);
const filteredUniversities = universities.filter((uni) =>
isMatchedHomeUniversityName(uni.homeUniversityName, homeUniversityInfo.name),
);

for (const university of filteredUniversities) {
params.push({
Expand Down Expand Up @@ -125,14 +127,18 @@ const CollegeDetailPage = async ({ params }: PageProps) => {
const universityDetailResult = await getUniversityDetailWithStatus(collegeId);

if (!universityDetailResult.ok) {
if (universityDetailResult.status === 404) {
notFound();
}
const isNotFoundError = universityDetailResult.status === 404;

return (
<>
<TopDetailNavigation title="파견 학교 상세" backHref={`/university/${homeUniversity}`} />
<UniversityDetailPreparingFallback backHref={`/university/${homeUniversity}`} />
<UniversityDetailPreparingFallback
backHref={`/university/${homeUniversity}`}
title={isNotFoundError ? "해당 대학 정보를 찾을 수 없어요." : undefined}
description={
isNotFoundError ? "요청하신 파견학교를 찾지 못했습니다. 목록에서 다른 학교를 선택해 주세요." : undefined
}
/>
</>
);
}
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/app/university/[homeUniversity]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { notFound } from "next/navigation";

import { getSearchUniversitiesAllRegions } from "@/apis/universities/server";
import TopDetailNavigation from "@/components/layout/TopDetailNavigation";
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS } from "@/constants/university";
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS, isMatchedHomeUniversityName } from "@/constants/university";
import type { HomeUniversitySlug } from "@/types/university";

import UniversityListContent from "./_ui/UniversityListContent";
Expand Down Expand Up @@ -55,8 +55,8 @@ const UniversityListPage = async ({ params }: PageProps) => {
const allUniversities = await getSearchUniversitiesAllRegions();

// homeUniversityName으로 프론트에서 필터링
const filteredUniversities = allUniversities.filter(
(university) => university.homeUniversityName === universityInfo.name,
const filteredUniversities = allUniversities.filter((university) =>
isMatchedHomeUniversityName(university.homeUniversityName, universityInfo.name),
);

return (
Expand Down
23 changes: 23 additions & 0 deletions apps/web/src/constants/university.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,29 @@ export const getHomeUniversityBySlug = (slug: string): HomeUniversityInfo | unde
return HOME_UNIVERSITY_LIST.find((uni) => uni.slug === slug);
};

export const normalizeHomeUniversityName = (value: string | null | undefined): HomeUniversity | undefined => {
if (!value) {
return undefined;
}

const normalized = value.trim();
const matchedUniversity = HOME_UNIVERSITY_LIST.find(
(university) => university.name === normalized || university.shortName === normalized,
);

return matchedUniversity?.name;
};

export const isMatchedHomeUniversityName = (
left: string | null | undefined,
right: string | null | undefined,
): boolean => {
const normalizedLeft = normalizeHomeUniversityName(left);
const normalizedRight = normalizeHomeUniversityName(right);

return normalizedLeft !== undefined && normalizedRight !== undefined && normalizedLeft === normalizedRight;
};

/**
* 유효한 홈 대학교 슬러그 목록
*/
Expand Down