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 (