Skip to content

[Feat] collection create modal and bottomsheet#65

Merged
nahy-512 merged 5 commits into
developfrom
feat/#59-CollectionCreate-Modal-and-Bottomsheet
Jan 13, 2026
Merged

[Feat] collection create modal and bottomsheet#65
nahy-512 merged 5 commits into
developfrom
feat/#59-CollectionCreate-Modal-and-Bottomsheet

Conversation

@chanmi1125

@chanmi1125 chanmi1125 commented Jan 13, 2026

Copy link
Copy Markdown
Contributor

📮 관련 이슈

📌 작업 내용

  • collection create modal and bottomsheet

📸 스크린샷

스크린샷
Screenshot_20260113-212751_Flint
Screenshot_20260113-212813_Flint

😅 미구현

  • [ ]

🫛 To. 리뷰어

Summary by CodeRabbit

새 기능

  • 컬렉션에 작품 추가 시 갤러리에서 선택하거나 표지 사진을 삭제할 수 있는 메뉴를 추가했습니다.
  • 작품 삭제 시 확인 모달이 표시됩니다.

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

@chanmi1125 chanmi1125 self-assigned this Jan 13, 2026
@chanmi1125 chanmi1125 requested a review from a team as a code owner January 13, 2026 12:39
@chanmi1125 chanmi1125 added 🧩 Component feat - 공통 컴포넌트 작업 Feat ✨ 신규 기능을 추가하거나 기존 기능의 동작, 정책을 변경 labels Jan 13, 2026
@coderabbitai

coderabbitai Bot commented Jan 13, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

워크스루

컬렉션 생성 기능의 UI를 개선하기 위해 두 개의 새로운 Jetpack Compose 컴포넌트를 추가합니다. 갤러리 선택 및 커버 삭제 옵션을 제공하는 바텀 시트와 삭제 확인 모달을 구현하여 사용자 상호작용 흐름을 완성합니다.

변경사항

코호트 / 파일(들) 변경 요약
UI 컴포넌트 추가
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionAddFilmBottomSheet.kt
갤러리 선택과 커버 사진 삭제 옵션을 제공하는 바텀 시트 컴포넌트 추가 (+50줄)
UI 컴포넌트 추가
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateFilmDeleteModal.kt
삭제 확인 모달 컴포넌트 추가, 파괴적 작업 스타일링 포함 (+35줄)

예상 코드 리뷰 노력

🎯 2 (Simple) | ⏱️ ~12분

추천 리뷰어

  • nahy-512

🐰 새로운 바텀 시트가 나타났어요,
갤러리와 삭제 옵션이 쏙,
모달로 확인 받고 안전하게,
컬렉션 생성이 완성돼요!
예쁜 UI로 사용자 경험 쌩쌩! 🎬✨

🚥 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의 주요 변경 사항을 명확하게 요약하고 있으며, collection create modal과 bottomsheet 추가라는 핵심 내용을 정확히 전달합니다.
Description check ✅ Passed PR 설명이 템플릿의 주요 섹션(관련 이슈, 작업 내용, 스크린샷)을 포함하고 있으며, 이슈 #59를 명시하고 구현 내용을 명확히 합니다.
Linked Issues check ✅ Passed PR은 이슈 #59의 두 가지 요구사항(모달 버튼 제작과 바텀 시트 제작)을 모두 충족하고 있으며, CollectionCreateFilmDeleteModal과 CollectionAddFilmBottomSheet 컴포넌트를 추가했습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 이슈 #59의 요구사항(모달과 바텀 시트 구현)과 직접 관련되어 있으며, 범위를 벗어난 변경은 없습니다.

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

🧹 Nitpick comments (3)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateModal.kt (1)

12-25: 이름과 기능 불일치 및 재사용 불가능한 구조

  1. 네이밍 불일치: CollectionCreateModal이라는 이름이지만, UI 텍스트는 삭제("작품을 삭제할까요?", "삭제")에 관한 내용입니다. 네이밍을 CollectionDeleteModal 또는 실제 용도에 맞게 수정하는 것이 좋습니다.

  2. 재사용성 부재: onConfirm, onDismiss 콜백이 빈 람다로 하드코딩되어 있어 외부에서 사용할 수 없습니다. 현재 private이므로 프리뷰 외에는 사용이 불가능합니다.

  3. 문자열 리소스: 한국어 문자열들이 하드코딩되어 있습니다. strings.xml 리소스를 사용하면 다국어 지원과 유지보수에 유리합니다.

♻️ 재사용 가능한 구조로 개선 제안
 @Composable
