일정 시간 중복 체크 로직 구현하기
기존 등록된 일정과 추가/수정할 시간이 겹치지 않도록 하는 로직을 구현하고자 하였다.
완성모습
구현과정
① 기존 일정의 시간 데이터 가공하기
이전에 시작/종료시간 유효성 적용을 했을때 만든 시간 → 분 변환 함수를 활용하였다.
props로 받은 "12:00:00" 형식의 시간 데이터를 사용하기 쉽게 초 부분을 자르고 분으로 변환하였다.
// 시간을 분으로 변환
const convertTimeToMinutes = (time: string) => {
const [hours, minutes] = time.split(":").map(Number);
return hours * 60 + minutes;
};
// 존재하는 일정의 시간범위 가공
const existTimeRanges = calendarData?.map((event) => ({
start: convertTimeToMinutes(event.start_time.slice(0, -3)),
end: convertTimeToMinutes(event.end_time.slice(0, -3)),
}));
② 시간 중복 체크 로직 만들기
// 선택된 시간이 이미 존재하는지 확인하는 함수
const checkTimeExist = (selectedMinutes: number) => {
for (const timeRange of existTimeRanges!) {
if (selectingType === "start") {
// 시작 시간 선택 시, 기존 일정의 시작 시간과 동일한경우 || 시작과 종료 시간 사이인 경우
if (
selectedMinutes === timeRange.start ||
(selectedMinutes > timeRange.start && selectedMinutes < timeRange.end)
) {
return true;
}
} else {
// 종료 시간 선택 시, 기존 일정의 시작과 종료 시간 사이인 경우
if (
selectedMinutes > timeRange.start &&
selectedMinutes < timeRange.end
) {
return true;
}
}
}
return false;
};
③ 적용 버튼에 중복 체크 조건 추가
if (checkTimeExist(selectedMinutes)) {
alert("등록된 일정 중 겹치는 시간이 있습니다! 확인해주세요!");
return;
}
🚨 발생했던 문제 1
일정 등록 / 일정 수정 기능을 동일한 컴포넌트로 구현을 했는데, 수정 모드일때 테스트를 하면 오류가 조회되었다.
existTimeRanges는 반복 가능하지 않다는 에러 메세지를 보면 가공한 데이터에 문제가 있는 듯 하였고 이 값을 콘솔에 출력해보았다.
- 등록 모드에서 값을 확인했을 때
- 수정 모드에서 값을 확인했을 때
❓ 원인
일정 등록과 수정을 동일한 컴포넌트로 구현하다보니 편집모드의 부모 컴포넌트에서는 calendarData 를 props로 내려주지 않고 있어서 수정모드에서는 데이터 가공자체를 할 수 없는 상태였다.
✅ 해결
수정모드의 부모컴포넌트에서도 calendarData를 props 전달 해주니 더이상 오류가 발생하지 않았다.
🚨 발생한 문제 2
앞의 오류를 해결하고 중복 시간이 잘 체크가 되는지 테스트를 해보다가, 수정모드에서 현재 수정중인 데이터는 비교할 데이터에서 제외해야 한다는.. 걸 발견했다..
로직을 다시 좀 뜯어 고쳐야 되네 .. ? 하아.. 모니터 앞에 12시간 넘게 앉아있었더니 머리가 안돌아간다..
내일 수정해야지..
'TIL' 카테고리의 다른 글
댓글&답글 삭제 유효성 적용하기 (1) | 2024.11.04 |
---|---|
캘린더 일정관리 - 일정 시간 중복 체크 유효성 ② (0) | 2024.11.03 |
캘린더 일정관리 - 시작시간 / 종료시간 유효성 (0) | 2024.10.31 |
모의면접 ② (1) | 2024.10.30 |
Next.js 스크롤 방식의 Time Picker 구현하기(feat. Tailwind CSS) (0) | 2024.10.29 |