feat: 독서 기록 플로우 화면 구성(OCR 문장 스캔이전까지)#66
Conversation
# Conflicts: # feature/screens/src/main/kotlin/com/ninecraft/booket/feature/screens/Screens.kt
# Conflicts: # app/build.gradle.kts
…xtField로 네이밍 변경 명확한 구분을 위함
패키지내 구성요소가 하나뿐인 경우, 패키지를 제거하고 상위 디렉토리에 위치
|
""" Walkthrough새로운 독서 기록(Record) 기능 모듈이 추가되고, 관련된 UI 플로우, 상태, 이벤트, 프레젠터, 문자열 리소스, 그리고 프로그래스바 및 입력 필드 등 디자인 시스템 컴포넌트가 도입되었습니다. 여러 기존 컴포넌트의 패키지 이동, 의존성 및 import 경로 정리, 그리고 홈 화면에서 Record 플로우 진입 이벤트가 연결되었습니다. Changes
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: 상태 갱신 및 반영
Estimated code review effort3 (~45분) Suggested labels
Suggested reviewers
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
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
📒 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.ReedScaffoldcore/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,ReedBackTopAppBar는core.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.component→core.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) { |
There was a problem hiding this comment.
텍스트 선택 색상 정의가 누락되었습니다.
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.
| implementations( | ||
| projects.core.designsystem, | ||
|
|
||
| libs.compose.keyboard.state, |
There was a problem hiding this comment.
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.
| 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), | ||
| ) |
There was a problem hiding this comment.
🛠️ 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 = {}, |
There was a problem hiding this comment.
스캔 버튼 기능이 구현되지 않았습니다.
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.
| ReedRecordTextField( | ||
| recordState = state.recordSentenceState, | ||
| recordHintRes = R.string.record_sentence_hint, | ||
| modifier = Modifier |
There was a problem hiding this comment.
문장 기록과 같이 길이가 긴 텍스트를 입력하는 경우, ImeAction.Next보단 ImeAction.Default(줄바꿈 있는)가 더 익숙하고, 실제 줄바꿈도 종종 사용하는데 이 부분 어떻게 생각하시나요?
| } | ||
|
|
||
| is RecordRegisterUiEvent.OnExitDialogConfirm -> { | ||
| navigator.pop() |
There was a problem hiding this comment.
여기서 OnExitDialogConfirm 이벤트 발생할 때, 화면이 pop되고 난 후 다이얼로그가 사라지고 있어서 이 부분에도 isExitDialogVisible = false가 들어가야 될 것 같습니다
저도 아예 막는게 맞다고 생각하고, 페이지수보다 더 큰 페이지 이런 입력정도만 errorText로 안내하면 될듯합니다. 아예 막는거는 BasicTextField내에 inputTransformation에서 특수문자 필터링 정규식 처리해주면 될것같네여,, 부탁드림다 |
|
@easyhooon 여기 수정사항은 제가 OCR, 코멘트 및 감정 입력 작업 때 같이 적용하는걸로 하겠습니다! 어차피 키보드나 이런 부분은 공통으로 적용되어야 하기 때문에 ㅎㅎ Approve와 함께 즐거운 휴가 되세요 🫡🎑🎆 |
비행기에서 merge완료 |



🔗 관련 이슈
📙 작업 설명
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
신규 기능
UI 개선
버그 수정 및 기타
feature:record가 추가되어 빌드 설정에 포함되었습니다.