-private fun CollectionCreateModal() {
+fun CollectionDeleteModal(
+    onConfirm: () -> Unit,
+    onDismiss: () -> Unit,
+) {
     TwoButtonModal(
         modifier = Modifier.background(Color.White),
         message = "작성한 내용이 모두 삭제돼요.",
         cancelText = "취소",
         confirmText = "삭제",
-        onConfirm = {},
-        onDismiss = {},
+        onConfirm = onConfirm,
+        onDismiss = onDismiss,
         title = "작품을 삭제할까요?",
         icon = R.drawable.ic_gradient_trash,
         isDestructive = true
     )
 }
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateBottomSheet.kt (2)

11-33: 외부에서 사용 불가능한 구조

현재 CollectionCreateBottomSheetpublic 함수이지만, 모든 콜백(clickAction, onDismiss)이 빈 람다로 하드코딩되어 있어 실제 기능 연동이 불가능합니다.

♻️ 콜백을 파라미터로 노출하는 구조로 개선 제안
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-fun CollectionCreateBottomSheet() {
+fun CollectionCreateBottomSheet(
+    onSelectFromGallery: () -> Unit,
+    onDeleteCoverPhoto: () -> Unit,
+    onDismiss: () -> Unit,
+) {
     val menuBottomSheetDataList = listOf(
         MenuBottomSheetData(
             label = "갤러리에서 선택",
-            clickAction = {}
+            clickAction = onSelectFromGallery
         ),
         MenuBottomSheetData(
             label = "커버 사진 삭제",
             color = FlintTheme.colors.error500,
-            clickAction = {}
+            clickAction = onDeleteCoverPhoto
         )
     )
 
     val sheetState = rememberModalBottomSheetState()
 
     MenuBottomSheet(
         menuBottomSheetDataList = menuBottomSheetDataList,
-        onDismiss = {},
+        onDismiss = onDismiss,
         sheetState = sheetState
     )
 }

프리뷰도 함께 수정:

 @OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Composable
 private fun CollectionCreateBottomSheetPreview() {
     FlintTheme {
-        CollectionCreateBottomSheet()
+        CollectionCreateBottomSheet(
+            onSelectFromGallery = {},
+            onDeleteCoverPhoto = {},
+            onDismiss = {}
+        )
     }
 }

35-42: 프리뷰에 showBackground = true 추가 권장

CollectionCreateModal의 프리뷰와 일관성을 위해 showBackground = true를 추가하는 것이 좋습니다.

♻️ 제안
 @OptIn(ExperimentalMaterial3Api::class)
-@Preview
+@Preview(showBackground = true)
 @Composable
 private fun CollectionCreateBottomSheetPreview() {
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fe18e55 and 77df5bb.

📒 Files selected for processing (2)
  • app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateBottomSheet.kt
  • app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateModal.kt
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: PR Build Check
  • GitHub Check: PR Lint Check

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

고생했어용 다른 사람 컴포 따라쓰기도.. 쉽지않죠??ㅎㅎ
리뷰 내용 수정하고 다시 리뷰 요청주세요~~


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CollectionCreateBottomSheet() {

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.

p1
onDismissonGalleryClick, onCoverdeleteClick 등의 이벤트 미리 뚫어서 아래 넘겨주시면 좋을 것 같습니다!

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.

으아! 무작정 따라썼네요 ~~ 변경하겠습니다!

import com.flint.core.designsystem.theme.FlintTheme

@Composable
private fun CollectionCreateModal() {

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.

p1
여기도 클릭 이벤트 미리 뚫어주면 좋을듯!
onConfirm이랑 onDismiss

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.

private 수정해주세요

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.

p1
사용처보다도 용도를 하나 더 적어주면 좋을 것 같아요! 삭제를 위한 모달이니까 차라리 FilmDeleteModal 식으로 명칭해주는 것도 좋을듯??

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.

넵! 반영할게요오

@Composable
private fun CollectionCreateModal() {
TwoButtonModal(
modifier = Modifier.background(Color.White),

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.

p1
background가 들어가는 이유가 있나요?

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.

삭제했습니다!! 프리뷰 따라하지 않기 ~~

confirmText = "삭제",
onConfirm = {},
onDismiss = {},
title = "작품을 삭제할까요?",

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
title이 message보다 먼저 들어가는 게 조금 더 보기 편할 것 같아요..!

onDismiss = {},
title = "작품을 삭제할까요?",
icon = R.drawable.ic_gradient_trash,
isDestructive = true

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.

아래 옵션이 기본으로 false를 선택되어있는데, 그럴경우 파란색 버튼이 생성됩니다! 빨간색 버튼으로 변경하려면 true로 설정해줘야된다고 적혀있더라구요 !!

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

🧹 Nitpick comments (1)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionAddFilmBottomSheet.kt (1)

13-16: 파라미터 명명 규칙 불일치: onCoverdeleteClickonCoverDeleteClick

onCoverdeleteClick은 camelCase 규칙에 맞지 않습니다. onCoverDeleteClick으로 수정하는 것이 좋습니다.

♻️ 제안된 수정
 @Composable
 fun CollectionAddFilmBottomSheet(
     onGalleryClick: () -> Unit,
-    onCoverdeleteClick: () -> Unit,
+    onCoverDeleteClick: () -> Unit,
     onDismiss: () -> Unit
 ) {
     val menuBottomSheetDataList = listOf(
         MenuBottomSheetData(
             label = "갤러리에서 선택",
             clickAction = onGalleryClick
         ),
         MenuBottomSheetData(
             label = "커버 사진 삭제",
             color = FlintTheme.colors.error500,
-            clickAction = onCoverdeleteClick
+            clickAction = onCoverDeleteClick
         )
     )
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 77df5bb and 724ca53.

📒 Files selected for processing (3)
  • app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionAddFilmBottomSheet.kt
  • app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateModal.kt
  • gradle/libs.versions.toml
🧰 Additional context used
🧬 Code graph analysis (2)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionAddFilmBottomSheet.kt (2)
app/src/main/java/com/flint/core/designsystem/component/bottomsheet/MenuBottomSheet.kt (1)
  • MenuBottomSheet (30-77)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateModal.kt (2)
app/src/main/java/com/flint/core/designsystem/component/modal/TwoButtonModal.kt (1)
  • TwoButtonModal (25-90)
app/src/main/java/com/flint/core/designsystem/theme/Theme.kt (1)
  • FlintTheme (8-16)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: PR Lint Check
  • GitHub Check: PR Build Check
🔇 Additional comments (3)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateModal.kt (1)

9-24: LGTM!

TwoButtonModal을 적절하게 활용하여 삭제 확인 모달을 구현했습니다. isDestructive = true 설정으로 삭제 버튼이 올바르게 강조됩니다.

app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionAddFilmBottomSheet.kt (1)

18-36: 액션 클릭 후 바텀시트 자동 닫힘 동작 확인 필요

현재 구현에서 메뉴 항목 클릭 시 clickAction만 호출되고 바텀시트가 자동으로 닫히지 않습니다. 호출하는 쪽에서 onGalleryClick이나 onCoverDeleteClick 콜백 내에서 바텀시트를 닫는 로직을 포함해야 합니다. 의도된 동작이라면 무시해주세요.

gradle/libs.versions.toml (1)

3-3: Material3 ModalBottomSheet는 API 27과 완벽하게 호환됩니다.

ModalBottomSheet는 Jetpack Compose Material3의 일부로, API 레벨 21(Android 5.0) 이상에서 지원됩니다. minSdk 27 환경에서는 호환성 문제가 없습니다.

또한 코드베이스에서 @RequiresApi 어노테이션이나 명시적인 API 레벨 체크가 발견되지 않아, 이 변경으로 인한 다른 호환성 문제도 파악되지 않습니다.

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

고생하셨습니다~!

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

🧹 Nitpick comments (2)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateFilmDeleteModal.kt (2)

10-13: modifier 파라미터 추가를 권장합니다.

Compose 컴포넌트의 일반적인 관례에 따라 modifier 파라미터를 노출하면 호출 측에서 레이아웃 조정이 가능해져 재사용성이 향상됩니다.

♻️ 제안하는 수정
 @Composable
 fun CollectionCreateFilmDeleteModal(
     onConfirm: () -> Unit,
-    onDismiss: () -> Unit
+    onDismiss: () -> Unit,
+    modifier: Modifier = Modifier
 ) {
     TwoButtonModal(
         title = "작품을 삭제할까요?",
         message = "작성한 내용이 모두 삭제돼요.",
         cancelText = "취소",
         confirmText = "삭제",
         onConfirm = onConfirm,
         onDismiss = onDismiss,
+        modifier = modifier,
         icon = R.drawable.ic_gradient_trash,
         isDestructive = true
     )
 }

14-23: 하드코딩된 문자열을 string resource로 분리하는 것을 고려해 주세요.

현재 UI 텍스트("작품을 삭제할까요?", "작성한 내용이 모두 삭제돼요." 등)가 코드에 직접 작성되어 있습니다. 향후 다국어 지원(i18n)이나 텍스트 일괄 관리를 위해 strings.xml로 분리하면 유지보수에 유리합니다.

참고: R.drawable.ic_gradient_trash 아이콘 리소스는 정상적으로 존재합니다.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 724ca53 and 44edc9a.

📒 Files selected for processing (2)
  • app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionAddFilmBottomSheet.kt
  • app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateFilmDeleteModal.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionAddFilmBottomSheet.kt
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateFilmDeleteModal.kt (2)
app/src/main/java/com/flint/core/designsystem/component/modal/TwoButtonModal.kt (1)
  • TwoButtonModal (25-90)
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 (1)
app/src/main/java/com/flint/presentation/collectioncreate/component/CollectionCreateFilmDeleteModal.kt (1)

26-35: LGTM!

Preview 함수가 FlintTheme으로 올바르게 감싸져 있고, showBackground = true 설정으로 미리보기에서 모달을 확인하기 좋습니다.

@nahy-512 nahy-512 merged commit 969e5af into develop Jan 13, 2026
2 of 3 checks passed
@nahy-512 nahy-512 deleted the feat/#59-CollectionCreate-Modal-and-Bottomsheet branch January 13, 2026 13:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🧩 Component feat - 공통 컴포넌트 작업 Feat ✨ 신규 기능을 추가하거나 기존 기능의 동작, 정책을 변경

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 컬렉션 추가 모달 버튼 & 바텀 시트 제작

2 participants