Skip to content

온보딩 화면 QA 반영#128

Open
chanho0908 wants to merge 27 commits intodevelopfrom
refactor/#123-onboarding-qa
Open

온보딩 화면 QA 반영#128
chanho0908 wants to merge 27 commits intodevelopfrom
refactor/#123-onboarding-qa

Conversation

@chanho0908
Copy link
Member

@chanho0908 chanho0908 commented Mar 10, 2026

이슈 번호

#123

작업내용

로그인 화면

  • 로그인 화면 버튼 배치 수정

커플 연결 화면

  • 일러스트 교체
  • 해지한 커플 복구 항목 옆 > 아이콘 추가

초대 코드 입력 화면

  • 초대 코드 입력 시 텍스트 필드 자동 포커스 제거
  • 코드 입력 시 스페이스바 입력 차단, 공백 입력 방지 처리 추가
  • 잘못된 코드 입력 시 에러 토스트 노출 처리

결과물

1. 로그인 화면 버튼 배치 수정

Before After
Image Image

2. 커플 연결 화면 수정

Before After
Image image

3. 해지 커플 복구 바텀시트 디자인 수정

Before After
Image Image

4. 초대 코드 입력 화면

Before After
스크린샷 2026-03-10 오후 3 36 05 스크린샷 2026-03-10 오후 3 34 00

리뷰어에게 추가로 요구하는 사항 (선택)

- `OnBoardingViewModel` 초기화 시 초대 코드를 자동으로 조회하도록 변경
- `OnBoardingSideEffect`에서 사용되지 않는 `CoupleConnection` 인터페이스 제거
- 특정 SideEffect 대신 공통 `showToast` 메서드를 사용하여 에러 메시지를 출력하도록 변경
- `CoupleConnectRoute`에서 수동으로 호출하던 `fetchMyInviteCode` 로직 제거 및 토스트 처리 로직 통합
- `NavigateToDDaySetting`을 `NavigateToNext`로 변경하여 목적지 추상화 및 범용성 개선
- `OnBoardingViewModel` 및 `ProfileScreen` 내 관련 참조 업데이트
- `OnBoardingSideEffect` 내에 `CopyInviteCode` 타입을 추가하여 UI 레이어에서 복사 로직을 처리하도록 변경
- `OnBoardingViewModel`에서 토스트 메시지를 직접 띄우는 대신 `CopyInviteCode` SideEffect를 방출하도록 수정
- `InviteCodeScreen`에서 클립보드 복사 및 Android 13(API 33) 이상 중복 알림 방지 로직 적용
- `TextFieldValue` 대신 `String`을 사용하도록 입력 로직 수정
- 커서의 깜빡임 애니메이션을 제거하고 `Cursor` 컴포넌트로 분리
- `Row` 내 아이템 간격 수정 (4.29.dp -> 4.dp) 및 코드 가독성 개선
@chanho0908 chanho0908 self-assigned this Mar 10, 2026
@chanho0908 chanho0908 added the Refactor Good for newcomers label Mar 10, 2026
@chanho0908 chanho0908 linked an issue Mar 10, 2026 that may be closed by this pull request
13 tasks
@coderabbitai
Copy link

coderabbitai bot commented Mar 10, 2026

📝 Walkthrough

Walkthrough

