Skip to content

[FEAT/#19] 체크리스트 컴포넌트 구현#20

Merged
sohee6989 merged 5 commits intodevelopfrom
feat/#19-checklist-component
Jan 11, 2026
Merged

[FEAT/#19] 체크리스트 컴포넌트 구현#20
sohee6989 merged 5 commits intodevelopfrom
feat/#19-checklist-component

Conversation

@sohee6989
Copy link
Copy Markdown
Contributor

@sohee6989 sohee6989 commented Jan 9, 2026

Related issue 🛠

Work Description ✏️

  • 챌린지 화면에서 사용하는 체크리스트 컴포넌트 구현

Screenshot 📸

스크린샷 2026-01-10 오전 1 30 46 스크린샷 2026-01-10 오전 1 30 53

Uncompleted Tasks 😅

  • N/A

To Reviewers 📢

Summary by CodeRabbit

새로운 기능

  • Challenge 화면에 상호작용 가능한 체크리스트 컴포넌트 추가
  • 체크박스 상태 변경 시 텍스트 꾸밈 및 색상 동적 변경
  • 활성화/비활성화 상태의 체크박스 아이콘 리소스 추가

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

@sohee6989 sohee6989 self-assigned this Jan 9, 2026
@sohee6989 sohee6989 requested a review from a team as a code owner January 9, 2026 16:33
@sohee6989 sohee6989 added the FEAT✨ 새로운 기능 구현 label Jan 9, 2026
@sohee6989 sohee6989 linked an issue Jan 9, 2026 that may be closed by this pull request
@sohee6989 sohee6989 added the 소희🍒 소희 담당 label Jan 9, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jan 9, 2026

개요

새로운 체크리스트 UI 컴포넌트 ChallengeChecklist를 구현했습니다. 선택 상태를 표시하는 두 개의 벡터 드로어블과 상호작용을 처리하는 Kotlin Composable 함수를 추가했습니다.

변경 사항

단위 / 파일(s) 변경 요약
UI 컴포넌트
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt
테두리, 둥근 모서리, 아이콘, 텍스트를 포함한 새로운 ChallengeChecklist Composable 추가. isChecked 상태에 따라 콘텐츠 색상과 텍스트 장식 변경. Preview에서 상태 토글 기능 포함
드로어블 리소스
app/src/main/res/drawable/ic_checkbox_active.xml, ic_checkbox_inactive.xml
활성(분홍색 배경 + 체크 기호) 및 비활성(회색 테두리 윤곽선) 상태의 24x24dp 체크박스 벡터 드로어블 두 개 추가

예상 코드 리뷰 난이도

🎯 2 (단순) | ⏱️ ~10분

🚥 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 제목이 체크리스트 컴포넌트 구현이라는 핵심 변경사항을 명확하게 반영하고 있습니다.
Description check ✅ Passed PR 설명이 요구되는 템플릿 구조를 따르고 있으며, 관련 이슈, 작업 내용, 스크린샷을 포함하고 있습니다.
Linked Issues check ✅ Passed PR의 코드 변경사항이 이슈 #19의 체크리스트 컴포넌트 구현 요구사항을 충족하고 있습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 체크리스트 컴포넌트 구현이라는 범위 내에 있으며, 범위를 벗어난 변경사항이 없습니다.

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

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3b75c29 and 129dbd1.

📒 Files selected for processing (1)
  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt:
- Around line 45-68: The clickable area is currently limited to the Icon because
onChecklistClick is applied only to Icon via Modifier.noRippleClickable; make
the entire checklist item clickable by moving the noRippleClickable modifier to
the container (e.g., apply Modifier.noRippleClickable(onClick =
onChecklistClick) on the Row or the outer Column/its modifier so the full padded
area responds to taps), remove the icon-only click, and ensure any existing
padding and alignment modifiers remain on the same container so layout doesn’t
change; keep contentDescription handling as before.
🧹 Nitpick comments (1)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt (1)

82-94: Preview가 잘 구현되었지만, 더 의미있는 텍스트 사용을 권장합니다.

인터랙티브 Preview가 잘 구성되어 있습니다. 다만 Line 91의 checklistContent = "dddd" 대신 실제 사용될 것과 유사한 텍스트(예: "물 1L 이상 마시기")를 사용하면 디자인 검토 시 더 유용합니다.

💡 Preview 텍스트 개선 제안
         ChallengeChecklist(
             isChecked = isChecked,
             onChecklistClick = { isChecked = !isChecked },
-            checklistContent = "dddd"
+            checklistContent = "물 1L 이상 마시기"
         )
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ad96acb and 559a317.

📒 Files selected for processing (3)
  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt
  • app/src/main/res/drawable/ic_checkbox_active.xml
  • app/src/main/res/drawable/ic_checkbox_inactive.xml
🧰 Additional context used
📓 Path-based instructions (1)
**/*.kt

⚙️ CodeRabbit configuration file

**/*.kt: - Jetpack Compose 구조, 상태 관리, recomposition 최적화에 집중

  • ViewModel, UiState, 단방향 데이터 흐름 패턴 검토
  • 불필요한 recomposition 가능성, remember/derivedStateOf 적절한 사용 확인
  • 네이밍 컨벤션, 가독성, Google 권장 Android 아키텍처 준수 여부

Files:

  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt
🧠 Learnings (1)
📓 Common learnings
Learnt from: nhyeonii
Repo: TEAM-Cherrish/Cherrish-Android PR: 14
File: app/src/main/java/com/cherrish/android/core/designsystem/component/chip/CherrishSelction.kt:1-1
Timestamp: 2026-01-09T08:25:52.533Z
Learning: Cherrish Android 프로젝트에서는 Jetpack Compose 컴포저블 파일명과 해당 파일의 메인 컴포저블 함수명이 일치해야 합니다 (예: CherrishBasicChip.kt 파일에는 CherrishBasicChip 컴포저블 함수).
🧬 Code graph analysis (1)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt (1)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
⏰ 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 (5)
app/src/main/res/drawable/ic_checkbox_active.xml (1)

1-15: LGTM! 체크박스 활성 상태 아이콘이 올바르게 정의되었습니다.

벡터 드로어블 구조가 적절하며, 활성 상태를 나타내는 핑크색 배경과 체크 마크가 잘 구현되었습니다.

app/src/main/res/drawable/ic_checkbox_inactive.xml (1)

1-11: LGTM! 체크박스 비활성 상태 아이콘이 올바르게 정의되었습니다.

벡터 드로어블 구조가 적절하며, 비활성 상태를 나타내는 외곽선만 있는 디자인이 잘 구현되었습니다.

app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt (3)

1-30: LGTM! 패키지 및 임포트 선언이 적절합니다.

필요한 Compose 관련 임포트와 프로젝트 커스텀 유틸리티가 올바르게 임포트되었습니다.


31-43: LGTM! 함수 시그니처와 조건부 값 처리가 적절합니다.

컴포저블 함수명이 파일명과 일치하며, 파라미터 구조가 명확합니다. isChecked 상태에 따른 아이콘, 색상, 텍스트 장식 처리가 올바르게 구현되었습니다.


72-77: LGTM! 텍스트 컴포넌트가 올바르게 구현되었습니다.

체크 상태에 따른 색상 변경과 취소선 적용이 적절하게 처리되었으며, 테마 사용도 올바릅니다.

Copy link
Copy Markdown
Contributor

@nhyeonii nhyeonii left a comment

Choose a reason for hiding this comment

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

LGTM ~ 🚀🚀 아쥬 깔끔띠 하네요

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt:
- Around line 36-43: ChallengeChecklistItem currently sets the Icon composable's
contentDescription to null, which breaks screen reader accessibility; update
ChallengeChecklistItem to accept a checklistIconDescription parameter (String)
and pass it into Icon's contentDescription, and ensure the parent
ChallengeChecklist supplies that description using its isChecked state (e.g.,
checklistIconDescription = if (isChecked) "선택됨" else "선택 안됨") so screen readers
announce the checkbox state.
🧹 Nitpick comments (1)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt (1)

54-66: 프리뷰에서 의미 있는 텍스트 사용 권장

프리뷰에서 "dddd" 대신 실제 사용 예시를 보여주는 텍스트를 사용하면 디자인 검토 시 더 유용합니다.

📝 개선 제안
     CherrishTheme {
         ChallengeChecklistItem(
             checklistIcon = R.drawable.ic_checkbox_inactive,
             onChecklistClick = {},
-            checklistContent = "dddd",
+            checklistContent = "아침 운동하기",
             contentColor = CherrishTheme.colors.gray800,
             contentDecoration = TextDecoration.None
         )
     }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 559a317 and 3b75c29.

📒 Files selected for processing (2)
  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt
  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt
🧰 Additional context used
📓 Path-based instructions (1)
**/*.kt

⚙️ CodeRabbit configuration file

**/*.kt: - Jetpack Compose 구조, 상태 관리, recomposition 최적화에 집중

  • ViewModel, UiState, 단방향 데이터 흐름 패턴 검토
  • 불필요한 recomposition 가능성, remember/derivedStateOf 적절한 사용 확인
  • 네이밍 컨벤션, 가독성, Google 권장 Android 아키텍처 준수 여부

Files:

  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt
  • app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt
🧠 Learnings (1)
📓 Common learnings
Learnt from: nhyeonii
Repo: TEAM-Cherrish/Cherrish-Android PR: 14
File: app/src/main/java/com/cherrish/android/core/designsystem/component/chip/CherrishSelction.kt:1-1
Timestamp: 2026-01-09T08:25:52.533Z
Learning: Cherrish Android 프로젝트에서는 Jetpack Compose 컴포저블 파일명과 해당 파일의 메인 컴포저블 함수명이 일치해야 합니다 (예: CherrishBasicChip.kt 파일에는 CherrishBasicChip 컴포저블 함수).
🧬 Code graph analysis (2)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt (1)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt (2)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt (1)
  • ChallengeChecklistItem (22-52)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
⏰ 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 (3)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt (1)

31-51: 클릭 가능한 영역 확대 검토 필요

현재 아이콘만 클릭 가능하도록 구현되어 있습니다. 일반적인 체크리스트 UX에서는 전체 행을 클릭할 수 있어 사용자 편의성이 더 좋습니다. 의도적인 설계인지 확인이 필요합니다.

🎯 전체 행을 클릭 가능하게 만드는 제안

만약 전체 행을 클릭 가능하게 하려면:

 Row(
-    modifier = modifier.fillMaxWidth(),
+    modifier = modifier
+        .fillMaxWidth()
+        .noRippleClickable(onClick = onChecklistClick),
     horizontalArrangement = Arrangement.spacedBy(6.dp),
     verticalAlignment = Alignment.CenterVertically
 ) {
     Icon(
         imageVector = ImageVector.vectorResource(id = checklistIcon),
         contentDescription = null,
-        modifier = Modifier.noRippleClickable(
-            onClick = onChecklistClick
-        ),
         tint = Color.Unspecified
     )
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.kt (2)

22-57: 컴포넌트 구조와 상태 관리가 잘 설계되었습니다

이 컴포넌트는 Compose 모범 사례를 잘 따르고 있습니다:

  • 상태를 외부에서 관리하는 stateless 설계로 재사용성이 높음
  • Lines 29-34의 파생 값들은 단순 조건문이므로 remember 없이도 성능상 문제 없음
  • Modifier 체이닝 순서가 올바름 (clip → border → background → padding)
  • ChallengeChecklistItem을 재사용하여 관심사 분리가 명확함

Based on learnings, 파일명(ChallengeChecklist.kt)과 메인 컴포저블 함수명(ChallengeChecklist)이 일치하여 프로젝트 컨벤션을 준수하고 있습니다.


59-71: 인터랙티브 프리뷰 구현이 우수합니다

remembermutableStateOf를 사용하여 디자인 타임에 상태 토글을 테스트할 수 있도록 구현한 점이 좋습니다. 이를 통해 체크/언체크 상태의 시각적 변화를 바로 확인할 수 있습니다.

Comment on lines +36 to +43
Icon(
imageVector = ImageVector.vectorResource(id = checklistIcon),
contentDescription = null,
modifier = Modifier.noRippleClickable(
onClick = onChecklistClick
),
tint = Color.Unspecified
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

접근성을 위해 아이콘에 contentDescription 추가 필요

아이콘의 contentDescriptionnull로 설정되어 있어 스크린 리더 사용자가 체크박스의 상태를 인식할 수 없습니다. 체크 여부에 따라 적절한 설명을 제공해야 합니다.

♿ 접근성 개선을 위한 제안

상위 컴포넌트(ChallengeChecklist)에서 isChecked 상태를 파라미터로 전달받아 적절한 contentDescription을 설정하세요:

 @Composable
 fun ChallengeChecklistItem(
     @DrawableRes checklistIcon: Int,
+    checklistIconDescription: String,
     onChecklistClick: () -> Unit,
     checklistContent: String,
     contentColor: Color,
     contentDecoration: TextDecoration,
     modifier: Modifier = Modifier
 ) {
     Row(
         modifier = modifier.fillMaxWidth(),
         horizontalArrangement = Arrangement.spacedBy(6.dp),
         verticalAlignment = Alignment.CenterVertically
     ) {
         Icon(
             imageVector = ImageVector.vectorResource(id = checklistIcon),
-            contentDescription = null,
+            contentDescription = checklistIconDescription,
             modifier = Modifier.noRippleClickable(
                 onClick = onChecklistClick
             ),
             tint = Color.Unspecified
         )

그리고 ChallengeChecklist.kt에서 다음과 같이 전달:

checklistIconDescription = if (isChecked) "선택됨" else "선택 안됨"

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
@app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklistItem.kt
around lines 36 - 43, ChallengeChecklistItem currently sets the Icon
composable's contentDescription to null, which breaks screen reader
accessibility; update ChallengeChecklistItem to accept a
checklistIconDescription parameter (String) and pass it into Icon's
contentDescription, and ensure the parent ChallengeChecklist supplies that
description using its isChecked state (e.g., checklistIconDescription = if
(isChecked) "선택됨" else "선택 안됨") so screen readers announce the checkbox state.

Copy link
Copy Markdown
Contributor

@usuuhyn usuuhyn left a comment

Choose a reason for hiding this comment

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

이것도 보고잇자니 제가 만들었던 밤티 체크리스트가 생각나네요..
이렇게 깔끔하게 만들 수 있는 거엿구나..?
짱 ! 수고하셨습니다 😻

@hyeminililo
Copy link
Copy Markdown
Contributor

너무 좋습니다 !! 우리 팀이라 너무 조타 ,,, 수고하셨습니당 !!!!!!

@sohee6989 sohee6989 merged commit 5fd2316 into develop Jan 11, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

FEAT✨ 새로운 기능 구현 소희🍒 소희 담당

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 체크리스트 컴포넌트 구현

4 participants