Skip to content

[Feat] 컬렉션 리스트 화면 UI 구현#111

Merged
nahy-512 merged 4 commits into
developfrom
feat/#101-collectionlist-ui
Jan 16, 2026
Merged

[Feat] 컬렉션 리스트 화면 UI 구현#111
nahy-512 merged 4 commits into
developfrom
feat/#101-collectionlist-ui

Conversation

@nahy-512

@nahy-512 nahy-512 commented Jan 15, 2026

Copy link
Copy Markdown
Contributor

📮 관련 이슈

  • closed #이슈번호

📌 작업 내용

  • 컬렉션 리스트 화면 UI 구현했어요.

📸 스크린샷

스크린샷
2026-01-15.11.36.58.mov

😅 미구현

  • N/A

🫛 To. 리뷰어

  • 리스트 뜨는 화면이 원래 여러 개 있는데, 기존 프로필 화면에서 진입했을 때의 검색바가 삭제돼서, title만 바꾸는 걸로 우선 구현하도록 하겠습니다.

Summary by CodeRabbit

릴리스 노트

  • 신기능

    • 컬렉션 목록 화면 추가: 뒤로가기 버튼 및 컬렉션 그리드 표시 기능 구현
  • 리팩토링

    • 검색 필드 모디파이어 커스터마이제이션 개선
  • 스타일

    • 컬렉션 항목 UI 높이 조정
  • 테스트

    • 모델 테스트 데이터 추가

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

…onlist-ui

# Conflicts:
#	app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt
#	app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt
@nahy-512 nahy-512 self-assigned this Jan 15, 2026
@nahy-512 nahy-512 requested a review from a team as a code owner January 15, 2026 14:41
@nahy-512 nahy-512 added Feat ✨ 신규 기능을 추가하거나 기존 기능의 동작, 정책을 변경 📱 UI feat - 컴포넌트 조립, 화면 구현 labels Jan 15, 2026
@nahy-512 nahy-512 linked an issue Jan 15, 2026 that may be closed by this pull request
3 tasks
@coderabbitai

coderabbitai Bot commented Jan 15, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

워크스루

이 변경은 컬렉션 리스트 화면에 백 네비게이션 기능을 추가하기 위해 네비게이션 레이어 전체에 navigateUp 콜백 파라미터를 도입합니다. 또한 테스트용 가짜 데이터 객체와 UI 구성 요소 개선사항을 추가합니다.

변경 사항

코호트 / 파일(들) 변경 요약
네비게이션 레이어
app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt, app/src/main/java/com/flint/presentation/main/MainNavHost.kt
collectionListNavGraph 함수 시그니처에 navigateUp: () -> Unit 파라미터 추가 및 네비게이션 체인 전체에 연결
컬렉션 리스트 화면 구현
app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt
공개 Composable을 private 함수로 변경, onBackClick, title, collections 파라미터 추가, 백 앱 바, 컬렉션 그리드, 샘플 데이터 Preview 포함 UI 구현 추가
테스트 데이터 객체
app/src/main/java/com/flint/domain/model/AuthorModel.kt, app/src/main/java/com/flint/domain/model/CollectionDetailModel.kt
companion object의 Fake 정적 프로퍼티 추가로 테스트 및 Preview 지원
UI 컴포넌트 개선
app/src/main/java/com/flint/presentation/collectionlist/component/CollectionFileItem.kt, app/src/main/java/com/flint/core/designsystem/component/textfield/FlintSearchTextField.kt
Modifier 파라미터화 및 높이 제약 추가로 레이아웃 유연성 향상

시퀀스 다이어그램

sequenceDiagram
    participant User
    participant MainNavHost
    participant CollectionListRoute
    participant CollectionListScreen
    participant Navigator

    User->>MainNavHost: 컬렉션 리스트 화면 진입
    MainNavHost->>CollectionListRoute: navigateUp 콜백 전달
    CollectionListRoute->>CollectionListScreen: onBackClick 파라미터로 전달
    User->>CollectionListScreen: 백 버튼 클릭
    CollectionListScreen->>Navigator: onBackClick() 호출
    Navigator->>MainNavHost: navigateUp 실행
    MainNavHost->>User: 이전 화면으로 돌아가기
Loading

추정 코드 리뷰 난이도

🎯 3 (중간) | ⏱️ ~20분

관련 가능성 있는 PR

  • [Feat] 스크린 Route 연결 #94: 이번 PR의 navigateUp 파라미터 추가가 PR #94에서 도입된 동일한 collection-list 네비게이션 코드를 직접 수정합니다.
  • [Feat] Home UI #104: 두 PR 모두 컬렉션 리스트 API/네비게이션 surface를 수정하며, 같은 CollectionListRoute/collectionListNavGraph 시그니처에 영향을 미칩니다.

