Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ fun FlintBackTopAppbar(
title: String = "",
closeable: Boolean = false,
actionText: String = "",
onActionClick: () -> Unit = {},
textColor: Color = Color.Unspecified,
) {
FlintBasicTopAppbar(
Expand All @@ -40,13 +41,14 @@ fun FlintBackTopAppbar(
action = {
if (closeable) {
Icon(
modifier = Modifier,
modifier = Modifier.noRippleClickable(onClick = onActionClick),
imageVector = ImageVector.vectorResource(R.drawable.ic_cancel),
contentDescription = null,
tint = FlintTheme.colors.white,
)
} else {
Text(
modifier = Modifier.noRippleClickable(onClick = onActionClick),
text = actionText,
color = textColor,
style = FlintTheme.typography.body1M16,
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/flint/core/navigation/Route.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ interface Route {
@Serializable
data object OnboardingOtt : Route

@Serializable
data object OnboardingDone : Route

@Serializable
data object CollectionList : Route

Expand Down
5 changes: 5 additions & 0 deletions app/src/main/java/com/flint/domain/type/OttType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,9 @@ enum class OttType(
Coupang(R.drawable.img_coupang, R.drawable.ic_small_coupang, "쿠팡플레이"),
Disney(R.drawable.img_disney, R.drawable.ic_small_disney, "디즈니플러스"),
Watcha(R.drawable.img_watcha, R.drawable.ic_small_watcha, "왓챠피디아"),
;

companion object {
fun getOtts(): List<OttType> = OttType.entries
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package com.flint.presentation.onboarding

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.flint.R
import com.flint.core.designsystem.component.button.FlintBasicButton
import com.flint.core.designsystem.component.button.FlintButtonState
import com.flint.core.designsystem.component.topappbar.FlintBackTopAppbar
import com.flint.core.designsystem.theme.FlintTheme

@Composable
fun OnboardingDoneRoute(
paddingValues: PaddingValues,
navigateToHome: () -> Unit,
navigateUp: () -> Unit,
) {
OnboardingDoneScreen(
onBackClick = navigateUp,
onNextClick = navigateToHome,
modifier = Modifier.padding(paddingValues),
)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

@Composable
fun OnboardingDoneScreen(
onBackClick: () -> Unit,
onNextClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Column(
modifier =
modifier
.fillMaxSize()
.background(color = FlintTheme.colors.background)
.statusBarsPadding(),
) {
FlintBackTopAppbar(
onClick = onBackClick,
)

Column(
modifier =
Modifier
.weight(1f),
) {
Spacer(modifier = Modifier.height(12.dp))

Text(
text = "취향이 보이기 시작했어요",
color = FlintTheme.colors.primary200,
style = FlintTheme.typography.body1R16,
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
)

Spacer(modifier = Modifier.height(8.dp))

Text(
text = "Flint에서 끌리는 콘텐츠를\n만나러 가볼까요? ",
color = FlintTheme.colors.white,
style = FlintTheme.typography.display2M28,
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
)

Spacer(modifier = Modifier.height(40.dp))

Image(
painter = painterResource(id = R.drawable.img_onboarding_3d),
contentDescription = null,
modifier =
Modifier
.fillMaxWidth(),
contentScale = ContentScale.Crop,
)
}

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

@coderabbitai coderabbitai Bot Jan 16, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ 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
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@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.

)
}
}

@Preview(showBackground = true)
@Composable
private fun OnboardingDoneScreenPreview() {
FlintTheme {
OnboardingDoneScreen(
onBackClick = {},
onNextClick = {},
)
}
}
Comment thread
ckals413 marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,15 +1,214 @@
package com.flint.presentation.onboarding

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.flint.core.designsystem.component.button.FlintBasicButton
import com.flint.core.designsystem.component.button.FlintButtonState
import com.flint.core.designsystem.component.image.SelectedFilmItem
import com.flint.core.designsystem.component.textfield.FlintSearchTextField
import com.flint.core.designsystem.component.topappbar.FlintBackTopAppbar
import com.flint.core.designsystem.component.view.FlintSearchEmptyView
import com.flint.core.designsystem.theme.FlintTheme
import com.flint.presentation.onboarding.component.OnboardingFilmItem
import com.flint.presentation.onboarding.component.StepProgressBar

@Composable
fun OnboardingFilmRoute(
paddingValues: PaddingValues,
navigateToOnboardingOtt: () -> Unit,
navigateUp: () -> Unit,
) {
OnboardingFilmScreen(
nickname = "User",
currentStep = 7,
onBackClick = navigateUp,
onNextClick = navigateToOnboardingOtt,
modifier = Modifier.padding(paddingValues),
)
}
Comment on lines 34 to 47

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ 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.


@Composable
fun OnboardingFilmScreen() {
fun OnboardingFilmScreen(
nickname: String,
currentStep: Int,
onBackClick: () -> Unit,
onNextClick: () -> Unit,
// UI 테스트를 위한 임시 파라미터 (실제 로직 연결 시 ViewModel 상태로 대체)
isEmptyParams: Boolean = false,
modifier: Modifier = Modifier,
) {
Column(
modifier =
modifier
.fillMaxSize()
.background(color = FlintTheme.colors.background)
.statusBarsPadding(),
) {
FlintBackTopAppbar(
onClick = onBackClick,
)

Spacer(modifier = Modifier.height(16.dp))

StepProgressBar(
currentStep = currentStep,
totalSteps = 7,
modifier = Modifier.padding(horizontal = 20.dp),
)

Spacer(modifier = Modifier.height(23.dp))

// 전체 콘텐츠를 LazyVerticalGrid로 구성
LazyVerticalGrid(
columns = GridCells.Fixed(3),
modifier = Modifier.weight(1f),
overscrollEffect = null,
contentPadding = PaddingValues(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(14.dp),
) {
// 타이틀 영역 - 스크롤됨
item(span = { GridItemSpan(3) }) {
Column {
Text(
text = "${nickname}님이 좋아하는 작품\n7개를 골라주세요",
color = FlintTheme.colors.white,
style = FlintTheme.typography.display2M28,
)

Spacer(modifier = Modifier.height(8.dp))

Text(
text = "이번 달 가장 재미있었던 작품은?",
color = FlintTheme.colors.gray300,
style = FlintTheme.typography.body2R14,
)

Spacer(modifier = Modifier.height(24.dp))
}
}

// 검색창 - sticky header (상단에 고정)
stickyHeader {
Column(
modifier =
Modifier
.background(FlintTheme.colors.background)
.padding(bottom = 16.dp),
) {
FlintSearchTextField(
placeholder = "작품 이름",
value = "",
onValueChanged = {},
onSearchAction = {},
)
Comment on lines +109 to +122

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ 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.

}
}

// 선택된 영화 가로 스크롤
item(span = { GridItemSpan(3) }) {
Column {
LazyRow(
horizontalArrangement = Arrangement.spacedBy(0.dp),
) {
items(7) { index ->
SelectedFilmItem(
imageUrl = "",
onRemoveClick = {},
)
}
}
Spacer(modifier = Modifier.height(20.dp))
}
}

// 영화 검색 목록 [비어있을 때 || 리스트 있을 때]
if (isEmptyParams) {
item(span = { GridItemSpan(3) }) {
Box(
modifier =
Modifier
.fillMaxWidth()
.height(300.dp), // 대강 // TODO: 위아래 중앙 배치
contentAlignment = Alignment.Center,
) {
FlintSearchEmptyView()
}
}
} else {
// 영화 목록 그리드
items(9) { index ->

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

넵!

OnboardingFilmItem(
imageUrl = "",
title = "은하수를 여행하는 히치하이커...",
director = "가스 제닝스",
releaseYear = "2005",
isSelected = false,
onClick = {},
modifier =
Modifier.padding(
top = if (index >= 3) 20.dp else 0.dp,
),
)
}
}
}

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ 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.

}
}

@Preview(showBackground = true, name = "기본 목록 상태")
@Composable
private fun OnboardingFilmScreenListPreview() {
FlintTheme {
OnboardingFilmScreen(
nickname = "안비",
currentStep = 7,
onBackClick = {},
onNextClick = {},
isEmptyParams = false,
)
}
}

@Preview(showBackground = true, name = "검색 결과 없음 상태")
@Composable
private fun OnboardingFilmScreenEmptyPreview() {
FlintTheme {
OnboardingFilmScreen(
nickname = "안비",
currentStep = 7,
onBackClick = {},
onNextClick = {},
isEmptyParams = true,
)
}
}
Loading
Loading