Skip to content

[Feat] Home UI#104

Merged
nahy-512 merged 5 commits into
developfrom
feat/#99-home-ui
Jan 15, 2026
Merged

[Feat] Home UI#104
nahy-512 merged 5 commits into
developfrom
feat/#99-home-ui

Conversation

@kimjw2003

@kimjw2003 kimjw2003 commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

📮 관련 이슈

📌 작업 내용

  • 홈 UI 작업
  • 홈의 각 컴포넌트 분리

📸 스크린샷

스크린샷
스크린샷 2026-01-15 오전 3 06 38
스크린샷 2026-01-15 오전 3 07 36

Summary by CodeRabbit

릴리스 노트

  • 새 기능

    • 홈 화면에 프로필 배너, 저장된 콘텐츠, 추천 컬렉션, 최근 컬렉션 섹션 추가
    • 컬렉션 생성 버튼(FAB) 추가
    • 컬렉션 및 저장된 콘텐츠 항목에서 컬렉션 상세로 이동(항목 클릭) 가능
  • 스타일

    • 새로운 그라디언트 색상 추가
    • 컬렉션 제목/작성자 텍스트에 한 줄 말줄임표(줄바꿈 및 트렁케이션) 적용

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

@kimjw2003 kimjw2003 self-assigned this Jan 14, 2026
@kimjw2003 kimjw2003 requested a review from a team as a code owner January 14, 2026 18:08
@kimjw2003 kimjw2003 added the 📱 UI feat - 컴포넌트 조립, 화면 구현 label Jan 14, 2026
@coderabbitai

coderabbitai Bot commented Jan 14, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

홈 화면 UI(배너, FAB, 추천/최근 컬렉션, 저장된 콘텐츠) 컴포넌트 추가 및 컬렉션 상세 네비게이션에 collectionId 파라미터 전파, 디자인 시스템에 새 그래디언트 추가 및 리스트 아이템 텍스트 오버플로우 처리 적용.

Changes

Cohort / File(s) 변경 사항 요약
홈 화면 UI 컴포넌트
app/src/main/java/com/flint/presentation/home/component/HomeBanner.kt, app/src/main/java/com/flint/presentation/home/component/HomeFab.kt, app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt, app/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.kt, app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt, app/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt
새로운 컴포넌트 6개 추가(배너, FAB, 추천/최근/빈 상태 컬렉션, 저장된 콘텐츠)
홈 화면 및 통합
app/src/main/java/com/flint/presentation/home/HomeScreen.kt
HomeRoute 시그니처 확장 및 새 컴포넌트 통합으로 UI 구조 대규모 변경
네비게이션 API 전파
app/src/main/java/com/flint/presentation/home/navigation/HomeNavigation.kt, app/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.kt, app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt, app/src/main/java/com/flint/presentation/explore/navigation/ExploreNavigation.kt, app/src/main/java/com/flint/presentation/profile/navigation/ProfileNavigation.kt, app/src/main/java/com/flint/presentation/main/MainNavHost.kt, app/src/main/java/com/flint/presentation/main/MainNavigator.kt
모든 계층의 navigateToCollectionDetail 콜백 시그니처가 (collectionId: String) -> Unit으로 변경 및 라우팅 호출 업데이트
라우트 정의 변경
app/src/main/java/com/flint/core/navigation/Route.kt
CollectionDetail을 object → data class CollectionDetail(val collectionId: String)로 변경(직렬화/생성자 변경)
컬렉션 상세 화면
app/src/main/java/com/flint/presentation/collectiondetail/CollectionDetailScreen.kt
CollectionDetailRoutecollectionId: String 파라미터 추가
리스트 아이템 변경
app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt, app/src/main/java/com/flint/core/designsystem/component/listItem/SavedContentItem.kt
CollectionItem에 텍스트 단일행+ellipsis 적용 및 패딩 조정; SavedContentItem에 onItemClick: (contentId: Long) -> Unit 파라미터 추가 및 클릭 처리 연결
디자인 시스템 색상
app/src/main/java/com/flint/core/designsystem/theme/Color.kt
Colors 데이터 클래스에 gradient400Secondary: Brush 추가 및 FlintColors 초기화(수직 그라디언트)

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)
Loading
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)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Suggested labels

