Conversation
개요새로운 체크리스트 UI 컴포넌트 ChallengeChecklist를 구현했습니다. 선택 상태를 표시하는 두 개의 벡터 드로어블과 상호작용을 처리하는 Kotlin Composable 함수를 추가했습니다. 변경 사항
예상 코드 리뷰 난이도🎯 2 (단순) | ⏱️ ~10분 🚥 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
📜 Recent review detailsConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ 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)
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. Comment |
There was a problem hiding this comment.
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
📒 Files selected for processing (3)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.ktapp/src/main/res/drawable/ic_checkbox_active.xmlapp/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! 텍스트 컴포넌트가 올바르게 구현되었습니다.체크 상태에 따른 색상 변경과 취소선 적용이 적절하게 처리되었으며, 테마 사용도 올바릅니다.
There was a problem hiding this comment.
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
📒 Files selected for processing (2)
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeChecklist.ktapp/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.ktapp/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: 인터랙티브 프리뷰 구현이 우수합니다
remember와mutableStateOf를 사용하여 디자인 타임에 상태 토글을 테스트할 수 있도록 구현한 점이 좋습니다. 이를 통해 체크/언체크 상태의 시각적 변화를 바로 확인할 수 있습니다.
| Icon( | ||
| imageVector = ImageVector.vectorResource(id = checklistIcon), | ||
| contentDescription = null, | ||
| modifier = Modifier.noRippleClickable( | ||
| onClick = onChecklistClick | ||
| ), | ||
| tint = Color.Unspecified | ||
| ) |
There was a problem hiding this comment.
접근성을 위해 아이콘에 contentDescription 추가 필요
아이콘의 contentDescription이 null로 설정되어 있어 스크린 리더 사용자가 체크박스의 상태를 인식할 수 없습니다. 체크 여부에 따라 적절한 설명을 제공해야 합니다.
♿ 접근성 개선을 위한 제안
상위 컴포넌트(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.
|
너무 좋습니다 !! 우리 팀이라 너무 조타 ,,, 수고하셨습니당 !!!!!! |
Related issue 🛠
Work Description ✏️
Screenshot 📸
Uncompleted Tasks 😅
To Reviewers 📢
Summary by CodeRabbit
새로운 기능
✏️ Tip: You can customize this high-level summary in your review settings.