diff --git a/frontend/src/pages/mobile/public/Schedule.jsx b/frontend/src/pages/mobile/public/Schedule.jsx index f833d5e..41f7d86 100644 --- a/frontend/src/pages/mobile/public/Schedule.jsx +++ b/frontend/src/pages/mobile/public/Schedule.jsx @@ -10,6 +10,24 @@ import { getTodayKST } from '../../../utils/date'; import { getSchedules, searchSchedules } from '../../../api/public/schedules'; import useScheduleStore from '../../../stores/useScheduleStore'; +// 멤버 리스트 추출 (검색 결과와 일반 데이터 모두 처리) +const getMemberList = (schedule) => { + // member_names 문자열이 있으면 사용 + if (schedule.member_names) { + return schedule.member_names.split(',').map(n => n.trim()).filter(Boolean); + } + // members 배열이 있으면 + if (Array.isArray(schedule.members) && schedule.members.length > 0) { + // 문자열 배열인 경우 (검색 결과) + if (typeof schedule.members[0] === 'string') { + return schedule.members.filter(Boolean); + } + // 객체 배열인 경우 (일반 데이터) + return schedule.members.map(m => m.name).filter(Boolean); + } + return []; +}; + // 폭죽 애니메이션 함수 const fireBirthdayConfetti = () => { const duration = 3000; @@ -937,8 +955,7 @@ function MobileSchedule() { // 일정 카드 컴포넌트 (검색용) - 날짜 포함 모던 디자인 function ScheduleCard({ schedule, categoryColor, categories, delay = 0, onClick }) { const categoryName = categories.find(c => c.id === (schedule.category?.id || schedule.category_id))?.name || '미분류'; - const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || ''; - const memberList = memberNames.split(',').filter(name => name.trim()); + const memberList = getMemberList(schedule); // 날짜 파싱 const parseDate = (dateStr) => { @@ -1041,8 +1058,7 @@ function ScheduleCard({ schedule, categoryColor, categories, delay = 0, onClick // 타임라인용 일정 카드 컴포넌트 - 모던 디자인 function TimelineScheduleCard({ schedule, categoryColor, categories, delay = 0, onClick }) { const categoryName = categories.find(c => c.id === (schedule.category?.id || schedule.category_id))?.name || '미분류'; - const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || ''; - const memberList = memberNames.split(',').filter(name => name.trim()); + const memberList = getMemberList(schedule); return ( { return textarea.value; }; +// 멤버 리스트 추출 (검색 결과와 일반 데이터 모두 처리) +const getMemberList = (schedule) => { + // member_names 문자열이 있으면 사용 + if (schedule.member_names) { + return schedule.member_names.split(',').map(n => n.trim()).filter(Boolean); + } + // members 배열이 있으면 + if (Array.isArray(schedule.members) && schedule.members.length > 0) { + // 문자열 배열인 경우 (검색 결과) + if (typeof schedule.members[0] === 'string') { + return schedule.members.filter(Boolean); + } + // 객체 배열인 경우 (일반 데이터) + return schedule.members.map(m => m.name).filter(Boolean); + } + return []; +}; + // 카테고리 ID 상수 const CATEGORY_IDS = { YOUTUBE: 2, @@ -59,8 +77,7 @@ const ScheduleItem = memo(function ScheduleItem({ const isBirthday = schedule.is_birthday || String(schedule.id).startsWith('birthday-'); const categoryColor = getColorStyle(categories.find(c => c.id === schedule.category_id)?.color)?.style?.backgroundColor || '#6b7280'; const categoryName = categories.find(c => c.id === schedule.category_id)?.name || '미분류'; - const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || ''; - const memberList = memberNames.split(',').filter(name => name.trim()); + const memberList = getMemberList(schedule); return ( { return textarea.value; }; +// 멤버 리스트 추출 (검색 결과와 일반 데이터 모두 처리) +const getMemberList = (schedule) => { + // member_names 문자열이 있으면 사용 + if (schedule.member_names) { + return schedule.member_names.split(',').map(n => n.trim()).filter(Boolean); + } + // members 배열이 있으면 + if (Array.isArray(schedule.members) && schedule.members.length > 0) { + // 문자열 배열인 경우 (검색 결과) + if (typeof schedule.members[0] === 'string') { + return schedule.members.filter(Boolean); + } + // 객체 배열인 경우 (일반 데이터) + return schedule.members.map(m => m.name).filter(Boolean); + } + return []; +}; + // 폭죽 애니메이션 함수 const fireBirthdayConfetti = () => { const duration = 3000; @@ -1227,8 +1245,7 @@ function Schedule() { {(() => { - const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || ''; - const memberList = memberNames.split(',').filter(name => name.trim()); + const memberList = getMemberList(schedule); if (memberList.length === 0) return null; if (memberList.length === 5) { return (