제안 라벨

🧩 Component

제안 리뷰어

  • giovannijunseokim

🐰 백 버튼 추가해 돌아갈 길 열고,
가짜 데이터로 UI 미리 보고,
네비게이션 체인 깔끔하게 연결하니,
컬렉션 리스트 이제 완성이로다! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 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 (2 passed)
Check name Status Explanation
Description check ✅ Passed PR 설명은 대부분의 필수 섹션(관련 이슈, 작업 내용, 스크린샷, 미구현, 리뷰어 코멘트)을 포함하고 있으나, 관련 이슈 번호가 구체적으로 작성되지 않았습니다.
Title check ✅ Passed PR 제목이 변경 사항의 주요 내용을 명확하게 요약하고 있으며, 컬렉션 리스트 화면 UI 구현이라는 핵심 변경사항을 정확하게 반영하고 있습니다.

✏️ 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: 1

🤖 Fix all issues with AI agents
In
`@app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt`:
- Around line 91-103: The current use of
Modifier.align(Alignment.CenterHorizontally) inside the LazyGrid item is invalid
because LazyGridItemScope does not provide align() and
Alignment.CenterHorizontally is for Column; replace the Box modifier with a
width-filling Box and use its contentAlignment parameter instead: change
Box(modifier = Modifier.fillMaxSize(1f).align(Alignment.CenterHorizontally)) to
Box(modifier = Modifier.fillMaxWidth().height(IntrinsicSize.Min) or
.wrapContentHeight(), contentAlignment = Alignment.Center) and remove the inner
Modifier.align call on CollectionFileItem (or keep
Modifier.align(Alignment.Center) only if inside a BoxScope), ensuring you use
Alignment.Center for centering within the Box and no align extension from
LazyGridItemScope.
🧹 Nitpick comments (1)
app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt (1)

55-56: 사용되지 않는 상태 변수 제거 필요

text 상태 변수가 선언되었지만 UI에서 사용되지 않습니다. 불필요한 코드이므로 제거하는 것이 좋습니다.

