Skip to content

[Feat] 온보딩 UI#116

Merged
nahy-512 merged 17 commits intodevelopfrom
feat/#100-onboarding-film-ui
Jan 17, 2026
Merged

[Feat] 온보딩 UI#116
nahy-512 merged 17 commits intodevelopfrom
feat/#100-onboarding-film-ui

Conversation

@ckals413
Copy link
Contributor

@ckals413 ckals413 commented Jan 15, 2026

📮 관련 이슈

📌 작업 내용

  • OnboardingProfile UI
  • OnboardingFilm UI
  • OnboardingOtt UI
  • OnboardingDone UI

📸 스크린샷

Screen_recording_20260116_013227.mp4
Screen_recording_20260116_013356.mp4
Screen_recording_20260116_013521.mp4
Screen_recording_20260116_014532.mp4

🫛 To. 리뷰어

  • 온보딩 UI 구현했습니다 ±

Summary by CodeRabbit

  • New Features

    • 온보딩 완료 화면 추가
    • 온보딩 프로필 편집 흐름 강화(닉네임·프로필 사진, 하단 시트)
    • OTT 선택·영화 선택 화면 확장(검색, 선택, 빈 상태, 프리뷰)
    • 온보딩 단계 표시용 스텝 프로그레스바 추가
    • 온보딩 완료 경로 네비게이션 연결
    • Ott 목록 반환 유틸(getOtts) 추가
  • Refactor

    • OTT 항목 API를 모델 기반으로 정리(이미지·라벨 통일)
    • 상단바에 액션 콜백(no-ripple) 옵션 추가

✏️ Tip: You can customize this high-level summary in your review settings.

@ckals413 ckals413 self-assigned this Jan 15, 2026
@ckals413 ckals413 requested a review from a team as a code owner January 15, 2026 16:49
@ckals413 ckals413 added Feat ✨ 신규 기능을 추가하거나 기존 기능의 동작, 정책을 변경 📱 UI feat - 컴포넌트 조립, 화면 구현 labels Jan 15, 2026
@ckals413 ckals413 linked an issue Jan 15, 2026 that may be closed by this pull request
1 task
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 15, 2026

📝 Walkthrough

Walkthrough

온보딩 플로우에 직렬화 라우트 OnboardingDone과 해당 완료 화면이 추가되고, 프로필·OTT·영화 선택 화면들이 파라미터화되어 UI·네비게이션이 확장되며, OttType API와 StepProgressBar 컴포넌트, top appbar 액션 콜백이 도입됩니다.

Changes

코호트 / 파일(s) 변경 사항
네비게이션 / 라우트
\app/src/main/java/com/flint/core/navigation/Route.kt`, `app/src/main/java/com/flint/presentation/onboarding/navigation/OnboardingNavigation.kt``
Route.OnboardingDone 데이터 객체 추가, NavController.navigateToOnboardingDone() 추가, 온보딩 그래프에 OnboardingDone 경로 연결 및 OnboardingOttRoute 콜백명/시그니처 변경 (navigateToDone)
온보딩 — 완료 화면
\app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt``
신규 Composable OnboardingDoneRouteOnboardingDoneScreen 추가 (완료 UI, 이미지, 시작하기 버튼 등)
온보딩 — 프로필
\app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt``
OnboardingProfileRoutenavigateUp 추가, OnboardingProfileScreen 파라미터화(닉네임 입력·바텀시트·버튼 로직 등)
온보딩 — OTT 선택
\app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt``
OnboardingOttRoutenavigateUp·navigateToDone 추가, OnboardingOttScreen 구현(3열 그리드·선택 상태 UI 등)
온보딩 — 영화 선택
\app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt``
OnboardingFilmRoutenavigateUp 추가, OnboardingFilmScreen 파라미터화 및 레이아웃/그리드/검색 헤더 확장
컴포넌트 — OTT 항목
\app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt``
API 변경: (imageUrl, platformName)ottType: OttType, NetworkImage→painterResource로 변경 및 레이아웃 조정
컴포넌트 — 스텝 진행률
\app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt``
신규 Composable StepProgressBar(currentStep, totalSteps) 추가 (프로그레스바 + "cur/total" 표시, 프리뷰 포함)
도메인 타입
\app/src/main/java/com/flint/domain/type/OttType.kt``
companion objectfun getOtts(): List<OttType> 추가
디자인시스템 — TopAppBar
\app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt``
onActionClick: () -> Unit = {} 파라미터 추가, 액션 영역에 noRippleClickable 적용

Sequence Diagram(s)

sequenceDiagram
    participant User as User
    participant Nav as NavController
    participant Graph as NavigationGraph
    participant Profile as OnboardingProfileScreen
    participant Ott as OnboardingOttScreen
    participant Film as OnboardingFilmScreen
    participant Done as OnboardingDoneScreen

    User->>Nav: 온보딩 시작
    Nav->>Graph: Route.OnboardingProfile
    Graph->>Profile: Render OnboardingProfileScreen
    User->>Profile: 닉네임 입력 → 다음
    Profile->>Nav: navigateToOnboardingOtt()
    Nav->>Graph: Route.OnboardingOtt
    Graph->>Ott: Render OnboardingOttScreen
    User->>Ott: OTT 선택 → 다음
    Ott->>Nav: navigateToOnboardingFilm() or navigateToOnboardingDone()
    Nav->>Graph: Route.OnboardingFilm / Route.OnboardingDone
    Graph->>Film: Render OnboardingFilmScreen
    Film->>Nav: onNextClick()
    Nav->>Graph: Route.OnboardingDone
    Graph->>Done: Render OnboardingDoneScreen
    Done->>User: 완료 화면 표시
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • giovannijunseokim
  • nahy-512
  • kimjw2003

Poem

🐇 폴짝 토끼가 말해요,
닉네임 적고 OTT 골라요,
영화도 찰칵 고른 뒤에,
문이 열리면 시작하기 누르자,
당근 한 입 축하해요 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 온보딩 UI 구현이라는 주요 변경사항을 명확히 반영하고 있으며, 간결하고 구체적입니다.
Description check ✅ Passed PR 설명은 템플릿의 필수 섹션을 모두 포함하고 있으며, 관련 이슈, 작업 내용, 스크린샷, 리뷰어 노트가 완전히 작성되어 있습니다.
Linked Issues check ✅ Passed PR은 링크된 이슈 #100의 주요 요구사항인 온보딩 UI(Film, Profile, Ott, Done 포함) 구현을 완전히 충족합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 온보딩 UI 구현 범위 내에 있으며, 화면 구성요소, 네비게이션, 지원 유틸리티 추가로 일관성 있게 진행되었습니다.

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

✨ Finishing touches
  • 📝 Generate docstrings


📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6aa2a30 and 4ce8471.

📒 Files selected for processing (2)
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-01-16T08:47:13.979Z
Learnt from: ckals413
Repo: imflint/Flint-Android PR: 116
File: app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt:97-105
Timestamp: 2026-01-16T08:47:13.979Z
Learning: In OnboardingDoneScreen.kt, the "시작하기" button is intentionally set to FlintButtonState.Disable as a placeholder state until ViewModel implementation is completed.

Applied to files:

  • app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: PR Lint Check
  • GitHub Check: PR Build Check
🔇 Additional comments (1)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (1)

34-46: 라우트에서 padding/back 전달 정상입니다.

Line 34-46에서 paddingValuesnavigateUp을 화면으로 전달해 인셋/뒤로가기 wiring이 명확합니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


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

Copy link
Contributor

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

Caution

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

⚠️ Outside diff range comments (1)
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (1)

36-41: OnboardingProfileRoute가 비어 있어 OnboardingProfileScreen이 렌더링되지 않습니다.

paddingValuesnavigateToOnboardingFilm 파라미터가 전달되지만, Route 바디가 비어 있어서 실제 화면이 표시되지 않습니다. OnboardingProfileScreen을 호출하고 네비게이션 콜백을 연결해야 합니다.

