Skip to content

[FEAT] 미션 수행 화면 리팩토링 및 미션 미리보기 화면 구현#236

Closed
DongChyeon wants to merge 6 commits into
developfrom
feat/235-mission-preview
Closed

[FEAT] 미션 수행 화면 리팩토링 및 미션 미리보기 화면 구현#236
DongChyeon wants to merge 6 commits into
developfrom
feat/235-mission-preview

Conversation

@DongChyeon
Copy link
Copy Markdown
Member

@DongChyeon DongChyeon commented Jul 27, 2025

Related issue 🛠

closed #235

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

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

2025-07-23.9.49.45.mov
  • 기존에 미션 수행 화면에서 탭, 흔들기 미션 로직이 분리되어있던 것을 통합했습니다.
  • 미션 설정 바텀시트에서 미션 미리보기 화면으로 이동할 수 있도록 처리했습니다.
  • 미션 화면의 하드코딩된 문자열을 문자열 리소스로 교체했습니다.

Uncompleted Tasks 😅

  • N/A

To Reviewers 📢

Summary by CodeRabbit

  • 신규 기능

    • 미션 미리보기 화면으로 이동하는 기능이 추가되었습니다.
    • 미션 화면에서 미리보기 모드와 실제 모드 구분이 가능해졌으며, 미리보기 모드에서는 전용 종료 버튼과 내비게이션 처리가 제공됩니다.
  • 개선 및 변경

    • 미션 관련 UI 텍스트가 국제화되어 다양한 상황에 맞는 안내 문구가 적용되었습니다.
    • 미션 진행 방식이 통합되어, 미션 타입(흔들기/탭)에 따라 일관된 동작을 제공합니다.
    • 미션 미리보기 진입 시 미션 타입과 횟수 정보를 함께 전달하도록 콜백 및 내비게이션 파라미터가 개선되었습니다.
    • 미션 내비게이션 및 상태 관리가 미션 모드에 맞게 업데이트되었습니다.
  • 버그 수정

    • 미션 완료, 종료, 오류 등 다양한 상황에서 안내 문구가 명확하게 표시됩니다.
  • 문서 및 리소스

    • 미션 관련 UI에 필요한 한글 문자열 리소스가 추가되었습니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 27, 2025

Walkthrough

미션 미리보기 기능이 추가되고, 미션 수행 화면과 관련 ViewModel이 리팩토링되었습니다. 미션 관련 네비게이션 경로가 파라미터화되었으며, 미션 모드(REAL/PREVIEW) 개념이 도입되어 UI 및 동작이 이에 따라 분기됩니다. 문자열 리소스도 추가 및 국제화되었습니다.

Changes

파일/경로 요약 변경 내용 요약
core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt
core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt
미션 미리보기 네비게이션 함수 추가, MissionRoute를 데이터 클래스(파라미터 포함)로 변경
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditContract.kt
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt
feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt
미션 미리보기 액션/사이드이펙트 추가 및 처리, 미리보기 파라미터 전달 방식 변경
feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt 미리보기 콜백 시그니처를 (MissionType, Int)로 통일, 내부 콜백 구조 단순화
feature/mission/src/main/java/com/yapp/mission/MissionContract.kt State에 missionMode 속성 추가, Action에 NavigateBack 추가
feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt MissionRoute 네비게이션 파라미터 명시적 전달, popUpTo 대상 수정
feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt MissionRoute에 navigator 파라미터 추가, 미션 모드별 UI/백핸들러 분기, 미리보기 종료 버튼 및 국제화 적용
feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt MissionMode enum 신설, savedStateHandle 공개, 미션 모드/타입/카운트 파싱 및 상태 반영, 미션 진행 로직 통합/리팩토링, NavigateBack 처리
feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt FlipCard에서 eventDispatcher 파라미터 제거
feature/mission/src/main/res/values/strings.xml 미션 관련 UI 문자열 리소스 14개 추가 및 한글화
core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt 알람 인텐트 생성 로직에서 조건문 제거, 항상 미션 네비게이션 인텐트 생성
domain/src/main/java/com/yapp/domain/MissionMode.kt MissionMode enum 클래스 추가 (REAL, PREVIEW), 문자열 변환 함수 포함

