-
Notifications
You must be signed in to change notification settings - Fork 0
[UI/#109] 설명서 화면을 구현합니다. #110
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Walkthrough새로운 Guide 화면을 추가하고, Home 화면에서 Help 버튼을 통해 해당 화면으로 내비게이션하는 흐름을 도입했습니다. Route에 Guide를 추가하고, MainNavHost/HomeNavHost/HomeScreen 계층에 navigateToGuide 경로를 연결했습니다. Guide 화면은 ViewModel(MVI)·BottomSheet UI·리소스와 함께 구현되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant HomeUI as HomeScreen/CollapsibleHeader
participant HomeVM as HomeViewModel
participant Nav as MainNavHost
participant GuideUI as GuideScreen
User->>HomeUI: Tap Help
HomeUI->>HomeVM: HomeIntent.OnHelpClick
HomeVM-->>HomeUI: HomeSideEffect.NavigateToGuide
HomeUI->>Nav: navigateToGuide()
Nav->>GuideUI: Show Route.Guide
sequenceDiagram
participant User
participant GuideUI as GuideScreen
participant GuideVM as GuideViewModel
participant Nav as MainNavHost
User->>GuideUI: Tap Back
GuideUI->>GuideVM: GuideIntent.OnBackClick
GuideVM-->>GuideUI: GuideSideEffect.NavigateToBack
GuideUI->>Nav: popBackStack()
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes(해당 없음) Poem
Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. ✨ Finishing Touches
🧪 Generate unit tests
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🔭 Outside diff range comments (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/home/component/template/CollapsibleHomeHeader.kt (1)
42-49
: onHelpClick 및 onRegisterEmotion 파라미터 누락 호출부 수정 필요아래 호출부에서 변경된 시그니처(
onHelpClick
,onRegisterEmotion
추가)를 반영해 주세요. 누락 시 컴파일 오류가 발생합니다.
- presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt (약 206행)
CollapsibleHomeHeader(…) 호출부에
onHelpClick = { /* ... */ }, onRegisterEmotion = { /* ... */ }
인자 추가- presentation/src/main/java/com/threegap/bitnagil/presentation/home/component/template/CollapsibleHomeHeader.kt (약 141행)
CollapsibleHomeHeaderPreview() 내부 호출부에도
onHelpClick = {}, onRegisterEmotion = {}
등 기본 람다 인자 추가위 두 곳 모두 시그니처와 일치하도록 수정 부탁드립니다.
♻️ Duplicate comments (1)
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt (1)
66-66
: HomeScreenContainer로 콜백 전달 확인 필요HomeScreenContainer가 navigateToGuide 파라미터를 수신하며 HomeSideEffect.NavigateToGuide를 수신했을 때 해당 콜백을 호출하는지 확인해 주세요. 동일 취지의 검증 스크립트를 앞선 코멘트에서 제공했습니다.
🧹 Nitpick comments (16)
core/designsystem/src/main/res/drawable/ic_help_circle.xml (1)
1-16
: 아이콘 색상 하드코딩을 지양하고 테마 속성으로 틴팅하세요현재 strokeColor/fillColor에 #ffffff가 하드코딩되어 있어 테마(라이트/다크) 변화에 취약합니다. 상위에서 일관된 틴트를 적용할 수 있도록 벡터 루트에 tint를 부여하는 것을 권장합니다.
다음 최소 변경으로 테마 적용을 유연하게 할 수 있습니다:
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?attr/colorOnSurface">또한, 실제 사용 시 IconButton/Clickable로 쓰인다면 접근성 대응을 위해 contentDescription을 반드시 지정해 주세요(예: "도움말"). CollapsibleHomeHeader 등에서 적용되었는지 확인 부탁드립니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideSideEffect.kt (1)
5-7
: 네이밍 일관성 제안: NavigateToBack → NavigateBack짧고 명확한 동사+목적어 조합(예: NavigateBack)으로 다른 네비게이션 사이드이펙트와 읽기 일관성을 높일 수 있습니다. 기능에 영향은 없으며 적용은 선택 사항입니다.
다음과 같이 변경을 고려해 보세요:
sealed interface GuideSideEffect : MviSideEffect { - data object NavigateToBack : GuideSideEffect + data object NavigateBack : GuideSideEffect }변경 시 전역 참조도 함께 치환해야 합니다. 주요 참조 위치:
- presentation/src/main/java/com/threegap/bitnagil/presentation/terms/model/TermsAgreementSideEffect.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/terms/TermsAgreementScreen.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/terms/TermsAgreementViewModel.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/withdrawal/model/WithdrawalSideEffect.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/withdrawal/WithdrawalViewModel.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/withdrawal/WithdrawalScreen.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideSideEffect.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideViewModel.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideScreen.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionSideEffect.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionIntent.kt
- presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt
일관성 유지를 위해 선택적으로 적용해 보시길 추천드립니다.
[optional_refactors_recommended]presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideType.kt (1)
6-26
: 이미지 리소스 존재 확인 완료 —imageRes
네이밍 변경 가능· 이미지 리소스가
core/designsystem/src/main/res/drawable-*/img_*_guide.png
경로에 모두 존재함을 확인했습니다.
· 따라서image
→imageRes
네이밍 변경 및@DrawableRes
어노테이션 사용이 안전합니다.
· 문자열 리소스(@StringRes) 전환을 원할 경우, 아래 옵션 중 선택해서 적용해 주세요:
옵션 A (권장):
title
,description
을@StringRes val titleRes/descriptionRes: Int
로 바꾸고strings.xml
에guide_title_*
,guide_desc_*
키 추가옵션 B (경량):
- 기존 문자열 하드코딩 유지
image
→imageRes
네이밍만 우선 변경[optional_refactors_recommended]
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideState.kt (1)
1-10
: GuideState 중복 상태 제거 제안: guideType만으로 BottomSheet 표시 제어guideBottomSheetVisible(Boolean)와 guideType(GuideType?)이 동시에 표시 여부를 나타내는 이중 소스입니다. 불일치 가능성을 줄이기 위해 guideType != null만으로 제어하도록 단순화하는 것을 권장합니다.
적용 예시(이 파일 변경):
@Parcelize data class GuideState( - val guideType: GuideType? = null, - val guideBottomSheetVisible: Boolean = false, + val guideType: GuideType? = null, ) : MviStateUI 사용부(참고, 별도 파일):
// before if (uiState.guideBottomSheetVisible) { uiState.guideType?.let { guideType -> GuideBottomSheet(guideType = guideType, onDismissRequest = { viewModel.sendIntent(GuideIntent.OnHideGuideBottomSheet) }) } } // after uiState.guideType?.let { guideType -> GuideBottomSheet(guideType = guideType, onDismissRequest = { viewModel.sendIntent(GuideIntent.OnHideGuideBottomSheet) }) } // OnHideGuideBottomSheet 시 guideType = null 로 변경app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)
251-259
: 뒤로가기 처리 간결화 제안: navigateUp 사용popBackStack 조건 검사 대신 navigateUp() 한 줄로 동일 동작을 간결하게 표현할 수 있습니다.
- navigateToBack = { - if (navigator.navController.previousBackStackEntry != null) { - navigator.navController.popBackStack() - } - }, + navigateToBack = { + navigator.navController.navigateUp() + },presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideScreen.kt (3)
68-68
: 하드코딩된 문자열을 string 리소스로 이동해 i18n 대응.UI 텍스트는 string 리소스로 관리하는 것이 바람직합니다.
아래 diff로 타이틀을 stringResource로 교체해 주세요(리소스 키는 예시).
- title = "설명서", + title = stringResource(R.string.guide_title),imports 추가(파일 상단 import 섹션에 아래 라인 추가 필요):
import androidx.compose.ui.res.stringResource import com.threegap.bitnagil.presentation.R
76-84
: 항목 수 증가 가능성에 대비해 스크롤/리스트 컴포넌트 고려.현재는
GuideType.entries.forEach
로 정적 수의 항목을 그리므로 문제 없지만, 항목 수가 늘어날 가능성이 있다면 LazyColumn(또는 최소한 verticalScroll) 도입을 고려해 주세요. 성능·접근성·테스트 편의성이 좋아집니다.예시(상단 import 필요:
import androidx.compose.foundation.lazy.LazyColumn
,import androidx.compose.foundation.lazy.items
):LazyColumn( contentPadding = PaddingValues(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { items(GuideType.entries) { guideType -> GuideButton( title = guideType.title, onClick = { onClickGuideButton(guideType) }, modifier = Modifier.fillMaxWidth(), ) } }
49-52
: 인텐트 디스패치 람다 생성 최소화는 선택사항.현재도 충분히 가볍지만, 재구성 빈도가 높은 경우 람다 캡처 생성을 줄이고 싶다면
remember
로 람다를 메모이즈하거나 ViewModel에 래핑 메서드를 제공하는 방법을 고려할 수 있습니다. 필수 사항은 아닙니다.presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideIntent.kt (1)
5-9
: KDoc 추가를 통한 의도/결과 구분 문서화 제안.향후 인텐트가 늘어날 경우를 대비해 각 인텐트의 목적과 트리거(사용자 액션 vs. 결과 이벤트)를 간단히 KDoc으로 남겨두면 유지보수에 도움이 됩니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/atom/GuideButton.kt (1)
27-37
: 접근성(semantics) 역할(Role.Button) 명시 제안.
Row
에 커스텀 clickable을 사용 중이므로 역할을 명시하면 스크린리더 인식이 개선됩니다.아래 diff 적용을 고려해 주세요.
Row( modifier = modifier .background( color = BitnagilTheme.colors.coolGray99, shape = RoundedCornerShape(12.dp), ) .fillMaxWidth() .height(56.dp) - .clickableWithoutRipple { onClick() } + .semantics { role = Role.Button } + .clickableWithoutRipple { onClick() } .padding(vertical = 14.dp, horizontal = 20.dp),imports 추가:
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.semanticspresentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/template/GuideBottomSheet.kt (1)
48-74
: 내용이 화면 높이를 초과할 경우 스크롤 가능하도록 개선 제안.설명/이미지 길이에 따라 작은 기기에서 콘텐츠가 잘릴 수 있습니다.
verticalScroll
을 추가해 주세요.아래 diff 적용:
@@ - Column( - modifier = modifier, - ) { + Column( + modifier = modifier.verticalScroll(rememberScrollState()), + ) {imports 추가:
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScrollpresentation/src/main/java/com/threegap/bitnagil/presentation/home/component/template/CollapsibleHomeHeader.kt (1)
82-87
: 도움말 버튼 접근성 라벨 부여 제안.
BitnagilIconButton
이 내부적으로contentDescription
을 null로 처리하므로, 호출부에서 semantics 라벨을 지정하는 것을 권장합니다.예시 diff:
BitnagilIconButton( id = R.drawable.ic_help_circle, onClick = onHelpClick, - paddingValues = PaddingValues(12.dp), + paddingValues = PaddingValues(12.dp), tint = null, + modifier = Modifier.semantics { + // string 리소스 사용 권장: stringResource(R.string.cd_help) + contentDescription = "도움말" + } )imports 추가:
import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics참고: 하드코딩 문자열 대신 string 리소스를 사용해 주세요.
presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt (2)
210-212
: CollapsibleHomeHeader로 onHelpClick 전달 — 시그니처/접근성 확인 권장
- CollapsibleHomeHeader가 onHelpClick 파라미터를 수용하도록 시그니처가 업데이트되었는지 최종 확인 부탁드립니다.
- 접근성 측면에서 헤더 내 도움말 아이콘에 contentDescription/semantics가 설정되어 있는지 점검을 권장합니다. TalkBack 사용자에게 의미가 전달되어야 합니다.
41-46
: HomeScreenContainer 호출부 검증 완료 및 기본값 옵션 제안
- app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt 에서만
HomeScreenContainer
가 호출되며, 해당 호출부에 이미navigateToGuide = navigateToGuide
가 반영되어 있어 컴파일 오류 우려가 없습니다.- 다른 호출부는 발견되지 않았습니다.
- (옵션) Preview나 테스트용 임시 호출 편의를 위해 아래와 같이 기본값을 지정할 수 있습니다.
기본값 설정 시 네비게이션 배선 누락이 런타임에 묵살될 수 있으므로 팀 컨벤션에 따라 적용 여부를 결정하세요.- navigateToGuide: () -> Unit, + navigateToGuide: () -> Unit = {},[optional_refactors_recommended]
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideViewModel.kt (2)
38-41
: 뒤로가기 처리 개선 제안: 바텀시트 열림 시 우선 닫기사용자 경험상 바텀시트가 열려 있을 때는 뒤로가기를 누르면 시트를 닫는 것이 자연스럽습니다. 현재는 항상 NavigateToBack을 보내므로, 아래처럼 조건 분기하는 것을 제안드립니다.
- is GuideIntent.OnBackClick -> { - sendSideEffect(GuideSideEffect.NavigateToBack) - null - } + is GuideIntent.OnBackClick -> { + if (state.guideBottomSheetVisible) { + state.copy( + guideType = null, + guideBottomSheetVisible = false, + ) + } else { + sendSideEffect(GuideSideEffect.NavigateToBack) + null + } + }
23-45
: 경미한 리팩터: when 결과를 직접 반환하여 간결화지역 변수 newState 없이도 동일 동작을 보다 간결하게 표현할 수 있습니다.
- val newState = when (intent) { + return when (intent) { is GuideIntent.OnClickGuideButton -> { state.copy( guideType = intent.guideType, guideBottomSheetVisible = true, ) } is GuideIntent.OnHideGuideBottomSheet -> { state.copy( guideType = null, guideBottomSheetVisible = false, ) } is GuideIntent.OnBackClick -> { sendSideEffect(GuideSideEffect.NavigateToBack) null } } - - return newState
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
⛔ Files ignored due to path filters (15)
core/designsystem/src/main/res/drawable-hdpi/img_edit_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-hdpi/img_recommend_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-hdpi/img_register_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-mdpi/img_edit_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-mdpi/img_recommend_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-mdpi/img_register_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xhdpi/img_edit_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xhdpi/img_recommend_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xhdpi/img_register_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xxhdpi/img_edit_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xxhdpi/img_recommend_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xxhdpi/img_register_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xxxhdpi/img_edit_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xxxhdpi/img_recommend_guide.png
is excluded by!**/*.png
core/designsystem/src/main/res/drawable-xxxhdpi/img_register_guide.png
is excluded by!**/*.png
📒 Files selected for processing (17)
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt
(3 hunks)app/src/main/java/com/threegap/bitnagil/Route.kt
(1 hunks)app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt
(2 hunks)core/designsystem/src/main/res/drawable/ic_help_circle.xml
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideScreen.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideViewModel.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/atom/GuideButton.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/template/GuideBottomSheet.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideIntent.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideSideEffect.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideState.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideType.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt
(5 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/home/component/template/CollapsibleHomeHeader.kt
(5 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/home/model/HomeIntent.kt
(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/home/model/HomeSideEffect.kt
(1 hunks)
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-07-23T13:31:46.809Z
Learnt from: l5x5l
PR: YAPP-Github/Bitnagil-Android#41
File: presentation/src/main/java/com/threegap/bitnagil/presentation/mypage/model/MyPageState.kt:6-14
Timestamp: 2025-07-23T13:31:46.809Z
Learning: In the Bitnagil Android project, MviState interface extends Parcelable, so any class implementing MviState automatically implements Parcelable. Therefore, Parcelize annotation works correctly without explicitly adding Parcelable implementation.
Applied to files:
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideState.kt
📚 Learning: 2025-07-21T10:38:49.104Z
Learnt from: l5x5l
PR: YAPP-Github/Bitnagil-Android#38
File: presentation/src/main/java/com/threegap/bitnagil/presentation/writeroutine/component/atom/textbutton/TextButton.kt:30-35
Timestamp: 2025-07-21T10:38:49.104Z
Learning: presentation/src/main/java/com/threegap/bitnagil/presentation/writeroutine/component/atom/textbutton/TextButton.kt의 TextButton 컴포넌트는 임시로 구현된 컴포넌트로, 디자인 시스템 구현시 대체 예정입니다.
Applied to files:
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/atom/GuideButton.kt
📚 Learning: 2025-07-23T13:32:26.263Z
Learnt from: l5x5l
PR: YAPP-Github/Bitnagil-Android#41
File: presentation/src/main/java/com/threegap/bitnagil/presentation/mypage/model/MyPageIntent.kt:6-6
Timestamp: 2025-07-23T13:32:26.263Z
Learning: In the Bitnagil Android project's MVI architecture, Intent classes like `LoadMyPageSuccess` are named to represent successful API response results that carry loaded data, not just user actions. This naming convention is used for future API integration where the intent will be triggered when my page data loading succeeds from the server.
Applied to files:
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideIntent.kt
🧬 Code Graph Analysis (6)
presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/common/mviviewmodel/MviViewModel.kt (1)
sendSideEffect
(23-23)
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideScreen.kt (1)
GuideScreenContainer
(27-53)
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideScreen.kt (3)
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/template/GuideBottomSheet.kt (1)
GuideBottomSheet
(21-41)core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/block/BitnagilTopBar.kt (1)
BitnagilTopBar
(22-63)presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/atom/GuideButton.kt (1)
GuideButton
(21-51)
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideViewModel.kt (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/common/mviviewmodel/MviViewModel.kt (1)
sendSideEffect
(23-23)
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/atom/GuideButton.kt (1)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilIcon.kt (1)
BitnagilIcon
(21-33)
presentation/src/main/java/com/threegap/bitnagil/presentation/home/component/template/CollapsibleHomeHeader.kt (1)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/atom/BitnagilIcon.kt (2)
BitnagilIcon
(21-33)BitnagilIconButton
(35-58)
⏰ 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 (19)
app/src/main/java/com/threegap/bitnagil/Route.kt (1)
45-46
: Route.Guide 매핑 및 네비게이션 정상 동작 확인 완료NavHost에
composable<Route.Guide>
로 등록되어 있고
Home 흐름에서HomeSideEffect.NavigateToGuide
→navigator.navController.navigate(Route.Guide)
경로 진입도 정상적으로 확인되었습니다.presentation/src/main/java/com/threegap/bitnagil/presentation/home/model/HomeSideEffect.kt (1)
8-11
: NavigateToGuide emit/collect 흐름 정상 확인스크립트 실행 결과 HomeViewModel에서 HomeSideEffect.NavigateToGuide를 emit하고, HomeScreen에서 collectAsEffect를 통해 해당 사이드이펙트를 받아 navigateToGuide()가 호출되는 것을 확인했습니다.
추가 수정 없이 바로 머지하셔도 좋습니다. LGTM! 😄presentation/src/main/java/com/threegap/bitnagil/presentation/home/model/HomeIntent.kt (1)
15-15
: 도움말 클릭 인텐트 추가 적절Help 버튼 이벤트를 표현하는 data object 추가가 MVI 패턴 및 기존 명명과 일관됩니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt (1)
113-116
: SideEffect 기반 가이드 내비게이션 OK – 연결 부분 재확인 필요현재 HomeSideEffect.NavigateToGuide가 모델에 정의되어 있고 HomeScreen.kt 에서 collectAsEffect → navigateToGuide() 호출로 이어지는 흐름은 기존 패턴과 일관적입니다.
다만, 아래 지점들만 최종 확인해 주세요:
- HomeScreen.kt 에서 navigateToGuide() 함수(또는 람다 파라미터)가 선언되어 있는지
- 해당 함수 내부에
navController.navigate(Route.Guide.route)
호출이 포함되어 있는지- 앱 라우트 정의(Route.kt 등)에
Route.Guide
가 명시되어 있는지위 세 가지가 모두 연결되어 있으면 바로 머지 가능합니다! 🚀
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (2)
11-11
: GuideScreenContainer import 추가 적절새 라우트와 대응되는 컨테이너 import가 정확합니다.
116-120
: Home → Guide 내비게이션 연결 OKlaunchSingleTop 설정으로 중복 진입 방지되는 점 좋습니다.
app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt (1)
42-42
: navigateToGuide 콜백 호이스팅 👍상위 NavHost로 내비게이션 책임을 올려 단방향 의존을 유지한 점 좋습니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideScreen.kt (2)
40-47
: 바텀시트 표시 조건 분기 적절 — UI 상태와 동기화 양호.
guideBottomSheetVisible
와guideType
을 함께 체크하여 안전하게 바텀시트를 렌더링하는 흐름이 명확합니다.
76-76
: 문제 없음: Kotlin 버전 2.1.20 사용 중이므로Enum.entries
안전합니다.
gradle/libs.versions.toml
에서 Kotlin 버전이"2.1.20"
임을 확인했습니다. 이는 1.9 이상이므로GuideType.entries
사용에 전혀 문제가 없습니다.presentation/src/main/java/com/threegap/bitnagil/presentation/guide/model/GuideIntent.kt (1)
5-9
: 의도(인텐트) 모델링이 명확하고 MVI 컨벤션과 일치.사용자 액션과 UI 제어 흐름에 필요한 최소 인텐트로 잘 정리되었습니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/atom/GuideButton.kt (1)
40-50
: 컴포넌트 구조·스타일 일관성 양호.디자인 시스템 색상/타이포 활용과 우측 내비게이션 아이콘 구성이 명확합니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/component/template/GuideBottomSheet.kt (1)
28-41
: 바텀시트 컨테이너 설정 적절.
onDismissRequest
연결과 테마 색상 지정이 명확합니다.presentation/src/main/java/com/threegap/bitnagil/presentation/home/component/template/CollapsibleHomeHeader.kt (2)
46-47
: 도움말 버튼 도입 방향성 좋음 — 헤더 액션 확장 👍API 시그니처에
onHelpClick
추가 및 우측 정렬 아이콘 버튼 배치가 자연스럽습니다.Also applies to: 82-87
68-73
: statusBarsPadding과 고정 높이 조합에 따른 레이아웃 영향 검토.Row에
height(collapsedHeaderHeight)
와statusBarsPadding()
을 함께 적용하면, 상태바 인셋만큼 내부 콘텐츠 영역이 줄어듭니다.collapsedHeaderHeight
가 이미 상태바 높이를 고려한 값인지 확인해 주세요(중복 보정 발생 가능).확인 지침:
collapsedHeaderHeight
정의부가 상태바 인셋을 포함하는지 검토- 실제 기기(노치/펀치홀/상태바 높이 큰 기기)에서 아이콘 수직 정렬/클리핑 여부 확인
presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt (4)
51-53
: 사이드이펙트 기반 네비게이션 처리 적절collectAsEffect 내에서 HomeSideEffect.NavigateToGuide를 안전하게 처리하고 있어, 재구성과 무관하게 단발 이벤트로 동작하는 점이 좋습니다.
90-92
: onHelpClick → Intent 전송 경로 연결 OKHomeIntent.OnHelpClick로 위임하는 MVI 흐름이 일관적입니다.
113-114
: HomeScreen에 onHelpClick 전달 — OK내부 컴포저블 간 콜백 전파가 명확합니다.
226-227
: Preview 업데이트 적절새 파라미터에 맞춘 Preview 파라미터 추가가 잘 반영되었습니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideViewModel.kt (1)
12-18
: MviViewModel 초기화/의존성 주입 구성 양호@hiltviewmodel + SavedStateHandle 주입과 initState 전달이 일관적이며, 베이스 MVI와의 결합이 깔끔합니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/guide/GuideScreen.kt
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다!
[ PR Content ]
설명서 화면 UI를 구현했습니다.
Related issue
Screenshot 📸
Screen_recording_20250817_070830.mp4
Work Description
To Reviewers 📢
Summary by CodeRabbit