Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat] #51 - Add Schedule View 구현 #54

Open
wants to merge 40 commits into
base: develop
Choose a base branch
from
Open

[Feat] #51 - Add Schedule View 구현 #54

wants to merge 40 commits into from

Conversation

rafa-e1
Copy link
Member

@rafa-e1 rafa-e1 commented Jan 18, 2025

🔥 Pull requests

👷 작업한 내용

Add Schedule View 구현

🚨 참고 사항

  • 종료 날짜가 시작 날짜보다 과거를 선택할 수 없도록 하였습니다.
  • PickerButtonViewModel이 굉장히 무거운데 추후에 대공사 필요할 듯 합니다..

📸 스크린샷

구현 내용 SE 13 mini 15 pro
제목 입력 감지, 엔터 버튼
날짜, 시간, 종일
반복 주기
태그

🖥️ 주요 코드 설명

PickerButtonViewModel.swift

  • 날짜 및 시간 선택, 반복 설정, 태그 선택 등 여러 기능을 총 관리하는 뷰 모델입니다.

프로퍼티

@Published private(set) var selection: DateTimeSelection
→ 날짜 및 시간 선탣 관리(startsDate, endsDate, selectedStartTime, selectedEndTime 포함)

@Published var repeatType: RepeatType
→ 선택된 반복 유형 저장(none, daily, weekly 등)

@Published var shouldShowEndRepeat: Bool
→ 반복 종료 날짜 선택 UI의 표시 여부

let pickerType: PickerButtonType
→ 현재 뷰 모델이 어떤 타입인지 구분(.date, .time, .repeat, .tag 등)

Initializer

init(type: PickerButtonType = .date)
  • 기본값은 .date
  • 전달받은 PickerButtonType에 따라 ViewModel의 역할이 달라짐
  • 초기 selection 값을 현재 시간으로 설정
  • 시작 및 종료 시간도 현재 시간으로 초기화

Computed Properties

var startsDate: Date {
    get { selection.startsDate }
    set {
        selection.startsDate = newValue
        validateAndUpdateDates()
    }
}
  • 시작 날짜와 종료 날짜 반환 및 수정
  • 날짜 변경 시, 유효성 검사 진행
var formattedPickerTitle: String {
    switch pickerType {
    case .date:
        return selectedDate.formattedDate(with: "MMM d, yyyy")
    case .endRepeat:
        return isEndRepeatDateSelected
            ? (endRepeatDate ?? selectedDate).formattedDate(with: "MMM d, yyyy")
            : "Select Date"
    case .repeat:
        return repeatType.title
    case .time:
        return selectedDate.formattedDate(with: "h:mm a")
    case .tag:
        return selectedTag.title.isEmpty ? "Untitled" : selectedTag.title
    }
}
  • pickerType에 따라 적절한 제목 반환
override func dismiss() {
    super.dismiss()
    setPressedState(false)

    if pickerType == .endRepeat {
        isEndRepeatDateSelected = true
    }
}
  • 시트 닫고 선택 상태 초기화
  • End Repeat의 경우, 날짜가 선택되었음을 표시
func confirmSelection() {
    if pickerType == .repeat {
        updateRepeatType(repeatType)
    }
    dismiss()
}
  • 선택 확정 후 시트 닫음
  • 반복 유형인 경우, repeatType 업데이트
func updateRepeatType(_ type: RepeatType) {
    if repeatType != type {
        repeatType = type
        shouldShowEndRepeat = type != .none
        if type == .none {
            endRepeatDate = nil
            isEndRepeatDateSelected = false
        }
    }
}
  • 반복 타입 변경 시 반복 종료 날짜 UI 동적으로 조정
  • none 선택 시, 종료 날짜 초기화
private func formatTimeString(_ date: Date) -> String {
    isAllDay ? "All-day" : date.formattedDate(with: "h:mm a")
}
  • All-day 여부에 따라 제목 포맷팅
private func validateAndUpdateDates() {
    if selection.endsDate < selection.startsDate {
        selection.endsDate = selection.startsDate
    }
    if !isAllDay && selection.selectedEndTime < selection.selectedStartTime {
        selection.selectedEndTime = selection.selectedStartTime
    }
}
  • 시작 날짜가 종료 날짜보다 늦지 않도록 검증
  • 시간도 유효성 체크

✅ Check List

  • Merge 대상 브랜치가 올바른가?
  • 최종 코드가 에러 없이 잘 동작하는가?
  • 전체 변경사항이 500줄을 넘지 않는가?

📟 관련 이슈

@rafa-e1 rafa-e1 added Feat Implementing new features 범수 labels Jan 18, 2025
@rafa-e1 rafa-e1 self-assigned this Jan 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feat Implementing new features 범수
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feat] Add Schedule View
1 participant