Sequence Diagram(s)

sequenceDiagram
    participant HomeScreen
    participant AlarmAddEditViewModel
    participant OrbitNavigator
    participant MissionScreen
    participant MissionViewModel

    HomeScreen->>AlarmAddEditViewModel: NavigateToMissionPreview(missionType, missionCount)
    AlarmAddEditViewModel->>HomeScreen: SideEffect.NavigateToMissionPreview(missionType, missionCount)
    HomeScreen->>OrbitNavigator: navigateToMissionPreview(missionType, missionCount)
    OrbitNavigator->>MissionScreen: MissionRoute(missionType, missionCount, missionMode=PREVIEW)
    MissionScreen->>MissionViewModel: loadMissionInfo(missionType, missionCount, missionMode=PREVIEW)
    MissionScreen-->>HomeScreen: (미리보기 종료 시 back navigation)
Loading
sequenceDiagram
    participant MissionScreen
    participant MissionViewModel

    MissionScreen->>MissionViewModel: User action (Shake/Tap)
    MissionViewModel->>MissionScreen: State 업데이트 (진행도, 애니메이션 등)
    alt missionMode == PREVIEW
        MissionScreen->>OrbitNavigator: 미리보기 종료(back)
    else missionMode == REAL
        MissionScreen->>MissionViewModel: 미션 완료 시 Fortune 화면 이동
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Possibly related PRs

Suggested reviewers

  • MoonsuKang

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 09b4762 and a214096.

📒 Files selected for processing (1)
  • feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt
⏰ 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
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/235-mission-preview

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • 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 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 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 for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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

🔭 Outside diff range comments (1)
feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt (1)

27-201: 테스트 코드 미작성 확인 – MissionViewModel 테스트 추가 필요

MissionViewModel을 검증하는 단위/통합 테스트 파일이 리포지토리에 존재하지 않습니다. 다음 항목에 대해 테스트 코드를 작성해주세요:

  • MissionMode.fromRaw(…) 정상/예외 케이스
  • handleMissionProgress 로직: 카운트 증가, 마지막 과제 완료 시 애니메이션 및 딜레이 처리
  • completeMission 분기: REAL 모드(postFortune 호출) vs PREVIEW 모드(뒤로가기) 동작
  • 기타 핵심 액션(processAction)이 State 및 SideEffect에 미치는 영향 확인

테스트 패키지 경로 예시:
feature/mission/src/test/kotlin/com/yapp/mission/MissionViewModelTest.kt

🧹 Nitpick comments (4)
core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt (1)

61-74: 미션 미리보기 네비게이션 함수가 잘 구현되었지만 개선 여지가 있습니다.

함수 구현은 전반적으로 좋으나, "PREVIEW" 문자열이 하드코딩되어 있습니다. MissionMode enum의 상수를 사용하는 것이 더 안전할 것 같습니다.

다음과 같이 개선할 수 있습니다:

 fun navigateToMissionPreview(
     missionType: Int,
     missionCount: Int,
     navOptions: NavOptions? = null,
 ) {
     navController.navigate(
         MissionRoute(
             missionType = "$missionType",
             missionCount = "$missionCount",
-            missionMode = "PREVIEW",
+            missionMode = MissionMode.PREVIEW.name,
         ),
         navOptions,
     )
 }
core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt (1)

6-14: MissionRoute 매개변수화가 잘 구현되었습니다.

data object에서 data class로의 변경이 적절하며, 미션 매개변수를 전달할 수 있게 되었습니다. 기본값 설정으로 기존 코드와의 호환성도 유지됩니다.

문자열 상수 대신 enum을 사용하면 타입 안전성을 높일 수 있습니다:

enum class MissionMode {
    REAL, PREVIEW
}

