Skip to content

feat: 독서 기록 플로우 화면 구성(OCR 문장 스캔이전까지)#66

Merged
easyhooon merged 13 commits intodevelopfrom
BOOK-156-feature/#62
Jul 24, 2025
Merged

feat: 독서 기록 플로우 화면 구성(OCR 문장 스캔이전까지)#66
easyhooon merged 13 commits intodevelopfrom
BOOK-156-feature/#62

Conversation

@easyhooon
Copy link
Copy Markdown
Contributor

@easyhooon easyhooon commented Jul 23, 2025

🔗 관련 이슈

📙 작업 설명

  • ReedProgress?Bar, ReedRecordTextField, ReedButton(StrokeStyle) 추가
  • RecordRegister 화면 구현 완료
  • 문장 기록시 keyboard 관련 들썩 거림 문제 해결을 위한 windowSoftInputMode = adjustResize 옵션 적용
  • 고수준 컴포넌트 core:designsystem 모듈에서 core:ui 모듈로 이동

🧪 테스트 내역 (선택)

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

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

기능 미리보기 기능 미리보기
독서 기록 등록 화면 독서 기록 탈주 다이얼로그

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

  • ProgressBar에 별다른 애니메이션이 없을 것으로 예상되어, (TopBar + ProgressBar 영역 고정 하단 컴포넌트영역만 바뀌는건지,, 그러면 애니메이션이 필요할텐데) 우선 static 하게 ProgressBar를 구성해봤는데, 이후 수정 필요하면 반영하겠습니다.

  • 페이지 입력 텍스트필드의 validation 체크 및 errorText 노출은, 이후 페이지수와 같은 메타데이터를 가져올수 있게되면 validation을 적용하여 연동하도록 하겠습니다.

  • ReedDialog 관련 Figma 의 시안을 만족시키기 위해(description이 한줄로 보이도록) DialogProperties 내에 usePlatformDefaultWidth = false 적용하여 Dialog의 가로 길이 제한을 풀었는데, 이럴 경우 화면 가로길이 전체 영역을 차지하게 되어, horizontal 에 대한 추가 패딩을 적용하였습니다. 다른 ReedDialog를 사용하는 화면에 SideEffect가 발생할 것으로 예상되는데 확인해봐야할듯함니다.

관련해서 이전에 작성했던 글이 있어서 첨부
reference)
https://velog.io/@mraz3068/Creating-Responsive-Dialog-with-Equal-Width-and-Height-in-Jetpack-Compose

Summary by CodeRabbit

  • 신규 기능

    • 독서 기록(Record) 기능이 추가되어, 홈 화면에서 "독서 기록 작성" 버튼을 통해 기록 등록 화면으로 이동할 수 있습니다.
    • 기록 등록 화면에서 페이지와 문장을 입력하고, 다음 단계로 이동하거나 스캔 버튼 및 종료 확인 다이얼로그를 사용할 수 있습니다.
    • 기록 단계 진행 상황을 표시하는 ProgressBar 컴포넌트가 추가되었습니다.
    • 입력 필드 UI가 개선된 ReedRecordTextField 컴포넌트가 도입되었습니다.
    • 기록 등록에 필요한 한글 UI 문자열이 새로 추가되었습니다.
  • UI 개선

    • 버튼 스타일에 외곽선(STROKE) 스타일이 추가되어 다양한 버튼 디자인이 가능해졌습니다.
    • 버튼 미리보기에서 STROKE 스타일 버튼이 추가되어 스타일 확인이 용이해졌습니다.
    • 일부 UI 컴포넌트의 패키지 위치가 정리되어 유지보수가 용이해졌습니다.
    • 다이얼로그 내부에 가로 패딩이 추가되고, 기본 너비 설정이 변경되어 UI가 개선되었습니다.
  • 버그 수정 및 기타

    • 소프트 키보드 표시 시 메인 화면이 자동으로 리사이즈되도록 설정이 변경되었습니다.
    • 프로젝트에 새로운 모듈 feature:record가 추가되어 빌드 설정에 포함되었습니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 23, 2025