온보딩 모듈의 사이드이펙트 계층을 model에서 contract로 재구성하고, 다수의 개별 토스트/네비게이션 이펙트를 삭제한 뒤 통합된 OnBoardingSideEffect.ShowToast 구조를 도입했습니다. InviteCode 및 CoupleConnect 관련 UI는 스크롤 지원, TopGradientOverlay, 백 네비게이션 추가 등 레이아웃을 재구성했고 텍스트 필드와 커서 로직을 단순화했습니다. ViewModel에서 일부 공개 메서드가 비공개로 전환되고 초기화 시 invite 코드 패치가 수행되며, 여러 벡터 드로어블(ic_arrow_left, ic_invite) 추가와 img_couple_connect 삭제, 온보딩 문자열 리소스 이동 및 중복 추가가 포함됩니다. 일부 라우트/컴포저블 시그니처(예: CoupleConnectRoute)에 파라미터가 추가되었습니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~65 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.56% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 '온보딩 화면 QA 반영'으로 로그인/커플 연결/초대 코드 입력 등 여러 화면의 QA 항목을 다루는 변경사항의 핵심을 명확히 전달합니다.
Description check ✅ Passed PR 설명은 세부 변경사항(로그인 버튼 배치, 일러스트 교체, 아이콘 추가, 입력 검증 등)과 Before/After 스크린샷을 포함하여 변경사항과 관련된 충실한 설명을 제공합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/#123-onboarding-qa

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

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
feature/onboarding/src/main/java/com/twix/onboarding/couple/CoupleConnectRoute.kt (1)

87-90: ⚠️ Potential issue | 🟠 Major

초대장 보내기 버튼이 현재 아무 동작도 하지 않습니다.

Line 89에서 onClickSend에 빈 람다를 넘겨서 사용자가 메인 CTA를 눌러도 아무 일도 일어나지 않습니다. QA 반영 범위와 무관하게 초대 플로우가 끊기므로, 기존 동작으로 연결하거나 의도적으로 비활성화한 것이라면 버튼 상태/문구도 함께 맞춰 주세요. 예를 들어 같은 초대 코드 화면으로 보내는 의도였다면 navigateToNext를 연결하는 형태가 됩니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/CoupleConnectRoute.kt`
around lines 87 - 90, The Invite button is currently a no-op because
CoupleConnectScreen is passed an empty lambda for onClickSend; replace the empty
lambda with the intended action (e.g., pass navigateToNext) or, if intentionally
disabled, update the button state/label in CoupleConnectScreen to reflect
disabled status; locate the CoupleConnectScreen call and change the onClickSend
argument from {} to navigateToNext (or add a disabled flag/alternate text in
CoupleConnectScreen and wire it accordingly).
feature/onboarding/src/main/java/com/twix/onboarding/navigation/OnboardingNavGraph.kt (1)

77-79: ⚠️ Potential issue | 🟠 Major

D-day 뒤로가기 네비게이션이 일관된 패턴을 따르지 않습니다

코드를 보면 CoupleConnectRoute(37행)와 InviteCodeRoute(48행)에서는 navigateToBack = navController::popBackStack을 사용하여 이전 화면으로 돌아가는데, DdayRoute만 77-79행에서 navController.navigate(NavRoutes.ProfileRoute.route)를 호출합니다.

이렇게 하면 ProfileRoute가 새로운 엔트리로 스택에 추가되어, 사용자가 여러 번 D-day 화면을 거쳐서 뒤로가기할 때 프로필이 여러 번 중복되어 쌓입니다. 이는 사용자가 예상하는 "이전 화면으로 돌아가기"라는 의도와 맞지 않습니다.

다른 라우트들과 동일하게 popBackStack()을 사용하여 스택의 이전 엔트리로 돌아가는 것이 바람직합니다.

수정 제안
-                    navigateToBack = {
-                        navController.navigate(NavRoutes.ProfileRoute.route)
-                    },
+                    navigateToBack = navController::popBackStack,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/navigation/OnboardingNavGraph.kt`
around lines 77 - 79, The DdayRoute's navigateToBack currently calls
navController.navigate(NavRoutes.ProfileRoute.route), which pushes a new
ProfileRoute instead of returning to the previous entry; change it to use
popBackStack so it matches CoupleConnectRoute and InviteCodeRoute patterns.
Locate the DdayRoute navigateToBack assignment in OnboardingNavGraph.kt (the
block that currently references NavRoutes.ProfileRoute.route) and replace that
call with navController::popBackStack or an equivalent
navController.popBackStack() invocation to pop the previous entry off the back
stack.
🧹 Nitpick comments (7)
feature/login/src/main/java/com/twix/login/LoginScreen.kt (1)

15-15: 사용되지 않는 import를 제거해 주세요.

