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

[UI/YAF-74] 알람 설정 시 알람 미루기를 설정할 수 있다 #46

Merged
merged 10 commits into from
Jan 19, 2025

Conversation

DongChyeon
Copy link
Member

Related issue 🛠

closed #45

어떤 변경사항이 있었나요?

  • 🐞 BugFix Something isn't working
  • 🎨 Design Markup & styling
  • 📃 Docs Documentation writing and editing (README.md, etc.)
  • ✨ Feature Feature
  • 🔨 Refactor Code refactoring
  • ⚙️ Setting Development environment setup
  • ✅ Test Test related (Junit, etc.)

CheckPoint ✅

PR이 다음 요구 사항을 충족하는지 확인하세요.

  • PR 컨벤션에 맞게 작성했습니다. (필수)
  • merge할 브랜치의 위치를 확인해 주세요(main❌/develop⭕) (필수)
  • Approve된 PR은 assigner가 머지하고, 수정 요청이 온 경우 수정 후 다시 push를 합니다. (필수)
  • BugFix의 경우, 버그의 원인을 파악하였습니다. (선택)

Work Description ✏️

default.mp4
  • 선택된 날짜가 없다면 공휴일 알람 끄기 스위치 비활성화
  • 알람 남은 시간 디바운싱 없이 실시간 반영
  • 알람 미루기 설정 바텀 시트 연동

Uncompleted Tasks 😅

  • N/A

To Reviewers 📢

data class State(
    val timeState: AlarmTimeState = AlarmTimeState(),
    val daySelectionState: AlarmDaySelectionState = AlarmDaySelectionState(),
    val holidayState: AlarmHolidayState = AlarmHolidayState(),
    val snoozeState: AlarmSnoozeState = AlarmSnoozeState(),
) : UiState

data class AlarmTimeState(
    val currentAmPm: String = "오전",
    val currentHour: Int = 1,
    val currentMinute: Int = 0,
    val alarmMessage: String = "",
)

data class AlarmDaySelectionState(
    val days: Set<AlarmDay> = enumValues<AlarmDay>().toSet(),
    val isWeekdaysChecked: Boolean = false,
    val isWeekendsChecked: Boolean = false,
    val selectedDays: Set<AlarmDay> = setOf(),
)

data class AlarmHolidayState(
    val isDisableHolidayEnabled: Boolean = false,
    val isDisableHolidayChecked: Boolean = false,
)

data class AlarmSnoozeState(
    val isSnoozeEnabled: Boolean = true,
    val snoozeIntervalIndex: Int = 2,
    val snoozeCountIndex: Int = 1,
    val isBottomSheetOpen: Boolean = false,
    val snoozeIntervals: List<String> = listOf("1분", "3분", "5분", "10분", "15분"),
    val snoozeCounts: List<String> = listOf("1회", "3회", "5회", "10회", "무한"),
)

화면에 표시할 정보가 너무 많아서 컴포넌트 단위로 상태 정의해서 관리하는데
나중에 다른 화면에도 써먹을 수 있을 것 같아요

이거보다 더 좋은 방식 있을 것 같음 코멘트 달아주세용

@DongChyeon DongChyeon added 📱 UI 사용자 인터페이스 관련 작업 💪 동현동현동현동현동현 labels Jan 19, 2025
@DongChyeon DongChyeon self-assigned this Jan 19, 2025
Copy link
Member

@MoonsuKang MoonsuKang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다.
컴포넌트 단위로 State처리한거에 대한 생각:
지금은 기능단위로 처리된걸 Context 단위로도 분리할 수 있을 것 같다?
예를 들어서 알람 화면 전체에 관련된 상태를 하나의 AlarmState로 통합하고,
필요시 하위 컴포넌트에서 일부 상태를 가져다 쓰는 방식으로 설계할 수도 있을 것 같습니다.