"""

Walkthrough

새로운 독서 기록(Record) 기능 모듈이 추가되고, 관련된 UI 플로우, 상태, 이벤트, 프레젠터, 문자열 리소스, 그리고 프로그래스바 및 입력 필드 등 디자인 시스템 컴포넌트가 도입되었습니다. 여러 기존 컴포넌트의 패키지 이동, 의존성 및 import 경로 정리, 그리고 홈 화면에서 Record 플로우 진입 이벤트가 연결되었습니다.

Changes

파일/경로 그룹 변경 요약
app/build.gradle.kts, settings.gradle.kts feature:record 모듈 의존성 및 프로젝트 포함
app/src/main/AndroidManifest.xml, feature/main/src/main/AndroidManifest.xml 매니페스트 속성 순서 조정 및 soft input 모드 추가
core/designsystem/build.gradle.kts, core/ui/build.gradle.kts compose.keyboard.state 의존성 추가/제거
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/RecordStep.kt RecordStep enum 클래스 추가
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/RecordProgressBar.kt RecordProgressBar 컴포저블 추가
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/ReedDivider.kt
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedSearchTextField.kt
패키지 선언 변경
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ButtonColorStyle.kt ReedButtonColorStyle에 STROKE 스타일 및 borderStroke 함수 추가
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ReedButton.kt FlowRow 적용, STROKE 스타일 버튼 프리뷰 추가, border 파라미터 적용
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedRecordTextField.kt ReedRecordTextField 컴포저블 및 프리뷰 추가
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/ReedScaffold.kt
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedBottomSheet.kt
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedTopAppBar.kt
패키지 선언 변경
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedDialog.kt 패키지 선언, DialogProperties 적용, 내부 padding 추가
feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/BookDetailUi.kt
feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterBottomSheet.kt
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterSuccessBottomSheet.kt
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsUi.kt
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/component/WithdrawConfirmationBottomSheet.kt
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesUi.kt
feature/webview/src/main/kotlin/com/ninecraft/booket/feature/webview/WebViewUi.kt
import 경로 변경
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUi.kt
feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUiState.kt
RecordScreen 진입 이벤트 및 UI 버튼/이벤트 추가
feature/record/.gitignore /build 무시 추가
feature/record/build.gradle.kts feature/record 모듈용 Gradle 빌드 스크립트 추가
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterPresenter.kt RecordRegisterPresenter 클래스 및 Factory 추가
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt RecordRegister UI 및 프리뷰, CircuitInject 적용, 다이얼로그 등 구현
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUiState.kt RecordUiState, RecordRegisterUiEvent 정의
feature/record/src/main/res/values/strings.xml 독서 기록 관련 string 리소스 14개 추가
feature/screens/src/main/kotlin/com/ninecraft/booket/feature/screens/Screens.kt RecordScreen 데이터 오브젝트 추가
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt import 경로 변경
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt queryState 기본값 생성자 인자 변경

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant HomeScreen
    participant HomePresenter
    participant Navigator
    participant RecordScreen
    participant RecordRegisterPresenter
    participant RecordRegisterUi

    User->>HomeScreen: "독서 기록 작성" 버튼 클릭
    HomeScreen->>HomePresenter: OnRecordButtonClick 이벤트
    HomePresenter->>Navigator: goTo(RecordScreen)
    Navigator->>RecordScreen: 화면 이동
    RecordScreen->>RecordRegisterPresenter: present()
    RecordRegisterPresenter->>RecordRegisterUi: 상태 전달
    User->>RecordRegisterUi: 입력/버튼/뒤로가기 등 상호작용
    RecordRegisterUi->>RecordRegisterPresenter: RecordRegisterUiEvent 전달
    RecordRegisterPresenter->>RecordRegisterUi: 상태 갱신 및 반영
Loading

Estimated code review effort

3 (~45분)

Suggested labels

✨ feat

Suggested reviewers

  • seoyoon513

Poem

🐇
새싹처럼 자라난 Record의 길,
버튼을 누르면 새로운 화면이 펼쳐지고,
프로그래스 바가 살짝살짝 빛나네.
입력창엔 나만의 문장,
다이얼로그엔 조심스런 이별 인사.
오늘도 코드밭에 토끼는 신나게 뛰논다!
🥕✨
"""


📜 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 b262588 and 6fc9aff.

