Skip to content

[FEAT/#35] 루틴 챌린지 및 Todo 미션 컴포넌트 구현 #72

Merged
hyeminililo merged 21 commits intodevelopfrom
feat/#35-challenge-onboarding-component
Jan 18, 2026
Merged

[FEAT/#35] 루틴 챌린지 및 Todo 미션 컴포넌트 구현 #72
hyeminililo merged 21 commits intodevelopfrom
feat/#35-challenge-onboarding-component

Conversation

@hyeminililo
Copy link
Copy Markdown
Contributor

@hyeminililo hyeminililo commented Jan 16, 2026

Related issue 🛠

Work Description ✏️

  • 루틴 챌린지 온보딩 바디 부분 구현
  • 루틴 Todo 챌린지 온보딩 바디 부분 구현
  • ktLint 실행

Screenshot 📸

루틴 챌린지 온보딩 바디

Screen_recording_20260116_180228.mp4

Todo 챌린지 미션

Screen_recording_20260116_204241.mp4

Uncompleted Tasks 😅

  • N/A

To Reviewers 📢

중간에 브랜치를 바꿔서 다시 적용을 해서 커밋명 순서가 조금 다를 수 있습니다 빠른 피드백 환영입니다유 ~~~☺️

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 루틴 선택 온보딩 화면 추가 — 2열 칩 그리드로 항목 선택 가능
    • 미션 선택 온보딩 화면 추가 — 목록형 칩으로 항목 선택/토글 지원
    • 선택 상태 관리를 위한 UI 상태 및 데이터 모델 추가 (루틴·미션 모델 및 UI 상태)
  • Style

    • 미션 카드 칩의 가로 간격 소폭(6→8dp) 조정으로 레이아웃 정렬 개선

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

@hyeminililo hyeminililo requested a review from a team as a code owner January 16, 2026 11:49
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jan 16, 2026

Walkthrough

루틴·미션 선택용 불변 모델과 UI 상태를 추가하고, 두 개의 신규 Composable(ChallengeRoutineOnboardingBody, ChallengeMissionOnboardingBody)을 도입했습니다. 기존 ChallengeMissionCardChip의 Row 간격이 6.dp→8.dp로 조정되고 Preview 변수명이 selectedisSelected로 변경되었습니다.

Changes

Cohort / File(s) Summary
데이터 모델
app/src/main/java/com/cherrish/android/presentation/challenge/mission/model/ChallengeMissionModel.kt, app/src/main/java/com/cherrish/android/presentation/challenge/routine/model/ChallengeRoutineModel.kt
신규 불변 데이터 클래스 추가: ChallengeMissionModel(id: Int, missionContent: String, isSelected: Boolean)ChallengeRoutineModel(id: Long, routine: String, isSelected: Boolean) (@Immutable)
UI 상태
app/src/main/java/com/cherrish/android/presentation/challenge/mission/ChallengeMissionUiState.kt, app/src/main/java/com/cherrish/android/presentation/challenge/routine/ChallengeRoutineUiState.kt
신규 UI 상태 추가: ChallengeMissionUiState(missions: ImmutableList<...>)ChallengeRoutineUiState(routine: String, isSelected: Boolean) (FakeRoutine 포함)
온보딩 컴포넌트
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeRoutineOnboardingBody.kt, app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeMissionOnboardingBody.kt
신규 Composable 추가: 루틴은 2열 LazyVerticalGrid로 표시되는 선택형 칩 목록, 미션은 LazyColumn의 선택형 항목 목록. 각각 onItemClick 콜백 및 Preview 포함
기존 UI 컴포넌트 변경
app/src/main/java/com/cherrish/android/presentation/challenge/component/ChallengeMissionCardChip.kt
Row horizontalArrangement 6.dp → 8.dp, Preview 변수명 selectedisSelected 및 onClick 연결 업데이트

Sequence Diagram(s)

sequenceDiagram
    participant User as User
    participant RoutineBody as ChallengeRoutineOnboardingBody
    participant MissionBody as ChallengeMissionOnboardingBody
    participant Callback as onItemClick
    participant State as UIState

    User->>RoutineBody: 루틴 칩 클릭
    RoutineBody->>Callback: onItemClick(itemId)
    Callback->>State: 선택 상태 업데이트
    State->>RoutineBody: recomposition (updated items)
    RoutineBody->>User: 렌더링 갱신

    User->>MissionBody: 미션 항목 클릭
    MissionBody->>Callback: onItemClick(itemId)
    Callback->>State: 선택 상태 업데이트
    State->>MissionBody: recomposition (updated items)
    MissionBody->>User: 렌더링 갱신
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • sohee6989
  • nhyeonii
  • usuuhyn
🚥 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 제목이 주요 변경사항을 명확하게 요약하고 있습니다. 루틴 챌린지와 Todo 미션 컴포넌트 구현이라는 핵심 내용을 담고 있습니다.
Description check ✅ Passed PR 설명이 템플릿 구조를 따르고 있으며, 관련 이슈, 작업 내용, 스크린샷, 완료 상태가 모두 포함되어 있습니다.
Linked Issues check ✅ Passed 이슈 #35의 요구사항 중 TODO 미션 선택 컴포넌트와 챌린지 바디 부분 컴포넌트가 구현되었으며, 루틴 챌린지 선택 컴포넌트는 미완료 상태입니다.
Out of Scope Changes check ✅ Passed 모든 코드 변경사항이 이슈 #35의 요구사항 범위 내에 있으며, 새로운 UI 컴포넌트와 데이터 모델이 일관되게 추가되었습니다.

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

✨ Finishing touches
  • 📝 Generate docstrings

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.

@hyeminililo hyeminililo self-assigned this Jan 16, 2026
@hyeminililo hyeminililo added FEAT✨ 새로운 기능 구현 혜민🍒 혜민 담당 labels Jan 16, 2026
Copy link
Copy Markdown
Contributor

@sohee6989 sohee6989 left a comment

Choose a reason for hiding this comment

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

수고하셨습니다!!


@Composable
fun ChallengeMissionOnboardingBody(
items: List<ChallengeMissionUiState>,
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: immutablelist?!

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.

추가로 여기에 바로 uiState를 넘겨주기보다는 스크린 상위에서 한번만 uiState를 넘겨주는 방향이 더 맞을 것 같아요 이 컴포넌트 필요한 값만 내려주는 형태가 사용하지 않는 uiState의 정보들을 가지고 있을 필요가 없기 때문에 더 적합할 것 같습니다 !

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.

넵 두 리뷰 다 수정해서 리팩토링 진행하겠습니다 !

verticalArrangement = Arrangement.spacedBy(space = 8.dp),
modifier = Modifier.fillMaxWidth()
) {
itemsIndexed(items = items) { index, item ->
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: key값 활용하는거 어떠세요?!

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
fun ChallengeRoutineOnboardingBody(
items: List<ChallengeRoutineUiState>,
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: immutablelist?!

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.

여기도 uiState 전체 보다는 필요한 정보들만 받을 수 잇도록 수정해주세요 ~~

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.

넵 !~~~!!

@@ -0,0 +1,6 @@
package com.cherrish.android.presentation.challenge.routine.model

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:immutable?!

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.

아니 점점 줄임말로 말해주시네요 감사합니다아 ~ 😙

@Immutable
data class ChallengeRoutineUiState(
val routine: String = "",

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: 공백 없애주자용~!!

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.

아아 넵넵 ! !

@@ -0,0 +1,6 @@
package com.cherrish.android.presentation.challenge.mission.model

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: Immutable?!

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.

Aha ! 넵 ~~~!!

)

data class ChallengeMissionScreenUiState(
val missions: List<ChallengeMissionUiState>
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: immutableList?!

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.

수정했습니다아 ~

val isSelected: Boolean = false
)

data class ChallengeMissionScreenUiState(
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: immutable?!

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.cherrish.android.presentation.challenge.mission.model.ChallengeMissionModel

data class ChallengeMissionUiState(
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: immutable?!

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

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

수고하셨습ㄴㅣ다 ~~ 리뷰 확인 후 반영 부탁드릴게요!


@Composable
fun ChallengeMissionOnboardingBody(
items: List<ChallengeMissionUiState>,
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.

추가로 여기에 바로 uiState를 넘겨주기보다는 스크린 상위에서 한번만 uiState를 넘겨주는 방향이 더 맞을 것 같아요 이 컴포넌트 필요한 값만 내려주는 형태가 사용하지 않는 uiState의 정보들을 가지고 있을 필요가 없기 때문에 더 적합할 것 같습니다 !


@Composable
fun ChallengeRoutineOnboardingBody(
items: List<ChallengeRoutineUiState>,
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.

여기도 uiState 전체 보다는 필요한 정보들만 받을 수 잇도록 수정해주세요 ~~

verticalArrangement = Arrangement.spacedBy(space = 12.dp),
modifier = Modifier.fillMaxWidth()
) {
itemsIndexed(items) { index, item ->
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 : 여기도 key 값 지정해주셍용 ~~

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.cherrish.android.presentation.challenge.mission.model.ChallengeMissionModel

data class ChallengeMissionUiState(
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 : UiState는 화면 당 하나만 나타나도록 수정해주세요! 화면 상태가 여러 UiState로 분산되면 흐름을 파악하기 어렵고 상태 동기화 비용이 커질 수 있어요!

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.

넵 하나의 State로 묶을게요!!

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.

고생햇슈 ~~

@hyeminililo hyeminililo merged commit e6dfa54 into develop Jan 18, 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] 챌린지 뷰 컴포넌트 구현

3 participants