♻️ 제안된 수정
 ) {
-    var text by remember { mutableStateOf("") }
-
     Column(
📜 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 9077c9d.

📒 Files selected for processing (7)
  • app/src/main/java/com/flint/core/designsystem/component/textfield/FlintSearchTextField.kt
  • app/src/main/java/com/flint/domain/model/AuthorModel.kt
  • app/src/main/java/com/flint/domain/model/CollectionDetailModel.kt
  • app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt
  • app/src/main/java/com/flint/presentation/collectionlist/component/CollectionFileItem.kt
  • app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt
  • app/src/main/java/com/flint/presentation/main/MainNavHost.kt
🧰 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/collectionlist/CollectionListScreen.kt
  • app/src/main/java/com/flint/presentation/collectionlist/component/CollectionFileItem.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/collectionlist/CollectionListScreen.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/collectionlist/component/CollectionFileItem.kt
🧬 Code graph analysis (3)
app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt (1)
app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt (1)
  • CollectionListRoute (34-46)
app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt (3)
app/src/main/java/com/flint/core/designsystem/component/topappbar/FlintBackTopAppbar.kt (1)
  • FlintBackTopAppbar (16-57)
app/src/main/java/com/flint/presentation/collectionlist/component/CollectionFileItem.kt (1)
  • CollectionFileItem (40-85)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintSearchTextField.kt (1)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintBasicTextField.kt (1)
  • FlintBasicTextField (36-114)
🔇 Additional comments (10)
app/src/main/java/com/flint/core/designsystem/component/textfield/FlintSearchTextField.kt (1)

27-31: LGTM!

Modifier 파라미터 추가가 Jetpack Compose 컨벤션을 잘 따르고 있습니다. 필수 파라미터 다음에 위치하며, FlintBasicTextField와 동일한 패턴을 사용하고 있어 일관성이 좋습니다. modifier.fillMaxWidth() 체이닝을 통해 호출자의 커스텀 modifier를 적용하면서도 기본 너비 동작을 유지하는 방식이 적절합니다.

app/src/main/java/com/flint/domain/model/AuthorModel.kt (1)

10-20: LGTM!

Compose Preview 및 테스트용 Fake 인스턴스가 잘 구현되었습니다. CollectionDetailModel.Fake에서 참조하는 구조로 적절하게 연결되어 있습니다.

app/src/main/java/com/flint/domain/model/CollectionDetailModel.kt (1)

13-28: LGTM!

Preview용 Fake 인스턴스가 일관된 패턴으로 구현되었습니다. AuthorModel.Fake를 활용하여 연관 모델의 의존성도 적절히 처리했습니다.

app/src/main/java/com/flint/presentation/collectionlist/component/CollectionFileItem.kt (3)

57-59: LGTM!

코드 포맷팅 변경으로, 기능적 영향 없이 가독성을 유지합니다.


75-82: 그리드 레이아웃에서 일관된 카드 높이를 위한 적절한 변경입니다.

maxLines = 2caption1R12 타이포그래피에 대해 45.dp 높이가 적절해 보입니다. 내용 길이에 관계없이 카드들이 균일한 높이를 유지하게 됩니다.


40-44: 파일/컴포넌트 이름 확인이 필요합니다.

커밋 메시지에는 CollectionFilmItem으로 언급되어 있지만, 실제 파일명과 컴포넌트 이름은 CollectionFileItem입니다. 영화/포스터 컬렉션 컨텍스트상 Film이 더 적절해 보이는데, 의도된 명명인지 확인해 주세요.

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

63-67: LGTM!

collectionListNavGraphnavigateUp 파라미터가 올바르게 연결되었습니다. navigator::navigateUp 메서드 참조 사용이 적절합니다.

app/src/main/java/com/flint/presentation/collectionlist/navigation/CollectionListNavigation.kt (1)

15-26: LGTM!

navigateUp 파라미터가 네비게이션 그래프 함수 시그니처에 올바르게 추가되었고, CollectionListRoute로 적절히 전달되고 있습니다.

app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt (2)

34-46: navigateToCollectionDetail 파라미터 미사용

navigateToCollectionDetailCollectionListRoute에 전달되지만 CollectionListScreen에는 전달되지 않아 컬렉션 아이템 클릭 시 상세 화면으로 이동하는 기능이 없습니다.

향후 구현 예정이라면 무시해도 되지만, 현재 상태에서는 컬렉션 아이템이 클릭 불가능합니다.


108-167: LGTM!

프리뷰 구현이 적절합니다. FlintTheme으로 감싸고 다양한 시나리오의 샘플 데이터를 사용하여 UI를 효과적으로 확인할 수 있습니다.

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

Comment on lines +91 to +103
items(
items = collections,
key = { it.collectionId },
) { collection ->
Box(modifier = Modifier.fillMaxSize(1f).align(Alignment.CenterHorizontally)) {
CollectionFileItem(
collection = collection,
modifier =
Modifier
.align(Alignment.Center),
)
}
}

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 | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# First, locate the file and read the relevant lines
find . -name "CollectionListScreen.kt" -type f

Repository: imflint/Flint-Android

Length of output: 146


🏁 Script executed:

# Search for Modifier.align definitions to understand what it actually is
rg -n "fun Modifier\.align" --type=kt

Repository: imflint/Flint-Android

Length of output: 91


🏁 Script executed:

# Check LazyVerticalGrid and LazyGridItemScope usage in the codebase
rg -n "LazyVerticalGrid" --type=kt -A 10 | head -150

Repository: imflint/Flint-Android

Length of output: 91


🏁 Script executed:

# Check what Modifier.align is available in the codebase - might be a custom extension
rg -n "\.align\(" --type=kt -B 2 -A 2 | head -200

Repository: imflint/Flint-Android

Length of output: 91


🏁 Script executed:

# Read the target file to see the actual code
cat -n ./app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt | sed -n '80,110p'

Repository: imflint/Flint-Android

Length of output: 1342


🏁 Script executed:

# Check imports at the top of the file
head -30 ./app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt

Repository: imflint/Flint-Android

Length of output: 1492


🏁 Script executed:

# Search for Modifier.align definitions without file type
ast-grep --pattern 'fun Modifier.align($$$)' | head -50

Repository: imflint/Flint-Android

Length of output: 47


🏁 Script executed:

# Search for custom align extensions across the codebase
rg "fun.*Modifier.*align" | head -50

Repository: imflint/Flint-Android

Length of output: 47


🌐 Web query:

LazyGridItemScope Modifier.align Jetpack Compose documentation

💡 Result:

Short answer: LazyGridItemScope does not provide a Modifier.align extension. The LazyGridItemScope API only exposes item-scoped modifiers like animateItem (and the usual Modifier extensions that don't require a specific scope). To align an item’s child you should wrap the item content in a layout that provides align (for example Box/Column/Row) and use that layout's scope Modifier.align. (composables.com)

References:

  • LazyGridItemScope (Compose Foundation API reference). (composables.com)
  • ColumnScope / Modifier.align documentation (example of align provided by layout scopes). (developer.android.com)

Citations:


🌐 Web query:

Alignment.CenterHorizontally vs Alignment.Center Compose alignment scopes

💡 Result:

Short answer: CenterHorizontally is a horizontal-only Alignment (Alignment.Horizontal) used by Column / ColumnScope (horizontalAlignment or Modifier.align inside a Column). Center (Alignment) is a 2‑D alignment (horizontal+vertical) used by Box / BoxScope (contentAlignment or Modifier.align inside a Box).

  • Alignment.CenterHorizontally → aligns along the X axis (for Column horizontalAlignment or ColumnScope.align). [1]
  • Alignment.Center → a full Alignment combining horizontal and vertical centering (used by Box.contentAlignment and BoxScope.align). [2][3]

Sources:
[1] Android Alignment API (CenterHorizontally property).
[2] ColumnScope / Column docs (horizontalAlignment, Modifier.align example).
[3] BoxScope / Box docs (contentAlignment: Alignment, Modifier.align(alignment: Alignment)).


🏁 Script executed:

# Check if there's any build configuration or gradle files that might reveal compilation status
find . -name "build.gradle*" -o -name "compose_version.gradle" | head -5

Repository: imflint/Flint-Android

Length of output: 106


🏁 Script executed:

# Search for any error or warning messages in the codebase related to align
rg "align" . --type=gradle -A 2 -B 2 | head -50

Repository: imflint/Flint-Android

Length of output: 47


Modifier.align() 코드 컴파일 불가 - 즉시 수정 필요

Line 95의 Modifier.align(Alignment.CenterHorizontally)는 컴파일되지 않습니다. LazyGridItemScopealign() 확장 함수를 제공하지 않으며, 이 메서드는 ColumnScope 또는 BoxScope 같은 특정 레이아웃 스코프 내에서만 사용 가능합니다. 또한 Alignment.CenterHorizontallyColumn의 수평 정렬용이며, Box 내에서는 Alignment.Center를 사용해야 합니다.

다음과 같이 수정하세요:

수정 방법
             items(
                 items = collections,
                 key = { it.collectionId },
             ) { collection ->
-                Box(modifier = Modifier.fillMaxSize(1f).align(Alignment.CenterHorizontally)) {
+                Box(
+                    modifier = Modifier.fillMaxSize(),
+                    contentAlignment = Alignment.Center,
+                ) {
                     CollectionFileItem(
                         collection = collection,
-                        modifier =
-                            Modifier
-                                .align(Alignment.Center),
+                        modifier = Modifier,
                     )
                 }
             }
🤖 Prompt for AI Agents
In
`@app/src/main/java/com/flint/presentation/collectionlist/CollectionListScreen.kt`
around lines 91 - 103, The current use of
Modifier.align(Alignment.CenterHorizontally) inside the LazyGrid item is invalid
because LazyGridItemScope does not provide align() and
Alignment.CenterHorizontally is for Column; replace the Box modifier with a
width-filling Box and use its contentAlignment parameter instead: change
Box(modifier = Modifier.fillMaxSize(1f).align(Alignment.CenterHorizontally)) to
Box(modifier = Modifier.fillMaxWidth().height(IntrinsicSize.Min) or
.wrapContentHeight(), contentAlignment = Alignment.Center) and remove the inner
Modifier.align call on CollectionFileItem (or keep
Modifier.align(Alignment.Center) only if inside a BoxScope), ensuring you use
Alignment.Center for centering within the Box and no align extension from
LazyGridItemScope.

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

잘했어요 칭찬 땅땅스~

items = collections,
key = { it.collectionId },
) { collection ->
Box(modifier = Modifier.fillMaxSize(1f).align(Alignment.CenterHorizontally)) {

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.

p2
fillMaxSize에 1f를 넣으신 이유가 무엇인가요?

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

LGTM 🥇

collections: ImmutableList<CollectionDetailModel>,
modifier: Modifier = Modifier,
) {
var text by remember { mutableStateOf("") }

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.

p2: 필요한 String인가요? 👀

) {
items(
items = collections,
key = { it.collectionId },

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: key는 어떤 역할을 하나요? 👀

@nahy-512 nahy-512 changed the title [Feat/#101] 컬렉션 리스트 화면 UI 구현 [Feat] 컬렉션 리스트 화면 UI 구현 Jan 15, 2026
@nahy-512 nahy-512 merged commit b4bb5d0 into develop Jan 16, 2026
3 checks passed
@nahy-512 nahy-512 deleted the feat/#101-collectionlist-ui branch January 16, 2026 11:43
@coderabbitai coderabbitai Bot mentioned this pull request Jun 14, 2026
6 tasks
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] 켈렉션 목록 화면 구현

3 participants