Skip to content

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

Merged
merged 6 commits into from
Jul 19, 2025
Merged

feat: BottomNavigation 구현 #58

merged 6 commits into from
Jul 19, 2025

Conversation

easyhooon
Copy link
Contributor

@easyhooon easyhooon commented Jul 18, 2025

🔗 관련 이슈

📙 작업 설명

  • compose-shadow 라이브러리 의존성 추가
  • BottomNavigation Figma 시안 반영
  • 도서 검색 화면으로 이동할 수 있는 임시 버튼 HomeScreen에 만들기
  • screens 모듈 feature 모듈 내부로 이동

🧪 테스트 내역 (선택)

  • 주요 기능 정상 동작 확인
  • 브라우저/기기에서 동작 확인
  • 엣지 케이스 테스트 완료
  • 기존 기능 영향 없음

📸 스크린샷 또는 시연 영상 (선택)

bottom-navigation.mp4

💬 추가 설명 or 리뷰 포인트 (선택)

  • figma 특유의 shadow와 Android에서 지원하는 shadow가 달라, 좀 더 유려하게 shadow 관련 처리를 할 수 있는 compose-shadow 라이브러리를 사용해보았습니다(써보고 싶었어요)
  • :screens 모듈 생성이후 계속 고민을 해봤는데, 얘가 절대로 app, core, feature 모듈들과 같은 위계를 가질 정도로 대단한 모듈은 아닌 것 같다고 생각이 들었습니다.(core, feature는 껍데기 모듈이긴한데...화면 단위로 feature를 보통 나누는 관계로 screens도 feature로)
  • 이러면 'feature 모듈간 의존성이 생기는것 아닌가?' 라고 생각이 들 수 있는데 단방향 의존을 보장하기 때문에 문제는 없을 듯 합니다. 더욱이 예전에 들었던 발표에서도 feature 모듈간 화면 이동시 서로간의 의존성을 해소하기 위한 솔루션으로 feature:navigator 모듈을 제시했던 것이 생각이나 어느정도 당위성도 챙기는...
  • 검색화면이 BottomNavigation(Scaffold)에서 빠져나와 windowInsets 대응을 위해 ReedFullScreen을 사용해봤는데, 이후 다른 화면들도 작업하면서 적용하면 될듯하네여
  • 현재 Circuit Navigation의 애니메이션이 Default 설정으로 되어있는데(left-in, right-out), 디자이너들이 생각하는 애니메이션은 이와 다를 수 있으므로 내일 한번 검사맡으면 좋을 것 같아요. 기존 Compose Naivgation 의 Default Animation인 fade-in, fade-out으로도 변경이 가능합니다. (그밖에 다른 애니메이션도 Compose Animation API를 이용해서 구현가능!)

언제 부턴가 Acitivity 이동시 기본 애니메이션이 left-in ,right-out이 되었던데 이것과 통일성이 있긴하더군여

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

  • 신규 기능

    • 홈 화면에 "Navigate To Search" 버튼이 추가되어, 클릭 시 검색 화면으로 이동할 수 있습니다.
    • 하단 바(MainBottomBar)에 그림자와 라운드 코너가 적용되어 더욱 세련된 디자인을 제공합니다.
  • UI 개선

    • 하단 바 아이콘 및 텍스트 스타일이 테마 기반으로 변경되고, 탭 아이콘 리소스가 새롭게 교체되었습니다.
    • 검색 화면의 레이아웃이 전체 화면 컴포넌트로 감싸지도록 개선되었습니다.
    • ReedFullScreen의 기본 배경색이 디자인 시스템의 화이트 컬러로 변경되었습니다.
  • 리소스 변경

    • 하단 바 관련 아이콘 리소스가 새롭게 추가 및 교체되었으며, 사용하지 않는 탭 아이콘 리소스는 제거되었습니다.
  • 기타

    • 내부 패키지 및 모듈 경로가 일관성 있게 정리되었습니다.
    • 새로운 Compose 라이브러리(Shadow)가 추가되었습니다.

Copy link

coderabbitai bot commented Jul 18, 2025

"""

Walkthrough

프로젝트 내 screens 모듈이 feature/screens로 이동 및 네임스페이스가 변경되었습니다. 이에 따라 관련 의존성, import 경로, Gradle 설정, 패키지 선언이 일괄 수정되었습니다. BottomNavigation UI는 Figma 시안에 맞춰 리팩토링되었고, 아이콘 리소스가 추가·삭제되었습니다. Home 화면에 검색 화면으로 이동하는 임시 버튼이 추가되었습니다.

Changes

파일/경로 그룹 변경 요약
settings.gradle.kts, build-logic/.../AndroidFeatureConventionPlugin.kt, feature/screens/build.gradle.kts, feature/screens/src/main/kotlin/com/ninecraft/booket/feature/screens/Screens.kt :screens 모듈을 :feature:screens로 이동, 네임스페이스 및 패키지 선언 변경, Gradle 설정 및 의존성 경로 수정
feature/*/src/main/kotlin/com/ninecraft/booket/feature/*/*.kt 모든 관련 import 경로를 com.ninecraft.booket.screenscom.ninecraft.booket.feature.screens로 변경
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainBottomBar.kt, MainTab.kt BottomNavigation UI Figma 시안 반영, tab enum에서 SEARCH 삭제, 아이콘 리소스명 변경, 테마 기반 스타일 적용, 그림자 효과 추가
feature/main/src/main/res/drawable/ic_home.xml, ic_library.xml, ic_selected_home.xml, ic_selected_library.xml 새로운 벡터 아이콘 리소스 추가
feature/main/src/main/res/drawable/ic_home_tab.xml, ic_library_tab.xml, ic_search_tab.xml, ic_selected_home_tab.xml, ic_selected_library_tab.xml, ic_selected_search_tab.xml 기존 tab용 벡터 아이콘 리소스 삭제
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt, HomeScreen.kt, HomeUiState.kt Home 화면에 이벤트 처리 추가, 버튼 클릭 시 검색 화면으로 이동, 임시 버튼 및 이벤트 추가
feature/main/build.gradle.kts, gradle/libs.versions.toml compose-shadow 라이브러리 의존성 추가 및 버전 관리
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedFullScreen.kt 배경색 기본값을 프로젝트 테마의 White로 변경
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchScreen.kt ReedFullScreen 컴포저블로 레이아웃 래핑 방식 변경

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: 화면 전환
Loading

Possibly related PRs

Suggested labels

✨ feat

Suggested reviewers

  • seoyoon513

Poem

🐰
새로워진 바텀바에 그림자 드리우고
홈에서 검색으로, 버튼 하나로 쏙!
아이콘도 반짝반짝, 테마 색상 입었네
screens는 feature로, 길을 잘 찾아갔지
토끼도 뛰놀 듯, 코드도 산뜻하게!

"""


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1899b6c and 1860353.

