Skip to content

Conversation

@hyeminililo
Copy link
Contributor

@hyeminililo hyeminililo commented Jan 22, 2026

Related issue 🛠

Work Description ✏️

  • ChallengeLoadingScreen 및 LoadingScreen 내에 기존 이미지에서 로띠 이미지를 적용했습니다

Screenshot 📸

Screen_Recording_20260122_213245_Cherrish.mp4

Uncompleted Tasks 😅

N/A

To Reviewers 📢

로띠 파일을 적용하면서 디쌤에게 옆에서 사이즈를 계속 물어봤는데 QA로 보면서 진행하시는게 좋을 것 같다고 하셨어요 ,, !!

Summary by CodeRabbit

  • 새로운 기능

    • 로딩·스플래시 화면에 반복 재생되는 Lottie 애니메이션과 관련 애셋을 추가해 시각적 경험을 강화했습니다.
    • 로딩 화면에 챌린지 명칭을 동적으로 전달해 표시합니다.
  • 시각적 개선

    • 애니메이션 크기·정렬과 레이아웃 간격(세로 여유)을 조정해 화면 표현을 개선했습니다.
  • UI 텍스트

    • 시작 버튼을 "챌린지 시작하기"로 변경하고, 미션 진행 화면에 수치 대신 안내 문구 및 동적 완료 버튼 텍스트를 표시합니다.
  • 리팩터

    • 내비게이션 및 관련 컴포넌트 인터페이스를 확장해 챌린지 명칭 전달을 지원하도록 업데이트했습니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@hyeminililo hyeminililo self-assigned this Jan 22, 2026
@hyeminililo hyeminililo requested a review from a team as a code owner January 22, 2026 12:40
@hyeminililo hyeminililo added FEAT✨ 새로운 기능 구현 혜민🍒 혜민 담당 labels Jan 22, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 22, 2026

Walkthrough

스플래시 및 챌린지 로딩 화면의 정적 이미지를 Lottie 애니메이션으로 교체하고, 네비게이션 사이드이펙트와 라우트/뷰모델/컴포저블 시그니처에 routineName을 전파하도록 관련 파일들을 업데이트했습니다.

Changes

Cohort / File(s) 변경 요약
Splash 화면
app/src/main/java/com/cherrish/android/presentation/splash/SplashScreen.kt, app/src/main/java/com/cherrish/android/presentation/splash/SplashViewModel.kt
정적 Image → LottieAnimation(rememberLottieComposition, animateLottieCompositionAsState)로 교체. SplashViewModel의 자동 네비게이션 사이드이펙트 흐름 일부 조정(NavigateToOnboarding 고정).
챌린지 로딩 화면
app/src/main/java/com/cherrish/android/presentation/challenge/loading/ChallengeLoadingScreen.kt, app/src/main/java/com/cherrish/android/presentation/challenge/loading/ChallengeLoadingViewModel.kt
Image → LottieAnimation 교체, 클릭 처리 유지(noRippleClickable), 세로 여백 60dp→80dp. SavedStateHandle 래퍼 추가 및 ViewModel에 public routineName 프로퍼티 추가.
Lottie 에셋
app/src/main/res/raw/lt_challenge_loading.json
새로운 Lottie JSON 자산 추가(다중 레이어·이미지 포함).
네비게이션·사이드이펙트
app/src/main/java/com/cherrish/android/presentation/challenge/ChallengeSideEffect.kt, app/src/main/java/com/cherrish/android/presentation/challenge/navigation/ChallengeNavigator.kt, app/src/main/java/com/cherrish/android/presentation/main/MainAppState.kt, app/src/main/java/com/cherrish/android/presentation/main/MainScreen.kt
NavigateToChallengeLoadingroutineName: String 추가; 라우트 데이터 클래스·네비게이터·공용 메서드 시그니처가 routineName을 수용하도록 변경(호출부 업데이트).
루틴 선택 화면·뷰모델
app/src/main/java/com/cherrish/android/presentation/challenge/routine/ChallengeRoutineScreen.kt, .../ChallengeRoutineViewModel.kt
선택 상태가 selectedRoutine: Routine?로 변경; 내비게이션 콜백 시그니처가 (Int) -> Unit(Int, String) -> Unit으로 변경되어 routineName 전달.
미션 진행 UI 상태·컴포넌트
app/src/main/java/com/cherrish/android/presentation/challenge/missionprogress/ChallengeMissionProgressUiState.kt, .../ChallengeMissionProgressViewModel.kt, .../ChallengeMissionProgressScreen.kt, app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeMissionProgressCherrygrowth.kt, .../ChallengeMissionTodoSection.kt
UI 상태에 remainingGuideText, completeButtonText 추가. ViewModel에 응답→UI 변환(toUiState) 추가. 관련 컴포저블 시그니처(숫자→문자열 또는 버튼 텍스트 인자 추가) 및 호출부 업데이트.
사소한 UI·로직 조정
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeMissionOnboardingBody.kt, app/src/main/java/com/cherrish/android/presentation/challenge/start/ChallengeStartScreen.kt, app/src/main/java/com/cherrish/android/presentation/home/HomeViewModel.kt
LazyColumn 간격 8→10dp, Start 버튼 레이블 변경("다음"→"챌린지 시작하기"), HomeViewModel selectedIndex 계산에 클램프 적용.

