Skip to content

Conversation

wjdrjs00
Copy link
Member

@wjdrjs00 wjdrjs00 commented Aug 16, 2025

[ PR Content ]

설명서 화면 UI를 구현했습니다.

Related issue

Screenshot 📸

Screen_recording_20250817_070830.mp4

Work Description

  • 설명서 화면 구현

To Reviewers 📢

  • 나중에 하려고 했다가, api 이슈가 있어 기다리는 시간에 먼저 구현했습니다요.
  • 간단한 작업이지만, 궁금한점, 이슈 등등 리뷰가 있다면 환영입니다요.

Summary by CodeRabbit

  • 신규 기능
    • 앱 내 가이드 화면 추가: 홈의 도움말 아이콘을 통해 진입, 항목별 가이드 목록 제공, 하단 시트에서 상세 설명/이미지 확인, 뒤로가기 지원.
  • UI
    • 홈 헤더에 도움말 아이콘 버튼 추가 및 가이드로의 탐색 경로 연결.
    • 도움말 아이콘 리소스 추가로 시각적 일관성 강화.

@wjdrjs00 wjdrjs00 requested a review from l5x5l August 16, 2025 22:10
@wjdrjs00 wjdrjs00 self-assigned this Aug 16, 2025
@wjdrjs00 wjdrjs00 added 📱 UI UI 추가 및 수정 (비지니스 로직을 포함하지 않는 작업) 🧤 대현 labels Aug 16, 2025
Copy link

coderabbitai bot commented Aug 16, 2025

Walkthrough

새로운 Guide 화면을 추가하고, Home 화면에서 Help 버튼을 통해 해당 화면으로 내비게이션하는 흐름을 도입했습니다. Route에 Guide를 추가하고, MainNavHost/HomeNavHost/HomeScreen 계층에 navigateToGuide 경로를 연결했습니다. Guide 화면은 ViewModel(MVI)·BottomSheet UI·리소스와 함께 구현되었습니다.

Changes

Cohort / File(s) Summary
Navigation wiring
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt, app/src/main/java/com/threegap/bitnagil/navigation/home/HomeNavHost.kt
Route.Guide로 이동하는 navigateToGuide 추가, Guide 컴포저블 등록, 뒤로가기 popBackStack 처리
Route
app/src/main/java/com/threegap/bitnagil/Route.kt
sealed Route에 @serializable data object Guide 추가
Home integration
presentation/.../home/HomeScreen.kt, presentation/.../home/HomeViewModel.kt, presentation/.../home/component/template/CollapsibleHomeHeader.kt, presentation/.../home/model/HomeIntent.kt, presentation/.../home/model/HomeSideEffect.kt
Help 아이콘 클릭 인텐트/사이드이펙트 추가(OnHelpClick, NavigateToGuide), 컨테이너·헤더에 onHelpClick/navigateToGuide 전파
Guide feature (UI/VM/Model)
presentation/.../guide/GuideScreen.kt, presentation/.../guide/GuideViewModel.kt, presentation/.../guide/model/GuideIntent.kt, presentation/.../guide/model/GuideSideEffect.kt, presentation/.../guide/model/GuideState.kt, presentation/.../guide/model/GuideType.kt, presentation/.../guide/component/atom/GuideButton.kt, presentation/.../guide/component/template/GuideBottomSheet.kt
Guide 화면 컨테이너/스크린, MVI 상태·인텐트·사이드이펙트·뷰모델 구현, 가이드 목록 버튼 및 상세 BottomSheet 구성, GuideType 정의
Design resource
core/designsystem/src/main/res/drawable/ic_help_circle.xml
도움말 아이콘 벡터 추가

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
Loading
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()
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Assessment against linked issues

Objective Addressed Explanation
기능 설명서(Guide) 화면 구현 및 내비게이션 연결 (#109)

Assessment against linked issues: Out-of-scope changes

(해당 없음)

Poem

새싹 같은 도움말, 톡! 하고 피었네 🌱
집으로 가는 길엔, 새 길도 생겼대.
Help을 톡 누르면, Guide로 폴짝!
시트가 사근사근, 비밀을 살짝~
토끼는 귀를 흔들며, “이제 길 안 잃지!” 🐰

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 Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ui/#109-guide

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.
    • 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.
  • 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 the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

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.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • 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

@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: 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 경로에 모두 존재함을 확인했습니다.
· 따라서 imageimageRes 네이밍 변경 및 @DrawableRes 어노테이션 사용이 안전합니다.
· 문자열 리소스(@StringRes) 전환을 원할 경우, 아래 옵션 중 선택해서 적용해 주세요:

  1. 옵션 A (권장):

    • title, description@StringRes val titleRes/descriptionRes: Int로 바꾸고
    • strings.xmlguide_title_*, guide_desc_* 키 추가
  2. 옵션 B (경량):

    • 기존 문자열 하드코딩 유지
    • imageimageRes 네이밍만 우선 변경

[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,
 ) : MviState

UI 사용부(참고, 별도 파일):

// 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.semantics
presentation/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.verticalScroll
presentation/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.

📥 Commits

Reviewing files that changed from the base of the PR and between ca58fc2 and 8f28127.

⛔ 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.NavigateToGuidenavigator.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 내비게이션 연결 OK

launchSingleTop 설정으로 중복 진입 방지되는 점 좋습니다.

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 상태와 동기화 양호.

guideBottomSheetVisibleguideType을 함께 체크하여 안전하게 바텀시트를 렌더링하는 흐름이 명확합니다.


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 전송 경로 연결 OK

HomeIntent.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와의 결합이 깔끔합니다.

Copy link
Contributor

@l5x5l l5x5l left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!

@wjdrjs00 wjdrjs00 merged commit 648e824 into develop Aug 18, 2025
2 checks passed
@wjdrjs00 wjdrjs00 deleted the ui/#109-guide branch August 18, 2025 04:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📱 UI UI 추가 및 수정 (비지니스 로직을 포함하지 않는 작업) 🧤 대현
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[UI] 기능 설명서 화면을 구현합니다.
2 participants