From 5d78d1b24450f8ae907df6e3a52802b4fac1c29a Mon Sep 17 00:00:00 2001 From: soyeon Date: Mon, 2 Mar 2026 20:51:23 +0900 Subject: [PATCH] =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/search/ListEntry.tsx | 39 +++++++++++++++++++----- src/pages/search/SearchDetailOverlay.tsx | 17 ++++++----- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/pages/search/ListEntry.tsx b/src/pages/search/ListEntry.tsx index 511d1de4..981e67a1 100644 --- a/src/pages/search/ListEntry.tsx +++ b/src/pages/search/ListEntry.tsx @@ -10,7 +10,6 @@ import SortButtons, { type Sort } from '@/components/molecules/SortButtons'; import type { Category, SearchResultItemRes } from '@/api/search'; import { ChipTabs, SegmentedControlTabs } from '@/components/atoms/Tabs'; import { filterByCategoryTab, type FilterCategory } from '@/utils/filterList'; -import AcademicScheduleInSearch from './AcademicScheduleInSearch'; import Pagination from '@/components/molecules/common/Pagination'; export type SearchTabKey = @@ -68,6 +67,15 @@ const CommunityLabel: Record = { FREE: '자유 게시판', }; +/** 학사일정-캘린더 제목에서 맨 앞 [학부,대학원], [학 부], [대학원] 등 추출 */ +function parseCalendarTitle(title: string): { category: string; cleanTitle: string } { + const match = title.match(/^\[([^\]]+)\]\s*(.*)$/); + if (match) { + return { category: match[1].trim(), cleanTitle: (match[2] ?? '').trim() || title }; + } + return { category: '', cleanTitle: title }; +} + const EMPTY_MESSAGE_CLASS = ({ isLong }: { isLong: boolean }) => { if (!isLong) { return 'flex h-26 items-center justify-center mx-5 border-1 border-grey-10 rounded-[4px] p-5'; @@ -76,7 +84,11 @@ const EMPTY_MESSAGE_CLASS = ({ isLong }: { isLong: boolean }) => { }; // 검색 결과 아이템 렌더링 -function renderItem(item: SearchResultItemRes, tab: SearchTabKey): ReactNode { +function renderItem( + item: SearchResultItemRes, + tab: SearchTabKey, + categoryTab?: Category | string, +): ReactNode { if (tab === '명대뉴스') { return ( ); } + // 학사일정-캘린더: 제목에서 [학부,대학원] 등 추출 → category로 전달 + if (tab === '학사일정' && categoryTab === 'MJU_CALENDAR') { + const { category: extractedCategory, cleanTitle } = parseCalendarTitle(item.highlightedTitle); + return ( + + ); + } return ( @@ -340,12 +366,9 @@ export default function ListEntry({ )} - {/* 학사일정 카테고리일 경우 학사일정 캘린더 출력, 나머지는 필터링 한 결과 출력 */} + {/* 필터링 한 결과 출력 */}
- {categoryTab === 'MJU_CALENDAR' && currentTab === '학사일정' && ( - - )} - {filteredItems.map((item) => renderItem(item, currentTab))} + {filteredItems.map((item) => renderItem(item, currentTab, categoryTab))} {filteredItems.length === 0 && !(categoryTab === 'MJU_CALENDAR' && currentTab === '학사일정') && (
diff --git a/src/pages/search/SearchDetailOverlay.tsx b/src/pages/search/SearchDetailOverlay.tsx index 50b9b916..123eddc2 100644 --- a/src/pages/search/SearchDetailOverlay.tsx +++ b/src/pages/search/SearchDetailOverlay.tsx @@ -110,7 +110,9 @@ export default function SearchDetail() { * 검색 요청 function */ const filterByType = (content: SearchResultItemRes[], type: string) => - content.filter((item) => item.type?.toLowerCase() === type.toLowerCase()).slice(0, 5); + content + .filter((item) => item.type?.toLowerCase() === type.toLowerCase()) + .slice(0, type === 'broadcast' ? 2 : 5); async function handleSearch(text: string) { if (currentTab === 'ALL' || tapLabel[currentTab] === 'ALL') { @@ -123,7 +125,8 @@ export default function SearchDetail() { } else { let type = tapLabel[currentTab]; if (currentTab === '학사일정' && categoryTab === 'academic') type = 'NOTICE'; - const category = currentTab === '명대뉴스' ? 'all' : categoryTab; + const category = + currentTab === '명대뉴스' || categoryTab === 'MJU_CALENDAR' ? 'all' : categoryTab; const res = await getSearchResult(text, type, category, sort, page, 10); const items = res.content as unknown as SearchResultItemRes[]; setItems(items); @@ -157,6 +160,11 @@ export default function SearchDetail() { } setInitialContent(keyword); setIsAiSummaryLoading(true); + try { + await handleSearch(keyword); + } catch { + // 에러는 상위에서 처리 + } try { await handleGetAiSummary(keyword); } catch { @@ -164,11 +172,6 @@ export default function SearchDetail() { } finally { setIsAiSummaryLoading(false); } - try { - await handleSearch(keyword); - } catch { - // 에러는 상위에서 처리 - } })(); }, [keyword, page]);