Sequence Diagram(s)

sequenceDiagram
  participant App as AppStart
  participant Splash as SplashScreen
  participant VM as SplashViewModel
  participant Nav as Navigator

  App->>Splash: 스플래시 화면 표시 (Lottie 재생 시작)
  Splash->>VM: 자동 로그인/사이드이펙트 트리거
  VM-->>Splash: emit NavigateToOnboarding
  Splash->>Nav: 네비게이션 요청 전달
  Nav-->>App: 온보딩 화면으로 전환
Loading
sequenceDiagram
  participant RoutineScreen as RoutineScreen
  participant RoutineVM as RoutineViewModel
  participant SideEffect as ChallengeSideEffect
  participant Nav as Navigator
  participant Loading as ChallengeLoadingScreen

  RoutineScreen->>RoutineVM: 사용자 루틴 선택 & 다음 클릭
  RoutineVM-->>SideEffect: Emit NavigateToChallengeLoading(routineId, routineName)
  RoutineScreen->>Nav: navigateToChallengeLoading(routineId, routineName)
  Nav->>Loading: 로딩 화면(route args: routineId, routineName) 표시 (Lottie 재생)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • nhyeonii
  • sohee6989
  • usuuhyn
🚥 Pre-merge checks | ✅ 3 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 일부 변경사항(remainingGuideText, completeButtonText, 버튼 텍스트 변경 등)이 Lottie 애니메이션 적용과 직접적인 관련이 없어 보입니다. Lottie 적용과 관계없는 UI 텍스트 변경사항들과 상태 관리 변경사항들을 검토하고 필요시 별도 PR로 분리하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경 사항인 Lottie 파일 적용을 명확하게 설명하고 있습니다.
Description check ✅ Passed PR 설명이 템플릿 구조를 따르고 관련 이슈, 작업 내용, 스크린샷, 리뷰어 참고사항을 포함하고 있습니다.
Linked Issues check ✅ Passed 코드 변경사항이 링크된 이슈 #141의 요구사항인 'Lottie 애니메이션으로 기존 이미지 교체'를 충족하고 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@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: 2

🤖 Fix all issues with AI agents
In `@app/src/main/java/com/cherrish/android/presentation/splash/SplashScreen.kt`:
- Around line 44-49: The code uses
LifecycleEventEffect(Lifecycle.Event.ON_START) with rememberCoroutineScope and
scope.launch+delay(3000) which can re-run when the app returns to foreground and
may continue after the Composable is disposed; replace this with
LaunchedEffect(Unit) and move the delay(3000) and viewModel.isAutoLoginCheck()
into the LaunchedEffect so it runs only once on initial composition and is
automatically cancelled when the Composable is disposed; specifically replace
the block containing LifecycleEventEffect, Lifecycle.Event.ON_START,
rememberCoroutineScope/ scope.launch and delay with a LaunchedEffect(Unit) {
delay(3000); viewModel.isAutoLoginCheck() } to fix duplicate navigation and
cancellation issues.

In
`@app/src/main/java/com/cherrish/android/presentation/splash/SplashViewModel.kt`:
- Around line 22-30: The code calls tokenManager.getId() into a now-unused
variable id and leaves a commented-out auto-login branch before always emitting
SplashSideEffect.NavigateToOnboarding; either remove the dead code or restore
the branch: delete the commented if/else and the unused id variable (or
re-enable the conditional that emits SplashSideEffect.NavigateToHome when id !=
null) in SplashViewModel where _sideEffect.emit is called so there is no
leftover commented logic or unused tokenManager.getId() call.