🔧 Route 구현 예시
 `@Composable`
 fun OnboardingProfileRoute(
     paddingValues: PaddingValues,
     navigateToOnboardingFilm: () -> Unit,
 ) {
+    OnboardingProfileScreen(
+        onStartClick = navigateToOnboardingFilm,
+    )
 }

OnboardingProfileScreen에도 onStartClick 파라미터를 추가하여 "시작하기" 버튼과 연결해야 합니다.

🤖 Fix all issues with AI agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt`:
- Around line 104-113: Rename the preview function from
OnboardingOttScreenPreview to OnboardingDoneScreenPreview to match the
composable it previews; update the function declaration identifier and any
references/usages accordingly so the preview targets OnboardingDoneScreen (keep
the `@Preview` and `@Composable` annotations and the call to OnboardingDoneScreen
with onBackClick/onNextClick).
- Around line 26-31: OnboardingDoneRoute is empty so navigating to that route
renders a blank screen; update OnboardingDoneRoute to call the
OnboardingDoneScreen composable and forward required params (pass paddingValues
and the navigateToHome lambda) so the UI is shown; ensure you keep the
`@Composable` annotation on OnboardingDoneRoute and any required imports so
OnboardingDoneScreen(paddingValues = paddingValues, navigateToHome =
navigateToHome) is invoked.

In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt`:
- Around line 28-33: OnboardingOttRoute is empty so the screen never renders;
implement it like the other route functions by calling OnboardingOttScreen and
wiring the navigateToDone callback and paddingValues through: inside
OnboardingOttRoute invoke OnboardingOttScreen(paddingValues = paddingValues,
onDone = navigateToDone) (or the correct parameter name for the screen),
matching how OnboardingProfileRoute delegates to its screen so the UI renders
and navigation callback is connected.
🧹 Nitpick comments (6)
app/src/main/java/com/flint/domain/type/OttType.kt (1)

18-20: getOtts() 함수가 중복될 수 있습니다.

OttType.entries를 직접 호출하는 것과 동일한 기능을 제공하므로, 호출하는 측에서 OttType.entries를 직접 사용하는 것이 더 간결할 수 있습니다. 다만, 추후 필터링 로직 추가 등 확장 가능성을 고려한다면 현재 구조도 괜찮습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (1)

141-171: TODO 주석 및 하드코딩된 데이터 확인이 필요합니다.

  • Line 148: // TODO: 위아래 중앙 배치 - 빈 검색 결과 뷰의 수직 중앙 정렬이 미완성입니다.
  • items(7), items(9) 및 더미 데이터가 하드코딩되어 있습니다. ViewModel 연동 시 실제 데이터로 교체가 필요합니다.

중앙 배치 구현을 도와드릴까요?

app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (1)

15-39: totalSteps가 0일 때 NaN 발생 가능성이 있습니다.

totalSteps가 0이면 currentStep.toFloat() / 0fNaN 또는 Infinity를 반환합니다. coerceInInfinity를 처리하지만 NaN은 그대로 유지되어 UI가 비정상적으로 표시될 수 있습니다.