is AlarmAddEditContract.Action.ToggleWeekendsChecked -> toggleWeekendsChecked()
is AlarmAddEditContract.Action.ToggleDaySelection -> toggleDaySelection(action.day)
is AlarmAddEditContract.Action.ToggleDisableHolidayChecked -> toggleDisableHolidayChecked()
viewModelScope.launch {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p5
로컬 디비에 담아야되서 viewmodelscope.launch 넣으신 거죠??

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의도한 것은 아닌데 Copilot 쓰다가 저렇게 됐네요....
나중에 DB 연동 작업 시에 알맞게 수정할게요

import javax.inject.Inject

@HiltViewModel
class AlarmAddEditViewModel @Inject constructor() : BaseViewModel<AlarmAddEditContract.State, AlarmAddEditContract.SideEffect>(
initialState = AlarmAddEditContract.State(),
) {
private var debounceJob: Job? = null // 디바운싱을 위한 Job
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p4
Job을 사용하신 이유가 궁금합니다이
mutableStateFlow로 하면 아마 스트림 연산으로 dobounce를 처리할 수 있을거 같아서

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요거 디바운싱 처리했다가 알라미에서는 디바운싱 안했길래 제거했어요

}
}

private fun updateAlarmMessage() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3
시간계산 쪽은 뭔가 domain layer에서 처리해야될 것 같은 아이들이 있는거 같아요.
아니면 유틸함수로 빼도 될듯?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

시간 계산이 위에 n시간 n분 남았습니다 를 말씀하시는건가요?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

분리 하자면

        // 남은 시간 계산
        val duration = java.time.Duration.between(now, nextAlarmDateTime)
        val totalMinutes = duration.toMinutes()
        val days = totalMinutes / (24 * 60)
        val hours = (totalMinutes % (24 * 60)) / 60
        val minutes = totalMinutes % 60

        // 출력 문구 생성
        val newMessage = when {
            days > 0 -> "${days}${hours}시간 후에 울려요"
            hours > 0 -> "${hours}시간 ${minutes}분 후에 울려요"
            else -> "${minutes}분 후에 울려요"
        }

this area.
사용하는지는 잘 모르지만 유틸이나 도메인으로 분리하면 다른 뷰에서도 참조 가능하고 우리가 나중에 테스트 코드를 짜게 된다면..? 더 이점이 있을듯 ㅋㅋㅋ

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이부분은 재사용하는 로직이 아니라서 따로 domain으로 안 빼둘게요

Comment on lines 140 to 148
private fun convertTo24HourFormat(amPm: String, hour: Int): Int {
return if (amPm == "오후" && hour != 12) {
hour + 12
} else if (amPm == "오전" && hour == 12) {
0
} else {
hour
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3

private fun convertTo24HourFormat(amPm: String, hour: Int): Int = when {
    amPm == "오후" && hour != 12 -> hour + 12
    amPm == "오전" && hour == 12 -> 0
    else -> hour
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반영했습니다!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p5
어우 👍👍👍

Copy link
Member

@MoonsuKang MoonsuKang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

호우

}
}

private fun updateAlarmMessage() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

분리 하자면

        // 남은 시간 계산
        val duration = java.time.Duration.between(now, nextAlarmDateTime)
        val totalMinutes = duration.toMinutes()
        val days = totalMinutes / (24 * 60)
        val hours = (totalMinutes % (24 * 60)) / 60
        val minutes = totalMinutes % 60

        // 출력 문구 생성
        val newMessage = when {
            days > 0 -> "${days}${hours}시간 후에 울려요"
            hours > 0 -> "${hours}시간 ${minutes}분 후에 울려요"
            else -> "${minutes}분 후에 울려요"
        }

this area.
사용하는지는 잘 모르지만 유틸이나 도메인으로 분리하면 다른 뷰에서도 참조 가능하고 우리가 나중에 테스트 코드를 짜게 된다면..? 더 이점이 있을듯 ㅋㅋㅋ

@DongChyeon DongChyeon merged commit 0bfc6c8 into develop Jan 19, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💪 동현동현동현동현동현 📱 UI 사용자 인터페이스 관련 작업
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[UI] 알람 설정 시 알람 미루기를 설정할 수 있다
2 participants