Comment on lines +44 to 49
LifecycleEventEffect(Lifecycle.Event.ON_START) {
scope.launch {
delay(3000)
viewModel.isAutoLoginCheck()
}
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

ON_START 이벤트 사용 시 중복 실행 가능성이 있습니다.

Lifecycle.Event.ON_START는 앱이 백그라운드에서 포그라운드로 돌아올 때마다 다시 트리거됩니다. 사용자가 스플래시 화면에서 다른 앱으로 전환했다가 돌아오면 3초 딜레이 후 네비게이션이 다시 시도될 수 있습니다.

또한 rememberCoroutineScope로 시작된 코루틴은 Composable이 dispose되어도 자동으로 취소되지 않을 수 있어, 화면 전환 후에도 네비게이션 로직이 실행될 위험이 있습니다.

🔧 LaunchedEffect 사용 권장
-    val scope = rememberCoroutineScope()
-
-    LifecycleEventEffect(Lifecycle.Event.ON_START) {
-        scope.launch {
-            delay(3000)
-            viewModel.isAutoLoginCheck()
-        }
-    }
+    LaunchedEffect(Unit) {
+        delay(3000)
+        viewModel.isAutoLoginCheck()
+    }

LaunchedEffect(Unit)은 최초 composition 시 한 번만 실행되며, recomposition이나 lifecycle 변경에 영향받지 않습니다. 또한 Composable이 dispose될 때 자동으로 취소됩니다.

🤖 Prompt for AI Agents
In `@app/src/main/java/com/cherrish/android/presentation/splash/SplashScreen.kt`
around lines 44 - 49, The code uses
LifecycleEventEffect(Lifecycle.Event.ON_START) with rememberCoroutineScope and
scope.launch+delay(3000) which can re-run when the app returns to foreground and
may continue after the Composable is disposed; replace this with
LaunchedEffect(Unit) and move the delay(3000) and viewModel.isAutoLoginCheck()
into the LaunchedEffect so it runs only once on initial composition and is
automatically cancelled when the Composable is disposed; specifically replace
the block containing LifecycleEventEffect, Lifecycle.Event.ON_START,
rememberCoroutineScope/ scope.launch and delay with a LaunchedEffect(Unit) {
delay(3000); viewModel.isAutoLoginCheck() } to fix duplicate navigation and
cancellation issues.

Comment on lines 22 to 30
val id = tokenManager.getId()
_sideEffect.emit(
if (id != null) {
SplashSideEffect.NavigateToHome
} else {
SplashSideEffect.NavigateToOnboarding
}
// if (id != null) {
// SplashSideEffect.NavigateToHome
// } else {
// SplashSideEffect.NavigateToOnboarding
// }

SplashSideEffect.NavigateToOnboarding
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

주석 처리된 코드와 미사용 변수가 있습니다.

tokenManager.getId() 호출 결과(id)가 더 이상 사용되지 않으며, 자동 로그인 분기 로직이 주석 처리되어 항상 NavigateToOnboarding만 emit됩니다.

이 PR의 목적은 Lottie 애니메이션 적용인데, 자동 로그인 로직 변경은 범위를 벗어난 것으로 보입니다. 의도된 변경이라면 주석 처리된 코드를 완전히 제거하고 미사용 id 변수도 삭제해 주세요. 임시 디버깅용이라면 별도 이슈로 관리하는 것이 좋겠습니다.

🔧 주석 및 미사용 코드 제거 제안
     fun isAutoLoginCheck() {
         viewModelScope.launch {
-            val id = tokenManager.getId()
             _sideEffect.emit(
-//                if (id != null) {
-//                    SplashSideEffect.NavigateToHome
-//                } else {
-//                    SplashSideEffect.NavigateToOnboarding
-//                }
-
                 SplashSideEffect.NavigateToOnboarding
             )
         }
     }

또는 자동 로그인 로직이 필요하다면:

     fun isAutoLoginCheck() {
         viewModelScope.launch {
             val id = tokenManager.getId()
             _sideEffect.emit(
-//                if (id != null) {
-//                    SplashSideEffect.NavigateToHome
-//                } else {
-//                    SplashSideEffect.NavigateToOnboarding
-//                }
-
-                SplashSideEffect.NavigateToOnboarding
+                if (id != null) {
+                    SplashSideEffect.NavigateToHome
+                } else {
+                    SplashSideEffect.NavigateToOnboarding
+                }
             )
         }
     }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
val id = tokenManager.getId()
_sideEffect.emit(
if (id != null) {
SplashSideEffect.NavigateToHome
} else {
SplashSideEffect.NavigateToOnboarding
}
// if (id != null) {
// SplashSideEffect.NavigateToHome
// } else {
// SplashSideEffect.NavigateToOnboarding
// }
SplashSideEffect.NavigateToOnboarding
_sideEffect.emit(
SplashSideEffect.NavigateToOnboarding
)
Suggested change
val id = tokenManager.getId()
_sideEffect.emit(
if (id != null) {
SplashSideEffect.NavigateToHome
} else {
SplashSideEffect.NavigateToOnboarding
}
// if (id != null) {
// SplashSideEffect.NavigateToHome
// } else {
// SplashSideEffect.NavigateToOnboarding
// }
SplashSideEffect.NavigateToOnboarding
val id = tokenManager.getId()
_sideEffect.emit(
if (id != null) {
SplashSideEffect.NavigateToHome
} else {
SplashSideEffect.NavigateToOnboarding
}
)
🤖 Prompt for AI Agents
In
`@app/src/main/java/com/cherrish/android/presentation/splash/SplashViewModel.kt`
around lines 22 - 30, The code calls tokenManager.getId() into a now-unused
variable id and leaves a commented-out auto-login branch before always emitting
SplashSideEffect.NavigateToOnboarding; either remove the dead code or restore
the branch: delete the commented if/else and the unused id variable (or
re-enable the conditional that emits SplashSideEffect.NavigateToHome when id !=
null) in SplashViewModel where _sideEffect.emit is called so there is no
leftover commented logic or unused tokenManager.getId() call.

Copy link
Contributor

@nhyeonii nhyeonii left a comment

Choose a reason for hiding this comment

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

로띠 이뿌따 ~ㅡ!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

FEAT✨ 새로운 기능 구현 혜민🍒 혜민 담당

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 로띠 이미지 적용

4 participants