From b5ef083f5c3cbbf0d04f2ccf687d37fa6d732be1 Mon Sep 17 00:00:00 2001 From: 6-keem <6ukeem@gmail.com> Date: Tue, 4 Mar 2025 01:00:07 +0900 Subject: [PATCH] fix: Resolve render error of calendar event MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 해결: #30 --- src/option/calendar.tsx | 114 +++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 55 deletions(-) diff --git a/src/option/calendar.tsx b/src/option/calendar.tsx index 0c2ad24..c35fc00 100644 --- a/src/option/calendar.tsx +++ b/src/option/calendar.tsx @@ -46,16 +46,6 @@ function getRangePosition(day: Date, event: CalendarEvent): 'single' | 'start' | return 'middle'; } -// const colorClasses = [ -// 'bg-red-100 text-red-700', -// 'bg-orange-100 text-orange-700', -// 'bg-yellow-100 text-yellow-700', -// 'bg-green-100 text-green-700', -// 'bg-blue-100 text-blue-700', -// 'bg-indigo-100 text-indigo-700', -// 'bg-purple-100 text-purple-700', -// 'bg-pink-100 text-pink-700', -// ]; const colorClasses = [ 'bg-rose-100 text-rose-800', 'bg-amber-100 text-amber-800', @@ -133,6 +123,20 @@ export function Calendar() { } }; + // 모든 이벤트에서 고유한 과목(여기서는 event.title)을 추출해 고정 순서와 색상을 부여 + const subjectList = useMemo(() => { + return Array.from(new Set(events.map((event) => event.title))); + }, [events]); + + const subjectColorMap = useMemo(() => { + const map: { [key: string]: string } = {}; + subjectList.forEach((subject, index) => { + map[subject] = colorClasses[index % colorClasses.length]; + }); + return map; + }, [subjectList]); + + // 날짜에 해당하는 이벤트들을 필터 const renderEvents = (day: Date, isCurrent: boolean) => { const typeFilterValues = typeFilters.map((f) => f.value); const selectedTypeFilters = selectedFilters.filter((f) => typeFilterValues.includes(f)); @@ -140,7 +144,6 @@ export function Calendar() { const eventsOfTheDay = events.filter((event) => { if (!isInEventRange(day, event)) return false; - if (selectedTypeFilters.length > 0 && selectedTitleFilters.length > 0) { return selectedTypeFilters.includes(event.type) && selectedTitleFilters.includes(event.title); } else if (selectedTypeFilters.length > 0) { @@ -151,60 +154,62 @@ export function Calendar() { return true; }); - if (eventsOfTheDay.length === 0) return null; - + // 렌더링할 행의 수는 subjectList의 개수로 고정 return (