♻️ 방어적 코드 제안
 `@Composable`
 fun StepProgressBar(
     currentStep: Int,
     totalSteps: Int,
     modifier: Modifier = Modifier,
 ) {
-    val progress = (currentStep.toFloat() / totalSteps.toFloat()).coerceIn(0f, 1f)
+    val progress = if (totalSteps > 0) {
+        (currentStep.toFloat() / totalSteps.toFloat()).coerceIn(0f, 1f)
+    } else {
+        0f
+    }
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (1)

108-127: 버튼 클릭 핸들러가 구현되지 않았습니다.

"확인" 버튼(Line 111)과 "시작하기" 버튼(Line 121)의 onClick이 비어 있습니다. 추후 구현 예정이라면 TODO 주석을 추가하거나, 화면 파라미터로 콜백을 받아서 연결하는 것이 좋습니다.

app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt (1)

32-56: OttType을 사용한 리팩토링이 좋습니다.

개별 imageUrl/platformName 대신 OttType 도메인 타입을 사용하여 타입 안전성과 유지보수성이 향상되었습니다.

다만, 접근성(Accessibility)을 위해 Image의 contentDescription에 OTT 이름을 추가하는 것을 권장합니다:

 Image(
     painter = painterResource(ottType.imageRes),
-    contentDescription = null,
+    contentDescription = ottType.ottName,
 )
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

72-84: LazyVerticalGrid items에 key 추가를 권장합니다.

리컴포지션 성능 최적화를 위해 items()key 파라미터를 추가하는 것이 좋습니다.

-items(OttType.getOtts()) { ottType ->
+items(
+    items = OttType.getOtts(),
+    key = { it.name }
+) { ottType ->
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8b41ead and ad92e85.

📒 Files selected for processing (10)
  • app/src/main/java/com/flint/core/navigation/Route.kt
  • app/src/main/java/com/flint/domain/type/OttType.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt
  • app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt
  • app/src/main/java/com/flint/presentation/onboarding/navigation/OnboardingNavigation.kt
  • app/src/main/res/raw/flint_lottie.json
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2026-01-13T19:02:41.580Z
Learnt from: chanmi1125
Repo: imflint/Flint-Android PR: 77
File: app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateThumbnail.kt:45-72
Timestamp: 2026-01-13T19:02:41.580Z
Learning: In `app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateThumbnail.kt`, the height difference between CollectionCreateEmptyThumbnail (no aspectRatio) and CollectionCreateFillThumbnail (aspectRatio 1.5f / 1f) is intentional design - the empty state should not have the same aspectRatio as the filled state.

Applied to files:

  • app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt
📚 Learning: 2026-01-13T19:02:56.195Z
Learnt from: chanmi1125
Repo: imflint/Flint-Android PR: 77
File: app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateThumbnail.kt:45-72
Timestamp: 2026-01-13T19:02:56.195Z
Learning: In `app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateThumbnail.kt`, the aspect ratio difference between `CollectionCreateEmptyThumbnail` (no aspect ratio) and `CollectionCreateFillThumbnail` (1.5f / 1f) is intentional by design.

Applied to files:

  • app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt
📚 Learning: 2026-01-13T17:03:16.816Z
Learnt from: giovannijunseokim
Repo: imflint/Flint-Android PR: 72
File: app/src/main/java/com/flint/core/designsystem/component/collection/PeopleBottomSheet.kt:85-98
Timestamp: 2026-01-13T17:03:16.816Z
Learning: In PeopleBottomSheet.kt, the `people` list passed to LazyColumn is static and does not change while the bottom sheet is visible, so a key parameter is not required for the items() call.

Applied to files:

  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🧬 Code graph analysis (4)
app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (2)
app/src/main/java/com/flint/core/designsystem/component/progressbar/FlintProgressBar.kt (1)
  • FlintProgressBar (18-39)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (8)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (1)
  • StepProgressBar (15-39)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
app/src/main/java/com/flint/core/designsystem/component/image/SelectedFilmItem.kt (1)
  • SelectedFilmItem (20-49)
app/src/main/java/com/flint/core/designsystem/component/view/FlintSearchEmptyView.kt (1)
  • FlintSearchEmptyView (20-41)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingFilmItem.kt (1)
  • OnboardingFilmItem (33-116)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/navigation/OnboardingNavigation.kt (2)
app/src/main/java/com/flint/presentation/main/MainNavigator.kt (1)
  • navigate (72-87)
app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (1)
  • OnboardingDoneRoute (26-31)
app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (3)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
⏰ 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). (2)
  • GitHub Check: PR Lint Check
  • GitHub Check: PR Build Check
🔇 Additional comments (8)
app/src/main/java/com/flint/core/navigation/Route.kt (1)

21-23: LGTM!

OnboardingDone 라우트가 기존 패턴을 따라 적절하게 추가되었습니다. 온보딩 플로우에서 OnboardingOtt 다음에 위치하는 것이 논리적으로 올바릅니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (3)

34-45: paddingValues 파라미터가 사용되지 않고, onBackClick이 비어있습니다.

  • paddingValues가 함수 시그니처에 있지만 OnboardingFilmScreen에 전달되지 않습니다.
  • onBackClick = {}로 인해 뒤로가기 버튼이 동작하지 않습니다.

ViewModel 연동 시 수정이 필요합니다.


174-183: 버튼 상태 처리가 적절합니다.

FlintButtonState.Disable 상태에서 FlintBasicButtonclickable(enabled = enabled, ...)을 사용하므로 비활성화 시 클릭이 방지됩니다. 추후 ViewModel 연동 시 선택된 영화 개수에 따라 상태를 동적으로 변경하면 됩니다.


107-122: Sticky header 구현이 적절합니다.

LazyVerticalGridstickyHeader를 사용하여 검색창이 스크롤 시 상단에 고정됩니다. 배경색 설정으로 콘텐츠가 겹치는 것을 방지한 점도 좋습니다.

app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (1)

41-72: 프리뷰 구성이 잘 되어 있습니다.

시작(1/7), 중간(3/7), 완료(7/7) 상태에 대한 프리뷰가 모두 포함되어 있어 다양한 상태를 확인할 수 있습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (1)

91-100: 완료 화면에서 버튼이 비활성화되어 있습니다.

온보딩 완료 화면의 "시작하기" 버튼이 FlintButtonState.Disable 상태입니다. 사용자가 온보딩을 완료하고 홈으로 이동할 수 없게 됩니다. UI 구현용 임시 상태인지 확인이 필요합니다.

✏️ 활성화 상태로 변경 제안
         FlintBasicButton(
             text = "시작하기",
-            state = FlintButtonState.Disable,
+            state = FlintButtonState.Enable,
             onClick = onNextClick,
app/src/main/java/com/flint/presentation/onboarding/navigation/OnboardingNavigation.kt (1)

25-60: 온보딩 네비게이션 확장이 올바르게 구현되었습니다.

navigateToOnboardingDone() 확장 함수와 Route.OnboardingDone 라우트가 기존 패턴과 일관되게 추가되었습니다. Profile → Film → Ott → Done → Home 플로우가 적절히 연결되어 있습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

49-53: "건너뛰기" 액션이 클릭 불가능한 상태입니다.

actionText = "건너뛰기"는 화면에 표시되지만 클릭할 수 없습니다. FlintBackTopAppbar의 현재 구현에서는 actionText에 대한 클릭 핸들러를 지원하지 않으며, onActionClick 파라미터도 존재하지 않습니다. 스킵 기능이 필요하다면 FlintBackTopAppbar를 확장하여 action 클릭 핸들링을 지원하거나, 다른 방식의 구현이 필요합니다.

Likely an incorrect or invalid review comment.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

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

⚠️ Outside diff range comments (1)
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (1)

36-41: OnboardingProfileRoute가 비어 있어 화면이 렌더링되지 않습니다.

Route 컴포저블이 OnboardingProfileScreen을 호출하지 않아 네비게이션 시 아무것도 표시되지 않습니다. paddingValuesnavigateToOnboardingFilm 파라미터도 사용되지 않고 있습니다.

🐛 Route와 Screen 연결 제안
 `@Composable`
 fun OnboardingProfileRoute(
     paddingValues: PaddingValues,
     navigateToOnboardingFilm: () -> Unit,
 ) {
+    OnboardingProfileScreen(
+        paddingValues = paddingValues,
+        navigateToOnboardingFilm = navigateToOnboardingFilm,
+    )
 }

OnboardingProfileScreen도 해당 파라미터를 받도록 시그니처 수정이 필요합니다.

🤖 Fix all issues with AI agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt`:
- Around line 34-45: OnboardingFilmRoute currently accepts paddingValues but
doesn't pass it into OnboardingFilmScreen and also sets onBackClick to an empty
lambda; update OnboardingFilmRoute to forward the received paddingValues to
OnboardingFilmScreen (e.g., pass paddingValues = paddingValues) so the screen
can inset content for system bars/navigation, and wire a proper back action into
onBackClick (e.g., accept a onBack callback parameter on OnboardingFilmRoute or
call navController::popBackStack) instead of the empty {} to enable back
navigation.

In
`@app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt`:
- Around line 133-150: The bottom sheet never closes after an action because the
MenuBottomSheetData items' clickAction handlers don't mutate showBottomSheet;
update the clickAction for each MenuBottomSheetData (the "갤러리에서 선택" and "프로필 사진
삭제" entries used by MenuBottomSheet) to set showBottomSheet = false (and then
perform the existing action logic if any) so selecting an item will dismiss the
sheet; keep the state update inside those clickAction lambdas so the UI reacts
immediately.
- Around line 43-48: The composable OnboardingProfileScreen currently has no
navigation or padding parameters; update its signature to accept navigation
callbacks and padding (e.g., add parameters like onNext: () -> Unit, onBack: ()
-> Unit and a padding parameter such as modifier: Modifier = Modifier or
contentPadding: PaddingValues) so it can be wired to the Route; update the
function body to use those parameters where navigation or padding is needed and
adjust all call sites to pass the appropriate callbacks and padding.
- Around line 121-130: The "시작하기" FlintBasicButton currently has an empty
onClick and therefore doesn't navigate; replace the onClick lambda to call
navigateToOnboardingFilm() (respecting the existing enabled state) — i.e., in
the FlintBasicButton invocation change onClick = {} to onClick = {
navigateToOnboardingFilm() } so clicking the button advances the onboarding
flow.
♻️ Duplicate comments (1)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

28-33: OnboardingOttRoute가 비어 있어 화면이 렌더링되지 않습니다.

이전 리뷰에서 지적된 것처럼, OnboardingOttScreen을 호출하고 콜백을 연결해야 합니다. paddingValues 파라미터도 사용되지 않고 있습니다.

🔧 Route 구현 예시
 `@Composable`
 fun OnboardingOttRoute(
     paddingValues: PaddingValues,
     navigateToDone: () -> Unit,
 ) {
+    OnboardingOttScreen(
+        nickname = "", // TODO: ViewModel에서 가져오기
+        onBackClick = { /* TODO: 뒤로가기 처리 */ },
+        onNextClick = navigateToDone,
+    )
 }
🧹 Nitpick comments (6)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt (1)

52-55: 접근성 개선: contentDescription에 OTT 이름을 제공하세요.

현재 contentDescriptionnull로 설정되어 있어 스크린 리더 사용자가 어떤 OTT 서비스인지 알 수 없습니다. ottType.ottName을 사용하여 접근성을 개선할 수 있습니다.

♻️ 제안된 수정
 Image(
     painter = painterResource(ottType.imageRes),
-    contentDescription = null,
+    contentDescription = ottType.ottName,
 )
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

77-84: TODO: 선택 상태 관리 로직이 필요합니다.

OTT 항목 선택 기능이 TODO로 남아 있습니다. ViewModel에서 선택 상태를 관리하고, 선택된 항목이 있을 때 버튼을 활성화하는 로직이 필요합니다.

선택 상태 관리를 위한 ViewModel 로직이나 상태 관리 코드 생성을 도와드릴까요?

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (4)

39-44: 하드코딩된 플레이스홀더 값들은 ViewModel 연동 시 교체가 필요합니다.

nickname = "User", currentStep = 7 등이 하드코딩되어 있습니다. UI 스캐폴딩 목적으로는 괜찮지만, 실제 로직 연결 시 ViewModel에서 상태를 주입받도록 변경해야 합니다.


115-120: 검색 필드 상태 관리가 구현되지 않았습니다.

value = ""onValueChange = {}가 하드코딩되어 있어 사용자 입력이 반영되지 않습니다. ViewModel 연동 전까지 임시로 remember { mutableStateOf("") }를 사용하여 입력 테스트가 가능하도록 할 수 있습니다.


144-152: TODO 주석: 빈 검색 결과 뷰의 세로 중앙 정렬이 필요합니다.

height(300.dp)가 임의의 값으로 설정되어 있고, TODO 주석에서 위아래 중앙 배치가 필요하다고 언급되어 있습니다. LazyVerticalGrid 특성상 남은 공간을 채우기 어려우므로, 빈 상태일 때는 그리드 대신 별도의 Box로 전환하는 것을 고려해보세요.

이 부분의 레이아웃 개선을 도와드릴까요?


130-135: 플레이스홀더 데이터에 빈 imageUrl이 사용되고 있습니다.

SelectedFilmItemOnboardingFilmItem 모두 imageUrl = ""로 설정되어 있어 프리뷰에서 이미지가 표시되지 않습니다. UI 검증을 위해 샘플 이미지 URL이나 로컬 드로어블 리소스 사용을 권장합니다.

Also applies to: 156-169

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ad92e85 and 86899b6.

📒 Files selected for processing (4)
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-01-13T17:03:16.816Z
Learnt from: giovannijunseokim
Repo: imflint/Flint-Android PR: 72
File: app/src/main/java/com/flint/core/designsystem/component/collection/PeopleBottomSheet.kt:85-98
Timestamp: 2026-01-13T17:03:16.816Z
Learning: In PeopleBottomSheet.kt, the `people` list passed to LazyColumn is static and does not change while the bottom sheet is visible, so a key parameter is not required for the items() call.

Applied to files:

  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🧬 Code graph analysis (3)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (4)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt (1)
  • OnboardingOttItem (31-88)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (8)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (1)
  • StepProgressBar (15-39)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
app/src/main/java/com/flint/core/designsystem/component/image/SelectedFilmItem.kt (1)
  • SelectedFilmItem (20-49)
app/src/main/java/com/flint/core/designsystem/component/view/FlintSearchEmptyView.kt (1)
  • FlintSearchEmptyView (20-41)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingFilmItem.kt (1)
  • OnboardingFilmItem (33-116)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (6)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/core/designsystem/component/image/EditProfileImage.kt (1)
  • EditProfileImage (21-52)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/component/bottomsheet/MenuBottomSheet.kt (1)
  • MenuBottomSheet (30-79)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
🪛 detekt (1.23.8)
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt

[warning] 32-33: This empty block of code can be removed.

(detekt.empty-blocks.EmptyFunctionBlock)

⏰ 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). (2)
  • GitHub Check: PR Build Check
  • GitHub Check: PR Lint Check
🔇 Additional comments (6)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt (1)

90-122: LGTM!

Preview가 선택된 상태와 선택되지 않은 상태를 모두 보여주어 다양한 케이스를 확인할 수 있습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

100-110: LGTM!

Preview가 FlintTheme으로 올바르게 래핑되어 있고, 샘플 데이터로 화면을 미리 볼 수 있습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (2)

186-212: 프리뷰 구현이 잘 되어 있습니다.

두 가지 상태(목록 있음/검색 결과 없음)에 대한 프리뷰가 적절히 구성되어 있어 UI 검증에 유용합니다.


173-182: 비활성화된 버튼이 여전히 클릭 가능하다는 우려는 타당하지 않습니다.

FlintBasicButton 구현을 확인한 결과, line 43에서 enabled 값을 상태에서 추출하고 line 60에서 .clickable(enabled = enabled, onClick = onClick)로 전달합니다. FlintButtonState.Disableenabled = false로 설정되어 있으며, Compose의 clickable() 수정자는 enabled = false일 때 클릭을 올바르게 차단합니다. 따라서 비활성화 상태에서 클릭이 실행되지 않습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (2)

111-118: "확인" 버튼의 역할이 명확하지 않습니다.

닉네임 입력 옆의 "확인" 버튼이 빈 onClick을 가지고 있습니다. 닉네임 유효성 검사나 저장 로직이 필요하다면 구현이 필요하고, 불필요하다면 제거를 고려해 주세요.


153-159: LGTM!

프리뷰 컴포저블이 표준 패턴을 따르고 있으며, FlintTheme으로 올바르게 래핑되어 있습니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines 34 to 45
@Composable
fun OnboardingFilmRoute(
paddingValues: PaddingValues,
navigateToOnboardingOtt: () -> Unit,
) {
OnboardingFilmScreen(
nickname = "User",
currentStep = 7,
onBackClick = {},
onNextClick = navigateToOnboardingOtt,
)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

paddingValues 파라미터가 사용되지 않습니다.

OnboardingFilmRoute에서 paddingValues를 받지만 OnboardingFilmScreen에 전달하지 않아 시스템 바 영역이나 하단 네비게이션과의 충돌이 발생할 수 있습니다. 또한 onBackClick이 빈 람다로 설정되어 뒤로가기 기능이 작동하지 않습니다.

제안된 수정
 `@Composable`
 fun OnboardingFilmRoute(
     paddingValues: PaddingValues,
     navigateToOnboardingOtt: () -> Unit,
+    onBackClick: () -> Unit,
 ) {
     OnboardingFilmScreen(
         nickname = "User",
         currentStep = 7,
-        onBackClick = {},
+        onBackClick = onBackClick,
         onNextClick = navigateToOnboardingOtt,
+        modifier = Modifier.padding(paddingValues),
     )
 }
🤖 Prompt for AI Agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt`
around lines 34 - 45, OnboardingFilmRoute currently accepts paddingValues but
doesn't pass it into OnboardingFilmScreen and also sets onBackClick to an empty
lambda; update OnboardingFilmRoute to forward the received paddingValues to
OnboardingFilmScreen (e.g., pass paddingValues = paddingValues) so the screen
can inset content for system bars/navigation, and wire a proper back action into
onBackClick (e.g., accept a onBack callback parameter on OnboardingFilmRoute or
call navController::popBackStack) instead of the empty {} to enable back
navigation.

Copy link
Contributor

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

🤖 Fix all issues with AI agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt`:
- Around line 108-121: The FlintBasicTextField is currently read-only because
value is hard-coded to "" and onValueChange is a no-op; replace that with a
composable-backed state (e.g., a remember + mutableStateOf) and bind it so value
reads from the state and onValueChange updates it; update the
FlintBasicTextField usage in the stickyHeader Column to use that local state (or
forward a state from the parent/ViewModel) so the input becomes editable.

In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt`:
- Around line 33-38: The OnboardingOttScreen call currently passes a hardcoded
nickname ("user") and an empty back callback; replace those with injected values
from the ViewModel or navigation layer by wiring the
RealViewModel/route-provided nickname into the nickname parameter and passing
the actual back-navigation function into onBackClick (instead of {}), while
keeping existing onNextClick (navigateToDone) and modifier usage; update the
caller to accept or fetch the ViewModel/nav args and forward them to
OnboardingOttScreen (look for the OnboardingOttScreen invocation, nickname
param, onBackClick, and navigateToDone to locate where to change).
- Around line 56-60: FlintBackTopAppbar currently renders actionText ("건너뛰기") as
non-clickable text; modify the component usage and/or component API so the
action becomes tappable: add an onActionClick callback parameter to
FlintBackTopAppbar (or make the actionText Text composable clickable) and wire
it to call the existing onNextClick from the onboarding screen; ensure the prop
name (onActionClick) and the actionText rendering inside FlintBackTopAppbar are
updated so clicking "건너뛰기" invokes onNextClick while leaving onBackClick
behavior unchanged.
- Around line 79-97: The screen currently renders items with OnboardingOttItem
and always passes isSelected = false and a no-op onClick while FlintBasicButton
is hardcoded to FlintButtonState.Disable; implement local state (e.g., a
MutableState or remember { mutableStateOf(...) } holding a Set or List of
selected OttType ids) in OnboardingOttScreen, pass each item's selection via
isSelected and update the selection set in the OnboardingOttItem onClick handler
to toggle membership, and compute the button state so FlintBasicButton uses
FlintButtonState.Enable when the selection set is non-empty and Disable when
empty, invoking onNextClick only when enabled. Use the existing
OttType.getOtts(), OnboardingOttItem, FlintBasicButton, FlintButtonState and
onNextClick symbols to locate where to wire the state.

In
`@app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt`:
- Around line 36-46: OnboardingProfileRoute passes paddingValues into
OnboardingProfileScreen but those Insets aren't applied, so wrap the screen's
root layout with the provided paddingValues (e.g., apply
Modifier.padding(paddingValues) or use Scaffold's content padding) inside
OnboardingProfileScreen; update the root container (Column/Box/Scaffold) in
OnboardingProfileScreen to consume the paddingValues parameter so system
bars/navigation bars don't overlap content.
♻️ Duplicate comments (1)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (1)

34-45: 뒤로가기 콜백이 여전히 빈 람다입니다.

Line 42에서 onBackClick = {}로 고정되어 상단 뒤로가기 버튼이 동작하지 않습니다. Route에서 콜백을 주입해 주세요. (이 이슈는 이전 리뷰와 동일합니다.)

🛠️ 제안 수정
 fun OnboardingFilmRoute(
     paddingValues: PaddingValues,
     navigateToOnboardingOtt: () -> Unit,
+    onBackClick: () -> Unit,
 ) {
     OnboardingFilmScreen(
         nickname = "User",
         currentStep = 7,
-        onBackClick = {},
+        onBackClick = onBackClick,
         onNextClick = navigateToOnboardingOtt,
         modifier = Modifier.padding(paddingValues)
     )
 }
🧹 Nitpick comments (1)
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (1)

141-158: 이전 리뷰 코멘트가 반영되었습니다.

바텀 시트 액션 선택 후 showBottomSheet = false로 시트가 닫히도록 수정되었습니다.

참고: Line 154의 람다 포맷팅이 Line 149와 일관되지 않습니다 ({showBottomSheet{ showBottomSheet).

♻️ 포맷팅 일관성 제안
                     MenuBottomSheetData(
                         label = "프로필 사진 삭제",
                         color = FlintTheme.colors.error500,
-                        clickAction = {showBottomSheet = false },
+                        clickAction = { showBottomSheet = false },
                     ),
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 86899b6 and 1a16a95.

📒 Files selected for processing (4)
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-01-13T17:03:16.816Z
Learnt from: giovannijunseokim
Repo: imflint/Flint-Android PR: 72
File: app/src/main/java/com/flint/core/designsystem/component/collection/PeopleBottomSheet.kt:85-98
Timestamp: 2026-01-13T17:03:16.816Z
Learning: In PeopleBottomSheet.kt, the `people` list passed to LazyColumn is static and does not change while the bottom sheet is visible, so a key parameter is not required for the items() call.

Applied to files:

  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🧬 Code graph analysis (3)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (4)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt (1)
  • OnboardingOttItem (31-88)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (8)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (1)
  • StepProgressBar (15-39)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
app/src/main/java/com/flint/core/designsystem/component/image/SelectedFilmItem.kt (1)
  • SelectedFilmItem (20-49)
app/src/main/java/com/flint/core/designsystem/component/view/FlintSearchEmptyView.kt (1)
  • FlintSearchEmptyView (20-41)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingFilmItem.kt (1)
  • OnboardingFilmItem (33-116)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (6)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/core/designsystem/component/image/EditProfileImage.kt (1)
  • EditProfileImage (21-52)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/component/bottomsheet/MenuBottomSheet.kt (1)
  • MenuBottomSheet (30-79)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
⏰ 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). (2)
  • GitHub Check: PR Lint Check
  • GitHub Check: PR Build Check
🔇 Additional comments (4)
app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (3)

66-68: 뒤로가기 버튼의 onClick이 비어있습니다.

온보딩 첫 화면이므로 뒤로가기가 불필요할 수 있지만, 그렇다면 FlintBackTopAppbar 대신 뒤로가기 아이콘이 없는 앱바를 사용하거나, 앱 종료/이전 플로우로 이동하는 동작을 연결하는 것이 좋습니다.


119-126: "확인" 버튼의 onClick이 비어있습니다.

닉네임 입력 후 "확인" 버튼의 의도된 동작이 불분명합니다. 닉네임 검증, 키보드 숨기기, 또는 상태 저장 등의 로직이 필요한지 확인이 필요합니다.


129-138: 이전 리뷰 코멘트가 반영되었습니다.

"시작하기" 버튼이 이제 navigateToOnboardingFilm을 호출하여 다음 화면으로 정상 이동합니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

107-115: 프리뷰 추가는 UI 확인에 도움이 됩니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines 108 to 121
// 검색창 - sticky header (상단에 고정)
stickyHeader {
Column(
modifier =
Modifier
.background(FlintTheme.colors.background)
.padding(bottom = 16.dp),
) {
FlintBasicTextField(
placeholder = "작품 이름",
value = "",
onValueChange = {},
modifier = Modifier.fillMaxWidth(),
)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

검색 입력이 동작하지 않습니다 (값 고정).

Line 118-119에서 value = "", onValueChange = {}로 고정되어 실제 입력이 불가능합니다. 최소한 로컬 상태라도 연결해 주세요.

🛠️ 제안 수정
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.rememberSaveable
+import androidx.compose.runtime.setValue
@@
 fun OnboardingFilmScreen(
@@
 ) {
+    var query by rememberSaveable { mutableStateOf("") }
+
     Column(
@@
                     FlintBasicTextField(
                         placeholder = "작품 이름",
-                        value = "",
-                        onValueChange = {},
+                        value = query,
+                        onValueChange = { query = it },
                         modifier = Modifier.fillMaxWidth(),
                     )
🤖 Prompt for AI Agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt`
around lines 108 - 121, The FlintBasicTextField is currently read-only because
value is hard-coded to "" and onValueChange is a no-op; replace that with a
composable-backed state (e.g., a remember + mutableStateOf) and bind it so value
reads from the state and onValueChange updates it; update the
FlintBasicTextField usage in the stickyHeader Column to use that local state (or
forward a state from the parent/ViewModel) so the input becomes editable.

Comment on lines 33 to 38
Copy link
Contributor

@coderabbitai coderabbitai bot Jan 16, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

라우트에서 하드코딩된 닉네임/빈 뒤로가기 콜백이 그대로 노출됩니다.
실사용 시 닉네임과 뒤로가기 동작을 ViewModel/네비게이션에서 주입하거나, 최소한 파라미터로 전달하도록 연결해 주세요.

🤖 Prompt for AI Agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt`
around lines 33 - 38, The OnboardingOttScreen call currently passes a hardcoded
nickname ("user") and an empty back callback; replace those with injected values
from the ViewModel or navigation layer by wiring the
RealViewModel/route-provided nickname into the nickname parameter and passing
the actual back-navigation function into onBackClick (instead of {}), while
keeping existing onNextClick (navigateToDone) and modifier usage; update the
caller to accept or fetch the ViewModel/nav args and forward them to
OnboardingOttScreen (look for the OnboardingOttScreen invocation, nickname
param, onBackClick, and navigateToDone to locate where to change).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

어 의도된거야, 나중에 뷰모델 하면서 할거야

Copy link
Contributor

Choose a reason for hiding this comment

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

@ckals413 알겠습니다! ViewModel 작업 시 함께 연결하시면 되겠네요. 👍

Comment on lines 36 to 46
@Composable
fun OnboardingProfileRoute(
paddingValues: PaddingValues,
navigateToOnboardingFilm: () -> Unit,
) {
// 뷰모델
OnboardingProfileScreen(
paddingValues = paddingValues,
navigateToOnboardingFilm = navigateToOnboardingFilm,
)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

paddingValues 파라미터가 사용되지 않습니다.

OnboardingProfileRoute에서 받은 paddingValuesOnboardingProfileScreen에 전달되지만, 실제 레이아웃에 적용되지 않습니다. Scaffold의 content padding을 적용하지 않으면 시스템 바 또는 네비게이션 바와 콘텐츠가 겹칠 수 있습니다.

🔧 paddingValues 적용 제안
     Column(
         modifier =
             Modifier
                 .fillMaxSize()
                 .background(color = FlintTheme.colors.background)
-                .statusBarsPadding(),
+                .padding(paddingValues),
     ) {
🤖 Prompt for AI Agents
In
`@app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt`
around lines 36 - 46, OnboardingProfileRoute passes paddingValues into
OnboardingProfileScreen but those Insets aren't applied, so wrap the screen's
root layout with the provided paddingValues (e.g., apply
Modifier.padding(paddingValues) or use Scaffold's content padding) inside
OnboardingProfileScreen; update the root container (Column/Box/Scaffold) in
OnboardingProfileScreen to consume the paddingValues parameter so system
bars/navigation bars don't overlap content.

Copy link
Contributor

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

Caution

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

⚠️ Outside diff range comments (1)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)

49-56: actionText가 비어있을 때 클릭 영역 확인 필요

closeablefalse이고 actionText가 기본값 ""일 때, 빈 Text가 렌더링되지만 noRippleClickable이 적용되어 있어 보이지 않는 영역이 클릭 가능한 상태가 됩니다. 의도하지 않은 클릭 이벤트가 발생할 수 있습니다.

💡 actionText가 비어있지 않을 때만 클릭 가능하도록 수정
             } else {
                 Text(
-                    modifier = Modifier.noRippleClickable(onClick = onActionClick),
+                    modifier = if (actionText.isNotEmpty()) {
+                        Modifier.noRippleClickable(onClick = onActionClick)
+                    } else {
+                        Modifier
+                    },
                     text = actionText,
                     color = textColor,
                     style = FlintTheme.typography.body1M16,
                 )
             }
🤖 Fix all issues with AI agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt`:
- Around line 27-35: OnboardingDoneRoute currently passes a no-op lambda to
OnboardingDoneScreen's onBackClick, causing the top back icon to be
unresponsive; update OnboardingDoneRoute to either pass a real navigation
callback (e.g., the parent back navigation function or a provided navigateUp
lambda) into onBackClick so the icon performs navigation, or remove/hide the
back icon by changing the props you pass to OnboardingDoneScreen if back
navigation is not desired; locate the OnboardingDoneRoute function and modify
the onBackClick argument (and any corresponding calls at lines ~51-53) to
forward the appropriate navigation callback instead of {} or adjust the screen
props to suppress the icon.
- Around line 96-104: The "시작하기" button is hard-coded disabled by using
FlintButtonState.Disable so users cannot proceed; update the FlintBasicButton in
OnboardingDoneScreen to use an enabled state (e.g., FlintButtonState.Enable) or
make the button state a composable parameter and pass it in from the parent,
ensuring onNextClick remains wired; locate the FlintBasicButton invocation and
change the state argument (or add a parameter to OnboardingDoneScreen to control
the buttonState) so the button is clickable on the completion screen.
♻️ Duplicate comments (3)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

80-98: 선택 상태/다음 버튼 활성화 미구현입니다. TODO 상태라 선택해도 진행이 막힙니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (2)

34-46: onBackClick이 여전히 빈 람다입니다.

paddingValues 적용은 개선되었으나, onBackClick = {}이 여전히 빈 람다로 설정되어 뒤로가기 기능이 작동하지 않습니다. OnboardingFilmRouteonBackClick 파라미터를 추가하고 네비게이션에서 전달받아 연결해 주세요.

제안된 수정
 `@Composable`
 fun OnboardingFilmRoute(
     paddingValues: PaddingValues,
     navigateToOnboardingOtt: () -> Unit,
+    onBackClick: () -> Unit,
 ) {
     OnboardingFilmScreen(
         nickname = "User",
         currentStep = 7,
-        onBackClick = {},
+        onBackClick = onBackClick,
         onNextClick = navigateToOnboardingOtt,
         modifier = Modifier.padding(paddingValues),
     )
 }

108-123: 검색 입력이 여전히 동작하지 않습니다.

value = ""onValueChange = {}로 고정되어 실제 입력이 불가능합니다. ViewModel 연결 전이라도 최소한 로컬 상태라도 연결해 주세요.

제안된 수정
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 
 `@Composable`
 fun OnboardingFilmScreen(
     // ...
 ) {
+    var query by remember { mutableStateOf("") }
+
     Column(
         // ...
     ) {
         // ...
         stickyHeader {
             Column(
                 // ...
             ) {
                 FlintBasicTextField(
                     placeholder = "작품 이름",
-                    value = "",
-                    onValueChange = {},
+                    value = query,
+                    onValueChange = { query = it },
                     modifier = Modifier.fillMaxWidth(),
                 )
             }
         }
🧹 Nitpick comments (4)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)

81-86: Preview에서 onActionClick 사용 예시 추가 권장

새로운 onActionClick 파라미터가 Preview에서 테스트되지 않고 있습니다. 컴포넌트 문서화 및 동작 확인을 위해 예시를 추가하는 것을 권장합니다.

✨ onActionClick 포함 Preview 예시
             FlintBackTopAppbar(
                 onClick = {},
                 title = "전체 컬렉션",
                 actionText = "뒤로가기",
                 textColor = FlintTheme.colors.error700,
+                onActionClick = {},
             )
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (2)

125-140: 선택된 영화 목록이 하드코딩되어 있습니다.

UI 스캐폴딩 단계에서는 허용되지만, ViewModel 연동 시 실제 선택된 영화 리스트를 파라미터로 받아 처리해야 합니다. 현재 items(7)과 빈 imageUrl, no-op onRemoveClick은 추후 교체가 필요합니다.


142-154: 빈 상태 영역의 높이가 하드코딩되어 있습니다.

height(300.dp)와 TODO 주석이 있습니다. 빈 상태가 그리드 영역 전체를 채우도록 fillMaxHeight() 또는 부모 레이아웃 기반 계산을 고려해 주세요.

app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (1)

62-82: 문자열 리소스로 분리 권장.

화면 문구가 하드코딩되어 있어 i18n/재사용에 불리합니다. stringResourcestrings.xml로 분리해 주세요.

♻️ 개선 예시
-import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.res.stringResource
 ...
 Text(
-    text = "취향이 보이기 시작했어요",
+    text = stringResource(R.string.onboarding_done_title),
 ...
 Text(
-    text = "Flint에서 끌리는 콘텐츠를\n만나러 가볼까요? ",
+    text = stringResource(R.string.onboarding_done_subtitle),
 ...
 FlintBasicButton(
-    text = "시작하기",
+    text = stringResource(R.string.onboarding_done_cta),

Also applies to: 97-97

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1a16a95 and 35d8441.

📒 Files selected for processing (5)
  • app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🧰 Additional context used
🧬 Code graph analysis (3)
app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (3)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-59)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (8)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-59)
app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (1)
  • StepProgressBar (15-39)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
app/src/main/java/com/flint/core/designsystem/component/image/SelectedFilmItem.kt (1)
  • SelectedFilmItem (20-49)
app/src/main/java/com/flint/core/designsystem/component/view/FlintSearchEmptyView.kt (1)
  • FlintSearchEmptyView (20-41)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingFilmItem.kt (1)
  • OnboardingFilmItem (33-116)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (3)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-59)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingOttItem.kt (1)
  • OnboardingOttItem (31-88)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
⏰ 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). (2)
  • GitHub Check: PR Build Check
  • GitHub Check: PR Lint Check
🔇 Additional comments (10)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)

26-26: LGTM!

새로운 onActionClick 파라미터가 기본값 빈 람다와 함께 잘 추가되었습니다. 기존 호출부와의 하위 호환성이 유지됩니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (4)

3-26: 임포트 구성 OK. 사용되는 Compose/디자인시스템/도메인 타입과 잘 맞습니다.


28-39: 라우트 → 스크린 연결 잘 됐습니다. navigateToDone 전달 및 padding 적용 흐름이 자연스럽습니다.


56-61: ‘건너뛰기’ 액션 클릭 연결 확인. onActionClick으로 동작이 살아났습니다.


108-117: 프리뷰 추가 좋아요. 테마 래핑도 적절합니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (5)

58-64: statusBarsPadding()paddingValues 중복 가능성 확인 필요.

OnboardingFilmScreen에서 statusBarsPadding()을 적용하고 있는데, Route에서 전달받은 paddingValues에도 시스템 바 패딩이 포함될 수 있습니다. Scaffold 등에서 이미 inset 처리된 paddingValues를 사용한다면 상단 여백이 중복될 수 있으니 확인해 주세요.


65-75: LGTM!

TopAppBar와 StepProgressBar 연결이 적절합니다.


79-106: LGTM!

LazyVerticalGrid 설정과 타이틀 영역 구성이 적절합니다.


174-184: 버튼이 항상 비활성화 상태입니다.

FlintButtonState.Disable로 고정되어 있어 사용자가 다음 단계로 진행할 수 없습니다. ViewModel 연동 시 선택된 영화 개수에 따라 FlintButtonState.Active로 전환하는 로직이 필요합니다.


187-213: LGTM!

두 가지 상태(목록/빈 결과)에 대한 Preview가 적절하게 구성되어 있습니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines +96 to +104
FlintBasicButton(
text = "시작하기",
state = FlintButtonState.Disable,
onClick = onNextClick,
contentPadding = PaddingValues(vertical = 14.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 20.dp),
Copy link
Contributor

@coderabbitai coderabbitai bot Jan 16, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

“시작하기” 버튼이 비활성화라 진행이 막힙니다.

FlintButtonState.Disable로 고정되어 클릭이 불가합니다. 완료 화면이라면 활성 상태로 변경하거나 상태를 파라미터화해 주세요.

🐛 수정 제안
 FlintBasicButton(
     text = "시작하기",
-    state = FlintButtonState.Disable,
+    state = FlintButtonState.Enable, // 프로젝트에서 정의한 활성 상태로 변경
     onClick = onNextClick,
     contentPadding = PaddingValues(vertical = 14.dp),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
FlintBasicButton(
text = "시작하기",
state = FlintButtonState.Disable,
onClick = onNextClick,
contentPadding = PaddingValues(vertical = 14.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 20.dp),
FlintBasicButton(
text = "시작하기",
state = FlintButtonState.Enable,
onClick = onNextClick,
contentPadding = PaddingValues(vertical = 14.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 20.dp),
🤖 Prompt for AI Agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt`
around lines 96 - 104, The "시작하기" button is hard-coded disabled by using
FlintButtonState.Disable so users cannot proceed; update the FlintBasicButton in
OnboardingDoneScreen to use an enabled state (e.g., FlintButtonState.Enable) or
make the button state a composable parameter and pass it in from the parent,
ensuring onNextClick remains wired; locate the FlintBasicButton invocation and
change the state argument (or add a parameter to OnboardingDoneScreen to control
the buttonState) so the button is clickable on the completion screen.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

어 아직 의도한거야 뷰모델 하면서 작업할거야

Copy link
Contributor

Choose a reason for hiding this comment

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

@ckals413 알겠습니다! ViewModel 작업과 함께 활성화할 예정이시군요. 현재는 의도적으로 비활성화 상태로 두신 것으로 이해했습니다. 👍


✏️ Learnings added
Learnt from: ckals413
Repo: imflint/Flint-Android PR: 116
File: app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt:97-105
Timestamp: 2026-01-16T08:47:13.979Z
Learning: In OnboardingDoneScreen.kt, the "시작하기" button is intentionally set to FlintButtonState.Disable as a placeholder state until ViewModel implementation is completed.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Copy link
Contributor

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

🤖 Fix all issues with AI agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt`:
- Around line 175-184: The "다음" button is hard-coded to FlintButtonState.Disable
which prevents progression; update the FlintBasicButton state to be dynamic
(e.g., compute a boolean like isNextEnabled from the current selected
films/count) and pass FlintButtonState.Enable when isNextEnabled is true and
FlintButtonState.Disable otherwise; locate the FlintBasicButton invocation in
OnboardingFilmScreen (the component using onNextClick) and derive isNextEnabled
from the existing selection state (e.g., selectedFilms, selectedFilmCount, or
similar) so the button enables when the user has chosen the required number of
films.

In
`@app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt`:
- Around line 62-68: OnboardingProfileScreen is ignoring the passed-in modifier
and duplicates padding via the paddingValues param; update
OnboardingProfileScreen to use the incoming modifier parameter (not a fresh
Modifier) and remove the redundant paddingValues parameter, applying
.padding(paddingValues) in OnboardingProfileRoute when calling
OnboardingProfileScreen and chaining .background(...) and .statusBarsPadding()
onto the passed modifier inside OnboardingProfileScreen (e.g., apply
modifier.padding(paddingValues).fillMaxSize().background(...).statusBarsPadding())
so the Route-provided padding is respected and duplication is eliminated.
♻️ Duplicate comments (2)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (1)

117-122: 검색 입력 필드가 여전히 동작하지 않습니다.

value = ""onValueChange = {}로 고정되어 실제 입력이 불가능합니다. ViewModel 연결 전이라면 최소한 로컬 상태라도 연결해 주세요.

app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (1)

97-106: "시작하기" 버튼이 비활성화 상태로 사용자가 진행할 수 없습니다.

온보딩 완료 화면의 버튼이 FlintButtonState.Disable로 설정되어 있어 사용자가 홈 화면으로 이동할 수 없습니다. 완료 화면에서는 버튼이 항상 활성화 상태여야 합니다.

제안된 수정
 FlintBasicButton(
     text = "시작하기",
-    state = FlintButtonState.Disable,
+    state = FlintButtonState.Enable,
     onClick = onNextClick,
🧹 Nitpick comments (3)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)

72-77: 문자열 리소스 사용 검토

UI 텍스트가 코드에 직접 하드코딩되어 있습니다. 다국어 지원이나 유지보수를 위해 strings.xml 리소스 파일 사용을 고려해 보세요.

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (1)

81-173: LazyVerticalGrid 레이아웃 구조가 적절합니다.

스크롤 가능한 타이틀, sticky 검색창, 선택된 영화 가로 스크롤, 그리고 영화 그리드가 잘 구성되어 있습니다. Line 150의 TODO 주석은 추후 처리가 필요합니다.

TODO 주석의 중앙 배치 구현을 도와드릴까요?

app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (1)

123-142: "확인"과 "시작하기" 버튼이 동일한 동작을 수행합니다.

두 버튼 모두 onNextClick을 호출합니다. 의도된 UX라면 무시해도 되지만, "확인" 버튼은 닉네임 확정 용도로, "시작하기"는 다음 화면 이동 용도로 구분하는 것이 명확할 수 있습니다.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 35d8441 and 7444570.

📒 Files selected for processing (5)
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
  • app/src/main/java/com/flint/presentation/onboarding/navigation/OnboardingNavigation.kt
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-01-13T17:03:16.816Z
Learnt from: giovannijunseokim
Repo: imflint/Flint-Android PR: 72
File: app/src/main/java/com/flint/core/designsystem/component/collection/PeopleBottomSheet.kt:85-98
Timestamp: 2026-01-13T17:03:16.816Z
Learning: In PeopleBottomSheet.kt, the `people` list passed to LazyColumn is static and does not change while the bottom sheet is visible, so a key parameter is not required for the items() call.

Applied to files:

  • app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt
🧬 Code graph analysis (3)
app/src/main/java/com/flint/presentation/onboarding/navigation/OnboardingNavigation.kt (3)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (1)
  • OnboardingFilmRoute (34-47)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (1)
  • OnboardingOttRoute (28-41)
app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (1)
  • OnboardingDoneRoute (26-37)
app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (8)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-59)
app/src/main/java/com/flint/presentation/onboarding/component/StepProgressBar.kt (1)
  • StepProgressBar (15-39)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
app/src/main/java/com/flint/core/designsystem/component/image/SelectedFilmItem.kt (1)
  • SelectedFilmItem (20-49)
app/src/main/java/com/flint/core/designsystem/component/view/FlintSearchEmptyView.kt (1)
  • FlintSearchEmptyView (20-41)
app/src/main/java/com/flint/presentation/onboarding/component/OnboardingFilmItem.kt (1)
  • OnboardingFilmItem (33-116)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (3)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-59)
app/src/main/java/com/flint/core/designsystem/component/button/FlintBasicButton.kt (1)
  • FlintBasicButton (34-98)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
⏰ 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). (2)
  • GitHub Check: PR Lint Check
  • GitHub Check: PR Build Check
🔇 Additional comments (14)
app/src/main/java/com/flint/presentation/onboarding/OnboardingOttScreen.kt (3)

28-41: Route 구현이 잘 되었습니다.

이전에 비어있던 Route가 이제 OnboardingOttScreen을 올바르게 호출하고 있으며, navigateUpnavigateToDone 콜백이 적절히 연결되었습니다. ViewModel 작업 시 닉네임 주입을 연결하시면 되겠습니다.


109-119: Preview 구현이 적절합니다.

FlintTheme으로 감싸고 샘플 데이터를 제공하여 미리보기가 잘 구성되어 있습니다.


96-105: 비활성화 상태에서의 버튼 동작은 정상입니다. FlintButtonState.Disableenabled = false로 설정되며, FlintBasicButton.clickable(enabled = enabled, onClick = onClick) 수정자는 enabledfalse일 때 onClick 콜백을 차단합니다. 따라서 현재 구현에서는 버튼이 비활성화되면 다음 화면으로 이동하지 않습니다.

Likely an incorrect or invalid review comment.

app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt (2)

34-46: LGTM! 이전 리뷰 피드백이 잘 반영되었습니다.

paddingValuesmodifier에 적용되고, navigateUponBackClick에 정상적으로 전달되어 뒤로가기 기능이 동작합니다.


188-214: LGTM! 프리뷰 구성이 적절합니다.

목록 상태와 빈 상태 두 가지 케이스에 대한 프리뷰가 잘 구성되어 있습니다.

app/src/main/java/com/flint/presentation/onboarding/navigation/OnboardingNavigation.kt (2)

25-27: LGTM! 새로운 네비게이션 함수가 올바르게 추가되었습니다.


34-64: LGTM! 온보딩 네비게이션 그래프가 잘 구성되었습니다.

모든 라우트에 navigateUp이 일관되게 연결되어 뒤로가기가 정상 동작하며, Profile → Film → Ott → Done → Home 흐름이 완성되었습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingDoneScreen.kt (3)

26-37: LGTM! 이전 리뷰 피드백이 잘 반영되었습니다.

OnboardingDoneRouteOnboardingDoneScreen을 올바르게 호출하고, navigateUponBackClick에 정상적으로 전달됩니다.


45-95: LGTM! 완료 화면 UI 구조가 적절합니다.

상단 앱바, 텍스트 콘텐츠, 이미지가 잘 배치되어 있습니다.


110-119: LGTM! 프리뷰 함수 이름이 올바르게 수정되었습니다.

app/src/main/java/com/flint/presentation/onboarding/OnboardingProfileScreen.kt (4)

1-34: LGTM!

필요한 Compose 및 디자인 시스템 컴포넌트 import가 적절하게 구성되어 있습니다.


36-47: LGTM!

Route 컴포저블이 네비게이션 콜백과 padding을 적절하게 Screen으로 위임하고 있습니다.


145-162: 바텀 시트 구조 적절합니다.

현재 UI 구현 단계에서 시트 닫기 로직이 적용되어 있으며, 실제 갤러리 선택 및 프로필 삭제 기능은 ViewModel 연동 시 추가할 수 있습니다.


165-174: LGTM!

Preview 컴포저블이 FlintTheme으로 감싸져 있고 스텁 콜백이 적절히 제공됩니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines +175 to +184
FlintBasicButton(
text = "다음",
state = FlintButtonState.Disable,
onClick = onNextClick,
contentPadding = PaddingValues(vertical = 14.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 20.dp),
)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

"다음" 버튼이 비활성화 상태입니다.

FlintButtonState.Disable로 고정되어 사용자가 다음 단계로 진행할 수 없습니다. UI 테스트용이라면 활성화 상태로 변경하거나, 선택된 영화 개수에 따라 상태를 동적으로 변경해 주세요.

제안된 수정
 FlintBasicButton(
     text = "다음",
-    state = FlintButtonState.Disable,
+    state = FlintButtonState.Enable, // 또는 조건부 상태
     onClick = onNextClick,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
FlintBasicButton(
text = "다음",
state = FlintButtonState.Disable,
onClick = onNextClick,
contentPadding = PaddingValues(vertical = 14.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 20.dp),
)
FlintBasicButton(
text = "다음",
state = FlintButtonState.Enable, // 또는 조건부 상태
onClick = onNextClick,
contentPadding = PaddingValues(vertical = 14.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 20.dp),
)
🤖 Prompt for AI Agents
In `@app/src/main/java/com/flint/presentation/onboarding/OnboardingFilmScreen.kt`
around lines 175 - 184, The "다음" button is hard-coded to
FlintButtonState.Disable which prevents progression; update the FlintBasicButton
state to be dynamic (e.g., compute a boolean like isNextEnabled from the current
selected films/count) and pass FlintButtonState.Enable when isNextEnabled is
true and FlintButtonState.Disable otherwise; locate the FlintBasicButton
invocation in OnboardingFilmScreen (the component using onNextClick) and derive
isNextEnabled from the existing selection state (e.g., selectedFilms,
selectedFilmCount, or similar) so the button enables when the user has chosen
the required number of films.

Copy link
Contributor

@nahy-512 nahy-512 left a comment

Choose a reason for hiding this comment

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

로직 대신 네비게이션을 다 연결해주셨군요
하드코딩 받아놓는 부분은 뷰모델 쓰면서 잡아보면 좋을 것 같네요. 작업 고생많으셨습니다!

Comment on lines 117 to 123
Copy link
Contributor

Choose a reason for hiding this comment

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

p1
이거 FlintSearchTextField 써주시면 좋을 것 같아요!

}
} else {
// 영화 목록 그리드
items(9) { index ->
Copy link
Contributor

Choose a reason for hiding this comment

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

p3
이거 숫자는 임의로 넣어둔 부분인 거죠??

Copy link
Contributor Author

Choose a reason for hiding this comment

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

넵!

Copy link
Contributor

Choose a reason for hiding this comment

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

p2
이건 const로 밖으로 빼도 괜찮을 것 같아요!

@nahy-512 nahy-512 merged commit e1c3795 into develop Jan 17, 2026
2 of 3 checks passed
@nahy-512 nahy-512 deleted the feat/#100-onboarding-film-ui branch January 17, 2026 01:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Feat ✨ 신규 기능을 추가하거나 기존 기능의 동작, 정책을 변경 📱 UI feat - 컴포넌트 조립, 화면 구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] Onboarding UI

2 participants

Comments