-
Notifications
You must be signed in to change notification settings - Fork 0
feat: BottomNavigation 구현 #58
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프로젝트 내 Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant HomeScreen
participant HomePresenter
participant Navigator
participant SearchScreen
User->>HomeScreen: 앱 실행/화면 진입
HomeScreen->>HomePresenter: present() 호출
HomePresenter->>HomeScreen: HomeUiState(eventSink)
User->>HomeScreen: "Navigate To Search" 버튼 클릭
HomeScreen->>HomePresenter: eventSink(OnButtonClick)
HomePresenter->>Navigator: navigate(SearchScreen)
Navigator->>SearchScreen: 화면 전환
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
""" 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ 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)
✨ Finishing Touches
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. 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)
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: 0
♻️ Duplicate comments (2)
feature/main/src/main/res/drawable/ic_home.xml (1)
1-9
: 아이콘 규격 및 테마 대응 동일 이슈
ic_library.xml
과 동일하게 25×24 dp 비율과 색상 하드코딩 문제가 있습니다. 디자인 시스템 일관성을 위해 24×24 dp 규격 및 테마 대응 방식을 재검토해 주세요.feature/main/src/main/res/drawable/ic_selected_home.xml (1)
1-9
: 중복 리소스 최적화 제안
ic_selected_home.xml
과ic_home.xml
은 pathData가 동일하고 fillColor만 다릅니다. 앞선 코멘트와 같이 색상만 변경 가능하도록 하나의 벡터에android:tint
로 상태를 주는 방식을 고려하면 APK 용량 및 관리 비용을 줄일 수 있습니다.
🧹 Nitpick comments (7)
feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryScreen.kt (1)
77-82
: 문자열 리소스로 분리 권장
"내 서재"
,state.nickname
,state.email
등이 하드-코딩되어 있어 다국어 대응 및 접근성 측정이 어렵습니다.core/designsystem
의 string 리소스를 활용해 i18n 준비를 부탁드립니다.-Text(text = "내 서재") +Text(text = stringResource(R.string.library_title))feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt (1)
48-85
: 동일 쿼리 중복 호출‧경합 가능성 있음
searchBooks
를scope.launch
로만 호출하면 사용자가 빠르게 입력하거나 스크롤할 때 이전 Job 이 취소되지 않아 UI 상태가 뒤섞일 수 있습니다.Job
객체를 저장해 이전 요청을 취소하거나,debounce
/collectLatest
패턴으로 전환하는 것이 안전합니다.-var uiJob: Job? = null - -fun searchBooks(...) { - uiJob?.cancel() - uiJob = scope.launch { +private var uiJob: Job? = null + +fun searchBooks(...) { + uiJob?.cancel() + uiJob = scope.launch { ... } }feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsScreen.kt (2)
83-88
: contentDescription 하드코딩 주의
"Right Chevron Icon"
과 같은 설명이 반복되는데 string 리소스로 추출하거나null
처리하여 TalkBack 읽기 흐름을 정교히 제어할 수 있습니다.
96-101
: 동일한 Icon 정의 중복두 구간(83-88, 96-101)에서 동일 Icon 구성이 반복됩니다.
@Composable
헬퍼로 분리해 중복을 제거하면 유지보수성이 높아집니다.feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesScreen.kt (1)
122-135
: 라이선스 URL 클릭 가능 처리 권장라이선스 URL 이 단순
Text
로만 표시되어 터치해도 열리지 않습니다.AnnotatedString
+clickable
이나ClickableText
로 변환하여 브라우저로 deep-link 하는 UX 개선을 권합니다.feature/main/src/main/res/drawable/ic_library.xml (1)
1-9
: 벡터 드로어블 크기·색상 하드코딩 재검토 필요
android:width="25dp"
/android:height="24dp"
처럼 비대칭 크기를 사용하면 BottomNavigation 아이콘 정렬이 미묘하게 틀어질 수 있습니다. Material Icons 기본 규격(24×24dp)을 그대로 쓰는 편이 안전합니다.android:fillColor="#E5E5E5"
를 직접 하드코딩하면 다크모드·테마 변경 시 색상 교체가 어렵습니다. design-system에서 선호하는 방식(라이트/다크 전용 파일 또는tint
활용)에 맞춰 대응 아이콘을drawable-night
에 두거나 색상 자원을 참조하도록 수정하는 것을 권장합니다.feature/main/src/main/res/drawable/ic_selected_library.xml (1)
1-9
: 선택·비선택 상태를 파일 분리로 처리한 이유 확인선택 상태용(#262626)·비선택 상태용(#E5E5E5) 아이콘을 별도 파일로 두면 리소스 수가 늘어나고 유지보수가 어려워질 수 있습니다. VectorDrawable +
tint
혹은ColorFilter
만으로 상태를 처리할 수 없는 특별한 요구사항이 있는지 확인 부탁드립니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (37)
build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt
(1 hunks)core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedFullScreen.kt
(2 hunks)feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt
(2 hunks)feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeScreen.kt
(2 hunks)feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUiState.kt
(1 hunks)feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryPresenter.kt
(1 hunks)feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryScreen.kt
(1 hunks)feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginPresenter.kt
(1 hunks)feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginScreen.kt
(1 hunks)feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementPresenter.kt
(1 hunks)feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementScreen.kt
(1 hunks)feature/main/build.gradle.kts
(1 hunks)feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/MainActivity.kt
(1 hunks)feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt
(1 hunks)feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigationPresenter.kt
(1 hunks)feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainBottomBar.kt
(3 hunks)feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainTab.kt
(2 hunks)feature/main/src/main/res/drawable/ic_home.xml
(1 hunks)feature/main/src/main/res/drawable/ic_home_tab.xml
(0 hunks)feature/main/src/main/res/drawable/ic_library.xml
(1 hunks)feature/main/src/main/res/drawable/ic_library_tab.xml
(0 hunks)feature/main/src/main/res/drawable/ic_search_tab.xml
(0 hunks)feature/main/src/main/res/drawable/ic_selected_home.xml
(1 hunks)feature/main/src/main/res/drawable/ic_selected_home_tab.xml
(0 hunks)feature/main/src/main/res/drawable/ic_selected_library.xml
(1 hunks)feature/main/src/main/res/drawable/ic_selected_library_tab.xml
(0 hunks)feature/main/src/main/res/drawable/ic_selected_search_tab.xml
(0 hunks)feature/screens/build.gradle.kts
(1 hunks)feature/screens/src/main/kotlin/com/ninecraft/booket/feature/screens/Screens.kt
(1 hunks)feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt
(1 hunks)feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchScreen.kt
(2 hunks)feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt
(1 hunks)feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsScreen.kt
(1 hunks)feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesPresenter.kt
(1 hunks)feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesScreen.kt
(1 hunks)gradle/libs.versions.toml
(2 hunks)settings.gradle.kts
(1 hunks)
💤 Files with no reviewable changes (6)
- feature/main/src/main/res/drawable/ic_search_tab.xml
- feature/main/src/main/res/drawable/ic_selected_search_tab.xml
- feature/main/src/main/res/drawable/ic_selected_home_tab.xml
- feature/main/src/main/res/drawable/ic_selected_library_tab.xml
- feature/main/src/main/res/drawable/ic_home_tab.xml
- feature/main/src/main/res/drawable/ic_library_tab.xml
🧰 Additional context used
🧠 Learnings (20)
📓 Common learnings
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T06:08:40.883Z
Learning: In the Reed-Android project, DelegatingNavigator was removed because it caused confusion and added unnecessary complexity. The simplified approach uses childNavigator only within bottom navigation screens and rootNavigator for all other navigation, which is more intuitive and maintainable.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#45
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/appbar/ReedTopAppBar.kt:65-65
Timestamp: 2025-07-12T01:33:57.101Z
Learning: Reed Android 프로젝트에서 타이포그래피 사용 규칙: 톱 앱바(Top App Bar)에서는 `headline2SemiBold`를 사용하고, 바텀시트(Bottom Sheet)에서는 `heading2SemiBold`를 사용한다. 이는 의도적인 디자인 시스템 차별화이다.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegateNavigator.kt:0-0
Timestamp: 2025-07-16T16:11:27.044Z
Learning: In the Reed-Android project's DelegateNavigator implementation, the pop(), peek(), and peekBackStack() methods should always use childNavigator without branching logic, as they operate on the currently active navigation stack. Only goTo() and resetRoot() methods need to route between childNavigator and rootNavigator based on screen type using isMainTabScreen() function.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#55
File: core/designsystem/src/main/res/drawable/ic_x_circle.xml:6-11
Timestamp: 2025-07-17T23:41:33.887Z
Learning: Reed Android 프로젝트에서는 SVG에서 vector drawable로 변환시 색상 매핑 대신 모드별 별도 아이콘 파일을 사용하는 방식을 선호한다. Figma에서 SVG export한 형태를 그대로 사용하며, 다크모드 대응이 필요할 경우 drawable-night 폴더에 별도 아이콘을 배치하는 방식을 사용한다.
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigationPresenter.kt (3)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T06:08:40.883Z
Learning: In the Reed-Android project, DelegatingNavigator was removed because it caused confusion and added unnecessary complexity. The simplified approach uses childNavigator only within bottom navigation screens and rootNavigator for all other navigation, which is more intuitive and maintainable.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegateNavigator.kt:0-0
Timestamp: 2025-07-16T16:11:27.044Z
Learning: In the Reed-Android project's DelegateNavigator implementation, the pop(), peek(), and peekBackStack() methods should always use childNavigator without branching logic, as they operate on the currently active navigation stack. Only goTo() and resetRoot() methods need to route between childNavigator and rootNavigator based on screen type using isMainTabScreen() function.
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt (5)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T06:08:40.883Z
Learning: In the Reed-Android project, DelegatingNavigator was removed because it caused confusion and added unnecessary complexity. The simplified approach uses childNavigator only within bottom navigation screens and rootNavigator for all other navigation, which is more intuitive and maintainable.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegateNavigator.kt:0-0
Timestamp: 2025-07-16T16:11:27.044Z
Learning: In the Reed-Android project's DelegateNavigator implementation, the pop(), peek(), and peekBackStack() methods should always use childNavigator without branching logic, as they operate on the currently active navigation stack. Only goTo() and resetRoot() methods need to route between childNavigator and rootNavigator based on screen type using isMainTabScreen() function.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegateNavigator.kt:0-0
Timestamp: 2025-07-16T16:11:27.044Z
Learning: In the Reed-Android project's DelegateNavigator implementation, the pop(), peek(), and peekBackStack() methods should always use childNavigator without branching logic, as they operate on the currently active navigation stack. Only goTo() and resetRoot() methods need to route between childNavigator and rootNavigator based on screen type.
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#45
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/appbar/ReedTopAppBar.kt:65-65
Timestamp: 2025-07-12T01:33:57.101Z
Learning: Reed Android 프로젝트에서 타이포그래피 사용 규칙: 톱 앱바(Top App Bar)에서는 `headline2SemiBold`를 사용하고, 바텀시트(Bottom Sheet)에서는 `heading2SemiBold`를 사용한다. 이는 의도적인 디자인 시스템 차별화이다.
feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementScreen.kt (3)
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#35
File: feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/TermsAgreementScreen.kt:127-127
Timestamp: 2025-07-09T01:14:29.836Z
Learning: In the Reed-Android project's TermsAgreementScreen.kt, the OnTermDetailClick event is intentionally passed an empty string for the URL parameter because the actual URLs for terms detail pages haven't been decided yet. This is a temporary implementation that will be updated once the URLs are finalized.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#32
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Theme.kt:15-21
Timestamp: 2025-07-08T03:21:24.693Z
Learning: Reed Android 프로젝트에서는 다크모드/라이트모드 대응 계획이 없고 기본 테마 값만 사용할 예정이다.
feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementPresenter.kt (3)
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#35
File: feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/TermsAgreementScreen.kt:127-127
Timestamp: 2025-07-09T01:14:29.836Z
Learning: In the Reed-Android project's TermsAgreementScreen.kt, the OnTermDetailClick event is intentionally passed an empty string for the URL parameter because the actual URLs for terms detail pages haven't been decided yet. This is a temporary implementation that will be updated once the URLs are finalized.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T06:08:40.883Z
Learning: In the Reed-Android project, DelegatingNavigator was removed because it caused confusion and added unnecessary complexity. The simplified approach uses childNavigator only within bottom navigation screens and rootNavigator for all other navigation, which is more intuitive and maintainable.
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsScreen.kt (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryScreen.kt (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesScreen.kt (4)
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#45
File: feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesScreen.kt:55-59
Timestamp: 2025-07-12T03:51:35.793Z
Learning: feature/settings OSS 라이선스 화면의 현재 구현은 임시 구현이며, oss_licenses.json이 remote 데이터로 관리될 때 로딩 상태 및 에러 처리가 적용될 예정입니다.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#32
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Theme.kt:15-21
Timestamp: 2025-07-08T03:21:24.693Z
Learning: Reed Android 프로젝트에서는 다크모드/라이트모드 대응 계획이 없고 기본 테마 값만 사용할 예정이다.
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#35
File: feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/TermsAgreementScreen.kt:127-127
Timestamp: 2025-07-09T01:14:29.836Z
Learning: In the Reed-Android project's TermsAgreementScreen.kt, the OnTermDetailClick event is intentionally passed an empty string for the URL parameter because the actual URLs for terms detail pages haven't been decided yet. This is a temporary implementation that will be updated once the URLs are finalized.
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesPresenter.kt (2)
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#45
File: feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesScreen.kt:55-59
Timestamp: 2025-07-12T03:51:35.793Z
Learning: feature/settings OSS 라이선스 화면의 현재 구현은 임시 구현이며, oss_licenses.json이 remote 데이터로 관리될 때 로딩 상태 및 에러 처리가 적용될 예정입니다.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginPresenter.kt (1)
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#35
File: feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/TermsAgreementScreen.kt:127-127
Timestamp: 2025-07-09T01:14:29.836Z
Learning: In the Reed-Android project's TermsAgreementScreen.kt, the OnTermDetailClick event is intentionally passed an empty string for the URL parameter because the actual URLs for terms detail pages haven't been decided yet. This is a temporary implementation that will be updated once the URLs are finalized.
feature/main/src/main/res/drawable/ic_home.xml (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#55
File: core/designsystem/src/main/res/drawable/ic_x_circle.xml:6-11
Timestamp: 2025-07-17T23:41:33.887Z
Learning: Reed Android 프로젝트에서는 SVG에서 vector drawable로 변환시 색상 매핑 대신 모드별 별도 아이콘 파일을 사용하는 방식을 선호한다. Figma에서 SVG export한 형태를 그대로 사용하며, 다크모드 대응이 필요할 경우 drawable-night 폴더에 별도 아이콘을 배치하는 방식을 사용한다.
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedFullScreen.kt (3)
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#32
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Theme.kt:15-21
Timestamp: 2025-07-08T03:21:24.693Z
Learning: Reed Android 프로젝트에서는 다크모드/라이트모드 대응 계획이 없고 기본 테마 값만 사용할 예정이다.
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#35
File: feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/TermsAgreementScreen.kt:127-127
Timestamp: 2025-07-09T01:14:29.836Z
Learning: In the Reed-Android project's TermsAgreementScreen.kt, the OnTermDetailClick event is intentionally passed an empty string for the URL parameter because the actual URLs for terms detail pages haven't been decided yet. This is a temporary implementation that will be updated once the URLs are finalized.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#55
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/ReedTextField.kt:0-0
Timestamp: 2025-07-17T23:43:38.658Z
Learning: Reed Android 프로젝트에서 아이콘의 tint 속성을 Color.Unspecified로 설정하는 이유는 theme 색상이 아이콘에 적용되어 아이콘 고유의 색상이 변경되는 것을 방지하기 위함이다. 이는 아이콘의 원본 색상을 보존하려는 디자인 시스템 정책과 일치한다.
feature/main/src/main/res/drawable/ic_library.xml (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#55
File: core/designsystem/src/main/res/drawable/ic_x_circle.xml:6-11
Timestamp: 2025-07-17T23:41:33.887Z
Learning: Reed Android 프로젝트에서는 SVG에서 vector drawable로 변환시 색상 매핑 대신 모드별 별도 아이콘 파일을 사용하는 방식을 선호한다. Figma에서 SVG export한 형태를 그대로 사용하며, 다크모드 대응이 필요할 경우 drawable-night 폴더에 별도 아이콘을 배치하는 방식을 사용한다.
feature/main/src/main/res/drawable/ic_selected_home.xml (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#55
File: core/designsystem/src/main/res/drawable/ic_x_circle.xml:6-11
Timestamp: 2025-07-17T23:41:33.887Z
Learning: Reed Android 프로젝트에서는 SVG에서 vector drawable로 변환시 색상 매핑 대신 모드별 별도 아이콘 파일을 사용하는 방식을 선호한다. Figma에서 SVG export한 형태를 그대로 사용하며, 다크모드 대응이 필요할 경우 drawable-night 폴더에 별도 아이콘을 배치하는 방식을 사용한다.
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchScreen.kt (4)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T06:08:40.883Z
Learning: In the Reed-Android project, DelegatingNavigator was removed because it caused confusion and added unnecessary complexity. The simplified approach uses childNavigator only within bottom navigation screens and rootNavigator for all other navigation, which is more intuitive and maintainable.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
Learnt from: seoyoon513
PR: YAPP-Github/Reed-Android#45
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/appbar/ReedTopAppBar.kt:65-65
Timestamp: 2025-07-12T01:33:57.101Z
Learning: Reed Android 프로젝트에서 타이포그래피 사용 규칙: 톱 앱바(Top App Bar)에서는 `headline2SemiBold`를 사용하고, 바텀시트(Bottom Sheet)에서는 `heading2SemiBold`를 사용한다. 이는 의도적인 디자인 시스템 차별화이다.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegateNavigator.kt:0-0
Timestamp: 2025-07-16T16:11:27.044Z
Learning: In the Reed-Android project's DelegateNavigator implementation, the pop(), peek(), and peekBackStack() methods should always use childNavigator without branching logic, as they operate on the currently active navigation stack. Only goTo() and resetRoot() methods need to route between childNavigator and rootNavigator based on screen type using isMainTabScreen() function.
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeScreen.kt (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
feature/main/src/main/res/drawable/ic_selected_library.xml (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#55
File: core/designsystem/src/main/res/drawable/ic_x_circle.xml:6-11
Timestamp: 2025-07-17T23:41:33.887Z
Learning: Reed Android 프로젝트에서는 SVG에서 vector drawable로 변환시 색상 매핑 대신 모드별 별도 아이콘 파일을 사용하는 방식을 선호한다. Figma에서 SVG export한 형태를 그대로 사용하며, 다크모드 대응이 필요할 경우 drawable-night 폴더에 별도 아이콘을 배치하는 방식을 사용한다.
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/MainActivity.kt (1)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T15:54:19.322Z
Learning: In the Reed-Android project using Circuit architecture, DelegatingNavigator was restored because NavigableCircuitContent can only inject a single navigator, but the dual-navigator architecture (childNavigator for bottom navigation screens, rootNavigator for full-screen screens) requires a delegating component to work within Circuit's constraint.
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainBottomBar.kt (2)
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegateNavigator.kt:0-0
Timestamp: 2025-07-16T16:11:27.044Z
Learning: In the Reed-Android project's DelegateNavigator implementation, the pop(), peek(), and peekBackStack() methods should always use childNavigator without branching logic, as they operate on the currently active navigation stack. Only goTo() and resetRoot() methods need to route between childNavigator and rootNavigator based on screen type using isMainTabScreen() function.
Learnt from: easyhooon
PR: YAPP-Github/Reed-Android#52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegatingNavigator.kt:0-0
Timestamp: 2025-07-16T06:08:40.883Z
Learning: In the Reed-Android project, DelegatingNavigator was removed because it caused confusion and added unnecessary complexity. The simplified approach uses childNavigator only within bottom navigation screens and rootNavigator for all other navigation, which is more intuitive and maintainable.
🧬 Code Graph Analysis (2)
build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Dependencies.kt (2)
implementation
(6-8)project
(42-52)
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchScreen.kt (1)
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedFullScreen.kt (1)
ReedFullScreen
(19-33)
🔇 Additional comments (34)
gradle/libs.versions.toml (1)
19-20
: 새 라이브러리 추가 호환성 확인 필요
compose-shadow
(2.0.4) 는 Compose 1.6.x 버전을 타깃으로 컴파일되는 것으로 알려져 있습니다. 현재 BOM(androidx-compose-bom
2025.06.00) 과의 ABI 호환성이 검증되지 않았으므로, CI 빌드 및 실제 기기에서 렌더링 깨짐·빌드 실패 여부를 꼭 확인해 주세요. 문제가 발견되면 버전을2.0.5+
또는 BOM과 동일한 Compose Runtime를 요구하는 포크로 올리는 방안을 고려할 수 있습니다.Also applies to: 94-94
feature/screens/src/main/kotlin/com/ninecraft/booket/feature/screens/Screens.kt (1)
1-1
: 패키지 네임스페이스 이동이 깔끔하게 반영되었습니다모듈 리팩터링 후 패키지 선언이 일관되게 변경되었습니다. 다른 모듈에서도 동일 네임스페이스를 사용하므로 런타임 충돌 가능성은 낮아 보입니다.
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/MainActivity.kt (1)
14-14
: import 경로 업데이트 완료 확인변경된
LoginScreen
패키지 경로가 제대로 반영되었습니다. IDE 최적화 명령어(Optimize Imports) 실행 여부만 한 번 더 확인해 주세요.feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginScreen.kt (1)
27-27
: 패키지 경로 수정 문제 없음
LoginScreen
참조가 새 패키지로 교체되었으며, 어노테이션(CircuitInject)도 정상 작동할 것으로 보입니다.feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigationPresenter.kt (1)
6-8
: BottomNavigation 관련 import 정상 변경하위 네비게이션 프레젠터에서 사용하는 스크린 객체들의 패키지가 올바르게 업데이트되었습니다.
feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryScreen.kt (1)
22-22
: 패키지 경로 업데이트 확인 완료
LibraryScreen
의 패키지가 신규 네임스페이스로 정상 교체되었습니다. 별다른 이슈 없습니다.feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt (1)
13-13
: 패키지 경로 업데이트 확인 완료
SearchScreen
의 import 교체가 정상적으로 반영되었습니다.feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsScreen.kt (1)
36-36
: 패키지 경로 업데이트 확인 완료
SettingsScreen
import 가 신규 네임스페이스로 정상 교체되었습니다.feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesPresenter.kt (1)
4-4
: 패키지 경로 업데이트 확인 완료
OssLicensesScreen
import 가 신규 네임스페이스로 정상 교체되었습니다.feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesScreen.kt (1)
38-38
: 패키지 경로 업데이트 확인 완료
OssLicensesScreen
import 가 신규 네임스페이스로 정상 교체되었습니다.feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginPresenter.kt (1)
9-10
: 패키지 경로 변경 정상 반영
LoginScreen
,TermsAgreementScreen
모두feature.screens
패키지로 옮겨진 사항이 올바르게 import 되었습니다. 이후 코드 사용부(예:navigator.resetRoot
)와도 일관성이 유지됩니다. 별다른 이슈 없습니다.feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementScreen.kt (1)
37-37
: 새 패키지 경로 적용 완료
TermsAgreementScreen
객체의 import가 새 네임스페이스로 잘 교체되었습니다.@CircuitInject
어노테이션과도 동일 참조를 사용하므로 문제 없어 보입니다.feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt (1)
10-10
: BottomNavigationScreen import 업데이트 확인패키지 이동에 따른 import 수정이 완료되었습니다. 클래스 내부에서의 사용(
@CircuitInject
, 상태 이벤트 처리 등)과도 일치합니다. 추가 조치 필요 없습니다.feature/screens/build.gradle.kts (1)
7-8
: 참조 제거 완료 확인
com.ninecraft.booket.screens
문자열에 대한 전역 검색(rg -n "com.ninecraft.booket.screens") 결과, AndroidManifest, 리소스, 소스 코드 어디에도 해당 참조가 남아있지 않음을 확인했습니다. 추가 조치는 필요 없습니다.feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementPresenter.kt (1)
9-10
: import 경로 교체 완료
BottomNavigationScreen
,TermsAgreementScreen
import가 새 패키지로 교체되어 현재 모듈 구조와 일관됩니다. 별다른 이슈 없습니다.feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryPresenter.kt (1)
10-12
: 모듈 재구조화에 따른 import 경로 업데이트가 정확합니다.screens 모듈이 feature/screens로 이동됨에 따라 import 경로가 올바르게 업데이트되었습니다.
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt (1)
10-12
: 모듈 재구조화에 따른 import 경로 업데이트가 정확합니다.screens 모듈이 feature/screens로 이동됨에 따라 import 경로가 올바르게 업데이트되었습니다.
feature/main/build.gradle.kts (1)
24-24
: BottomNavigation 그림자 효과 구현을 위한 라이브러리 추가가 적절합니다.compose-shadow 라이브러리는 네이티브 Android 그림자보다 더 정교한 그림자 효과를 제공하여 Figma 디자인 구현에 도움이 됩니다.
build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt (1)
27-27
: 컨벤션 플러그인에서 모듈 의존성 경로가 올바르게 업데이트되었습니다.":screens"에서 ":feature:screens"로 변경되어 모든 feature 모듈에서 올바른 의존성 경로를 사용할 수 있습니다.
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUiState.kt (1)
10-12
: 검색 화면으로의 네비게이션을 위한 이벤트 추가가 적절합니다.OnButtonClick 이벤트가 HomeUiEvent 인터페이스에 올바르게 추가되어 Circuit 아키텍처 패턴을 따르고 있습니다.
settings.gradle.kts (1)
41-42
: 모듈 경로 변경에 따른 레퍼런스 누락 확인 요청
":feature:screens"
모듈을 추가하면서 기존":screens"
모듈을 빌드 설정에서 완전히 제거하셨는지 확인 부탁드립니다. Gradle 캐시나 IDE 인덱스에 남아 있는 경우 CI에서 “duplicate project path” 오류가 발생할 수 있습니다.core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedFullScreen.kt (1)
11-11
: 프로젝트 디자인 시스템 색상 사용으로 일관성 향상Compose 프레임워크의
Color.White
대신 프로젝트 디자인 시스템의White
색상을 사용하도록 변경한 것이 좋습니다. 이는 테마 일관성을 유지하는 올바른 접근법입니다.Also applies to: 22-22
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeScreen.kt (2)
5-5
: 필요한 import 추가 및 패키지 경로 업데이트새로운 UI 컴포넌트 사용을 위한 import와 리팩토링된 패키지 경로 업데이트가 적절합니다.
Also applies to: 7-8, 13-13, 16-16
45-52
: 검색 화면 네비게이션을 위한 임시 버튼 추가검색 화면으로의 네비게이션을 테스트하기 위한 임시 버튼이 적절하게 구현되었습니다. 16dp 간격과 이벤트 처리 로직이 올바르게 작성되었습니다.
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchScreen.kt (2)
27-27
: 필요한 import 추가 및 패키지 경로 업데이트ReedFullScreen 컴포넌트 사용을 위한 import와 리팩토링된 패키지 경로 업데이트가 적절합니다.
Also applies to: 31-31
42-42
: ReedFullScreen으로 전환하여 windowInsets 처리 개선기존 Column 레이아웃을 ReedFullScreen으로 교체한 것이 좋습니다. 이는 systemBarsPadding이 자동으로 적용되어 windowInsets 처리가 개선됩니다. PR 목표에서 언급한 대로 다른 화면들도 이 방식으로 확장할 예정이니 좋은 시작점입니다.
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt (2)
5-6
: 패키지 경로 업데이트모듈 리팩토링에 따른 패키지 경로 변경이 적절합니다.
24-34
: Circuit 패턴에 따른 이벤트 처리 구현
handleEvent
함수를 통한 이벤트 처리와eventSink
설정이 Circuit 아키텍처 패턴에 맞게 올바르게 구현되었습니다.OnButtonClick
이벤트 처리로 SearchScreen으로의 네비게이션이 적절하게 구현되었습니다.feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainTab.kt (3)
6-7
: 패키지 경로 업데이트모듈 리팩토링에 따른 패키지 경로 변경이 적절합니다.
18-19
: 아이콘 리소스명 정리
_tab
접미사를 제거하여 아이콘 리소스명을 단순화한 것이 좋습니다. 새로운 디자인 시스템에 맞는 아이콘 리소스로 업데이트되었습니다.Also applies to: 25-26
17-30
: SEARCH 탭 제거 확인MainTab enum에서 SEARCH 탭이 제거되었습니다. 이는 검색 기능을 별도 화면으로 분리하는 설계 변경으로 보입니다. 홈 화면의 임시 버튼을 통해 검색 화면으로 네비게이션하는 구조가 의도된 것인지 확인해 주세요.
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainBottomBar.kt (3)
15-15
: 새로운 import 추가 승인그림자 효과와 둥근 모서리 구현을 위한 필요한 import들이 적절히 추가되었습니다.
Also applies to: 22-22, 28-28
46-84
: BottomBar 구조 리팩토링 승인기존 HorizontalDivider를 사용한 구조에서 compose-shadow 라이브러리를 활용한 drop shadow 구현으로 개선되었습니다. 다음과 같은 장점들이 있습니다:
- 네이티브 안드로이드 그림자 대비 더 정교한 그림자 효과
- 둥근 모서리와 적절한 그림자 오프셋으로 모던한 디자인
- modifier 순서가 올바르게 적용됨 (dropShadow → clip → background)
- 높이가 58.dp로 조정되어 디자인 요구사항에 부합
109-109
: 테마 기반 스페이싱 및 타이포그래피 적용 승인하드코딩된 값들을 테마 기반 스페이싱과 타이포그래피로 교체하여 디자인 시스템 일관성이 향상되었습니다:
ReedTheme.spacing
사용으로 일관된 여백 적용- 아이콘과 텍스트 사이 적절한 간격 추가
- 선택 상태에 따른 색상 구분 (
contentPrimary
/contentSecondary
)caption2Regular
타이포그래피로 일관된 텍스트 스타일 적용Also applies to: 116-116, 119-121
|
저도 동의합니다! |
1860353 반영 완료 |
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.
LGTM~
🔗 관련 이슈
📙 작업 설명
🧪 테스트 내역 (선택)
📸 스크린샷 또는 시연 영상 (선택)
bottom-navigation.mp4
💬 추가 설명 or 리뷰 포인트 (선택)
reference)
https://github.com/slackhq/circuit/blob/main/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/CrossFadeNavDecorator.kt
https://github.com/easyhooon/CircuitScreenAnimation
Summary by CodeRabbit
신규 기능
UI 개선
리소스 변경
기타