[REFACTOR] 알람 설정 바텀 시트 리팩토링#241
Conversation
## Walkthrough
이 변경사항은 알람 설정 화면의 바텀시트 구조를 대대적으로 리팩토링합니다. AlarmAddEditScreen에서 여러 개의 바텀시트 선언을 통합하여 OrbitBottomSheetState 기반의 단일 진입점으로 변경하고, 각 바텀시트(미션, 스누즈, 사운드) 컴포넌트의 상태 관리 방식을 내부 관리로 전환했습니다. 관련 네비게이션, 액션, 사이드이펙트, 뷰모델 로직도 이에 맞게 수정되었습니다.
## Changes
| Cohort / File(s) | Change Summary |
|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **BottomSheet 통합 및 상태 관리 리팩토링**<br> `core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetLayout.kt`,<br>`core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetState.kt`,<br>`core/ui/src/main/java/com/yapp/ui/component/bottomsheet/BottomSheetContent.kt`,<br>`app/src/main/java/com/yapp/orbit/OrbitNavHost.kt`,<br>`feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt`,<br>`feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt` | OrbitBottomSheetLayout 및 OrbitBottomSheetState 신규 도입, OrbitNavHost/네비게이션 그래프에서 bottomSheetState 전달 및 사용, BottomSheetContent 타입 정의. ModalBottomSheetLayout 기반 단일 진입점 바텀시트 구조로 통합. |
| **AlarmAddEdit 화면 및 바텀시트 리팩토링**<br> `feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt`,<br>`feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt`,<br>`feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditContract.kt`,<br>`feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt`,<br>`feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSnoozeBottomSheet.kt`,<br>`feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSoundBottomSheet.kt` | AlarmAddEditScreen 내 바텀시트 진입점 단일화, 각 바텀시트 컴포넌트의 상태 내부관리로 전환, 액션/사이드이펙트/상태 구조 변경, ViewModel의 관련 처리 메서드 일원화 및 명확화, 이벤트 디스패치 네이밍 정비, UI 및 바텀시트 오픈/클로즈 방식 변경. |
| **온보딩 바텀시트 리팩토링**<br> `feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt`,<br>`feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt`,<br>`feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt`,<br>`feature/onboarding/src/main/java/com/yapp/onboarding/component/UserInfoBottomSheet.kt` | 온보딩 바텀시트 관련 상태/액션/사이드이펙트 구조 변경, 뷰모델에서 바텀시트 상태 직접 관리 대신 사이드이펙트 기반 오픈/클로즈 방식으로 전환, UserInfoBottomSheet 내부 단순화 및 상태 전달 방식 변경. |
| **Gradle 의존성 추가**<br> `app/build.gradle.kts`,<br>`feature/onboarding/build.gradle.kts` | Compose Material 라이브러리 의존성 추가. |
| **AndroidManifest 수정**<br> `app/src/main/AndroidManifest.xml` | `android:enableOnBackInvokedCallback="true"` 속성 추가, `tools:targetApi` 31 → 33으로 변경. |
## Sequence Diagram(s)
```mermaid
sequenceDiagram
participant User
participant AlarmAddEditScreen
participant OrbitBottomSheetState
participant AlarmMissionBottomSheet
participant AlarmSnoozeBottomSheet
participant AlarmSoundBottomSheet
User->>AlarmAddEditScreen: 바텀시트 오픈 트리거(미션/스누즈/사운드)
AlarmAddEditScreen->>OrbitBottomSheetState: show { 바텀시트 Content 람다 }
OrbitBottomSheetState->>AlarmMissionBottomSheet: (미션일 경우) Content 렌더
OrbitBottomSheetState->>AlarmSnoozeBottomSheet: (스누즈일 경우) Content 렌더
OrbitBottomSheetState->>AlarmSoundBottomSheet: (사운드일 경우) Content 렌더
User->>AlarmMissionBottomSheet: 설정 완료
AlarmMissionBottomSheet->>AlarmAddEditScreen: onComplete 콜백
AlarmAddEditScreen->>OrbitBottomSheetState: hide()Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes(해당 없음) Possibly related issues
Possibly related PRs
Suggested labels
Suggested reviewers
|
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetState.kt (1)
35-49: API 설계를 개선할 수 있습니다OrbitBottomSheetState 클래스의 설계는 전반적으로 좋지만, setContent가 public하게 노출되어 있어 외부에서 직접 조작할 수 있습니다. 상태 관리의 일관성을 위해 private 또는 internal로 변경하는 것을 고려해보세요.
class OrbitBottomSheetState( val state: ModalBottomSheetState, val contentState: State<BottomSheetContent?>, - val setContent: (BottomSheetContent?) -> Unit, + private val setContent: (BottomSheetContent?) -> Unit, ) {
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (19)
app/build.gradle.kts(1 hunks)app/src/main/AndroidManifest.xml(1 hunks)app/src/main/java/com/yapp/orbit/OrbitNavHost.kt(2 hunks)core/ui/src/main/java/com/yapp/ui/component/bottomsheet/BottomSheetContent.kt(1 hunks)core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetLayout.kt(3 hunks)core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetState.kt(1 hunks)feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt(2 hunks)feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditContract.kt(4 hunks)feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt(11 hunks)feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt(4 hunks)feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt(3 hunks)feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSnoozeBottomSheet.kt(3 hunks)feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSoundBottomSheet.kt(4 hunks)feature/onboarding/build.gradle.kts(1 hunks)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt(2 hunks)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt(6 hunks)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt(2 hunks)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt(2 hunks)feature/onboarding/src/main/java/com/yapp/onboarding/component/UserInfoBottomSheet.kt(2 hunks)
🧰 Additional context used
🧠 Learnings (10)
📓 Common learnings
Learnt from: DongChyeon
PR: YAPP-Github/Orbit-Android#234
File: feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt:73-76
Timestamp: 2025-07-23T10:29:14.146Z
Learning: AlarmMissionBottomSheet에서 missionType/missionCount 파라미터는 현재 저장된 값을 UI에 표시하기 위해 사용되고, selectedMissionType/selectedMissionCount는 사용자가 변경 중인 내부 작업 상태를 관리하기 위해 사용된다. onDone이나 onSave 콜백을 통해 명시적으로 저장할 때만 변경사항이 반영되는 UX 패턴이다.
feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt (2)
Learnt from: DongChyeon
PR: #234
File: feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt:73-76
Timestamp: 2025-07-23T10:29:14.146Z
Learning: AlarmMissionBottomSheet에서 missionType/missionCount 파라미터는 현재 저장된 값을 UI에 표시하기 위해 사용되고, selectedMissionType/selectedMissionCount는 사용자가 변경 중인 내부 작업 상태를 관리하기 위해 사용된다. onDone이나 onSave 콜백을 통해 명시적으로 저장할 때만 변경사항이 반영되는 UX 패턴이다.
Learnt from: DongChyeon
PR: #238
File: feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt:118-120
Timestamp: 2025-07-27T15:20:35.256Z
Learning: MissionRoute와 MissionScreen이 같은 파일(feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt)에 있을 때, MissionRoute에서 BackHandler를 사용하면 파일 레벨의 import 문은 유지되어야 함.
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt (1)
Learnt from: DongChyeon
PR: #234
File: feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt:73-76
Timestamp: 2025-07-23T10:29:14.146Z
Learning: AlarmMissionBottomSheet에서 missionType/missionCount 파라미터는 현재 저장된 값을 UI에 표시하기 위해 사용되고, selectedMissionType/selectedMissionCount는 사용자가 변경 중인 내부 작업 상태를 관리하기 위해 사용된다. onDone이나 onSave 콜백을 통해 명시적으로 저장할 때만 변경사항이 반영되는 UX 패턴이다.
app/src/main/java/com/yapp/orbit/OrbitNavHost.kt (1)
Learnt from: DongChyeon
PR: #238
File: feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt:118-120
Timestamp: 2025-07-27T15:20:35.256Z
Learning: MissionRoute와 MissionScreen이 같은 파일(feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt)에 있을 때, MissionRoute에서 BackHandler를 사용하면 파일 레벨의 import 문은 유지되어야 함.
feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSnoozeBottomSheet.kt (1)
Learnt from: DongChyeon
PR: #234
File: feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt:73-76
Timestamp: 2025-07-23T10:29:14.146Z
Learning: AlarmMissionBottomSheet에서 missionType/missionCount 파라미터는 현재 저장된 값을 UI에 표시하기 위해 사용되고, selectedMissionType/selectedMissionCount는 사용자가 변경 중인 내부 작업 상태를 관리하기 위해 사용된다. onDone이나 onSave 콜백을 통해 명시적으로 저장할 때만 변경사항이 반영되는 UX 패턴이다.
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt (1)
Learnt from: DongChyeon
PR: #238
File: feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt:118-120
Timestamp: 2025-07-27T15:20:35.256Z
Learning: MissionRoute와 MissionScreen이 같은 파일(feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt)에 있을 때, MissionRoute에서 BackHandler를 사용하면 파일 레벨의 import 문은 유지되어야 함.
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt (2)
Learnt from: DongChyeon
PR: #234
File: feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt:73-76
Timestamp: 2025-07-23T10:29:14.146Z
Learning: AlarmMissionBottomSheet에서 missionType/missionCount 파라미터는 현재 저장된 값을 UI에 표시하기 위해 사용되고, selectedMissionType/selectedMissionCount는 사용자가 변경 중인 내부 작업 상태를 관리하기 위해 사용된다. onDone이나 onSave 콜백을 통해 명시적으로 저장할 때만 변경사항이 반영되는 UX 패턴이다.
Learnt from: DongChyeon
PR: #238
File: feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt:118-120
Timestamp: 2025-07-27T15:20:35.256Z
Learning: MissionRoute와 MissionScreen이 같은 파일(feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt)에 있을 때, MissionRoute에서 BackHandler를 사용하면 파일 레벨의 import 문은 유지되어야 함.
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt (1)
Learnt from: DongChyeon
PR: #238
File: feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt:118-120
Timestamp: 2025-07-27T15:20:35.256Z
Learning: MissionRoute와 MissionScreen이 같은 파일(feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt)에 있을 때, MissionRoute에서 BackHandler를 사용하면 파일 레벨의 import 문은 유지되어야 함.
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditContract.kt (1)
Learnt from: DongChyeon
PR: #234
File: feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt:73-76
Timestamp: 2025-07-23T10:29:14.146Z
Learning: AlarmMissionBottomSheet에서 missionType/missionCount 파라미터는 현재 저장된 값을 UI에 표시하기 위해 사용되고, selectedMissionType/selectedMissionCount는 사용자가 변경 중인 내부 작업 상태를 관리하기 위해 사용된다. onDone이나 onSave 콜백을 통해 명시적으로 저장할 때만 변경사항이 반영되는 UX 패턴이다.
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt (1)
Learnt from: DongChyeon
PR: #234
File: feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt:73-76
Timestamp: 2025-07-23T10:29:14.146Z
Learning: AlarmMissionBottomSheet에서 missionType/missionCount 파라미터는 현재 저장된 값을 UI에 표시하기 위해 사용되고, selectedMissionType/selectedMissionCount는 사용자가 변경 중인 내부 작업 상태를 관리하기 위해 사용된다. onDone이나 onSave 콜백을 통해 명시적으로 저장할 때만 변경사항이 반영되는 UX 패턴이다.
🧬 Code Graph Analysis (3)
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt (1)
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt (2)
showBottomSheet(525-527)hideBottomSheet(529-531)
feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSoundBottomSheet.kt (1)
feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSnoozeBottomSheet.kt (1)
VibrationSection(122-142)
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt (2)
core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt (1)
navigateToMissionPreview(61-74)feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt (2)
showBottomSheet(228-230)hideBottomSheet(232-234)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (51)
app/build.gradle.kts (1)
51-51: 의존성 추가가 적절합니다새로운 OrbitBottomSheetState에서 사용하는 ModalBottomSheetState를 위해 필요한 의존성입니다. 버전 카탈로그를 통한 중앙화된 의존성 관리가 잘 적용되었습니다.
core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetState.kt (1)
11-33: 바텀시트 상태 관리 중앙화가 잘 구현되었습니다rememberOrbitBottomSheetState 함수가 적절하게 구현되었습니다. confirmValueChange에서 Hidden 상태일 때 content를 자동으로 정리하는 로직이 메모리 누수를 방지합니다.
feature/onboarding/build.gradle.kts (1)
20-20: 온보딩 모듈의 의존성 추가가 적절합니다온보딩 기능에서 OrbitBottomSheetState를 사용하기 위해 필요한 Compose Material 의존성이 추가되었습니다. 앱 모듈과 일관된 패턴을 따르고 있습니다.
app/src/main/AndroidManifest.xml (1)
25-27: 최신 뒤로가기 처리 지원이 적절합니다Android 13+의 새로운 뒤로가기 콜백 시스템을 활성화하고 targetApi를 33으로 업데이트한 것이 적절합니다. 이는 PR 목적에서 언급한 "뒤로가기 버튼으로 바텀시트 닫기" 기능 구현을 지원합니다.
core/ui/src/main/java/com/yapp/ui/component/bottomsheet/BottomSheetContent.kt (1)
6-6: 타입 별칭 정의가 적절합니다BottomSheetContent 타입 별칭이 바텀시트 컨텐츠의 타입 안정성을 제공하고 코드 가독성을 향상시킵니다. BoxScope를 수신자로 하여 레이아웃 제약을 명확하게 표현한 것이 좋습니다.
feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt (3)
11-11: 새로운 바텀시트 상태 관리 시스템 도입 확인OrbitBottomSheetState import가 추가되어 통합된 바텀시트 상태 관리가 가능해졌습니다.
19-19: 바텀시트 상태 파라미터 추가 확인homeNavGraph 함수에 bottomSheetState 파라미터가 추가되어 네비게이션 레벨에서 바텀시트 상태를 관리할 수 있게 되었습니다.
35-35: AlarmAddEditRoute에 바텀시트 상태 전달 확인bottomSheetState가 AlarmAddEditRoute에 올바르게 전달되어 알람 편집 화면에서 통합된 바텀시트 관리가 가능해졌습니다.
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt (2)
56-57: 명시적 바텀시트 액션으로 개선기존의 toggle 방식에서 ShowBottomSheet, HideBottomSheet로 명시적인 액션으로 변경되어 상태 관리가 더욱 명확해졌습니다.
74-76: 사이드이펙트 기반 바텀시트 제어 도입ShowBottomSheet, HideBottomSheet 사이드이펙트가 추가되어 뷰모델에서 UI 상태를 직접 조작하지 않고 사이드이펙트를 통해 바텀시트를 제어할 수 있게 되었습니다.
app/src/main/java/com/yapp/orbit/OrbitNavHost.kt (4)
28-30: 바텀시트 관리 컴포넌트 import 추가OrbitBottomSheetLayout과 관련 상태 관리 컴포넌트들이 적절히 import되었습니다.
40-40: 루트 레벨 바텀시트 상태 관리 도입OrbitNavHost에 bottomSheetState 파라미터가 추가되어 앱 전체의 바텀시트 상태를 중앙에서 관리할 수 있게 되었습니다. 기본값으로 rememberOrbitBottomSheetState()를 사용하는 것도 적절합니다.
44-46: OrbitBottomSheetLayout으로 통합 바텀시트 관리기존 Scaffold를 OrbitBottomSheetLayout으로 래핑하여 앱 전체의 바텀시트를 통합 관리할 수 있는 구조로 변경되었습니다.
64-68: 네비게이션 그래프에 바텀시트 상태 전달onboardingNavGraph와 homeNavGraph에 bottomSheetState가 적절히 전달되어 각 기능에서 통합된 바텀시트 관리를 사용할 수 있게 되었습니다.
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt (2)
60-61: 바텀시트 액션 처리 추가ShowBottomSheet, HideBottomSheet 액션이 적절히 처리되어 명시적인 바텀시트 제어가 가능해졌습니다.
228-234: 사이드이펙트 기반 바텀시트 제어 메서드 구현showBottomSheet()와 hideBottomSheet() 메서드가 사이드이펙트를 통해 바텀시트를 제어하도록 구현되었습니다. 이는 AlarmAddEditViewModel과 일관된 패턴을 따르고 있어 코드 일관성이 좋습니다.
feature/onboarding/src/main/java/com/yapp/onboarding/component/UserInfoBottomSheet.kt (5)
30-31: 콜백 파라미터 이름 단순화onDismissRequest, onConfirmRequest에서 onDismiss, onConfirm으로 콜백 이름이 단순화되어 더욱 명확해졌습니다.
33-91: 바텀시트 래퍼 제거로 컴포넌트 단순화OrbitBottomSheet 래퍼가 제거되고 순수한 컨텐츠만 렌더링하도록 변경되었습니다. 이는 OrbitBottomSheetState를 통한 중앙 집중식 바텀시트 관리 방식과 일치하는 좋은 변경사항입니다.
71-71: 버튼 클릭 핸들러 업데이트변경된 콜백 이름 onDismiss가 버튼 핸들러에 올바르게 적용되었습니다.
83-83: 확인 버튼 핸들러 업데이트변경된 콜백 이름 onConfirm이 확인 버튼 핸들러에 올바르게 적용되었습니다.
128-129: 프리뷰 함수 업데이트프리뷰 함수에서도 변경된 콜백 파라미터 이름이 올바르게 반영되었습니다.
feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt (4)
62-69: API 단순화가 잘 이루어졌습니다.여러 개의 개별 파라미터들을
AlarmAddEditContract.AlarmMissionState하나로 통합하여 컴포넌트의 API가 훨씬 깔끔해졌습니다. 내부 상태 관리도 기존 학습 내용과 일치하게 현재 저장된 값(missionState)과 사용자가 변경 중인 값(selected*)을 분리하여 관리하고 있습니다.
67-82: 스택 기반 네비게이션 구현이 우수합니다.
stepStack을 사용한 네비게이션 구현이 깔끔하고 직관적입니다.pop()함수에서 스택 크기가 1보다 클 때만 제거하는 경계 검사가 적절히 구현되어 있어 빈 스택 상태를 방지합니다.
83-139: 네비게이션 플로우와 상태 관리가 일관성 있게 구현되었습니다.각 단계별로 적절한 컴포넌트를 렌더링하고, 네비게이션 콜백에서
push()/pop()함수를 올바르게 사용하고 있습니다. 특히 미션이 설정되지 않은 경우(MissionType.NONE)에 대한 처리도 잘 되어 있습니다.
632-638: 프리뷰 함수가 새로운 API에 맞게 적절히 업데이트되었습니다.새로운 통합된 상태 객체를 사용하도록 프리뷰가 올바르게 수정되었습니다.
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt (3)
15-18: 네비게이션 그래프에 바텀시트 상태 통합이 적절히 이루어졌습니다.
OrbitBottomSheetState파라미터를 추가하여 전체 앱의 바텀시트 관리 시스템과 일관성을 유지하고 있습니다.
108-112: 사이드 이펙트 처리 함수의 추상화가 우수합니다.
processAction람다 파라미터를 통해 액션 처리를 추상화한 것이 좋은 설계입니다. 이를 통해 함수가 특정 ViewModel 타입에 의존하지 않고 더 재사용 가능해졌습니다.
70-74: Gender 목적지의 리팩토링이 일관성 있게 적용되었습니다.다른 목적지들과 달리
OnboardingGenderRoute에 직접navigator,bottomSheetState,viewModel을 전달하는 방식이 중앙집중식 바텀시트 상태 관리 패턴과 일치합니다.feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSoundBottomSheet.kt (3)
41-53: 파라미터 통합과 내부 상태 관리가 적절히 구현되었습니다.여러 개별 파라미터를
AlarmAddEditContract.AlarmSoundState로 통합하고, 내부에서remember를 사용해 상태를 관리하는 방식이 다른 바텀시트 컴포넌트들과 일관성을 유지합니다.soundState에서 초기값을 설정하는 것도 올바른 패턴입니다.
62-93: 콜백 패턴이 잘 구현되었습니다.각 상호작용에서 로컬 상태를 먼저 업데이트한 후 해당 콜백을 호출하는 방식이 부모 컴포넌트가 변경사항에 즉시 반응할 수 있게 해줍니다. 이는 UX 측면에서 즉각적인 피드백을 제공하는 좋은 패턴입니다.
102-110: 완료 버튼의 동작 순서가 올바릅니다.
onDismiss()를 먼저 호출한 후onComplete를 호출하는 순서가 적절합니다. 이를 통해 바텀시트가 먼저 닫힌 후 완료 콜백이 실행되어 상태 충돌을 방지할 수 있습니다.core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetLayout.kt (2)
33-59: 핵심 바텀시트 컴포넌트의 리팩토링이 우수합니다.
OrbitBottomSheetState를 사용하여 API를 단순화하고, 상태 관리를 중앙집중화한 것이 훌륭합니다.sheetState.content?.invoke(this)패턴을 통해 동적 콘텐츠 관리가 깔끔하게 구현되었습니다.
128-163: 프리뷰 함수가 새로운 API를 잘 보여줍니다.
sheetState.show { }패턴을 통해 새로운 API 사용법을 명확히 보여주고 있습니다. 프리뷰가 리팩토링된 컴포넌트의 사용 방법을 잘 설명하고 있습니다.feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmSnoozeBottomSheet.kt (3)
35-63: 스누즈 바텀시트 리팩토링이 일관성 있게 구현되었습니다.
AlarmAddEditContract.AlarmSnoozeState로 파라미터를 통합하고, 내부에서 상태를 관리하는 방식이 다른 바텀시트들과 동일한 패턴을 따릅니다. 무한 반복(-1) 케이스에 대한 특별 처리도 적절합니다.
39-51: 하드코딩된 옵션 배열이 적절합니다.스누즈 간격과 횟수에 대한 하드코딩된 옵션들이 합리적인 값들로 구성되어 있습니다. 무한 반복을 -1로 표현하는 것도 일반적인 패턴입니다.
197-206: 프리뷰가 새로운 API에 맞게 적절히 업데이트되었습니다.새로운
AlarmSnoozeState를 사용하고 단순화된 콜백 시그니처를 보여주어 API 변경사항을 잘 반영하고 있습니다.feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt (4)
64-65: 좋은 리팩토링입니다!OrbitBottomSheetState를 사용하여 바텀시트 상태 관리를 통합한 것이 훌륭합니다. 이는 전체 앱에서 일관된 바텀시트 관리 패턴을 제공합니다.
88-211: 사이드 이펙트 처리가 잘 구조화되었습니다!바텀시트 표시/숨김 로직을 사이드 이펙트로 통합하여 관심사 분리가 명확해졌습니다. 각 바텀시트 타입별로 적절한 상태와 콜백이 전달되고 있습니다.
277-283: 백버튼 처리 로직이 개선되었습니다!바텀시트가 열려있을 때 먼저 닫도록 처리하는 것이 좋은 UX 패턴입니다. 우선순위가 명확하게 설정되어 있습니다.
505-521: 스누즈 설정 표시 로직이 개선되었습니다!인덱스 기반 접근 방식을 직접 값 사용 방식으로 변경하여 코드가 더 명확하고 유지보수하기 쉬워졌습니다. 무한 반복 케이스(-1)도 적절히 처리됩니다.
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditContract.kt (3)
54-55: 상태 관리가 단순화되었습니다!인덱스 기반 스누즈 설정을 직접 정수 값으로 변경한 것이 좋습니다. 이로 인해 상태 관리가 더 직관적이고 오류 가능성이 줄어듭니다.
84-103: 액션 구조가 명확하게 개선되었습니다!토글 기반 액션을 명시적인 저장 액션으로 변경하고, 바텀시트 표시/숨김을 별도 액션으로 분리한 것이 훌륭합니다. 각 액션의 목적이 명확해졌습니다.
119-124: 사이드 이펙트가 적절히 추가되었습니다!바텀시트 관련 사이드 이펙트를 별도로 정의하여 UI 상호작용과 비즈니스 로직의 분리가 명확해졌습니다.
feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt (3)
81-134: 사이드 이펙트 처리가 잘 중앙화되었습니다!handleSideEffect 함수를 통해 모든 사이드 이펙트를 일관되게 처리하는 패턴이 좋습니다. 네비게이션과 바텀시트 관리가 명확하게 분리되었습니다.
146-154: 백버튼 처리 우선순위가 잘 설정되었습니다!다이얼로그 → 바텀시트 → 이전 단계 순으로 처리하는 것이 직관적인 UX를 제공합니다.
188-206: 성별 선택 UI가 확장 가능하게 개선되었습니다!리스트 반복을 사용하여 성별 옵션을 렌더링하는 방식으로 변경한 것이 좋습니다. 향후 옵션 추가가 용이해졌습니다.
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt (5)
152-153: 스누즈 상태 설정이 단순화되었습니다!직접 값을 사용하여 스누즈 상태를 설정하는 방식이 명확하고 간단합니다.
177-195: 액션 처리가 명확하게 구조화되었습니다!각 액션에 대한 전용 핸들러 메서드를 사용하여 코드 가독성과 유지보수성이 향상되었습니다.
459-501: 설정 저장 메서드들이 잘 구현되었습니다!각 설정을 원자적으로 저장하는 방식이 좋습니다. 상태 일관성이 보장됩니다.
503-523: UI 피드백이 적절히 통합되었습니다!진동 토글 시 햅틱 피드백, 사운드 비활성화 시 재생 중지 등 사용자 경험을 고려한 구현이 훌륭합니다.
525-531: 바텀시트 관리가 일관되게 구현되었습니다!사이드 이펙트를 통한 바텀시트 표시/숨김 처리가 깔끔합니다. 온보딩 모듈과 동일한 패턴을 사용하여 일관성이 유지됩니다.
Codecov Report❌ Patch coverage is ❌ Your project status has failed because the head coverage (4.27%) is below the target coverage (60.00%). You can increase the head coverage or adjust the target coverage. Additional details and impacted files@@ Coverage Diff @@
## develop #241 +/- ##
============================================
+ Coverage 4.21% 4.27% +0.05%
Complexity 53 53
============================================
Files 50 50
Lines 4480 4421 -59
Branches 660 647 -13
============================================
Hits 189 189
+ Misses 4281 4222 -59
Partials 10 10
🚀 New features to boost your workflow:
|
Related issue 🛠
closed #237
어떤 변경사항이 있었나요?
CheckPoint ✅
PR이 다음 요구 사항을 충족하는지 확인하세요.
Work Description ✏️
Uncompleted Tasks 😅
To Reviewers 📢
Summary by CodeRabbit
New Features
개선사항 및 리팩터
버그 수정
기타