📒 Files selected for processing (1)
  • feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainBottomBar.kt (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/component/MainBottomBar.kt
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: ci-build
✨ 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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

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

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

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

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ 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.xmlic_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: 동일 쿼리 중복 호출‧경합 가능성 있음

searchBooksscope.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: 벡터 드로어블 크기·색상 하드코딩 재검토 필요

  1. android:width="25dp" / android:height="24dp" 처럼 비대칭 크기를 사용하면 BottomNavigation 아이콘 정렬이 미묘하게 틀어질 수 있습니다. Material Icons 기본 규격(24×24dp)을 그대로 쓰는 편이 안전합니다.
  2. 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

📥 Commits

Reviewing files that changed from the base of the PR and between ef55179 and 1899b6c.

📒 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

@seoyoon513
Copy link
Contributor

figma 특유의 shadow와 Android에서 지원하는 shadow가 달라, 좀 더 유려하게 shadow 관련 처리를 할 수 있는 compose-shadow 라이브러리를 사용해보았습니다(써보고 싶었어요)

디자인 요구사항에는 바텀네비에 shadow가 없어서 내일 한번 물어봐야겠네요 🤔
image

@seoyoon513
Copy link
Contributor

:screens 모듈 생성이후 계속 고민을 해봤는데, 얘가 절대로 app, core, feature 모듈들과 같은 위계를 가질 정도로 대단한 모듈은 아닌 것 같다고 생각이 들었습니다.(core, feature는 껍데기 모듈이긴한데...화면 단위로 feature를 보통 나누는 관계로 screens도 feature로)

저도 동의합니다!
feature 내 모듈들의 순환참조를 막기 위한, feature 연관된 네비게이션 역할을 한다는 관점에서 feature:screen이 적합한 것 같아요

@easyhooon
Copy link
Contributor Author

디자인 요구사항에는 바텀네비에 shadow가 없어서 내일 한번 물어봐야겠네요 🤔

image

피그마보니까 맨아래 뭐가 있던데, 저건 뭐지 왠지 좀 다르게 보이긴했..

@seoyoon513
Copy link
Contributor

seoyoon513 commented Jul 18, 2025

shadow가 들어가 있는 것 같네요. 디자인 요구사항 자세히 보니 그림자 색상 Opacity 적용 + 바텀네비 border 조합이라 그 방향으로 수정하면 될 것 같습니다

적용 전 적용 후
@Composable
internal fun MainBottomBar(
    tabs: ImmutableList<MainTab>,
    currentTab: MainTab?,
    onTabSelected: (MainTab) -> Unit,
    modifier: Modifier = Modifier,
) {
    Box(
        modifier = modifier
            .dropShadow(
                shape = RoundedCornerShape(
                    topStart = ReedTheme.spacing.spacing3,
                    topEnd = ReedTheme.spacing.spacing3,
                ),
                color = Color(0x0D6D6D6D), // 5% Opacity 적용
                offsetY = (-4).dp,
                blur = 20.dp,
            )
            .clip(
                RoundedCornerShape(
                    topStart = ReedTheme.spacing.spacing3,
                    topEnd = ReedTheme.spacing.spacing3,
                ),
            )
            .border(width = 1.dp, color = ReedTheme.colors.borderPrimary, // border 추가
                shape = RoundedCornerShape(
                    topStart = ReedTheme.spacing.spacing3,
                    topEnd = ReedTheme.spacing.spacing3,
                )
            )
            .background(White),
    )

@easyhooon
Copy link
Contributor Author

shadow가 들어가 있는 것 같네요. 디자인 요구사항 자세히 보니 그림자 색상 Opacity 적용 + 바텀네비 border 조합이라 그 방향으로 수정하면 될 것 같습니다

1860353 반영 완료

Copy link
Contributor

@seoyoon513 seoyoon513 left a comment

Choose a reason for hiding this comment

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

LGTM~

@easyhooon easyhooon merged commit 756f2c1 into develop Jul 19, 2025
4 checks passed
@easyhooon easyhooon deleted the BOOK-150-feature/#56 branch July 19, 2025 02:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BOOK-150/feat] BottomNavigation 구현
2 participants