[Feat] 온보딩 Screen 구현 - #67
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthrough온보딩 전체 흐름을 추가했습니다. 단계별 입력 화면, 공통 레이아웃, 출생 정보 시트, 완료 화면을 구현했습니다. 완료 확인 후 Android 13 알림 권한을 요청하고 Changes온보딩 상태와 완료 흐름
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 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. Comment |
|
@CodeRabbit review |
✅ Action performedReview finished.
|
|
온보딩 완료 화면이 변경됨에 따라 추가 커밋 올렸습니다 |
There was a problem hiding this comment.
Actionable comments posted: 12
🧹 Nitpick comments (4)
core/designsystem/src/main/java/com/kikidan/designsystem/component/TodakunProgressBar.kt (1)
51-55: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win[P2] 터치 피드백과 터치 영역을 함께 보완하세요.
indication = null로 리플이 사라졌습니다. 클릭 가능한 아이콘의 터치 영역도 8x16dp로, 권장 최소 터치 타깃 48dp보다 작습니다. 두 요소가 겹치면 사용자는 뒤로가기 탭이 인식되었는지 알기 어렵습니다.클릭 영역을 아이콘 크기와 분리하고,
contentDescription도 지정하세요.♻️ 제안 수정
Icon( painter = painterResource(id = R.drawable.ic_arrow_back), - contentDescription = null, + contentDescription = stringResource(id = R.string.designsystem_back), tint = TodakunColor.gray400, modifier = Modifier - .size(width = 8.dp, height = 16.dp) .clickable( indication = null, interactionSource = remember { MutableInteractionSource() }, onClick = onBackClick, - ), + ) + .padding(16.dp) + .size(width = 8.dp, height = 16.dp), )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@core/designsystem/src/main/java/com/kikidan/designsystem/component/TodakunProgressBar.kt` around lines 51 - 55, Update the clickable back-button area in TodakunProgressBar to provide a minimum 48dp touch target independent of the icon’s 8x16dp size, restore visible touch indication by removing the null indication, and add an appropriate contentDescription to the clickable icon.feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt (1)
20-20: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win[P2] 미사용 import를 제거하세요.
kotlinx.coroutines.delay를 이 파일에서 사용하지 않습니다. ktlint의 미사용 import 규칙에 걸립니다.-import kotlinx.coroutines.delay🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt` at line 20, Remove the unused kotlinx.coroutines.delay import from OnboardingViewModel.kt, leaving the remaining imports and implementation unchanged.Source: Path instructions
feature/onboarding/src/main/res/drawable/ic_arrow_right.xml (1)
2-6: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win[P2] RTL 로케일 대응을 위해
autoMirrored를 추가하세요.방향성 화살표 아이콘에
android:autoMirrored="true"가 없습니다. RTL 로케일을 지원할 계획이라면 이 속성을 추가해 아이콘이 자동으로 반전되도록 하세요.🌐 제안 수정
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="7dp" android:height="12dp" android:viewportWidth="7" - android:viewportHeight="12"> + android:viewportHeight="12" + android:autoMirrored="true">🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/onboarding/src/main/res/drawable/ic_arrow_right.xml` around lines 2 - 6, Update the vector drawable declaration in ic_arrow_right.xml to add android:autoMirrored="true", ensuring the directional arrow automatically flips in RTL locales while preserving its existing dimensions and viewport settings.feature/onboarding/src/main/java/com/kikidan/onboarding/screen/CompleteScreen.kt (1)
31-36: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value[P3] 배경색이 디자인 시스템 토큰을 사용하지 않습니다.
Color(0xFF010018)가 하드코딩되어 있습니다.TodakunColor에 대응하는 토큰이 있다면 재사용하고, 없다면 새로 정의해 색상 관리를 일관되게 유지하세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/onboarding/src/main/java/com/kikidan/onboarding/screen/CompleteScreen.kt` around lines 31 - 36, Update the background configuration in CompleteScreen’s Box to use the corresponding TodakunColor design-system token instead of the hardcoded Color(0xFF010018); if no matching token exists, define it in TodakunColor and reuse it here.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/component/OnboardingScaffold.kt`:
- Around line 104-136: Update TermsHeader’s back-navigation control to use an
IconButton with at least the standard 48dp touch target, and provide a
meaningful back-navigation contentDescription instead of null. Preserve the
existing icon appearance and onBackClick behavior.
- Around line 83-99: OnboardingScaffold의 콘텐츠 Column에
verticalScroll(rememberScrollState())를 추가해 필드가 많은 화면에서도 전체 콘텐츠를 세로로 스크롤할 수 있도록
수정하세요.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingStep.kt`:
- Around line 19-24: Update the COMPLETE-step back-navigation handling so
BackHandler does not fall through to the app-wide back action when
OnboardingStep.previous is null. In the COMPLETE branch, consume the back press
and apply the intended behavior—ignore it or navigate home/show the exit
dialog—while preserving existing previous-step navigation for other onboarding
steps.
In `@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingRoute.kt`:
- Around line 48-57: OnboardingRoute’s permissionHandled state must survive
configuration changes: replace the remember-backed state with rememberSaveable
while preserving its initial SDK-based value. Update the COMPLETE-stage
rendering condition around the onboarding step logic so the completion screen is
always rendered and can advance regardless of permission state, including when
the activity is recreated during the permission request.
- Around line 59-77: Update the when expression in OnboardingRoute’s
viewModel.collectSideEffect block to handle InvalidInput and Failure as explicit
side-effect branches with the required user feedback, and remove the catch-all
else branch. Keep the expression exhaustive by covering every existing
OnboardingSideEffect subtype explicitly so future additions trigger compiler
checks.
- Around line 3-37: Remove the unused PackageManager, LaunchedEffect,
LocalContext, and ContextCompat imports from OnboardingRoute.kt, while
preserving all imports that are referenced by the onboarding route
implementation and its required import ordering.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt`:
- Around line 73-88: OnboardingViewModel의 완료 처리에서 검증용 즉시 COMPLETE 전환과 주석 처리된 데드
코드를 제거하고, signupSubmission과 onboardingToken을 사용해 signUpUseCase를 실제 호출하세요. 회원가입
성공 시에만 COMPLETE 상태를 갱신하고 PermissionRequest를 게시하며, 실패 시 기존 Failure 사이드 이펙트를
게시하세요. CompleteScreen의 확인 액션에서 OnboardingSideEffect.NavigateToHome을 게시해
OnboardingRoute의 onFinish()가 호출되도록 연결하세요.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/screen/BirthInfoScreen.kt`:
- Around line 71-148: Update the content layout in BirthInfoScreen so the full
Column containing the gender, calendar, birth date, birth time, checkbox, and
hint can scroll vertically on smaller screens. Apply the scrolling behavior to
the content area without changing field interactions or the CTA layout, ensuring
the bottom content is not obscured.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/screen/ExtraQuestionScreen.kt`:
- Around line 51-66: Make the content containing both ChipQuestion sections
scrollable so all Job and RelationshipStatus options remain accessible on small
screens without overlapping the CTA. Update the Column in ExtraQuestionScreen,
or the shared OnboardingScaffold if that is where screen content scrolling is
managed, using the existing layout scrolling approach.
- Around line 114-122: Update the RelationshipStatus.labelRes mapping so the
MARRY and REMARRY enum values use labels matching their actual meanings,
avoiding a “divorced/single-after-marriage” label for remarriage; rename the
enum or adjust the corresponding string resource reference as appropriate while
preserving the other mappings.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/screen/TermsScreen.kt`:
- Around line 84-130: The TermRow call sites and default onMoreDetailClick
currently provide no action for the details icon. Implement the terms-detail
navigation or external-link behavior and pass it from each TermRow caller,
remove the no-op TODO default, assign the icon an explicit size, and provide a
localized accessibility contentDescription describing the details action.
In
`@feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt`:
- Around line 237-241: Update the test around
OnboardingViewModel.onCompleteConfirmed to consume and assert the emitted
PermissionRequest side effect before calling expectState. Preserve the final
assertion that the state transitions to OnboardingStep.COMPLETE, ensuring the
test follows Orbit’s emission order.
---
Nitpick comments:
In
`@core/designsystem/src/main/java/com/kikidan/designsystem/component/TodakunProgressBar.kt`:
- Around line 51-55: Update the clickable back-button area in TodakunProgressBar
to provide a minimum 48dp touch target independent of the icon’s 8x16dp size,
restore visible touch indication by removing the null indication, and add an
appropriate contentDescription to the clickable icon.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt`:
- Line 20: Remove the unused kotlinx.coroutines.delay import from
OnboardingViewModel.kt, leaving the remaining imports and implementation
unchanged.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/screen/CompleteScreen.kt`:
- Around line 31-36: Update the background configuration in CompleteScreen’s Box
to use the corresponding TodakunColor design-system token instead of the
hardcoded Color(0xFF010018); if no matching token exists, define it in
TodakunColor and reuse it here.
In `@feature/onboarding/src/main/res/drawable/ic_arrow_right.xml`:
- Around line 2-6: Update the vector drawable declaration in ic_arrow_right.xml
to add android:autoMirrored="true", ensuring the directional arrow automatically
flips in RTL locales while preserving its existing dimensions and viewport
settings.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: fa6bbb15-3360-431b-9cd2-be7d18a9927c
⛔ Files ignored due to path filters (1)
feature/onboarding/src/main/res/drawable/img_onboarding_complete_character.pngis excluded by!**/*.png
📒 Files selected for processing (18)
app/src/main/AndroidManifest.xmlcore/designsystem/src/main/java/com/kikidan/designsystem/component/TodakunProgressBar.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingRoute.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/component/OnboardingScaffold.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingSideEffect.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingState.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingStep.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/screen/BirthInfoScreen.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/screen/CompleteScreen.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/screen/ExtraQuestionScreen.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/screen/NameScreen.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/screen/TermsScreen.ktfeature/onboarding/src/main/res/drawable/ic_arrow_right.xmlfeature/onboarding/src/main/res/values/strings.xmlfeature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.ktfeature/onboarding/src/test/java/com/kikidan/onboarding/fake/FakeAuthRepository.ktfeature/onboarding/src/test/java/com/kikidan/onboarding/fake/FakeTokenRepository.kt
| private fun TermRow( | ||
| label: String, | ||
| checked: Boolean, | ||
| textStyleEmphasized: Boolean, | ||
| onCheckedChange: (Boolean) -> Unit, | ||
| modifier: Modifier = Modifier, | ||
| onMoreDetailClick: () -> Unit = { /* TODO 외부 링크 열기 */ }, | ||
| ) { | ||
| Row( | ||
| modifier = | ||
| modifier | ||
| .fillMaxWidth() | ||
| .toggleable( | ||
| value = checked, | ||
| onValueChange = onCheckedChange, | ||
| role = Role.Checkbox, | ||
| interactionSource = null, | ||
| indication = null, | ||
| ), | ||
| verticalAlignment = Alignment.CenterVertically, | ||
| horizontalArrangement = Arrangement.spacedBy(12.dp), | ||
| ) { | ||
| TodakunCheckbox( | ||
| checked = checked, | ||
| onCheckedChange = onCheckedChange, | ||
| ) | ||
| Text( | ||
| modifier = Modifier.weight(1f), | ||
| text = label, | ||
| style = if (textStyleEmphasized) TodakunTypography.body2SemiBold else TodakunTypography.body3Regular, | ||
| color = TodakunColor.black, | ||
| ) | ||
| Icon( | ||
| modifier = | ||
| Modifier | ||
| .padding(horizontal = 7.dp) | ||
| .clickable( | ||
| onClick = onMoreDetailClick, | ||
| indication = null, | ||
| interactionSource = remember { MutableInteractionSource() }, | ||
| ), | ||
| painter = painterResource(id = R.drawable.ic_arrow_right), | ||
| contentDescription = null, | ||
| tint = TodakunColor.gray300, | ||
| ) | ||
| } | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
[P1] "더보기" 아이콘이 아직 아무 동작도 하지 않습니다.
onMoreDetailClick 기본값은 TODO 주석뿐입니다(Line 90). 실제 호출부(Line 61-66, 74-79)에서도 override하지 않아, 사용자가 화살표를 눌러도 약관 전문을 볼 방법이 없습니다. 약관 동의 화면에서는 전문 열람 기능이 필요합니다.
또한 아이콘에 크기 지정이 없고(Line 116-128) contentDescription = null이라 스크린 리더 사용자도 이 버튼의 목적을 알 수 없습니다.
외부 링크 열기 기능을 구현할까요, 아니면 이슈로 등록해 드릴까요?
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/screen/TermsScreen.kt`
around lines 84 - 130, The TermRow call sites and default onMoreDetailClick
currently provide no action for the details icon. Implement the terms-detail
navigation or external-link behavior and pass it from each TermRow caller,
remove the no-op TODO default, assign the icon an explicit size, and provide a
localized accessibility contentDescription describing the details action.
There was a problem hiding this comment.
추후에 노션 링크를 전달받으면 그때 외부 링크로 이동하도록 하겠습니다
There was a problem hiding this comment.
@oungsi2000, 확인했습니다. 노션 링크를 받은 뒤 약관별 외부 링크 이동을 구현하면 됩니다.
이때 TermRow의 no-op 기본 콜백을 제거하고, 더보기 아이콘의 명시적 크기 및 접근성 contentDescription도 함께 적용해야 합니다. 후속 GitHub 이슈로 등록할까요?
You are interacting with an AI system.
ea945ea to
4e56d2a
Compare
OnboardingState, OnboardingStep, OnboardingSideEffect 및 TermsAgreementUiModel 등 UI 상태와 관련된 클래스들을 `com.kikidan.onboarding.model` 패키지로 이동하여 모듈 내부 구조를 정리한다. 클래스 위치 변경에 따라 OnboardingViewModel과 관련 테스트 코드의 import 경로를 수정한다. Co-Authored-By: Claude 3.5 Sonnet <noreply@anthropic.com> # Conflicts: # feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt
약관 동의부터 이름 입력, 생년월일 및 성별 선택, 추가 질문(직업/연애 상태)으로 구성된 전체 온보딩 흐름을 구현한다. - `OnboardingRoute`를 추가하여 각 단계별 상태 관리 및 화면 전환 로직을 통합 관리 - 공통 UI 구조를 위한 `OnboardingScaffold`를 정의하고 상단 진행바 및 하단 CTA 버튼 연동 - `TermsScreen`: 전체 동의 및 개별 필수/선택 약관 동의 기능 구현 - `NameScreen`: 이름 유효성 검사(길이, 특수문자 제한) 및 에러 상태 메시지 처리 - `BirthInfoScreen`: 성별/역법 선택 및 휠 피커 시트를 활용한 날짜·시간 입력 연동 - `ExtraQuestionScreen`: 칩(Chip) 컴포넌트를 사용한 직업 및 연애 상태 선택 구현 - `TodakunProgressBar` 및 헤더의 뒤로가기 버튼에서 불필요한 클릭 인디케이션(리플 효과) 제거
OnboardingStep, OnboardingSheet, TermsAgreementUiModel 등 온보딩 화면에서 사용하는 모델들을 model 패키지로 이동하여 패키지 구조를 정리한다. 또한 OnboardingRoute에서 사용되는 생년월일 관련 기본값 및 범위 상수들을 OnboardingRouteDefaults 객체로 캡슐화한다.
TermsAgreementUiModel 초기화 구문의 가독성을 위해 줄바꿈을 조정하고 마지막 요소에 트레일링 콤마를 추가했다.
회원가입 완료 시 기존 다이얼로그 대신 전용 완료 화면(CompleteScreen)을 노출한다. 완료 진입 시 POST_NOTIFICATIONS 권한을 요청하도록 변경하고, 테스트 코드의 Fake 객체들을 별도 파일로 분리하여 정리했다.
onCompleteConfirmed 호출 시 OnboardingStep.COMPLETE 상태 전환과 더불어 OnboardingSideEffect.PermissionRequest 사이드 이펙트가 발생하는지 확인한다.
4e56d2a to
5ee0cbf
Compare
회원가입 요청 시 `isSubmitting` 상태를 추가하여 중복 요청을 방지한다. 성공 시 즉시 홈으로 이동하는 대신 `PermissionRequest` 사이드 이펙트를 먼저 발생시키며, `Failure` 사이드 이펙트에 `Throwable`을 포함하여 실패 원인을 전달하도록 수정한다. 최종 완료 확인(`onSignUpCompleteConfirmed`) 시점에 다이얼로그를 닫고 홈 화면으로 이동한다. # Conflicts: # feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt # feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingSideEffect.kt # feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt
회원가입 성공 시 완료 다이얼로그를 띄우는 대신 `OnboardingStep.COMPLETE` 단계로 진입하도록 변경한다. 완료 단계는 진행바 비율을 갖지 않으며, 이전 단계로의 이동을 허용하지 않는다. 테스트 코드 가독성을 위해 `FakeAuthRepository`와 `FakeTokenRepository`를 별도 파일로 분리한다.
회원가입 완료 시 기존 다이얼로그 대신 전용 완료 화면(CompleteScreen)을 노출한다. 완료 진입 시 POST_NOTIFICATIONS 권한을 요청하도록 변경하고, 테스트 코드의 Fake 객체들을 별도 파일로 분리하여 정리했다. # Conflicts: # feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt # feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingSideEffect.kt # feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingStep.kt # feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt # feature/onboarding/src/test/java/com/kikidan/onboarding/fake/FakeAuthRepository.kt
마지막 스텝 완료 시의 동작을 '화면 전환' 대신 '완료 단계로 이동'으로 표현하여 테스트의 의도를 더욱 명확하게 반영한다.
OnboardingScaffold 컨텐츠 영역에 `verticalScroll`을 추가하여 화면 크기가 작은 기기에서도 모든 내용이 표시되도록 개선한다. 권한 처리 상태(`permissionHandled`)를 `rememberSaveable`로 변경하여 화면 회전이나 프로세스 재시작 시에도 상태를 유지한다. 뒤로가기 버튼을 `IconButton`으로 교체하여 터치 영역과 접근성을 개선하고, '재혼' 상태 관련 리소스 명칭 및 매핑을 수정한다.
IconButton 대신 Icon에 Modifier.clickable을 사용하여 뒤로가기 동작을 구현한다. indication을 null로 설정해 클릭 시 발생하는 시각적 피드백(리플 효과)을 제거했다.
관련 이슈
#65
작업 내용
변경사항 / 상세
중점 리뷰사항
스크린샷 (선택)
Summary by CodeRabbit