Skip to content

[REFACTOR] 알람 설정 바텀 시트 리팩토링#241

Merged
DongChyeon merged 16 commits into
developfrom
refactor/#237-alarm-bottomsheet
Jul 28, 2025
Merged

[REFACTOR] 알람 설정 바텀 시트 리팩토링#241
DongChyeon merged 16 commits into
developfrom
refactor/#237-alarm-bottomsheet

Conversation

@DongChyeon
Copy link
Copy Markdown
Member

@DongChyeon DongChyeon commented Jul 28, 2025

Related issue 🛠

closed #237

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

  • 🐞 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 ✏️

  • ModalBottomSheet -> ModalBottomSheetLayout 마이그레이션
  • 알람 설정 화면에서 바텀시트의 완료 버튼을 누를 때만 상태 변경
  • 바텀 시트나 다이얼로그 노출 시 뒤로가기 버튼 누르면 닫기
  • MissionBottomSheet의 단계를 스택으로 관리

Uncompleted Tasks 😅

  • N/A

To Reviewers 📢

Summary by CodeRabbit

  • New Features

    • 하단 시트(Bottom Sheet) 기능이 앱 내 주요 화면(온보딩, 알람 추가/수정 등)에 통합되어, 다양한 설정 및 정보를 보다 직관적으로 관리할 수 있습니다.
  • 개선사항 및 리팩터

    • 알람 및 온보딩 화면에서 하단 시트 상태 관리가 단일 상태로 통합되어, 여러 시트의 전환과 표시가 더욱 부드러워졌습니다.
    • 알람 설정(미션, 스누즈, 사운드) 관련 UI 및 상태 관리가 간소화되어 사용성과 일관성이 향상되었습니다.
    • 온보딩 및 알람 설정 화면의 액션 및 사이드 이펙트가 명확하게 분리되어, 사용자 인터랙션이 더욱 직관적으로 반영됩니다.
    • 스누즈 및 사운드 설정이 인덱스 기반에서 직접 값 기반으로 변경되어 관리가 명확해졌습니다.
    • 하단 시트 관련 컴포넌트들이 단순화되고, 상태 및 콘텐츠 관리가 개선되어 유지보수성이 향상되었습니다.
    • 온보딩 성별 선택 화면과 사용자 정보 하단 시트 등 UI 이벤트 처리 및 내비게이션 흐름이 개선되었습니다.
  • 버그 수정

    • 스누즈 및 사운드 설정의 값이 직접적으로 관리되어, 이전의 인덱스 기반 오류 가능성이 줄어들었습니다.
  • 기타

    • Compose Material 라이브러리 의존성이 추가되었습니다.
    • AndroidManifest에서 일부 속성이 업데이트되었습니다.

@DongChyeon DongChyeon requested a review from MoonsuKang July 28, 2025 07:42
@DongChyeon DongChyeon self-assigned this Jul 28, 2025
@DongChyeon DongChyeon added the ♻️ REFACTOR 코드 리팩토링(전면 수정) label Jul 28, 2025
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 28, 2025

## 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

Objective Addressed Explanation
AlarmSnoozeBottomSheet 내부에서 상태를 관리하도록 구조 변경 (#237)
AlarmAddEditScreen 내 바텀시트 렌더링 방식을 ModalBottomSheetLayout 또는 BottomSheetHost 구조로 통합 (#237)

Assessment against linked issues: Out-of-scope changes

(해당 없음)

Possibly related issues

Possibly related PRs

Suggested labels

💪 동현동현동현동현동현

Suggested reviewers

  • MoonsuKang

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 99908c485e473d7401d576584d94a8635db5ea6f and e9bafd0eaee187ff191f72dbc1dab88c48219885.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetState.kt` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* core/ui/src/main/java/com/yapp/ui/component/bottomsheet/OrbitBottomSheetState.kt

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings
<details>
<summary>🧪 Generate unit tests</summary>

- [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Create PR with unit tests
- [ ] <!-- {"checkboxId": "07f1e7d6-8a8e-4e23-9900-8731c2c87f58", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Post copyable unit tests in a comment
- [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Commit unit tests in branch `refactor/#237-alarm-bottomsheet`

</details>

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=YAPP-Github/Orbit-Android&utm_content=241):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai generate unit tests` to generate unit tests for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between eb4dc28 and 13c4132.

📒 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
Copy link
Copy Markdown

codecov Bot commented Jul 28, 2025

Codecov Report

❌ Patch coverage is 0% with 332 lines in your changes missing coverage. Please review.
✅ Project coverage is 4.27%. Comparing base (cc8cf3c) to head (e9bafd0).
⚠️ Report is 18 commits behind head on develop.

Files with missing lines Patch % Lines
.../com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt 0.00% 119 Missing ⚠️
...m/component/bottomsheet/AlarmMissionBottomSheet.kt 0.00% 54 Missing ⚠️
...rm/component/bottomsheet/AlarmSnoozeBottomSheet.kt 0.00% 49 Missing ⚠️
...arm/component/bottomsheet/AlarmSoundBottomSheet.kt 0.00% 42 Missing ⚠️
...m/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt 0.00% 41 Missing ⚠️
...om/yapp/home/alarm/addedit/AlarmAddEditContract.kt 0.00% 26 Missing ⚠️
...e/home/src/main/java/com/yapp/home/HomeNavGraph.kt 0.00% 1 Missing ⚠️

❌ 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

Impacted file tree graph

@@             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              
Files with missing lines Coverage Δ
...e/home/src/main/java/com/yapp/home/HomeNavGraph.kt 0.00% <0.00%> (ø)
...om/yapp/home/alarm/addedit/AlarmAddEditContract.kt 0.00% <0.00%> (ø)
...m/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt 0.00% <0.00%> (ø)
...arm/component/bottomsheet/AlarmSoundBottomSheet.kt 0.00% <0.00%> (ø)
...rm/component/bottomsheet/AlarmSnoozeBottomSheet.kt 0.00% <0.00%> (ø)
...m/component/bottomsheet/AlarmMissionBottomSheet.kt 0.00% <0.00%> (ø)
.../com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt 0.00% <0.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@DongChyeon DongChyeon merged commit c7c2698 into develop Jul 28, 2025
2 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] 알람 설정 바텀 시트 리팩토링

1 participant