setValue는 이전에 동적 포지셔닝 로직에서 mutableStateOf와 함께 사용되었으나, 해당 로직이 제거되면서 더 이상 사용되지 않습니다. 불필요한 import는 코드 가독성과 유지보수성을 저해할 수 있습니다.

🧹 제거 제안
-import androidx.compose.runtime.setValue
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@feature/login/src/main/java/com/twix/login/LoginScreen.kt` at line 15, 파일
LoginScreen.kt에서 더 이상 사용되지 않는 import androidx.compose.runtime.setValue를 제거하세요;
LoginScreen 컴포저블(또는 관련 함수)에서 mutableStateOf/setValue 호출이 모두 제거된 것을 확인한 뒤 해당
import 문을 삭제하여 불필요한 의존성을 제거하고 빌드/포맷을 다시 실행하세요.
feature/onboarding/src/main/java/com/twix/onboarding/couple/component/RestoreCoupleBottomSheetContent.kt (1)

93-99: Preview 함수 가시성 통일을 권장합니다.

다른 컴포넌트들의 Preview 함수가 private으로 선언된 것과 달리, 이 Preview는 public입니다. 일관성을 위해 private으로 변경하는 것을 고려해 주세요.

♻️ 가시성 수정 제안
 `@Preview`(showBackground = true)
 `@Composable`
-fun RestoreCoupleBottomSheetContentPreview() {
+private fun RestoreCoupleBottomSheetContentPreview() {
     TwixTheme {
         RestoreCoupleBottomSheetContent()
     }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/RestoreCoupleBottomSheetContent.kt`
around lines 93 - 99, Preview 함수 RestoreCoupleBottomSheetContentPreview의 가시성이 다른
컴포넌트의 Preview들과 달리 public으로 선언되어 있으니, 함수 선언부에 private 키워드를 추가하여 가시성을 private으로
통일하세요; 대상 심볼은 RestoreCoupleBottomSheetContentPreview()이며 파일의 해당 `@Preview` 어노테이션이
붙은 함수 선언을 찾아 선언부를 수정하면 됩니다.
feature/onboarding/src/main/java/com/twix/onboarding/couple/component/CoupleConnectTopbar.kt (1)

17-34: Preview Composable 추가를 권장합니다.

코딩 가이드라인에 따르면 Preview Composable이 제공되어야 합니다. Preview를 추가하면 개발 및 디자인 검토 시 유용합니다.

♻️ Preview 추가 제안
`@Preview`(showBackground = true)
`@Composable`
private fun CoupleConnectTopbarPreview() {
    TwixTheme {
        CoupleConnectTopbar(onClickBack = {})
    }
}