data class MissionRoute(
    val missionType: String,
    val missionCount: String,
    val missionMode: String = MissionMode.REAL.name,
)
feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt (2)

32-40: fromRaw 메소드를 더 간결하게 리팩토링할 수 있습니다

현재 구현도 동작하지만, Kotlin의 entries 속성을 활용하면 더 간결하게 작성할 수 있습니다.

    companion object {
        fun fromRaw(raw: String?): MissionMode {
-            return try {
-                valueOf(raw ?: "REAL")
-            } catch (_: IllegalArgumentException) {
-                REAL
-            }
+            return raw?.let { entries.find { it.name == raw } } ?: REAL
        }
    }

50-50: savedStateHandle의 접근 제한자를 private으로 유지하는 것이 좋습니다

ViewModel의 의존성은 캡슐화를 위해 private으로 유지하는 것이 일반적입니다. 현재 코드에서는 내부적으로만 사용되고 있으므로 외부 접근이 필요하지 않아 보입니다.

-    val savedStateHandle: SavedStateHandle,
+    private val savedStateHandle: SavedStateHandle,
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 9378db1 and 8c80112.

📒 Files selected for processing (12)
  • core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt (2 hunks)
  • core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt (1 hunks)
  • feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditContract.kt (2 hunks)
  • feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt (2 hunks)
  • feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt (2 hunks)
  • feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt (5 hunks)
  • feature/mission/src/main/java/com/yapp/mission/MissionContract.kt (2 hunks)
  • feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt (3 hunks)
  • feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt (17 hunks)
  • feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt (4 hunks)
  • feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt (0 hunks)
  • feature/mission/src/main/res/values/strings.xml (1 hunks)
💤 Files with no reviewable changes (1)
  • feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt
🧰 Additional context used
🧠 Learnings (9)
📓 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/mission/src/main/java/com/yapp/mission/MissionContract.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 패턴이다.

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/mission/src/main/res/values/strings.xml (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/AlarmAddEditScreen.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/component/bottomsheet/AlarmMissionBottomSheet.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/mission/src/main/java/com/yapp/mission/MissionScreen.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/mission/src/main/java/com/yapp/mission/MissionViewModel.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 패턴이다.

🔇 Additional comments (22)
feature/mission/src/main/java/com/yapp/mission/MissionContract.kt (2)

8-8: 미션 모드 추가가 적절합니다.

MissionMode.REAL을 기본값으로 하는 missionMode 속성 추가가 잘 구현되었습니다. 기존 기능에 영향을 주지 않으면서 미리보기 모드를 지원할 수 있게 되었습니다.


24-24: 뒤로가기 액션 추가가 적절합니다.

NavigateBack 액션이 기존 패턴을 따라 일관성 있게 구현되었습니다. 이미 정의된 NavigateBack SideEffect와 잘 연동될 것으로 보입니다.

feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt (2)

28-31: 명명된 매개변수 사용으로 가독성이 향상되었습니다.

MissionRoute 호출 시 명명된 매개변수를 사용하여 코드의 명확성이 개선되었습니다. navigatorviewModel 매개변수가 명시적으로 전달되어 이해하기 쉬워졌습니다.


43-43: 라우트 상수 사용이 일관성 있습니다.

MissionRoute.route 상수를 사용하여 네비게이션 옵션을 설정한 것이 적절합니다. MissionRoute가 매개변수화된 데이터 클래스로 변경된 것과 일치하며, 라우트 관리의 일관성을 유지합니다.

Also applies to: 53-53

feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt (2)

184-184: 미션 미리보기 액션 처리가 적절합니다.

NavigateToMissionPreview 액션 케이스가 기존 패턴을 따라 일관성 있게 추가되었습니다. 매개변수 전달도 올바르게 구현되었습니다.


215-220: 미션 미리보기 네비게이션 함수가 잘 구현되었습니다.

navigateToMissionPreview 함수가 적절한 매개변수와 함께 구현되었습니다. 사이드 이펙트 포스팅도 올바르게 처리되어 있으며, private 접근 제한자 사용이 적절합니다.

core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt (1)

14-14: 필요한 import가 적절히 추가되었습니다.

MissionRoute import 추가가 새로운 네비게이션 함수에 필요한 의존성을 올바르게 해결합니다.

feature/mission/src/main/res/values/strings.xml (1)

1-14: 문자열 리소스가 잘 구성되었습니다!

한국어 문자열 리소스가 적절하게 정의되었고, 명명 규칙이 일관되게 적용되었습니다. 특히 미션 관련 UI 텍스트들이 체계적으로 구성되어 있습니다.

feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditContract.kt (1)

88-88: 미션 미리보기 네비게이션 액션과 사이드 이펙트가 적절히 추가되었습니다!

기존 Contract 패턴을 잘 따르고 있으며, 미션 타입과 횟수를 파라미터로 전달하는 구조가 명확합니다.

Also applies to: 107-110

feature/home/src/main/java/com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt (2)

107-112: 미션 미리보기 네비게이션 처리가 올바르게 구현되었습니다!

NavigateToMissionPreview 사이드 이펙트가 적절히 처리되고 있으며, missionType.value를 사용하여 네비게이션 파라미터를 전달하는 방식이 적절합니다.


250-257: 미션 미리보기 콜백 시그니처가 일관되게 업데이트되었습니다!

onPreviewMission 콜백이 missionType과 missionCount를 모두 받도록 변경되어 미션 미리보기 기능을 완전히 지원합니다.

feature/home/src/main/java/com/yapp/home/alarm/component/bottomsheet/AlarmMissionBottomSheet.kt (1)

71-71: 미션 미리보기 콜백 시그니처가 일관되게 업데이트되었습니다!

기존 학습 내용과 일치하게, selectedMissionType과 selectedMissionCount가 작업 상태로 관리되고 있으며, 이들이 미리보기 네비게이션에 적절히 전달되고 있습니다. 콜백 시그니처 변경이 모든 관련 위치에서 일관되게 적용되었습니다.

Also applies to: 150-151, 478-478, 572-572, 658-658

feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt (6)

63-65: MissionRoute에 Navigator 파라미터가 적절히 추가되었습니다!

미션 미리보기 화면에서의 네비게이션을 지원하기 위해 필수적인 변경사항입니다.


76-89: 미션 모드에 따른 백 핸들러 분기 처리가 잘 구현되었습니다!

PREVIEW 모드에서는 바로 뒤로 가고, REAL 모드에서는 종료 다이얼로그를 표시하는 로직이 명확합니다.


151-176: 미리보기 모드 종료 버튼이 적절히 구현되었습니다!

네비게이션 바 인셋을 고려한 패딩 처리와 CircleShape 버튼 디자인이 일관된 UI를 제공합니다.


239-254: 미션 모드에 따른 상단바 조건부 렌더링이 올바르게 구현되었습니다!

REAL 모드에서만 나가기 아이콘과 텍스트를 표시하는 로직이 명확합니다.


275-281: 문자열 리소스가 일관되게 적용되었습니다!

하드코딩된 문자열이 모두 리소스로 대체되어 국제화 지원이 개선되었습니다.

Also applies to: 350-353, 396-396, 410-412


430-448: 미리보기 Composable이 개발에 유용하게 추가되었습니다!

REAL과 PREVIEW 두 가지 모드에 대한 프리뷰가 제공되어 개발 시 UI 확인이 용이합니다.

Also applies to: 450-469

feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt (4)

77-94: 미션 정보 로드 로직이 잘 구현되었습니다

파라미터 파싱과 기본값 처리가 안전하게 구현되어 있습니다. toIntOrNull()을 사용한 null-safe 파싱과 적절한 기본값 설정이 좋습니다.


66-75: 액션 처리 로직 통합이 훌륭합니다

기존의 분리된 shake/click 핸들러를 handleMissionProgress로 통합한 것은 코드 중복을 제거하고 유지보수성을 향상시킵니다.


108-138: 연속적인 액션 처리 시 동시성 이슈를 검토해주세요

사용자가 빠르게 연속으로 탭하거나 흔들 경우, delay 중에 다른 액션이 처리되어 상태 불일치가 발생할 수 있습니다. 액션 처리 중 중복 실행을 방지하는 로직이 필요할 수 있습니다.

다음과 같은 방법을 고려해보세요:

  • 처리 중 플래그를 추가하여 중복 실행 방지
  • 디바운싱 또는 스로틀링 적용

165-173: 미션 완료 시 모드별 처리가 적절합니다

REAL 모드에서만 운세를 포스팅하고, PREVIEW 모드에서는 뒤로 이동하는 로직이 미리보기 기능의 목적에 잘 부합합니다.

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

🔭 Outside diff range comments (1)
core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt (1)

137-149: 불필요해진 shouldNavigateToMission 매개변수 및 메서드 제거 필요

현재 createNotification(alarm, shouldNavigateToMission()) 호출부는 여전히 shouldNavigateToMission() 값을 전달하지만, 내부의 조건 분기 로직이 주석 처리되어 해당 값이 전혀 사용되지 않고 있습니다. 이로 인해 다음 항목들을 정리해야 합니다:

  • createNotification 시그니처에서 shouldNavigateToMission: Boolean 매개변수 제거
  • 호출부(startForeground 직전)에서 shouldNavigateToMission() 호출 제거 후 createNotification(alarm) 형태로 변경
  • 더 이상 사용되지 않는 private suspend fun shouldNavigateToMission() 메서드 삭제
  • 주석 처리된 기존 분기 코드 및 createAlarmDismissPendingIntent import 정리

위 수정으로 코드 가독성과 유지보수성을 확보할 수 있습니다.

🧹 Nitpick comments (1)
core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt (1)

151-156: 항상 미션 화면으로 이동하는 변경사항 승인

미션 미리보기 기능 구현에 따라 알람 해제 시 항상 미션 화면으로 이동하도록 변경된 것으로 보입니다. createNavigateToMissionPendingIntent를 사용하여 미션 타입과 카운트 정보를 전달하는 구현이 올바릅니다.

다만, 더 이상 사용되지 않는 createAlarmDismissPendingIntent import도 제거하는 것이 좋겠습니다.

사용하지 않는 import를 제거하세요:

- import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissPendingIntent
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 8c80112 and 09b4762.

📒 Files selected for processing (6)
  • core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt (2 hunks)
  • core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt (1 hunks)
  • domain/src/main/java/com/yapp/domain/MissionMode.kt (1 hunks)
  • feature/mission/src/main/java/com/yapp/mission/MissionContract.kt (2 hunks)
  • feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt (17 hunks)
  • feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • feature/mission/src/main/java/com/yapp/mission/MissionContract.kt
  • core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt
  • feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt
🧰 Additional context used
🧠 Learnings (2)
📓 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/mission/src/main/java/com/yapp/mission/MissionScreen.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 (2)
core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt (1)
core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt (1)
  • createNavigateToMissionPendingIntent (35-53)
feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt (1)
feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt (1)
  • FlipCard (25-96)
⏰ 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 (9)
domain/src/main/java/com/yapp/domain/MissionMode.kt (1)

3-13: LGTM! 깔끔한 enum 구현입니다.

MissionMode enum이 잘 구현되었습니다. fromRaw 메서드는 null 안전성을 보장하고 적절한 기본값을 제공합니다. entries 사용도 최신 Kotlin 관례를 따르고 있습니다.

feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt (8)

64-90: 미션 모드별 네비게이션 로직이 잘 구현되었습니다.

MissionRouteOrbitNavigator 파라미터가 추가되고 BackHandler에서 미션 모드에 따른 분기 처리가 적절히 구현되었습니다. 프리뷰 모드에서는 즉시 뒤로가기, 실제 모드에서는 종료 다이얼로그를 보여주는 UX가 직관적입니다.


152-177: 프리뷰 모드 종료 버튼이 잘 구현되었습니다.

프리뷰 모드에서만 표시되는 하단 종료 버튼이 적절히 구현되었습니다. WindowInsets를 활용한 패딩 계산과 디자인 시스템을 따른 스타일링이 좋습니다.


203-203: FlipCard 컴포넌트 사용법이 올바르게 업데이트되었습니다.

FlipCard에서 eventDispatcher 파라미터가 제거된 것이 컴포넌트의 현재 시그니처와 일치합니다.


219-258: 미션 모드에 따른 조건부 UI 렌더링이 적절합니다.

MissionTopAppBar에서 REAL 모드일 때만 종료 버튼을 표시하는 로직이 올바르게 구현되었습니다. 문자열 리소스 사용도 국제화를 위해 좋은 개선입니다.


276-282: 문자열 리소스 활용이 잘 구현되었습니다.

하드코딩된 문자열을 stringResource로 교체하고 미션 카운트를 파라미터로 전달하는 방식이 적절합니다. 국제화와 유지보수성 향상에 도움이 됩니다.


351-354: 다이얼로그 문자열 리소스화가 완료되었습니다.

종료 다이얼로그의 모든 텍스트가 문자열 리소스로 교체되어 일관성과 현지화 지원이 개선되었습니다.


397-397: 나머지 UI 컴포넌트의 문자열 리소스화가 완료되었습니다.

성공 오버레이와 에러 다이얼로그의 텍스트도 문자열 리소스로 교체되어 전체 화면의 국제화 작업이 일관되게 완료되었습니다.

Also applies to: 411-411, 413-413


431-470: 프리뷰 함수들이 두 가지 미션 모드를 적절히 지원합니다.

MissionRouteRealMissionRoutePreview 함수가 각각 실제 모드와 프리뷰 모드의 상태를 올바르게 설정하여 개발 및 테스트에 도움이 됩니다.

@codecov
Copy link
Copy Markdown

codecov Bot commented Jul 27, 2025

Codecov Report

❌ Patch coverage is 0% with 32 lines in your changes missing coverage. Please review.
✅ Project coverage is 4.21%. Comparing base (6215002) to head (a214096).
⚠️ Report is 2 commits behind head on develop.

Files with missing lines Patch % Lines
...m/yapp/home/alarm/addedit/AlarmAddEditViewModel.kt 0.00% 10 Missing ⚠️
.../com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt 0.00% 9 Missing ⚠️
.../main/java/com/yapp/alarm/services/AlarmService.kt 0.00% 5 Missing ⚠️
...om/yapp/home/alarm/addedit/AlarmAddEditContract.kt 0.00% 5 Missing ⚠️
...m/component/bottomsheet/AlarmMissionBottomSheet.kt 0.00% 3 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff              @@
##             develop    #236      +/-   ##
============================================
- Coverage       4.23%   4.21%   -0.02%     
  Complexity        53      53              
============================================
  Files             50      50              
  Lines           4462    4480      +18     
  Branches         659     660       +1     
============================================
  Hits             189     189              
- Misses          4263    4281      +18     
  Partials          10      10              
Files with missing lines Coverage Δ
...m/component/bottomsheet/AlarmMissionBottomSheet.kt 0.00% <0.00%> (ø)
.../main/java/com/yapp/alarm/services/AlarmService.kt 0.00% <0.00%> (ø)
...om/yapp/home/alarm/addedit/AlarmAddEditContract.kt 0.00% <0.00%> (ø)
.../com/yapp/home/alarm/addedit/AlarmAddEditScreen.kt 0.00% <0.00%> (ø)
...m/yapp/home/alarm/addedit/AlarmAddEditViewModel.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 closed this Jul 27, 2025
@DongChyeon DongChyeon deleted the feat/235-mission-preview branch July 27, 2025 06:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 미션 수행 화면 리팩토링 및 미션 미리보기 화면 구현

1 participant