[Feat] Home UI#104
Conversation
📝 WalkthroughWalkthrough홈 화면 UI(배너, FAB, 추천/최근 컬렉션, 저장된 콘텐츠) 컴포넌트 추가 및 컬렉션 상세 네비게이션에 Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant HomeScreen
participant NavGraphBuilder
participant NavController
participant Route
participant CollectionDetailScreen
User->>HomeScreen: 컬렉션 항목 클릭 (collectionId)
HomeScreen->>NavGraphBuilder: navigateToCollectionDetail(collectionId)
NavGraphBuilder->>NavController: navigateToCollectionDetail(collectionId)
NavController->>Route: Route.CollectionDetail(collectionId)
NavController->>CollectionDetailScreen: open CollectionDetailRoute(collectionId)
sequenceDiagram
participant User
participant HomeScreen
participant HomeBanner
participant HomeRecommendCollection
participant HomeRecentCollection
participant HomeSavedContents
User->>HomeScreen: 홈 화면 진입
HomeScreen->>HomeBanner: render(userName)
HomeScreen->>HomeRecommendCollection: render(list)
HomeScreen->>HomeRecentCollection: render(list)
HomeScreen->>HomeSavedContents: render(list)
User->>HomeSavedContents: 콘텐츠 클릭 -> onItemClick(contentId)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Fix all issues with AI agents
In
`@app/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.kt`:
- Around line 23-29: CollectionDetailRoute is receiving collectionId from the
route but never passes it into CollectionDetailScreen, so the id is unused;
update CollectionDetailScreen's signature to accept collectionId (e.g., add a
String parameter) and modify CollectionDetailRoute to call
CollectionDetailScreen(collectionId = collectionId), ensuring the
composable<Route.CollectionDetail> flow (where collectionDetail.collectionId is
obtained) forwards that value through CollectionDetailRoute into
CollectionDetailScreen.
In
`@app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt`:
- Around line 61-66: The Text composable in HomeRecentCollection.kt is
hardcoding the username ("키카님"); add a userName String parameter to the
HomeRecentCollection composable (or the surrounding component/function that
renders this Text) and replace the hardcoded string with a formatted value using
that parameter (e.g., "$userName님이 최근 살펴본 컬렉션이에요"); update all call sites of
HomeRecentCollection to pass the current user's name and ensure null/empty
handling (default to empty string or fallback) so rendering remains safe.
In
`@app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt`:
- Around line 70-71: The preview Composable function name has a typo: rename the
function from PreviewHomeRecommentCollection to PreviewHomeRecommendCollection
and update all references/usages (including any `@Preview` annotation or calls) to
the new name so the preview and references resolve correctly; ensure the file's
import/usage sites reflect the updated symbol.
In
`@app/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt`:
- Around line 33-38: The Text composable in HomeSavedContents.kt uses the string
literal "최근 저장한 콘텐츠 " with an unnecessary trailing space; remove the trailing
space so the Text call in HomeSavedContents (the Text(...) with style =
FlintTheme.typography.head3Sb18) uses "최근 저장한 콘텐츠" to avoid extra spacing in the
UI.
In `@app/src/main/java/com/flint/presentation/home/HomeScreen.kt`:
- Around line 38-47: HomeScreen is missing wiring for recent collection and
explore callbacks; update the HomeScreen(...) call to pass
onRecentCollectionItemClick = { collectionId ->
navigateToCollectionDetail(collectionId) }, onRecentCollectionAllClick = {
navigateToExplore() }, and navigateToExplore = { navigateToExplore() } (use the
existing navigateToCollectionDetail and navigateToExplore functions) so
recent-item taps and "전체보기"/explore navigation are handled.
🧹 Nitpick comments (10)
app/src/main/java/com/flint/presentation/home/component/HomeBanner.kt (1)
34-42: 하드코딩된 문자열을 string resource로 분리하는 것을 권장합니다.다국어 지원(i18n/l10n)을 위해 인사말 텍스트를
strings.xml로 분리하는 것이 좋습니다.♻️ 권장 수정 사항
app/src/main/res/values/strings.xml에 다음을 추가:<string name="home_banner_greeting">반가워요, %1$s 님\n오늘은 어떤 작품이 끌리세요?</string>+import androidx.compose.ui.res.stringResourceText( - text = "반가워요, $userName 님\n오늘은 어떤 작품이 끌리세요?", + text = stringResource(R.string.home_banner_greeting, userName), style = FlintTheme.typography.head1Sb22, color = FlintTheme.colors.white,app/src/main/java/com/flint/core/designsystem/component/listItem/SavedContentItem.kt (1)
60-64: 제목 텍스트 오버플로우 처리 누락 가능성
CollectionItem에서는 제목에maxLines = 1과TextOverflow.Ellipsis를 적용했는데, 여기서는 적용되지 않았습니다. 120dp 너비 내에서 긴 제목이 예기치 않게 줄바꿈될 수 있습니다.♻️ 일관성을 위한 수정 제안
Text( text = contentModel.title, color = FlintTheme.colors.white, style = FlintTheme.typography.body1M16, + overflow = TextOverflow.Ellipsis, + maxLines = 1, )app/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.kt (1)
29-41: 고려사항: 하드코딩된 문자열UI 문자열이 코드에 직접 작성되어 있습니다. 현재로서는 문제없지만, 향후 다국어 지원이 필요할 경우
strings.xml리소스로 추출하는 것을 고려해 주세요.app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt (2)
91-98:itemsIndexed대신items사용을 권장합니다.인덱스를 사용하지 않으므로
items로 단순화할 수 있습니다.♻️ 수정 제안
- itemsIndexed(collectionModelList) { _, item -> + items(collectionModelList) { item -> CollectionItem( collectionModel = item, onItemClick = { id -> onItemClick(id) }, ) }
itemsimport 추가:import androidx.compose.foundation.lazy.items
71-81: 접근성을 위해contentDescription추가를 권장합니다.클릭 가능한 아이콘에
contentDescription이null로 설정되어 있어 스크린 리더 사용자가 기능을 파악하기 어렵습니다.♻️ 수정 제안
Icon( imageVector = ImageVector.vectorResource(R.drawable.ic_more), - contentDescription = null, + contentDescription = "전체보기", tint = Color.Unspecified,app/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt (1)
56-63:itemsIndexed대신items사용을 권장합니다.인덱스를 사용하지 않으므로
items로 단순화할 수 있습니다.♻️ 수정 제안
- itemsIndexed(contentModelList) { _, item -> + items(contentModelList) { item -> SavedContentItem( contentModel = item, onItemClick = { contentId -> onItemClick(contentId) }, ) }
itemsimport 추가:import androidx.compose.foundation.lazy.itemsapp/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt (1)
57-64:itemsIndexed대신items사용을 권장합니다.인덱스를 사용하지 않으므로
items로 단순화할 수 있습니다.♻️ 수정 제안
- itemsIndexed(collectionModelList) { _, item -> + items(collectionModelList) { item -> CollectionItem( collectionModel = item, onItemClick = { id -> onItemClick(id) }, ) }
itemsimport 추가:import androidx.compose.foundation.lazy.itemsapp/src/main/java/com/flint/presentation/home/component/HomeFab.kt (2)
35-40: 접근성을 위해contentDescription추가가 필요합니다.FAB은 주요 액션 버튼이므로 스크린 리더 사용자를 위해
contentDescription을 설정해야 합니다.♻️ 수정 제안
Icon( imageVector = ImageVector.vectorResource(R.drawable.ic_plus), tint = Color.Unspecified, - contentDescription = null, + contentDescription = "컬렉션 만들기", modifier = Modifier.size(32.dp), )
27-32: Modifier 순서 조정을 권장합니다.
size를clip전에 적용해야 클리핑 영역이 올바르게 설정됩니다. 현재 순서에서도 동작하지만, 명시적인 순서가 더 안전합니다.♻️ 수정 제안
Box( modifier = modifier + .size(48.dp) .clip(CircleShape) .background(FlintTheme.colors.gradient400Secondary) - .size(48.dp) .clickable { onClick() }, contentAlignment = Alignment.Center, )app/src/main/java/com/flint/presentation/collectiondetail/CollectionDetailScreen.kt (1)
6-13:collectionId파라미터가 현재 사용되지 않음
collectionId가CollectionDetailRoute에 전달되지만CollectionDetailScreen에서 사용되지 않습니다. 플레이스홀더 화면이므로 현재는 문제가 없지만, 실제 구현 시 이 파라미터를 활용해야 합니다.향후 구현을 위해 TODO 주석 추가를 고려해 주세요:
💡 선택적 개선 제안
`@Composable` fun CollectionDetailRoute( paddingValues: PaddingValues, collectionId: String, navigateToCollectionList: () -> Unit, ) { + // TODO: collectionId를 사용하여 컬렉션 상세 데이터 로드 CollectionDetailScreen() }
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (22)
app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.ktapp/src/main/java/com/flint/core/designsystem/component/listItem/SavedContentItem.ktapp/src/main/java/com/flint/core/designsystem/theme/Color.ktapp/src/main/java/com/flint/core/navigation/Route.ktapp/src/main/java/com/flint/presentation/collectiondetail/CollectionDetailScreen.ktapp/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.ktapp/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.ktapp/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.ktapp/src/main/java/com/flint/presentation/explore/ExploreScreen.ktapp/src/main/java/com/flint/presentation/explore/navigation/ExploreNavigation.ktapp/src/main/java/com/flint/presentation/home/HomeScreen.ktapp/src/main/java/com/flint/presentation/home/component/HomeBanner.ktapp/src/main/java/com/flint/presentation/home/component/HomeFab.ktapp/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.ktapp/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.ktapp/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.ktapp/src/main/java/com/flint/presentation/home/component/HomeSavedContents.ktapp/src/main/java/com/flint/presentation/home/navigation/HomeNavigation.ktapp/src/main/java/com/flint/presentation/main/MainNavHost.ktapp/src/main/java/com/flint/presentation/main/MainNavigator.ktapp/src/main/java/com/flint/presentation/profile/ProfileScreen.ktapp/src/main/java/com/flint/presentation/profile/navigation/ProfileNavigation.kt
🧰 Additional context used
🧠 Learnings (2)
📚 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/home/component/HomeRecommendCollection.ktapp/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.ktapp/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.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/core/designsystem/component/listItem/CollectionItem.kt
🧬 Code graph analysis (8)
app/src/main/java/com/flint/presentation/home/navigation/HomeNavigation.kt (1)
app/src/main/java/com/flint/presentation/home/HomeScreen.kt (1)
HomeRoute(32-48)
app/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.kt (2)
app/src/main/java/com/flint/presentation/main/MainNavigator.kt (1)
navigate(72-87)app/src/main/java/com/flint/presentation/collectiondetail/CollectionDetailScreen.kt (1)
CollectionDetailRoute(6-13)
app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt (2)
app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt (1)
CollectionItem(35-113)app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
FlintTheme(8-16)
app/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.kt (2)
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/home/component/HomeRecentCollection.kt (2)
app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt (1)
CollectionItem(35-113)app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
FlintTheme(8-16)
app/src/main/java/com/flint/presentation/home/component/HomeBanner.kt (1)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
FlintTheme(8-16)
app/src/main/java/com/flint/presentation/home/component/HomeFab.kt (1)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
FlintTheme(8-16)
app/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt (2)
app/src/main/java/com/flint/core/designsystem/component/listItem/SavedContentItem.kt (1)
SavedContentItem(24-74)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 (18)
app/src/main/java/com/flint/presentation/home/component/HomeBanner.kt (2)
1-17: LGTM!패키지 선언과 import 구문이 적절하게 구성되어 있습니다.
46-54: LGTM!Preview 함수가
FlintTheme으로 올바르게 래핑되어 있어 디자인 시스템의 스타일이 미리보기에 정확히 반영됩니다.app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt (1)
78-78: LGTM! 텍스트 오버플로우 처리가 적절합니다.
end패딩 추가와TextOverflow.Ellipsis+maxLines = 1조합으로 긴 텍스트가 레이아웃을 벗어나는 문제를 방지합니다. 제목과 닉네임 모두 일관되게 처리되어 있습니다.Also applies to: 94-110
app/src/main/java/com/flint/core/designsystem/component/listItem/SavedContentItem.kt (1)
24-36: LGTM! 클릭 핸들러가 적절하게 추가되었습니다.
onItemClick콜백이contentId를 전달하는 패턴은 PR 전반의 네비게이션 패턴과 일치합니다.app/src/main/java/com/flint/core/designsystem/theme/Color.kt (1)
61-61: LGTM! 새로운 그래디언트 색상이 잘 정의되었습니다.
gradient400Secondary가 기존 secondary 팔레트 색상(secondary300, secondary400)을 활용하여 일관성 있게 정의되었습니다.verticalGradient사용은 기존gradient400의linearGradient와 구분되는 의도적인 선택으로 보입니다.Also applies to: 123-126
app/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.kt (1)
18-56: LGTM! 빈 상태 컴포넌트가 잘 구현되었습니다.컴포넌트 구조가 기존 패턴을 따르고 있으며,
FlintTheme타이포그래피와 색상을 일관되게 사용합니다.app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt (1)
6-12: 네비게이션 시그니처 업데이트가 PR 패턴과 일치합니다.
navigateToCollectionDetail이collectionId: String을 받도록 변경되어 PR 전반의 네비게이션 패턴과 일관됩니다. 현재CollectionListScreen()에서 해당 콜백을 사용하지 않는데, 추후 구현 시 컬렉션 아이템 클릭 핸들러에 연결이 필요합니다.app/src/main/java/com/flint/presentation/home/HomeScreen.kt (1)
142-233: Preview 구현이 적절합니다.다양한 샘플 데이터를 활용하여 HomeScreen의 여러 상태를 확인할 수 있도록 잘 구성되어 있습니다.
recentCollectionModelList를emptyList()로 변경하여 빈 상태도 테스트할 수 있는 점이 좋습니다.app/src/main/java/com/flint/presentation/profile/ProfileScreen.kt (1)
14-24: LGTM - 네비게이션 API 변경이 일관성 있게 적용됨
navigateToCollectionDetail콜백이collectionId: String파라미터를 받도록 업데이트되었습니다. 현재 플레이스홀더 화면이므로 콜백이 사용되지 않는 것은 예상된 동작입니다.app/src/main/java/com/flint/presentation/explore/ExploreScreen.kt (1)
14-23: LGTM - 네비게이션 시그니처 일관성 유지
ProfileScreen.kt와 동일한 패턴으로navigateToCollectionDetail콜백 시그니처가 업데이트되었습니다.app/src/main/java/com/flint/presentation/main/MainNavHost.kt (1)
56-61: LGTM - homeNavGraph에 네비게이션 콜백 정상 연결
navigateToCollectionDetail콜백이 다른 NavGraph들(collectionListNavGraph,exploreNavGraph,profileNavGraph)과 동일한 패턴으로 연결되었습니다.app/src/main/java/com/flint/core/navigation/Route.kt (1)
24-27:CollectionDetail전환이 올바르게 구현됨
data object에서data class로 변경하여collectionId파라미터를 전달할 수 있게 되었습니다. Kotlin Serialization 기반 type-safe navigation 패턴에 적합합니다.모든
Route.CollectionDetail사용처가 새로운 시그니처로 올바르게 업데이트되었습니다.navigateToCollectionDetail함수에서collectionId를 명시적으로 전달하고, 네비게이션 컴포저블에서 올바르게 역직렬화하고 있습니다.app/src/main/java/com/flint/presentation/explore/navigation/ExploreNavigation.kt (1)
15-27: LGTM!
navigateToCollectionDetail파라미터가(collectionId: String) -> Unit으로 올바르게 업데이트되었고,ExploreRoute로 적절히 전달되고 있습니다. PR 전반의 네비게이션 API 변경 사항과 일관성 있게 구현되었습니다.app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt (1)
15-25: LGTM!
collectionListNavGraph에서navigateToCollectionDetail시그니처 변경이 올바르게 적용되었으며,CollectionListRoute로 적절히 전달됩니다.app/src/main/java/com/flint/presentation/home/navigation/HomeNavigation.kt (1)
15-29: LGTM!
homeNavGraph에navigateToCollectionDetail: (collectionId: String) -> Unit파라미터가 올바르게 추가되었습니다.HomeRoute의 시그니처와 일치하며,onRecommendCollectionItemClick콜백에서collectionId를 적절히 활용합니다.app/src/main/java/com/flint/presentation/profile/navigation/ProfileNavigation.kt (1)
15-29: LGTM!
profileNavGraph의navigateToCollectionDetail파라미터 시그니처 변경이 다른 네비게이션 모듈들과 일관성 있게 적용되었습니다.app/src/main/java/com/flint/presentation/main/MainNavigator.kt (1)
119-121: LGTM!
MainNavigator.navigateToCollectionDetail이collectionId: String파라미터를 받아navController에 올바르게 전달합니다. 이 중앙 네비게이터의 변경으로 PR 전반에 걸친collectionId기반 네비게이션 API가 완성됩니다.app/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.kt (1)
12-17: LGTM! Type-safe 네비게이션 구현이 적절합니다.
collectionId파라미터를 추가하고Route.CollectionDetaildata class를 사용한 type-safe 네비게이션 패턴이 올바르게 구현되었습니다.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In
`@app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt`:
- Around line 72-82: The Icon in HomeRecentCollection.kt currently sets
contentDescription = null which breaks accessibility; replace it with a
localized description (e.g., contentDescription =
stringResource(R.string.view_all) or "전체 보기") so screen readers announce the
button's purpose, using the same Icon + noRippleClickable { onAllClick() } block
to keep behavior unchanged; add the string to resources (R.string.view_all) if
not present and import androidx.compose.ui.res.stringResource to use it.
In `@app/src/main/java/com/flint/presentation/home/HomeScreen.kt`:
- Around line 39-47: HomeScreen is missing the navigateToCollectionCreate
callback passed from HomeRoute, so the FAB won't trigger navigation; update the
HomeScreen invocation in HomeRoute to include navigateToCollectionCreate =
navigateToCollectionCreate (alongside existing onRecommendCollectionItemClick
and onSavedContentItemClick) and ensure the FAB inside HomeScreen calls that
prop when clicked (look for the FAB implementation or onFabClick handler inside
HomeScreen to wire it to navigateToCollectionCreate).
🧹 Nitpick comments (3)
app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt (2)
92-99:itemsIndexed대신items사용을 권장합니다.인덱스 파라미터가 사용되지 않고 있습니다(
_).items를 사용하면 더 간결해집니다. 또한 람다도 메서드 참조로 단순화할 수 있습니다.♻️ 리팩터링 제안
- itemsIndexed(collectionModelList) { _, item -> + items(collectionModelList) { item -> CollectionItem( collectionModel = item, - onItemClick = { id -> - onItemClick(id) - }, + onItemClick = onItemClick, ) }
itemsimport 추가 필요:import androidx.compose.foundation.lazy.items
53-67: 하드코딩된 문자열의 리소스 분리를 고려해주세요.한국어 문자열이 코드에 직접 작성되어 있습니다. 향후 다국어 지원을 위해
strings.xml로 분리하는 것을 권장합니다.app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt (1)
57-64:itemsIndexed대신items사용 권장인덱스 파라미터(
_)가 사용되지 않으므로items로 변경하는 것이 더 간결합니다. 또한onItemClick람다도 직접 전달할 수 있습니다.♻️ 수정 제안
- itemsIndexed(collectionModelList) { _, item -> - CollectionItem( - collectionModel = item, - onItemClick = { id -> - onItemClick(id) - }, - ) - } + items( + items = collectionModelList, + key = { it.collectionId }, + ) { item -> + CollectionItem( + collectionModel = item, + onItemClick = onItemClick, + ) + }참고:
key파라미터를 추가하면 리컴포지션 성능이 향상됩니다. 단,collectionId가 빈 문자열이 아닌 고유 값이어야 합니다.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
app/src/main/java/com/flint/presentation/home/HomeScreen.ktapp/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.ktapp/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.ktapp/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt
🚧 Files skipped from review as they are similar to previous changes (1)
- app/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt
🧰 Additional context used
🧠 Learnings (1)
📚 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/home/component/HomeRecommendCollection.kt
🧬 Code graph analysis (3)
app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt (2)
app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt (1)
CollectionItem(35-113)app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
FlintTheme(8-16)
app/src/main/java/com/flint/presentation/home/HomeScreen.kt (10)
app/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.kt (1)
navigateToCollectionDetail(12-17)app/src/main/java/com/flint/presentation/main/MainNavigator.kt (1)
navigateToCollectionDetail(119-121)app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintLogoTopAppbar.kt (1)
FlintLogoTopAppbar(13-29)app/src/main/java/com/flint/presentation/home/component/HomeBanner.kt (1)
HomeBanner(19-44)app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt (1)
HomeRecommendCollection(23-67)app/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt (1)
HomeSavedContents(22-66)app/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.kt (1)
HomeRecentCollectionEmpty(18-56)app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt (1)
HomeRecentCollection(32-102)app/src/main/java/com/flint/presentation/home/component/HomeFab.kt (1)
HomeFab(21-42)app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
FlintTheme(8-16)
app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt (2)
app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt (1)
CollectionItem(35-113)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 (5)
app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt (1)
104-147: LGTM!Preview가
FlintTheme으로 올바르게 래핑되어 있고, 샘플 데이터도 UI 미리보기 목적에 적합합니다.userName파라미터가 잘 전달되고 있습니다.app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt (1)
69-109: Preview 함수 구현 LGTM이전에 지적된 함수명 오타(
PreviewHomeRecommentCollection→PreviewHomeRecommendCollection)가 수정되었습니다. Preview 데이터도 적절하게 구성되어 있습니다.app/src/main/java/com/flint/presentation/home/HomeScreen.kt (3)
73-130: LazyColumn 내 UI 구조 LGTM
stickyHeader를 활용한 상단 앱바, 배너, 추천 컬렉션, 저장된 콘텐츠, 최근 컬렉션 섹션이 잘 구성되어 있습니다.recentCollectionModelList가 비어있을 때HomeRecentCollectionEmpty를 표시하는 조건부 렌더링도 적절합니다.
132-139: FAB 배치 LGTMFAB가 우하단에 적절하게 배치되어 있고,
contentPadding = PaddingValues(bottom = 80.dp)로 LazyColumn 콘텐츠가 FAB에 가려지지 않도록 처리되어 있습니다.
50-64: ExperimentalFoundationApi 주석 제거 검토현재 프로젝트의 Compose BOM 버전(
2025.10.01)에서stickyHeaderAPI는 Compose Foundation 1.9.0 이후 안정화되었습니다.@OptIn(ExperimentalFoundationApi::class)주석은 더 이상 필요하지 않으므로 제거할 수 있습니다.Likely an incorrect or invalid review comment.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
| Icon( | ||
| imageVector = ImageVector.vectorResource(R.drawable.ic_more), | ||
| contentDescription = null, | ||
| tint = Color.Unspecified, | ||
| modifier = | ||
| Modifier | ||
| .size(24.dp) | ||
| .noRippleClickable { | ||
| onAllClick() | ||
| }, | ||
| ) |
There was a problem hiding this comment.
접근성: 클릭 가능한 아이콘에 contentDescription이 필요합니다.
contentDescription = null로 설정되어 있어 스크린 리더 사용자가 이 버튼의 기능을 알 수 없습니다. "전체 보기" 또는 "더 보기"와 같은 설명을 추가해주세요.
🔧 수정 제안
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_more),
- contentDescription = null,
+ contentDescription = "전체 보기",
tint = Color.Unspecified,
modifier =
Modifier
.size(24.dp)
.noRippleClickable {
onAllClick()
},
)📝 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.
| Icon( | |
| imageVector = ImageVector.vectorResource(R.drawable.ic_more), | |
| contentDescription = null, | |
| tint = Color.Unspecified, | |
| modifier = | |
| Modifier | |
| .size(24.dp) | |
| .noRippleClickable { | |
| onAllClick() | |
| }, | |
| ) | |
| Icon( | |
| imageVector = ImageVector.vectorResource(R.drawable.ic_more), | |
| contentDescription = "전체 보기", | |
| tint = Color.Unspecified, | |
| modifier = | |
| Modifier | |
| .size(24.dp) | |
| .noRippleClickable { | |
| onAllClick() | |
| }, | |
| ) |
🤖 Prompt for AI Agents
In
`@app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt`
around lines 72 - 82, The Icon in HomeRecentCollection.kt currently sets
contentDescription = null which breaks accessibility; replace it with a
localized description (e.g., contentDescription =
stringResource(R.string.view_all) or "전체 보기") so screen readers announce the
button's purpose, using the same Icon + noRippleClickable { onAllClick() } block
to keep behavior unchanged; add the string to resources (R.string.view_all) if
not present and import androidx.compose.ui.res.stringResource to use it.
| HomeScreen( | ||
| onRecommendCollectionItemClick = { collectionId -> | ||
| navigateToCollectionDetail(collectionId) | ||
| }, | ||
| onSavedContentItemClick = { contentId -> | ||
| // TODO show OttListBottomSheet | ||
| }, | ||
| modifier = Modifier.padding(paddingValues), | ||
| ) |
There was a problem hiding this comment.
navigateToCollectionCreate 콜백이 HomeScreen에 전달되지 않았습니다.
HomeRoute에 navigateToCollectionCreate 파라미터가 있지만 HomeScreen에 전달되지 않아 FAB 클릭 시 동작하지 않습니다.
🔧 수정 제안
HomeScreen(
onRecommendCollectionItemClick = { collectionId ->
navigateToCollectionDetail(collectionId)
},
onSavedContentItemClick = { contentId ->
// TODO show OttListBottomSheet
},
+ navigateToCollectionCreate = navigateToCollectionCreate,
modifier = Modifier.padding(paddingValues),
)📝 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.
| HomeScreen( | |
| onRecommendCollectionItemClick = { collectionId -> | |
| navigateToCollectionDetail(collectionId) | |
| }, | |
| onSavedContentItemClick = { contentId -> | |
| // TODO show OttListBottomSheet | |
| }, | |
| modifier = Modifier.padding(paddingValues), | |
| ) | |
| HomeScreen( | |
| onRecommendCollectionItemClick = { collectionId -> | |
| navigateToCollectionDetail(collectionId) | |
| }, | |
| onSavedContentItemClick = { contentId -> | |
| // TODO show OttListBottomSheet | |
| }, | |
| navigateToCollectionCreate = navigateToCollectionCreate, | |
| modifier = Modifier.padding(paddingValues), | |
| ) |
🤖 Prompt for AI Agents
In `@app/src/main/java/com/flint/presentation/home/HomeScreen.kt` around lines 39
- 47, HomeScreen is missing the navigateToCollectionCreate callback passed from
HomeRoute, so the FAB won't trigger navigation; update the HomeScreen invocation
in HomeRoute to include navigateToCollectionCreate = navigateToCollectionCreate
(alongside existing onRecommendCollectionItemClick and onSavedContentItemClick)
and ensure the FAB inside HomeScreen calls that prop when clicked (look for the
FAB implementation or onFabClick handler inside HomeScreen to wire it to
navigateToCollectionCreate).
|
|
||
| @Preview | ||
| @Composable | ||
| private fun PreviewHomeFab() { |
There was a problem hiding this comment.
p3
이름 이거 Preview가 먼저 표시되는 이유가 있나요
There was a problem hiding this comment.
개인적으로 이게 알아보가 쉽더라구요
There was a problem hiding this comment.
오홍 도메인 모델 이름을 DomainXX 식으로 작성하시는 거랑 같은 이유신가 보네요
컨벤션 맞춰보면 좋을 것 같은데,, 작업 끝나고 여유될 때 다시 얘기해보는 걸로 하시죠~!
📮 관련 이슈
📌 작업 내용
📸 스크린샷
Summary by CodeRabbit
릴리스 노트
새 기능
스타일
✏️ Tip: You can customize this high-level summary in your review settings.