As per coding guidelines, feature/**: Preview Composable이 제공되는가?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/CoupleConnectTopbar.kt`
around lines 17 - 34, Add a Preview composable for CoupleConnectTopbar so it can
be rendered in Android Studio previews: create a private preview function (e.g.,
CoupleConnectTopbarPreview) annotated with `@Preview`(showBackground = true) and
`@Composable` that wraps CoupleConnectTopbar in the app theme (TwixTheme) and
passes a no-op lambda for onClickBack ({}); place it in the same file
(CoupleConnectTopbar.kt) near the CoupleConnectTopbar composable and keep the
preview function private.
core/design-system/src/main/res/drawable/ic_arrow_left.xml (1)

1-13: 다크 모드 지원을 고려해 주세요.

현재 strokeColor="#171717"가 하드코딩되어 있어, 다크 모드에서 배경과 대비가 부족할 수 있습니다. 디자인 시스템의 테마 색상을 사용하거나, night 리소스 폴더에 별도의 drawable을 추가하는 것을 권장합니다.

다크 모드를 지원하지 않는 앱이라면 현재 구현도 괜찮습니다. 향후 다크 모드 지원 계획이 있는지 확인해 주세요.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@core/design-system/src/main/res/drawable/ic_arrow_left.xml` around lines 1 -
13, The hardcoded strokeColor on the vector drawable's path (the <path> element
inside ic_arrow_left.xml) prevents proper dark-mode contrast; replace the
literal "#171717" with a theme-aware color attribute (e.g., use a color
attribute from your design system like ?attr/colorOnBackground or
?attr/colorControlNormal) so the icon adapts to light/dark themes, or provide an
alternative drawable under a night resource qualifier with an appropriate
strokeColor for dark backgrounds; update any references to ensure the themed
attribute exists in your themes and fallback color resources are defined.
feature/onboarding/src/main/java/com/twix/onboarding/couple/component/InvitationButton.kt (1)

23-44: 접근성 관점에서 터치 피드백을 검토해 주세요.

noRippleClickable을 사용하면 시각적 터치 피드백이 없어, 저시력 사용자나 스크린 리더 사용자에게 버튼이 눌렸는지 명확하지 않을 수 있습니다.

디자인 의도에 따른 선택이라면 괜찮지만, 접근성(Accessibility) 가이드라인을 고려하여 다음 중 하나를 검토해 보시는 것을 권장드립니다:

  • 커스텀 pressed state 시각 효과 추가
  • 또는 표준 clickable 사용으로 ripple 피드백 제공
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/InvitationButton.kt`
around lines 23 - 44, The InvitationButton currently uses
Modifier.noRippleClickable which removes visual touch feedback; update
InvitationButton to provide accessible pressed feedback by either replacing
noRippleClickable with Modifier.clickable(onClick = onClick, indication =
rememberRipple(), interactionSource = remember { MutableInteractionSource() })
to restore ripple feedback, or implement a custom pressed state using an
InteractionSource on the same Modifier (capture pressed Interaction.Pressed and
change background color/alpha or elevation in the composable) so users receive
clear visual feedback when the button is pressed.
feature/onboarding/src/main/java/com/twix/onboarding/contract/OnBoardingSideEffect.kt (1)

25-28: ShowToast.message@StringRes로 계약을 고정해 두는 편이 안전합니다.

지금은 단순 Int라서 문자열 리소스가 아닌 값도 컴파일되고, 각 Route에서 getString(sideEffect.message)를 호출할 때 런타임 크래시로 이어질 수 있습니다. 계약 레벨에서 @StringRes를 붙여 두면 잘못된 사용을 훨씬 빨리 막을 수 있습니다.

예시 수정
+import androidx.annotation.StringRes
 import com.twix.designsystem.components.toast.model.ToastType
 import com.twix.ui.base.SideEffect
@@
     data class ShowToast(
+        `@StringRes`
         val message: Int,
         val type: ToastType,
     ) : OnBoardingSideEffect
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/contract/OnBoardingSideEffect.kt`
around lines 25 - 28, Change the ShowToast contract to require a string resource
by annotating the message parameter with `@StringRes` (e.g., data class
ShowToast(`@StringRes` val message: Int, val type: ToastType) :
OnBoardingSideEffect) and add the appropriate import for
androidx.annotation.StringRes so callers cannot pass arbitrary Ints and
accidental getString(...) runtime crashes are prevented; update any usages that
currently pass non-resource ints to supply valid string resource IDs.
feature/onboarding/src/main/java/com/twix/onboarding/invite/InviteCodeScreen.kt (1)

274-287: 람다 래퍼 제거로 간소화할 수 있습니다.

onClick = { onComplete() }는 추가 작업 없이 함수를 호출하는 것이므로, 불필요한 람다 래퍼를 제거하고 직접 함수 참조를 전달하면 코드가 더 간결해지고 매 recomposition마다 새 람다 객체 생성을 피할 수 있습니다.

♻️ 제안된 수정
         AppButton(
             text = stringResource(R.string.onboarding_profile_button_title),
-            onClick = { onComplete() },
+            onClick = onComplete,
             backgroundColor = if (uiModel.isValid) GrayColor.C500 else GrayColor.C100,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/invite/InviteCodeScreen.kt`
around lines 274 - 287, The AppButton call uses an unnecessary lambda wrapper
for the click handler: locate the AppButton invocation and replace onClick = {
onComplete() } with a direct function reference onClick = onComplete (ensure the
onComplete signature matches the expected click handler type), leaving the rest
of the props (backgroundColor, textColor, enabled, modifier, uiModel) unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@feature/login/src/main/java/com/twix/login/navigation/LoginNavGraph.kt`:
- Line 41: The Login navigation currently calls
navController.navigate(destination) in LoginNavGraph which leaves the LoginGraph
on the back stack and allows returning to login from onboarding
(CoupleConnectRoute, InviteRoute); change the navigation to pop the LoginGraph
off the back stack by using navController.navigate(destination) with
popUpTo(graphRoute.route) { inclusive = true } (matching the ProfileRoute and
DdayRoute patterns) so the LoginGraph is removed when navigating to the
onboarding/main destinations.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/ConnectButton.kt`:
- Around line 54-64: The two AppText usages in ConnectButton (the AppText with
stringResource R.string.onboarding_couple_connect_direct_description and the
following AppText with R.string.onboarding_couple_direct_connect_button_title)
currently force fixed heights via Modifier.height(18.dp) and height(24.dp);
remove those height modifiers so the text can size to its content and replace
the spacing between them with an explicit Spacer or Column vertical spacing
(e.g., insert a Spacer(Modifier.height(...)) or use Column with
verticalArrangement/Arrangement.spacedBy) to create the needed gap while keeping
AppText flexible.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/CoupleConnectTopbar.kt`:
- Around line 25-32: The Image in CoupleConnectTopbar.kt uses contentDescription
= null which makes the back button inaccessible; replace the null with a
meaningful description (e.g., use string resources via
stringResource(R.string.back) or R.string.btn_back) so TalkBack can announce it,
and add the corresponding entry in strings.xml if it doesn't exist; ensure the
Image (the noRippleClickable onClickBack handler) keeps the same behavior while
providing the accessible label.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/invite/component/InviteCodeTextField.kt`:
- Around line 32-52: The field keeps showing a focused visual because focus
isn't tracked; update InviteCodeTextField's BasicTextField to track actual focus
via onFocusChanged (store a Boolean state like hasFocus), pass that focus state
into CodeBox, and change CodeBox usage so the active visual is only when
hasFocus && inviteCode.length == index; ensure existing input filtering logic
(value=inviteCode, onValueChange) and repeat(InviteCode.INVITE_CODE_LENGTH)
remain unchanged while wiring the new hasFocus state to control cursor/border
rendering.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/invite/InviteCodeScreen.kt`:
- Around line 329-334: The Preview in InviteCodeScreen is using a hardcoded
validation (isValid = textState.length == 6) that conflicts with the domain
constant InviteCode.INVITE_CODE_LENGTH (8); update the Preview's
InviteCodeUiModel creation (where InviteCodeUiModel is constructed with
partnerInviteCode = textState) to compute isValid using the domain constant
(e.g., isValid = textState.length == InviteCode.INVITE_CODE_LENGTH) so the
Preview mirrors InviteCodeTextField.kt’s validation and stays in sync with the
domain rule.

In `@feature/onboarding/src/main/java/com/twix/onboarding/OnBoardingViewModel.kt`:
- Around line 22-43: The fetchMyInviteCode() call in init should be removed
because init runs once for a shared ViewModel and can surface failure to users
before the invite screen is shown; instead make fetching lazy or explicit:
remove fetchMyInviteCode() from init, keep fetchMyInviteCode() as a public
method (or add fetchMyInviteCodeIfEmpty()) that checks inviteCode.myInviteCode
for emptiness before invoking launchResult, and wire the UI to call
fetchMyInviteCode() when the invite screen is entered or when a retry intent is
emitted; also keep the existing error handling (showToast) but ensure it only
runs when the UI triggers the fetch so the toast appears in the proper context.

---

Outside diff comments:
In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/CoupleConnectRoute.kt`:
- Around line 87-90: The Invite button is currently a no-op because
CoupleConnectScreen is passed an empty lambda for onClickSend; replace the empty
lambda with the intended action (e.g., pass navigateToNext) or, if intentionally
disabled, update the button state/label in CoupleConnectScreen to reflect
disabled status; locate the CoupleConnectScreen call and change the onClickSend
argument from {} to navigateToNext (or add a disabled flag/alternate text in
CoupleConnectScreen and wire it accordingly).

In
`@feature/onboarding/src/main/java/com/twix/onboarding/navigation/OnboardingNavGraph.kt`:
- Around line 77-79: The DdayRoute's navigateToBack currently calls
navController.navigate(NavRoutes.ProfileRoute.route), which pushes a new
ProfileRoute instead of returning to the previous entry; change it to use
popBackStack so it matches CoupleConnectRoute and InviteCodeRoute patterns.
Locate the DdayRoute navigateToBack assignment in OnboardingNavGraph.kt (the
block that currently references NavRoutes.ProfileRoute.route) and replace that
call with navController::popBackStack or an equivalent
navController.popBackStack() invocation to pop the previous entry off the back
stack.

---

Nitpick comments:
In `@core/design-system/src/main/res/drawable/ic_arrow_left.xml`:
- Around line 1-13: The hardcoded strokeColor on the vector drawable's path (the
<path> element inside ic_arrow_left.xml) prevents proper dark-mode contrast;
replace the literal "#171717" with a theme-aware color attribute (e.g., use a
color attribute from your design system like ?attr/colorOnBackground or
?attr/colorControlNormal) so the icon adapts to light/dark themes, or provide an
alternative drawable under a night resource qualifier with an appropriate
strokeColor for dark backgrounds; update any references to ensure the themed
attribute exists in your themes and fallback color resources are defined.

In `@feature/login/src/main/java/com/twix/login/LoginScreen.kt`:
- Line 15: 파일 LoginScreen.kt에서 더 이상 사용되지 않는 import
androidx.compose.runtime.setValue를 제거하세요; LoginScreen 컴포저블(또는 관련 함수)에서
mutableStateOf/setValue 호출이 모두 제거된 것을 확인한 뒤 해당 import 문을 삭제하여 불필요한 의존성을 제거하고
빌드/포맷을 다시 실행하세요.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/contract/OnBoardingSideEffect.kt`:
- Around line 25-28: Change the ShowToast contract to require a string resource
by annotating the message parameter with `@StringRes` (e.g., data class
ShowToast(`@StringRes` val message: Int, val type: ToastType) :
OnBoardingSideEffect) and add the appropriate import for
androidx.annotation.StringRes so callers cannot pass arbitrary Ints and
accidental getString(...) runtime crashes are prevented; update any usages that
currently pass non-resource ints to supply valid string resource IDs.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/CoupleConnectTopbar.kt`:
- Around line 17-34: Add a Preview composable for CoupleConnectTopbar so it can
be rendered in Android Studio previews: create a private preview function (e.g.,
CoupleConnectTopbarPreview) annotated with `@Preview`(showBackground = true) and
`@Composable` that wraps CoupleConnectTopbar in the app theme (TwixTheme) and
passes a no-op lambda for onClickBack ({}); place it in the same file
(CoupleConnectTopbar.kt) near the CoupleConnectTopbar composable and keep the
preview function private.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/InvitationButton.kt`:
- Around line 23-44: The InvitationButton currently uses
Modifier.noRippleClickable which removes visual touch feedback; update
InvitationButton to provide accessible pressed feedback by either replacing
noRippleClickable with Modifier.clickable(onClick = onClick, indication =
rememberRipple(), interactionSource = remember { MutableInteractionSource() })
to restore ripple feedback, or implement a custom pressed state using an
InteractionSource on the same Modifier (capture pressed Interaction.Pressed and
change background color/alpha or elevation in the composable) so users receive
clear visual feedback when the button is pressed.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/component/RestoreCoupleBottomSheetContent.kt`:
- Around line 93-99: Preview 함수 RestoreCoupleBottomSheetContentPreview의 가시성이 다른
컴포넌트의 Preview들과 달리 public으로 선언되어 있으니, 함수 선언부에 private 키워드를 추가하여 가시성을 private으로
통일하세요; 대상 심볼은 RestoreCoupleBottomSheetContentPreview()이며 파일의 해당 `@Preview` 어노테이션이
붙은 함수 선언을 찾아 선언부를 수정하면 됩니다.

In
`@feature/onboarding/src/main/java/com/twix/onboarding/invite/InviteCodeScreen.kt`:
- Around line 274-287: The AppButton call uses an unnecessary lambda wrapper for
the click handler: locate the AppButton invocation and replace onClick = {
onComplete() } with a direct function reference onClick = onComplete (ensure the
onComplete signature matches the expected click handler type), leaving the rest
of the props (backgroundColor, textColor, enabled, modifier, uiModel) unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 6233d593-f0ed-4ea2-a838-c84c4133869f

📥 Commits

Reviewing files that changed from the base of the PR and between 7841567 and 33396ed.

📒 Files selected for processing (27)
  • core/design-system/src/main/java/com/twix/designsystem/components/toast/ToastHost.kt
  • core/design-system/src/main/res/drawable/ic_arrow_left.xml
  • core/design-system/src/main/res/drawable/ic_copy.xml
  • core/design-system/src/main/res/drawable/ic_direct.xml
  • core/design-system/src/main/res/drawable/ic_invite.xml
  • core/design-system/src/main/res/values/strings.xml
  • feature/login/src/main/java/com/twix/login/LoginScreen.kt
  • feature/login/src/main/java/com/twix/login/navigation/LoginNavGraph.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/OnBoardingViewModel.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/contract/OnBoardingIntent.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/contract/OnBoardingSideEffect.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/contract/OnBoardingUiState.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/CoupleConnectRoute.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/component/ConnectButton.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/component/CoupleConnectTopbar.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/component/InvitationButton.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/component/RestoreCoupleBottomSheetContent.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/dday/DdayRoute.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/dday/component/DDayField.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/invite/InviteCodeScreen.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/invite/InviteCodeUiModel.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/invite/component/InviteCodeTextField.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/model/OnBoardingSideEffect.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/navigation/OnboardingNavGraph.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/profile/ProfileScreen.kt
  • feature/onboarding/src/main/res/drawable/img_couple_connect.xml
  • feature/onboarding/src/main/res/values/strings.xml
💤 Files with no reviewable changes (3)
  • feature/onboarding/src/main/res/drawable/img_couple_connect.xml
  • feature/onboarding/src/main/res/values/strings.xml
  • feature/onboarding/src/main/java/com/twix/onboarding/model/OnBoardingSideEffect.kt

- `verticalScroll`을 상위 레이아웃에서 내부 `Column`으로 이동하여 스크롤 동작 수정
@chanho0908 chanho0908 requested a review from dogmania March 10, 2026 07:20
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@feature/onboarding/src/main/java/com/twix/onboarding/couple/CoupleConnectRoute.kt`:
- Around line 124-133: The topbar (CoupleConnectTopbar) is currently inside the
vertically scrolling Column so it scrolls away; move CoupleConnectTopbar out of
the Column and make it a separate fixed child of the parent Box (e.g., place it
before/above the Column) while keeping the verticalScroll(scrollState) modifier
only on the Column content; ensure the Box child ordering/layout or use an
alignment modifier so the topbar remains pinned at the top and the Column
occupies the scrollable area below it.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: b3e12079-753c-402a-bfa7-c2ae286ad95f

📥 Commits

Reviewing files that changed from the base of the PR and between 59e4ef2 and 9cc29f6.

📒 Files selected for processing (4)
  • feature/login/src/main/java/com/twix/login/LoginScreen.kt
  • feature/login/src/main/java/com/twix/login/component/LoginButton.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/CoupleConnectRoute.kt
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/component/ConnectButton.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • feature/onboarding/src/main/java/com/twix/onboarding/couple/component/ConnectButton.kt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Refactor Good for newcomers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

온보딩 화면 QA 적용

1 participant