Feat ✨

Suggested reviewers

  • nahy-512
  • giovannijunseokim

Poem

🐰 배너에 햇살, FAB에 반짝임,

컬렉션들 줄지어 춤추네, 클릭하면 흘러간다 id,
그라디언트 물결 위에서 폰트가 살짝 잘리네…
토끼가 박수 치며 외칩니다: 잘했어요! 🎉

🚥 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의 모든 코드 변경사항이 #99 이슈의 홈 UI 구현 목표와 일치하며, 홈 화면 UI와 컴포넌트 분리가 완전히 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 홈 UI 구현 범위 내에 있으며, #99 이슈와 관련된 네비게이션 연결 작업도 필요한 범위 내의 변경입니다.

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

✨ Finishing touches
  • 📝 Generate docstrings

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

@coderabbitai coderabbitai Bot left a comment

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.

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.stringResource
         Text(
-            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 = 1TextOverflow.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)
                     },
                 )
             }

items import 추가:

import androidx.compose.foundation.lazy.items

71-81: 접근성을 위해 contentDescription 추가를 권장합니다.

클릭 가능한 아이콘에 contentDescriptionnull로 설정되어 있어 스크린 리더 사용자가 기능을 파악하기 어렵습니다.

♻️ 수정 제안
             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)
                     },
                 )
             }

items import 추가:

import androidx.compose.foundation.lazy.items
app/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)
                     },
                 )
             }

items import 추가:

import androidx.compose.foundation.lazy.items
app/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 순서 조정을 권장합니다.

sizeclip 전에 적용해야 클리핑 영역이 올바르게 설정됩니다. 현재 순서에서도 동작하지만, 명시적인 순서가 더 안전합니다.

♻️ 수정 제안
     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 파라미터가 현재 사용되지 않음

collectionIdCollectionDetailRoute에 전달되지만 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

📥 Commits

Reviewing files that changed from the base of the PR and between 2cba14c and 3b5bc28.

📒 Files selected for processing (22)
  • app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt
  • app/src/main/java/com/flint/core/designsystem/component/listItem/SavedContentItem.kt
  • app/src/main/java/com/flint/core/designsystem/theme/Color.kt
  • app/src/main/java/com/flint/core/navigation/Route.kt
  • app/src/main/java/com/flint/presentation/collectiondetail/CollectionDetailScreen.kt
  • app/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.kt
  • app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt
  • app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt
  • app/src/main/java/com/flint/presentation/explore/ExploreScreen.kt
  • app/src/main/java/com/flint/presentation/explore/navigation/ExploreNavigation.kt
  • app/src/main/java/com/flint/presentation/home/HomeScreen.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeBanner.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeFab.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeRecentCollectionEmpty.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeSavedContents.kt
  • app/src/main/java/com/flint/presentation/home/navigation/HomeNavigation.kt
  • app/src/main/java/com/flint/presentation/main/MainNavHost.kt
  • app/src/main/java/com/flint/presentation/main/MainNavigator.kt
  • app/src/main/java/com/flint/presentation/profile/ProfileScreen.kt
  • app/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.kt
  • app/src/main/java/com/flint/core/designsystem/component/listItem/CollectionItem.kt
  • app/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 사용은 기존 gradient400linearGradient와 구분되는 의도적인 선택으로 보입니다.

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 패턴과 일치합니다.

navigateToCollectionDetailcollectionId: String을 받도록 변경되어 PR 전반의 네비게이션 패턴과 일관됩니다. 현재 CollectionListScreen()에서 해당 콜백을 사용하지 않는데, 추후 구현 시 컬렉션 아이템 클릭 핸들러에 연결이 필요합니다.

app/src/main/java/com/flint/presentation/home/HomeScreen.kt (1)

142-233: Preview 구현이 적절합니다.

다양한 샘플 데이터를 활용하여 HomeScreen의 여러 상태를 확인할 수 있도록 잘 구성되어 있습니다. recentCollectionModelListemptyList()로 변경하여 빈 상태도 테스트할 수 있는 점이 좋습니다.

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!