📒 Files selected for processing (1)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/RecordStep.kt (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/RecordStep.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
Copy Markdown

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

🧹 Nitpick comments (7)
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/RecordStep.kt (1)

3-7: enum 값 정의 방식 개선을 고려해보세요.

현재 하드코딩된 정수 값을 사용하고 있는데, ordinal 프로퍼티를 활용하면 더 간결하게 구현할 수 있습니다.

-enum class RecordStep(val value: Int) {
-    REGISTER(0),
-    APPRECIATION(1),
-    EMOTION(2),
-}
+enum class RecordStep {
+    REGISTER,
+    APPRECIATION,
+    EMOTION;
+    
+    val value: Int get() = ordinal
+}

또는 명시적인 값이 필요한 경우라면 각 단계에 대한 문서 주석을 추가하는 것을 권장합니다.

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterBottomSheet.kt (1)

81-86: 아이콘 접근성 문자열을 string 리소스로 분리하세요

contentDescription = "Close Icon" 과 같이 하드코딩된 영어 문자열이 포함되어 있습니다. 다국어 지원 및 접근성을 위해 strings.xml 에 정의한 뒤 stringResource() 로 불러오시는 편이 좋습니다.

- contentDescription = "Close Icon",
+ contentDescription = stringResource(R.string.content_desc_close),
feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/component/WithdrawConfirmationBottomSheet.kt (1)

90-104: Row 배치 방식이 버튼 폭을 왜곡할 수 있습니다

Row 에서

horizontalArrangement = Arrangement.SpaceBetween

을 사용하면서 동시에 두 버튼에 weight(1f) 를 주고 가운데 Spacer 를 두고 있습니다. SpaceBetween 은 가용 공간을 양 끝과 항목 사이에 균등 분배하므로, 의도한 Spacer 간격 이상으로 벌어져 버튼 폭이 불균등해질 수 있습니다.

간단히 Arrangement.spacedBy(ReedTheme.spacing.spacing2) 로 교체하면 가독성 및 예측 가능성이 개선됩니다.

-horizontalArrangement = Arrangement.SpaceBetween,
+horizontalArrangement = Arrangement.spacedBy(ReedTheme.spacing.spacing2),
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/RecordProgressBar.kt (1)

33-33: 진행률 표시 로직을 개선하세요.

현재 currentStep.value == index 비교는 정확히 현재 단계만 강조표시합니다. 일반적인 진행률 바는 현재 단계까지의 모든 단계를 완료된 것으로 표시합니다.

다음과 같이 수정하는 것을 고려해보세요:

-                        color = if (currentStep.value == index) {
+                        color = if (currentStep.value >= index) {
                             ReedTheme.colors.bgPrimary
                         } else {
                             ReedTheme.colors.bgDisabled
                         },
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt (3)

51-53: BackHandler와 TopAppBar의 뒤로가기 동작이 중복됩니다.

두 곳 모두 같은 이벤트를 발생시키므로 코드 중복을 줄이고 일관성을 보장하기 위해 공통 함수로 추출하는 것을 고려해보세요.

+    val onBackAction = { state.eventSink(RecordRegisterUiEvent.OnBackButtonClick) }
+
     BackHandler {
-        state.eventSink(RecordRegisterUiEvent.OnBackButtonClick)
+        onBackAction()
     }

     ReedFullScreen(
         modifier = modifier.fillMaxSize(),
     ) {
         ReedBackTopAppBar(
-            onBackClick = {
-                state.eventSink(RecordRegisterUiEvent.OnBackButtonClick)
-            },
+            onBackClick = onBackAction,
         )

95-98: RecordProgressBar에 불필요한 modifier가 전달되고 있습니다.

RecordProgressBar에 전달되는 modifier가 함수 파라미터와 동일한 이름이지만 실제로는 RecordRegisterContent의 modifier입니다. 혼동을 피하기 위해 명확한 이름을 사용하거나 별도의 modifier를 사용해주세요.

         RecordProgressBar(
             currentStep = RecordStep.REGISTER,
-            modifier = modifier,
+            modifier = Modifier,
         )

182-184: Preview의 상태가 불완전합니다.

Preview에서 사용하는 RecordUiState가 기본값만 가지고 있어서 실제 동작을 확인하기 어렵습니다. 더 현실적인 미리보기를 위해 샘플 데이터를 포함한 상태를 사용하는 것을 고려해보세요.

 @DevicePreview
 @Composable
 private fun RecordRegisterPreview() {
+    val sampleState = RecordUiState(
+        eventSink = {},
+        // 샘플 데이터 추가 고려
+    )
     ReedTheme {
         RecordRegister(
-            state = RecordUiState(
-                eventSink = {},
-            ),
+            state = sampleState,
         )
     }
 }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 5640208 and b262588.

📒 Files selected for processing (37)
  • app/build.gradle.kts (1 hunks)
  • app/src/main/AndroidManifest.xml (1 hunks)
  • core/designsystem/build.gradle.kts (0 hunks)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/RecordStep.kt (1 hunks)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/RecordProgressBar.kt (1 hunks)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/ReedDivider.kt (1 hunks)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ButtonColorStyle.kt (3 hunks)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ReedButton.kt (18 hunks)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedRecordTextField.kt (1 hunks)
  • core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedSearchTextField.kt (1 hunks)
  • core/ui/build.gradle.kts (1 hunks)
  • core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/ReedScaffold.kt (1 hunks)
  • core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedBottomSheet.kt (1 hunks)
  • core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedDialog.kt (3 hunks)
  • core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedTopAppBar.kt (1 hunks)
  • feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/BookDetailUi.kt (1 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/HomeUi.kt (1 hunks)
  • feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUiState.kt (1 hunks)
  • feature/main/src/main/AndroidManifest.xml (1 hunks)
  • feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt (1 hunks)
  • feature/record/.gitignore (1 hunks)
  • feature/record/build.gradle.kts (1 hunks)
  • feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterPresenter.kt (1 hunks)
  • feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt (1 hunks)
  • feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUiState.kt (1 hunks)
  • feature/record/src/main/res/values/strings.xml (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/SearchUi.kt (1 hunks)
  • feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt (1 hunks)
  • feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterBottomSheet.kt (1 hunks)
  • feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterSuccessBottomSheet.kt (1 hunks)
  • feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsUi.kt (1 hunks)
  • feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/component/WithdrawConfirmationBottomSheet.kt (1 hunks)
  • feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesUi.kt (1 hunks)
  • feature/webview/src/main/kotlin/com/ninecraft/booket/feature/webview/WebViewUi.kt (1 hunks)
  • settings.gradle.kts (1 hunks)
💤 Files with no reviewable changes (1)
  • core/designsystem/build.gradle.kts
🧰 Additional context used
🧠 Learnings (26)
📓 Common learnings
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.
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/ReedScaffold.kt (4)

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

core/ui/build.gradle.kts (1)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterSuccessBottomSheet.kt (4)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: seoyoon513
PR: #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를 사용한다. 이는 의도적인 디자인 시스템 차별화이다.

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedTopAppBar.kt (5)

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: seoyoon513
PR: #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: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

settings.gradle.kts (1)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedSearchTextField.kt (1)

Learnt from: seoyoon513
PR: #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.

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedBottomSheet.kt (5)

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: seoyoon513
PR: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: easyhooon
PR: #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/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/BookDetailUi.kt (6)

Learnt from: easyhooon
PR: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: seoyoon513
PR: #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: seoyoon513
PR: #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: #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: #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/OssLicensesUi.kt (5)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: seoyoon513
PR: #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: #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: seoyoon513
PR: #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: seoyoon513
PR: #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/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterBottomSheet.kt (6)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: seoyoon513
PR: #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: #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: #55
File: core/designsystem/src/main/res/drawable/ic_x_circle.xml:6-11
Timestamp: 2025-07-17T23:41:33.929Z
Learning: Reed Android 프로젝트에서는 SVG에서 vector drawable로 변환시 색상 매핑 대신 모드별 별도 아이콘 파일을 사용하는 방식을 선호한다. Figma에서 SVG export한 형태를 그대로 사용하며, 다크모드 대응이 필요할 경우 drawable-night 폴더에 별도 아이콘을 배치하는 방식을 사용한다.

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt (5)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: seoyoon513
PR: #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: #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: seoyoon513
PR: #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: seoyoon513
PR: #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/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt (2)

Learnt from: easyhooon
PR: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/component/WithdrawConfirmationBottomSheet.kt (4)

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: seoyoon513
PR: #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/screens/src/main/kotlin/com/ninecraft/booket/feature/screens/Screens.kt (1)

Learnt from: seoyoon513
PR: #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/record/build.gradle.kts (2)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: easyhooon
PR: #46
File: core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/BookSearchResponse.kt:33-44
Timestamp: 2025-07-14T00:51:38.952Z
Learning: The project uses Kotlinx Serialization with JSON configuration that includes ignoreUnknownKeys = true, encodeDefaults = true, isLenient = true, and prettyPrint = true to handle API response parsing robustly, making additional null safety measures less critical if the API consistently provides all expected fields.

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedDialog.kt (3)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/ReedDivider.kt (3)

Learnt from: easyhooon
PR: #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: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

app/build.gradle.kts (1)

Learnt from: easyhooon
PR: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt (7)

Learnt from: easyhooon
PR: #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: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: #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: #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/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterPresenter.kt (1)

Learnt from: easyhooon
PR: #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/webview/src/main/kotlin/com/ninecraft/booket/feature/webview/WebViewUi.kt (6)

Learnt from: easyhooon
PR: #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: seoyoon513
PR: #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: #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: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: easyhooon
PR: #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.

feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsUi.kt (7)

Learnt from: easyhooon
PR: #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: #61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 booket.android.feature convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Learnt from: seoyoon513
PR: #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: #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: #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: #55
File: core/designsystem/src/main/res/drawable/ic_x_circle.xml:6-11
Timestamp: 2025-07-17T23:41:33.929Z
Learning: Reed Android 프로젝트에서는 SVG에서 vector drawable로 변환시 색상 매핑 대신 모드별 별도 아이콘 파일을 사용하는 방식을 선호한다. Figma에서 SVG export한 형태를 그대로 사용하며, 다크모드 대응이 필요할 경우 drawable-night 폴더에 별도 아이콘을 배치하는 방식을 사용한다.

Learnt from: seoyoon513
PR: #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 프로젝트에서는 다크모드/라이트모드 대응 계획이 없고 기본 테마 값만 사용할 예정이다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ButtonColorStyle.kt (1)

Learnt from: seoyoon513
PR: #32
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ButtonColorStyle.kt:10-16
Timestamp: 2025-07-08T12:33:01.863Z
Learning: Reed Android 프로젝트에서 KAKAO 버튼 스타일은 디자이너가 pressed 상태 색상을 별도로 정의하지 않았기 때문에 pressed 상태에서도 동일한 Kakao 색상을 사용한다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ReedButton.kt (1)

Learnt from: seoyoon513
PR: #32
File: core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ButtonColorStyle.kt:10-16
Timestamp: 2025-07-08T12:33:01.863Z
Learning: Reed Android 프로젝트에서 KAKAO 버튼 스타일은 디자이너가 pressed 상태 색상을 별도로 정의하지 않았기 때문에 pressed 상태에서도 동일한 Kakao 색상을 사용한다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedRecordTextField.kt (2)

Learnt from: seoyoon513
PR: #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: #55
File: feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt:44-44
Timestamp: 2025-07-17T18:40:41.210Z
Learning: rememberTextFieldState()는 내부적으로 rememberSaveable(saver = TextFieldState.Saver)를 사용하여 구현되어 있어, 화면 회전이나 프로세스 재시작 시에도 텍스트 상태가 자동으로 보존된다. 따라서 추가적인 rememberRetained 래핑이 불필요하다.

🧬 Code Graph Analysis (3)
feature/record/build.gradle.kts (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Dependencies.kt (1)
  • ksp (14-16)
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedRecordTextField.kt (1)
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Theme.kt (1)
  • ReedTheme (14-21)
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt (7)
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedFullScreen.kt (1)
  • ReedFullScreen (19-33)
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedTopAppBar.kt (1)
  • ReedBackTopAppBar (81-94)
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedDialog.kt (1)
  • ReedDialog (25-104)
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/RecordProgressBar.kt (1)
  • RecordProgressBar (17-42)
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedRecordTextField.kt (1)
  • ReedRecordTextField (39-110)
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ReedButton.kt (1)
  • ReedButton (33-100)
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Theme.kt (1)
  • ReedTheme (14-21)
⏰ 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
🔇 Additional comments (44)
settings.gradle.kts (1)

41-41: 새로운 feature:record 모듈 추가가 적절합니다.

독서 기록 기능을 위한 새로운 모듈이 기존 feature 모듈들과 일관된 구조로 추가되었습니다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ButtonColorStyle.kt (5)

3-5: 새로운 STROKE 스타일을 위한 import 추가가 적절합니다.

BorderStroke와 dp import가 새로운 borderStroke 함수를 위해 올바르게 추가되었습니다.


10-10: STROKE 스타일 추가가 적절합니다.

새로운 테두리 버튼 스타일이 기존 enum 패턴과 일관되게 추가되었습니다.


17-17: STROKE 스타일의 배경색 처리가 적절합니다.

테두리 버튼의 특성상 pressed 상태에서도 배경색을 동일하게 유지하는 것이 올바른 구현입니다.


26-26: STROKE 스타일의 텍스트 색상이 적절합니다.

contentBrand 색상을 사용하여 일관된 디자인 시스템을 유지하고 있습니다.


36-40: borderStroke 함수 구현이 우수합니다.

STROKE 스타일에서만 테두리를 제공하고, 적절한 두께(1dp)와 브랜드 색상을 사용한 깔끔한 구현입니다.

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/ReedScaffold.kt (1)

1-1: 패키지 이동 일관성 검증 완료

ReedScaffold의 import 경로가 새 패키지(com.ninecraft.booket.core.ui)로 모두 업데이트되었으며, 기존 패키지(com.ninecraft.booket.core.designsystem.component)의 잔존 레퍼런스가 없습니다. 따라서 패키지 이동을 승인합니다.

  • 확인된 사용처
    • feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt
      import com.ninecraft.booket.core.ui.ReedScaffold
core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedBottomSheet.kt (1)

1-1: 패키지 일관성 검증 완료 및 승인

  • ReedBottomSheet의 모든 사용처가 com.ninecraft.booket.core.ui.component.ReedBottomSheet로 업데이트되었습니다.
  • 더 이상 com.ninecraft.booket.core.designsystem.component.bottomsheet.ReedBottomSheet에 대한 참조가 없습니다.

해당 패키지 이동을 승인합니다.

feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/bottomnavigation/BottomNavigation.kt (1)

7-7: ReedScaffold 레거시 import 없음 확인 완료
스크립트를 통해 com.ninecraft.booket.core.designsystem.component.ReedScaffold 호출부가 전혀 발견되지 않음을 확인했습니다. 컴파일 오류 우려가 없으므로 추가 조치 불필요합니다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedSearchTextField.kt (1)

1-1: 레거시 참조 경로 없음 확인
전역 검색 결과 import com.ninecraft.booket.core.designsystem.component.ReedTextField 사용 흔적이 없습니다. 기존 패키지 경로를 참조하는 코드가 없어 추가 수정이 필요하지 않습니다.

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedTopAppBar.kt (1)

1-1: 패키지 변경 검증 완료: 레거시 참조 없음

rg를 통해 com.ninecraft.booket.core.designsystem.component.appbar.Reed(Top|Back|Close)TopAppBar에 대한 임포트를 전수 검색한 결과, 이전 패키지를 참조하는 구문이 발견되지 않았습니다. 추가 작업 없이 머지하셔도 됩니다.

feature/record/.gitignore (1)

1-1: 모듈별 /build 제외 규칙은 중복이지만 무해합니다

루트 .gitignore 에 이미 /build 규칙이 있다면 기능적으로 동일하므로, 모듈 로컬 .gitignore 추가는 선택 사항입니다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/ReedDivider.kt (1)

1-1: 패키지 이동 후 component.divider 참조 없음 확인 완료

리포지토리 전체에서 component.divider 경로에 대한 import 및 직접 참조를 검사한 결과, 잔존 경로가 발견되지 않았습니다. 추가 조치가 필요 없습니다.

feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/BookDetailUi.kt (1)

11-11: 새 패키지로의 변경 반영 완료

ReedBackTopAppBar 경로가 core.ui.component로 정상 교체되었습니다. 추가 수정 사항은 없어 보이며, 컴파일 오류만 재확인하면 됩니다.

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookRegisterSuccessBottomSheet.kt (1)

23-23: BottomSheet 패키지 경로 업데이트 확인

ReedBottomSheet가 새 ui 모듈 위치로 옮겨진 것이 반영되었습니다. 나머지 코드와 의존성도 일관성을 유지합니다.

feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/osslicenses/OssLicensesUi.kt (1)

34-34: TopAppBar 경로 교체 정상

설정 모듈에서도 새 패키지(core.ui.component)를 사용하도록 수정되었습니다. 특별한 문제는 없어 보입니다.

feature/webview/src/main/kotlin/com/ninecraft/booket/feature/webview/WebViewUi.kt (1)

13-13: 패키지 이동 반영 OK

웹뷰 화면에서도 ReedBackTopAppBar 패키지 변경이 적용되었습니다. 컴파일만 확인하면 됩니다.

app/build.gradle.kts (1)

54-56: feature:record 모듈 의존성 추가 확인 완료

앱 모듈에서 신규 기능 모듈을 정상적으로 참조하도록 projects.feature.record 가 implementations 블록에 추가되었습니다. 다른 빌드 설정과 충돌되는 부분이 없으며, settings.gradle.kts 도 함께 수정되었으므로 빌드-경로 관점에서 문제 없습니다.

feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsUi.kt (1)

30-33: 패키지 이동 일관성 재확인 필요

ReedDialog, ReedBackTopAppBarcore.ui.component 로 옮겨졌는데, ReedDivider 만 아직 core.designsystem.component 패키지를 사용하고 있습니다.

  • 실제로 ReedDivider 가 아직 디자인 시스템 모듈에 남아있다면 현재 그대로 두어도 무방합니다.
  • 만약 동일한 리팩터링으로 core.ui.component 로 이동되었다면 import 를 수정하지 않으면 컴파일 에러가 발생합니다.

변경 이력이 혼재되어 있으니 모듈 기준으로 위치를 다시 한 번 확인해 주세요.

feature/screens/src/main/kotlin/com/ninecraft/booket/feature/screens/Screens.kt (1)

34-36: RecordScreen 추가 확인 완료

새로운 화면 객체가 정상적으로 선언되었습니다. 고유한 name 값을 부여했으며 @Parcelize 처리도 문제 없습니다. 네비게이션 매핑 및 Presenter/Ui 구현만 누락되지 않았는지 한 번 더 확인해 주시면 됩니다.

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUiState.kt (1)

12-12: 새로운 독서 기록 이벤트 추가가 적절합니다.

기존 패턴을 따라 OnRecordButtonClick 이벤트가 올바르게 추가되었고, PR 목적인 독서 기록 플로우 구현에 부합합니다.

app/src/main/AndroidManifest.xml (1)

14-14: 매니페스트 속성 순서 정리가 적절합니다.

android:networkSecurityConfig 속성의 위치만 변경된 것으로, 기능적 변화는 없고 코드 정리 목적으로 보입니다.

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt (1)

27-29: 패키지 재구성에 따른 import 경로 업데이트가 올바릅니다.

UI 컴포넌트들의 패키지 이동(core.designsystem.componentcore.ui.component)에 맞춰 import 경로가 정확하게 업데이트되었습니다.

feature/main/src/main/AndroidManifest.xml (1)

10-10: 키보드 처리 개선을 위한 적절한 설정입니다.

adjustResize 모드 추가로 독서 기록 기능의 텍스트 입력 시 키보드가 나타날 때 레이아웃이 적절히 조정됩니다.

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedDialog.kt (3)

1-1: 패키지 이동이 적절하게 처리되었습니다.

UI 컴포넌트 재구성의 일환으로 core.ui.component로의 패키지 이동이 올바르게 적용되었습니다.


46-46: 추가된 수평 패딩이 적절합니다.

전체 너비 다이얼로그에 대응하여 추가된 수평 패딩(spacing5)이 디자인 시스템과 일관성을 유지합니다.


39-41: ReedDialog 너비 제한 해제 영향 검증 필요

usePlatformDefaultWidth = false 설정으로 모든 ReedDialog가 플랫폼 기본 너비 제한 없이 렌더링됩니다. 아래 사용 위치에서 디자인(Figma) 요구사항과 실제 레이아웃이 일치하는지 반드시 확인해주세요.

  • core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedDialog.kt
    • Preview: ReedConfirmDialogPreview, ReedChoiceDialogPreview
  • feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsUi.kt
    • 로그아웃 확인 다이얼로그
  • feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt
    • 레코드 종료 확인 다이얼로그

각 화면에서 다이얼로그 너비가 의도대로 동작하는지 검증 후 머지 부탁드립니다.

feature/record/build.gradle.kts (1)

1-22: 새로운 feature 모듈 설정이 올바르게 구성되었습니다.

convention plugin 사용, KSP 설정, 그리고 필요한 의존성들이 적절히 추가되어 있습니다. 프로젝트의 모듈 구조와 일관성을 유지하고 있습니다.

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt (1)

23-23: TextFieldState 초기화 일관성 확인 완료

feature/record 및 feature/search 모듈 모두 TextFieldState()로 기본값이 반영되어 있으며,
디자인 시스템 컴포넌트(ReedRecordTextField, ReedSearchTextField)에서 "검색"을 초기 값으로 사용하는 부분은 의도된 UI 동작이므로 변경이 불필요합니다.

— feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUiState.kt
— feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt

이상으로 변경사항을 승인합니다.

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUi.kt (1)

51-60: 홈 화면에 독서 기록 기능이 성공적으로 추가되었습니다.

기존 버튼의 텍스트를 한국어로 변경하고 새로운 독서 기록 버튼을 추가했습니다. 적절한 간격과 이벤트 핸들링이 구현되어 있습니다.

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt (2)

6-6: RecordScreen import가 적절히 추가되었습니다.

새로운 독서 기록 화면으로의 네비게이션을 위해 필요한 import입니다.


30-32: 새로운 이벤트 핸들링이 올바르게 구현되었습니다.

OnRecordButtonClick 이벤트를 처리하여 RecordScreen으로 네비게이션하는 로직이 Circuit 패턴에 맞게 구현되어 있습니다.

feature/record/src/main/res/values/strings.xml (1)

1-15: 독서 기록 기능을 위한 문자열 리소스가 잘 정의되었습니다.

UI 컴포넌트에 필요한 모든 텍스트가 포함되어 있고, 네이밍 컨벤션도 일관성 있게 적용되었습니다. 한국어 텍스트도 사용자 친화적으로 작성되어 있습니다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/button/ReedButton.kt (2)

69-69: STROKE 스타일 지원이 올바르게 구현되었습니다.

border 매개변수 추가로 새로운 STROKE 버튼 스타일이 적절히 지원됩니다.


109-112: FlowRow 사용으로 레이아웃이 개선되었습니다.

Row에서 FlowRow로 변경하고 verticalArrangement를 추가하여 더 반응형 레이아웃을 제공합니다. 모든 프리뷰 함수에 일관되게 적용되었습니다.

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUiState.kt (2)

7-12: UI 상태 정의가 잘 구성되었습니다.

CircuitUiState를 구현하고 TextFieldState를 사용하여 폼 입력을 적절히 관리합니다. eventSink 패턴도 올바르게 적용되었습니다.


14-21: 이벤트 정의가 명확하고 완전합니다.

sealed interface로 정의된 6개의 이벤트 타입이 독서 기록 등록 화면의 모든 사용자 상호작용을 적절히 커버합니다.

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedRecordTextField.kt (2)

40-55: 텍스트 필드 매개변수 설계가 잘 되어있습니다.

다양한 커스터마이징 옵션을 제공하면서도 합리적인 기본값을 설정했습니다. KeyboardOptions와 TextFieldLineLimits 지원도 적절합니다.


95-104: 조건부 clear 버튼 구현이 적절합니다.

텍스트가 있고 onClear 콜백이 제공될 때만 clear 버튼을 표시하는 로직이 사용자 경험을 향상시킵니다.

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterPresenter.kt (3)

25-27: 텍스트 필드 상태 관리가 적절합니다.

rememberTextFieldState()는 내부적으로 rememberSaveable을 사용하여 화면 회전 시에도 상태가 보존되므로 올바른 선택입니다. rememberRetained를 사용한 다이얼로그 상태 관리도 적절합니다.


29-50: 이벤트 처리 로직이 명확하게 구현되었습니다.

각 이벤트 타입에 대한 적절한 처리가 구현되어 있습니다. OnSentenceScanButtonClick과 OnNextButtonClick의 빈 구현은 PR 목표에 따라 향후 구현될 예정인 것으로 이해됩니다.


60-64: Circuit 의존성 주입이 올바르게 설정되었습니다.

@CircuitInject 어노테이션과 AssistedFactory 패턴이 적절히 사용되어 RecordScreen과 연결됩니다.

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt (2)

66-79: 다이얼로그 표시 로직이 잘 구현되어 있습니다.

종료 확인 다이얼로그가 조건부로 표시되고, 확인/취소 버튼에 대한 이벤트 처리가 적절히 구현되어 있습니다. 사용자 경험을 위한 좋은 구현입니다.


45-50: Circuit 프레임워크 적용이 올바릅니다.

@CircuitInject 어노테이션과 ActivityRetainedComponent 스코프가 적절히 사용되어 있고, 함수 시그니처도 Circuit 패턴에 맞게 구현되어 있습니다.

) {
val keyboardController = LocalSoftwareKeyboardController.current

CompositionLocalProvider(LocalTextSelectionColors provides reedTextSelectionColors) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

텍스트 선택 색상 정의가 누락되었습니다.

reedTextSelectionColors가 정의되지 않았거나 import되지 않았습니다. 이로 인해 컴파일 오류가 발생할 수 있습니다.

이 색상 정의를 추가하거나 적절한 파일에서 import하세요.

🤖 Prompt for AI Agents
In
core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/textfield/ReedRecordTextField.kt
at line 58, the variable reedTextSelectionColors is either not defined or not
imported, causing a compilation error. Define reedTextSelectionColors with the
appropriate text selection color values or import it from the correct file where
it is declared. Ensure that reedTextSelectionColors is accessible in this file
before using it in CompositionLocalProvider.

Comment thread core/ui/build.gradle.kts
implementations(
projects.core.designsystem,

libs.compose.keyboard.state,
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

implementations 확장 함수 존재 여부 확인 필요

Gradle DSL 표준 키워드는 implementation 이며, 현재 사용한 implementations( 는 커스텀 확장 함수가 프로젝트에 정의되어 있지 않으면 빌드가 실패합니다.

  • 사내 convention 플러그인에서 제공되는지 다시 한 번 확인해 주세요.
  • 아니라면 아래처럼 단수 형태로 수정하는 것을 권고합니다.
-    implementations(
+    implementation(
         libs.compose.keyboard.state,
🤖 Prompt for AI Agents
In core/ui/build.gradle.kts at line 16, the use of `implementations(` should be
verified because the standard Gradle keyword is `implementation`. Check if a
custom `implementations` extension function is defined in the project or company
convention plugins; if not, replace `implementations(` with the standard
`implementation(` to avoid build failures.

Comment on lines +117 to +134
ReedRecordTextField(
recordState = state.recordPageState,
recordHintRes = R.string.record_page_hint,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number,
imeAction = ImeAction.Next,
),
lineLimits = TextFieldLineLimits.SingleLine,
onClear = {
state.eventSink(RecordRegisterUiEvent.OnClearClick)
},
onNext = {
focusManager.moveFocus(FocusDirection.Down)
},
modifier = Modifier
.fillMaxWidth()
.height(50.dp),
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

페이지 입력 필드의 유효성 검증이 필요합니다.

페이지 번호는 숫자 타입이므로 음수나 0 같은 잘못된 값에 대한 유효성 검증이 필요합니다. TextFieldState의 값이 유효한지 확인하는 로직을 추가하는 것을 고려해보세요.

🤖 Prompt for AI Agents
In
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt
around lines 117 to 134, the page input field lacks validation for invalid
values like negative numbers or zero. Add validation logic to check if the
TextFieldState value is a positive number before accepting it. Implement this
validation either within the ReedRecordTextField component or in the event
handler that processes the input, ensuring only valid page numbers are allowed.

)
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing3))
ReedButton(
onClick = {},
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

스캔 버튼 기능이 구현되지 않았습니다.

OCR 문장 스캔 기능까지 구현하는 것이 이 PR의 목표인데, 스캔 버튼의 onClick이 빈 람다로 되어 있습니다. 기능을 구현하거나 TODO 주석을 추가해주세요.

-            onClick = {},
+            onClick = {
+                // TODO: OCR 문장 스캔 기능 구현 필요
+                state.eventSink(RecordRegisterUiEvent.OnScanSentenceClick)
+            },
🤖 Prompt for AI Agents
In
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt
at line 151, the onClick handler for the scan button is currently an empty
lambda, meaning the scan functionality is not implemented. To fix this,
implement the OCR scan functionality inside the onClick lambda or, if not ready
yet, add a TODO comment indicating that the scan feature needs to be implemented
here.

@seoyoon513
Copy link
Copy Markdown
Contributor

seoyoon513 commented Jul 24, 2025

페이지 입력 TextField에 아래와 같은 요구사항이 있는데요, 이 부분도 같이 적용되면 좋을 것 같아요!
페이지 수 초과는 서버에서 데이터를 받아야겠네요

image image

ReedRecordTextField(
recordState = state.recordSentenceState,
recordHintRes = R.string.record_sentence_hint,
modifier = Modifier
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

문장 기록과 같이 길이가 긴 텍스트를 입력하는 경우, ImeAction.Next보단 ImeAction.Default(줄바꿈 있는)가 더 익숙하고, 실제 줄바꿈도 종종 사용하는데 이 부분 어떻게 생각하시나요?

}

is RecordRegisterUiEvent.OnExitDialogConfirm -> {
navigator.pop()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

여기서 OnExitDialogConfirm 이벤트 발생할 때, 화면이 pop되고 난 후 다이얼로그가 사라지고 있어서 이 부분에도 isExitDialogVisible = false가 들어가야 될 것 같습니다

@seoyoon513
Copy link
Copy Markdown
Contributor

Quollect 앱에서는 아예 특수문자 입력은 안되게 만들었네요. 개인적로 에러 메세지보다는 막는게 낫다는 생각. 근데 14.5 이런식으로 소수점은 써지더라구요 ㅋㅋㅋㅋㅋ

그리고 문장 입력 부분에서 문장이 길어지면 키보드에 가려지는 이슈가 있습니당. 지훈님이 휴가라 요런 부분은 제가 수정해도 될 것 같아요!
image

Quollect 레퍼런스 영상 첨부

Reed_._.mp4

@easyhooon
Copy link
Copy Markdown
Contributor Author

easyhooon commented Jul 24, 2025

근데 14.5 이런식으로 소수점은 써지더라구요

저도 아예 막는게 맞다고 생각하고, 페이지수보다 더 큰 페이지 이런 입력정도만 errorText로 안내하면 될듯합니다.

아예 막는거는 BasicTextField내에 inputTransformation에서 특수문자 필터링 정규식 처리해주면 될것같네여,, 부탁드림다

@seoyoon513
Copy link
Copy Markdown
Contributor

@easyhooon 여기 수정사항은 제가 OCR, 코멘트 및 감정 입력 작업 때 같이 적용하는걸로 하겠습니다! 어차피 키보드나 이런 부분은 공통으로 적용되어야 하기 때문에 ㅎㅎ

Approve와 함께 즐거운 휴가 되세요 🫡🎑🎆

@easyhooon easyhooon merged commit 1c4196c into develop Jul 24, 2025
3 checks passed
@easyhooon easyhooon deleted the BOOK-156-feature/#62 branch July 24, 2025 00:52
@easyhooon
Copy link
Copy Markdown
Contributor Author

@easyhooon 여기 수정사항은 제가 OCR, 코멘트 및 감정 입력 작업 때 같이 적용하는걸로 하겠습니다! 어차피 키보드나 이런 부분은 공통으로 적용되어야 하기 때문에 ㅎㅎ

Approve와 함께 즐거운 휴가 되세요 🫡🎑🎆

비행기에서 merge완료

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-156/feat] 독서 기록 플로우 화면 구성(OCR 문장 스캔이전까지)

2 participants