homeNavGraphnavigateToCollectionDetail: (collectionId: String) -> Unit 파라미터가 올바르게 추가되었습니다. HomeRoute의 시그니처와 일치하며, onRecommendCollectionItemClick 콜백에서 collectionId를 적절히 활용합니다.

app/src/main/java/com/flint/presentation/profile/navigation/ProfileNavigation.kt (1)

15-29: LGTM!

profileNavGraphnavigateToCollectionDetail 파라미터 시그니처 변경이 다른 네비게이션 모듈들과 일관성 있게 적용되었습니다.

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

119-121: LGTM!

MainNavigator.navigateToCollectionDetailcollectionId: String 파라미터를 받아 navController에 올바르게 전달합니다. 이 중앙 네비게이터의 변경으로 PR 전반에 걸친 collectionId 기반 네비게이션 API가 완성됩니다.

app/src/main/java/com/flint/presentation/collectiondetail/navigation/CollectionDetailNavigation.kt (1)

12-17: LGTM! Type-safe 네비게이션 구현이 적절합니다.

collectionId 파라미터를 추가하고 Route.CollectionDetail data class를 사용한 type-safe 네비게이션 패턴이 올바르게 구현되었습니다.

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

Comment thread app/src/main/java/com/flint/presentation/home/HomeScreen.kt

@coderabbitai coderabbitai Bot left a comment

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.

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,
                 )
             }

items import 추가 필요:

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

📥 Commits

Reviewing files that changed from the base of the PR and between 3b5bc28 and 2e092ea.

📒 Files selected for processing (4)
  • app/src/main/java/com/flint/presentation/home/HomeScreen.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeRecentCollection.kt
  • app/src/main/java/com/flint/presentation/home/component/HomeRecommendCollection.kt
  • app/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

이전에 지적된 함수명 오타(PreviewHomeRecommentCollectionPreviewHomeRecommendCollection)가 수정되었습니다. Preview 데이터도 적절하게 구성되어 있습니다.

app/src/main/java/com/flint/presentation/home/HomeScreen.kt (3)

73-130: LazyColumn 내 UI 구조 LGTM

stickyHeader를 활용한 상단 앱바, 배너, 추천 컬렉션, 저장된 콘텐츠, 최근 컬렉션 섹션이 잘 구성되어 있습니다. recentCollectionModelList가 비어있을 때 HomeRecentCollectionEmpty를 표시하는 조건부 렌더링도 적절합니다.


132-139: FAB 배치 LGTM

FAB가 우하단에 적절하게 배치되어 있고, contentPadding = PaddingValues(bottom = 80.dp)로 LazyColumn 콘텐츠가 FAB에 가려지지 않도록 처리되어 있습니다.


50-64: ExperimentalFoundationApi 주석 제거 검토

현재 프로젝트의 Compose BOM 버전(2025.10.01)에서 stickyHeader API는 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.

Comment on lines +72 to +82
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_more),
contentDescription = null,
tint = Color.Unspecified,
modifier =
Modifier
.size(24.dp)
.noRippleClickable {
onAllClick()
},
)

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

접근성: 클릭 가능한 아이콘에 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.

Suggested change
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.

Comment on lines 39 to 47
HomeScreen(
onRecommendCollectionItemClick = { collectionId ->
navigateToCollectionDetail(collectionId)
},
onSavedContentItemClick = { contentId ->
// TODO show OttListBottomSheet
},
modifier = Modifier.padding(paddingValues),
)

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

navigateToCollectionCreate 콜백이 HomeScreen에 전달되지 않았습니다.

HomeRoutenavigateToCollectionCreate 파라미터가 있지만 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.

Suggested change
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).

@nahy-512 nahy-512 left a comment

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.

작업 속도 최고다,, 고생하셨습니다!


@Preview
@Composable
private fun PreviewHomeFab() {

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
이름 이거 Preview가 먼저 표시되는 이유가 있나요

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.

오홍 도메인 모델 이름을 DomainXX 식으로 작성하시는 거랑 같은 이유신가 보네요
컨벤션 맞춰보면 좋을 것 같은데,, 작업 끝나고 여유될 때 다시 얘기해보는 걸로 하시죠~!

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] Home UI

2 participants