Skip to content

[FEAT/#50] 시술 플로우 컨텐트 UI 구현#62

Merged
usuuhyn merged 35 commits intodevelopfrom
feat/#50-procedure-flow-content
Jan 15, 2026
Merged

[FEAT/#50] 시술 플로우 컨텐트 UI 구현#62
usuuhyn merged 35 commits intodevelopfrom
feat/#50-procedure-flow-content

Conversation

@usuuhyn
Copy link
Copy Markdown
Contributor

@usuuhyn usuuhyn commented Jan 14, 2026

Related issue 🛠

Work Description ✏️

  • 시술 플로우에 필요한 컨텐트 UI를 구현했습니다.
  • 구현 과정에서 재사용 가능하거나 개선이 필요하다고 판단된 컴포넌트들을 함께 리팩토링했습니다.

Screenshot 📸

CategoryContent DowntimeContent ExistenceContent
FilteringContent FilteringWithSearchContent RecoveryScheduleContent

Uncompleted Tasks 😅

N/A

To Reviewers 📢

시술 플로우 컨텐트들을 구현햇으용 API 연결이 필요한 컨텐트들은 API 명세서 스펙에 맞춰 목데이터를 적용해두었습니다!!
수정할 부분들이 많을 것으로 예상됩니도.... 편하게 많이 코멘트 주세요!!

야르

Summary by CodeRabbit

  • 새로운 기능

    • 시술 검색·필터링 화면(검색 포함) 및 카드 리스트 대량 추가
    • 회복 일정 설정 UI(연/월/일 입력, 선택에 따른 노출) 추가
    • 시술 카테고리·존재 여부 선택 및 걱정 항목 리스트 컴포넌트 추가
    • UI용 데이터 모델(시술 항목·걱정 항목) 추가
  • 개선사항

    • 시술 카드 관련 파라미터 정리로 사용·가독성 개선
    • 주의 문구를 기본값으로 두고 커스터마이즈 가능하게 변경
    • 칩 텍스트 타이포그래피 적용 및 입력 필드 플레이스홀더 레이아웃 최적화

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

- 시술 여부 선택 뷰 컨텐트 구현
- 시술 카테고리 선택 뷰 컨텐트 구현
- 시술 플로우의 시술 필터링 뷰 컨텐트 구현
- 시술 플로우의 시술 다운타임 설정 뷰 컨텐트 구현
- 시술플로우 시술 필터링 + 검색 뷰 컨텐트 구현
@usuuhyn usuuhyn self-assigned this Jan 14, 2026
@usuuhyn usuuhyn requested a review from a team as a code owner January 14, 2026 19:41
@usuuhyn usuuhyn added the FEAT✨ 새로운 기능 구현 label Jan 14, 2026
@usuuhyn usuuhyn linked an issue Jan 14, 2026 that may be closed by this pull request
@usuuhyn usuuhyn added the 수현🍒 수현 담당 label Jan 14, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jan 14, 2026

Walkthrough

시술 플로우 관련 다수의 신규 컴포저블과 UI 모델을 추가하고, 디자인 시스템 컴포넌트의 텍스트 스타일 및 일부 컴포저블 시그니처(ProcedureCard, ProcedureTitleSection, CautionDescription)를 변경했습니다.

Changes

Cohort / File(s) 변경 사항
디자인 시스템 컴포넌트
app/src/main/java/com/cherrish/android/core/designsystem/component/chip/CherrishSelectionChip.kt, app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt
SelectionChip 내부 Text에 선택 상태 기반 텍스트 스타일 적용(body1SB14 / body1M14). TextField의 placeholder에 Modifier.fillMaxWidth() 추가 및 관련 import 추가.
컴포저블 시그니처 수정
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt, app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt, app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt
CautionDescriptiondescription: String 기본 파라미터 추가. ProcedureCard 공개 파라미터명 변경(예: titleprocedureName, descriptioncategory, minDowntimeDayminDowntimeDays). ProcedureTitleSection 시그니처명 변경 및 내부 구조(ProcedureTitleWithCaution) 분리/재배치.
시술 플로우 컨텐츠 (신규 컴포저블들)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt, .../DowntimeContent.kt, .../ExistenceContent.kt, .../FilteringContent.kt, .../FilteringWithSearchContent.kt, .../RecoveryScheduleContent.kt
카테고리 선택, 다운타임 목록, 존재 여부 선택, 필터링(검색 포함), 회복 일정 입력 등 여러 신규 공개 컴포저블 추가. 각 컴포넌트에 선택/클릭 핸들러, 프리뷰 및 모의 데이터 포함.
시술 UI 모델 (신규)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureCardItemUiModel.kt, app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureWorryUiModel.kt
ProcedureCardItemUiModelProcedureWorryUiModel 데이터 클래스 추가(아이디, 텍스트, 카테고리, 다운타임 범위, displayMode 등).

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant RecoveryScheduleContent
  participant SelectionSection
  participant ScheduleSettingSection
  participant DateInputBasicSection

  User->>RecoveryScheduleContent: 화면 진입
  RecoveryScheduleContent->>SelectionSection: 항목 렌더링 요청
  User->>SelectionSection: 항목 선택(onItemClick)
  SelectionSection-->>RecoveryScheduleContent: selectedIndex 전달
  RecoveryScheduleContent->>ScheduleSettingSection: selectedIndex 존재 시 표시
  ScheduleSettingSection->>DateInputBasicSection: 연/월/일 입력 필드 렌더링
  User->>DateInputBasicSection: 값 입력(onYear/Month/DayChange)
  DateInputBasicSection-->>RecoveryScheduleContent: 변경 콜백 전달
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • hyeminililo
  • sohee6989
  • nhyeonii
🚥 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 제목은 작업 내용을 명확하게 요약하고 있으며, 이슈 번호 #50 참고 및 구현 내용(시술 플로우 컨텐트 UI 구현)이 반영되어 있습니다.
Description check ✅ Passed PR 설명이 템플릿 구조를 따르고 있으며, 관련 이슈, 작업 내용, 스크린샷, 리뷰 요청사항이 모두 포함되어 있습니다.
Linked Issues check ✅ Passed PR의 모든 주요 변경사항이 이슈 #50의 목표와 일치합니다. 요구된 6개 컨텐트 UI(CategoryContent, DowntimeContent, ExistenceContent, FilteringContent, FilteringWithSearchContent, RecoveryScheduleContent) 모두 구현되었습니다.
Out of Scope Changes check ✅ Passed PR의 변경사항들(컴포넌트 리팩토링 포함)은 모두 시술 플로우 컨텐트 UI 구현 목표 범위 내에 있으며, 불필요한 범위 외 변경사항이 없습니다.

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

✨ Finishing touches
  • 📝 Generate docstrings

🧹 Recent nitpick comments
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt (3)

13-27: Compose API 모범 사례에 따라 modifier 파라미터 추가 권장

SelectionSectionmodifier 파라미터를 지원하므로, ExistenceContent에서도 modifier를 노출하면 호출부에서 패딩, 정렬 등 레이아웃 조정이 용이해집니다. Google의 Compose API 가이드라인에 따라 공용 컴포저블에는 modifier 파라미터를 포함하는 것이 권장됩니다.

♻️ 제안 수정안
+import androidx.compose.ui.Modifier
+
 `@Composable`
 fun ExistenceContent(
     selectedIndex: Int?,
-    onItemClick: (Int) -> Unit
+    onItemClick: (Int) -> Unit,
+    modifier: Modifier = Modifier
 ) {
     SelectionSection(
+        modifier = modifier,
         title = "시술 일정을 추가해볼게요.\n" +
             "이미 생각해둔 시술이 있나요?",
         ...
     )
 }

23-23: 정적 리스트를 상수로 추출하여 불필요한 객체 할당 방지

persistentListOf("선택한 시술이 있어요", "아직 선택 전이에요")가 컴포저블 내부에서 호출되면 매 recomposition마다 새 리스트 인스턴스가 생성됩니다. 고정된 데이터이므로 파일 레벨 또는 companion object 상수로 추출하면 메모리 할당을 줄일 수 있습니다.

♻️ 제안 수정안
+private val EXISTENCE_ITEMS = persistentListOf("선택한 시술이 있어요", "아직 선택 전이에요")
+
 `@Composable`
 fun ExistenceContent(
     selectedIndex: Int?,
     onItemClick: (Int) -> Unit
 ) {
     SelectionSection(
         title = "시술 일정을 추가해볼게요.\n" +
             "이미 생각해둔 시술이 있나요?",
         description = "시술을 선택하셨는지 확인할게요.",
         descriptionTextStyle = CherrishTheme.typography.body1R14,
-        items = persistentListOf("선택한 시술이 있어요", "아직 선택 전이에요"),
+        items = EXISTENCE_ITEMS,
         selectedIndex = selectedIndex,
         onItemClick = onItemClick
     )
 }

33-33: Preview 초기값으로 -1 대신 null 사용 권장

selectedIndexInt? 타입이고 "선택 없음" 상태를 나타내므로, preview에서도 null을 초기값으로 사용하는 것이 의미적으로 더 정확합니다. -1은 유효하지 않은 인덱스로 동작할 수 있지만, nullable 타입의 의도와 일치하지 않습니다.

♻️ 제안 수정안
-        var selectedIndex by remember { mutableIntStateOf(-1) }
+        var selectedIndex by remember { mutableStateOf<Int?>(null) }

mutableStateOf<Int?> import 필요:

import androidx.compose.runtime.mutableStateOf
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt (2)

30-31: selectedIndex 타입과 "선택 없음" 상태 표현 불일치

selectedIndexInt? 타입으로 선언되어 null이 "선택 없음"을 나타내야 하지만, Preview에서는 -1을 "선택 없음" 값으로 사용하고 있습니다. hasSelection 조건에서 >= 0 체크가 필요한 이유가 이 때문인데, 이는 API 설계의 일관성을 해칩니다.

두 가지 방안 중 하나를 선택하시는 것을 권장드립니다:

  1. Int? 타입 유지 → Preview에서 null을 초기값으로 사용
  2. Int 타입으로 변경 → -1을 "선택 없음"으로 명시적으로 문서화
♻️ 방안 1: null을 "선택 없음"으로 일관되게 사용
 `@Composable`
 fun RecoveryScheduleContent(
     selectedIndex: Int?,
     ...
 ) {
-    val hasSelection = selectedIndex != null && selectedIndex >= 0
+    val hasSelection = selectedIndex != null
     ...
 }

 `@Preview`(showBackground = true)
 `@Composable`
 private fun RecoveryScheduleContentPreview() {
     CherrishTheme {
-        var selectedIndex by remember { mutableIntStateOf(-1) }
+        var selectedIndex by remember { mutableStateOf<Int?>(null) }
         ...
         RecoveryScheduleContent(
-            selectedIndex = selectedIndex,
+            selectedIndex = selectedIndex,
             onItemClick = { selectedIndex = it },
             ...
         )
     }
 }

Also applies to: 41-41, 174-174


145-160: 날짜 입력에 숫자 키보드 타입 지정 필요

날짜 입력 필드(년/월/일)에서 keyboardType을 지정하지 않아 기본 텍스트 키보드가 표시됩니다. 숫자만 입력받아야 하므로 KeyboardType.Number를 지정하면 UX가 개선됩니다.

♻️ keyboardType 추가
+import androidx.compose.ui.text.input.KeyboardType
 ...
         CherrishTextField(
             value = date,
             placeholder = placeholder,
             onValueChange = onValueChange,
             roundedCornerShape = RoundedCornerShape(8.dp),
             placeholderTextStyle = CherrishTheme.typography.title2R16.copy(
                 textAlign = TextAlign.Center
             ),
             placeholderTextColor = CherrishTheme.colors.gray500,
             inputTextStyle = CherrishTheme.typography.title2M16.copy(
                 textAlign = TextAlign.Center
             ),
             inputTextColor = CherrishTheme.colors.gray800,
             paddingValues = PaddingValues(horizontal = 19.dp, vertical = 8.dp),
+            keyboardType = KeyboardType.Number,
             modifier = Modifier.weight(1f)
         )
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt (2)

12-13: 불필요한 명시적 import 제거 권장

indexOfFirstmap은 Kotlin 표준 라이브러리 extension function으로 명시적 import 없이 사용 가능합니다.

♻️ 제안된 수정
-import kotlin.collections.indexOfFirst
-import kotlin.collections.map

34-37: Recomposition 최적화를 위해 remember 사용 권장

itemsselectedIndex 계산이 매 recomposition마다 실행됩니다. worriesselectedWorryId가 변경될 때만 재계산하도록 remember로 감싸면 불필요한 연산을 줄일 수 있습니다.

♻️ 제안된 수정
 `@Composable`
 fun CategoryContent(
     worries: ImmutableList<ProcedureWorryUiModel>,
     selectedWorryId: Long?,
     onWorryClick: (Long) -> Unit
 ) {
-    val items = worries.map { it.content }.toImmutableList()
+    val items = remember(worries) {
+        worries.map { it.content }.toImmutableList()
+    }
 
-    val selectedIndex = worries.indexOfFirst { it.id == selectedWorryId }
-        .takeIf { it >= 0 }
+    val selectedIndex = remember(worries, selectedWorryId) {
+        worries.indexOfFirst { it.id == selectedWorryId }
+            .takeIf { it >= 0 }
+    }
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt (1)

93-123: LazyColumn 구조가 적절합니다.

단방향 데이터 흐름 패턴을 잘 따르고 있으며, key = { it.id } 사용으로 아이템 안정성을 확보했습니다. ImmutableList 파라미터로 불필요한 recomposition도 방지됩니다.

선택적으로, 서로 다른 아이템 타입(header, spacer, card)에 contentType을 지정하면 LazyColumn의 아이템 재사용 효율을 높일 수 있습니다:

♻️ contentType 추가 제안
 LazyColumn(
     modifier = modifier.fillMaxWidth()
 ) {
-    item {
+    item(contentType = "header") {
         ProcedureTitleSection(
             worryName = name
         )
     }

-    item {
+    item(contentType = "spacer") {
         Spacer(modifier = Modifier.height(18.dp))
     }

     items(
         items = cardItems,
-        key = { it.id }
+        key = { it.id },
+        contentType = { "card" }
     ) { item ->

📜 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 1255e66 and e8d6f9a.

📒 Files selected for processing (6)
  • app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.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/calendar/procedure/content/RecoveryScheduleContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt
🧠 Learnings (1)
📚 Learning: 2026-01-12T19:49:27.085Z
Learnt from: nhyeonii
Repo: TEAM-Cherrish/Cherrish-Android PR: 41
File: app/src/main/java/com/cherrish/android/presentation/challenge/ChallengeScreen.kt:30-39
Timestamp: 2026-01-12T19:49:27.085Z
Learning: When a Jetpack Compose screen composable receives a Scaffold paddingValues: PaddingValues parameter (commonly from Scaffold), apply it to the root container's modifier first (e.g., .padding(paddingValues)) before applying any additional padding. This ensures content respects system bars (status/navigation) and avoids layout overlap. This pattern should be followed across presentation screens under app/src/main/java/com/cherrish/android/presentation/ to maintain consistent insets handling.

Applied to files:

  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt
🧬 Code graph analysis (3)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt (2)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/SelectionSection.kt (1)
  • SelectionSection (26-53)
app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt (1)
  • CherrishTextField (31-92)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt (2)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/SelectionSection.kt (1)
  • SelectionSection (26-53)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt (2)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/SelectionSection.kt (1)
  • SelectionSection (26-53)
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 (6)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt (1)

170-190: 프리뷰 구현 LGTM

CherrishTheme으로 감싸고 상태 호이스팅 패턴에 맞게 프리뷰 내부에서 상태를 관리하는 구조가 적절합니다. selectedIndex 타입 불일치 건만 위 코멘트대로 수정해주시면 됩니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt (2)

18-26: LGTM!

Preview용 목 데이터로 적절히 구성되었으며, TODO 주석으로 삭제 예정임을 명확히 표시했습니다.


51-65: LGTM!

Preview가 CherrishTheme으로 적절히 감싸져 있고, 로컬 상태를 통해 선택/해제 토글 동작을 확인할 수 있도록 잘 구성되었습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt (3)

1-23: LGTM!

패키지 구조와 import가 적절합니다. ImmutableListpersistentListOf 사용으로 Compose의 안정성(stability)을 확보하여 불필요한 recomposition을 방지합니다.


25-83: Mock 데이터 삭제 예정 확인.

TODO 주석으로 삭제 예정임이 명시되어 있습니다. API 연동 시 해당 mock 데이터와 TODO 주석이 함께 제거되는지 확인해 주세요.


126-141: LGTM!

Preview 구조가 적절합니다. remembermutableStateOf를 사용한 로컬 상태 관리로 선택/해제 동작을 잘 시연하고 있습니다.

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


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: 3

🤖 Fix all issues with AI agents
In
`@app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt`:
- Around line 17-19: The functions ProcedureTitleSection and
ProcedureTitleWithCaution declare an unused id: Long parameter; remove id from
both function signatures and any internal references (none currently used) and
update all call sites to stop passing the id so the function signatures and
usages remain consistent; ensure imports/overloads are adjusted if needed and
run a build to catch remaining references.

In
`@app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringWithSearchContent.kt`:
- Around line 106-107: The LazyColumn is reusing the external parameter named
modifier (modifier.fillMaxWidth()) which duplicates parent Column's modifiers;
change the LazyColumn invocation to use a fresh Modifier (e.g.,
Modifier.fillMaxWidth()) instead of the passed-in modifier so external
padding/size constraints from the parent Column are not applied twice. Locate
the LazyColumn call in FilteringWithSearchContent.kt and replace modifier =
modifier.fillMaxWidth() with modifier = Modifier.fillMaxWidth() (or compose the
needed local modifiers using Modifier.then(...) without reusing the external
modifier).
- Around line 94-104: The component currently stores the search query in the
local var text but never uses it to filter the displayed cards and
onSearchAction is a no-op; either implement local filtering by deriving a
filtered list from the existing cardItems using the text state (e.g., compute
filteredCardItems = cardItems.filter { matches(query) } and render that instead
of cardItems), or propagate the query to the parent by calling a provided
callback from ProcedureTextField's onValueChange or onSearchAction so the parent
returns filtered data; update ProcedureTextField usage (onValueChange = { text =
it; onSearchActionCallback?.invoke(it) } or call onSearchAction with the current
text) and replace references to cardItems in the UI with the filtered
collection, and double-check the component's TODO comment to confirm whether
implementing search here is appropriate.
🧹 Nitpick comments (9)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt (3)

56-79: sectionTitle 연산을 remember로 최적화 고려

sectionTitleAnimatedVisibility 블록 내부에서 매번 recomposition마다 계산됩니다. selectedIndex가 변경될 때만 다시 계산되도록 remember를 사용하면 불필요한 연산을 줄일 수 있습니다.

♻️ 제안된 수정
         AnimatedVisibility(
             visible = hasSelection,
             enter = fadeIn() + expandVertically(),
             exit = fadeOut() + shrinkVertically()
         ) {
+            val sectionTitle = remember(selectedIndex) {
+                if (selectedIndex == 0) {
+                    "대략적인 회복 목표일을 정해볼까요?"
+                } else {
+                    "언제까지 회복이 완료되면 좋을까요?"
+                }
+            }
+
             Column(
                 modifier = Modifier.padding(top = 56.dp)
             ) {
-                val sectionTitle = if (selectedIndex == 0) {
-                    "대략적인 회복 목표일을 정해볼까요?"
-                } else {
-                    "언제까지 회복이 완료되면 좋을까요?"
-                }
-
                 ScheduleSettingSection(

154-169: 날짜 입력에 KeyboardType.Number 지정 권장

날짜 입력 필드에 keyboardType = KeyboardType.Number를 지정하면 사용자가 숫자 키패드로 바로 입력할 수 있어 UX가 개선됩니다.

♻️ 제안된 수정
+import androidx.compose.ui.text.input.KeyboardType
         CherrishTextField(
             value = date,
             placeholder = placeholder,
             onValueChange = onValueChange,
             roundedCornerShape = RoundedCornerShape(8.dp),
             placeholderTextStyle = CherrishTheme.typography.title2R16.copy(
                 textAlign = TextAlign.Center
             ),
             placeholderTextColor = CherrishTheme.colors.gray500,
             inputTextStyle = CherrishTheme.typography.title2M16.copy(
                 textAlign = TextAlign.Center
             ),
             inputTextColor = CherrishTheme.colors.gray800,
             paddingValues = PaddingValues(horizontal = 19.dp, vertical = 8.dp),
-            modifier = Modifier.weight(1f)
+            modifier = Modifier.weight(1f),
+            keyboardType = KeyboardType.Number
         )

149-150: fillMaxWidth() 중복 적용

modifier 파라미터로 이미 weight(1f)가 전달되므로 fillMaxWidth()는 중복입니다. 간결성을 위해 제거를 고려해주세요.

♻️ 제안된 수정
     Row(
-        modifier = modifier.fillMaxWidth(),
+        modifier = modifier,
         horizontalArrangement = Arrangement.spacedBy(4.dp),
         verticalAlignment = CenterVertically
     ) {
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt (1)

28-39: Preview 상태 타입을 파라미터 타입과 일치시키는 것을 권장합니다.

selectedIndex 파라미터가 Int?(nullable)로 선언되어 "선택 없음"을 null로 표현하도록 설계되어 있습니다. 그러나 Preview에서는 mutableIntStateOf(-1)을 사용하여 -1로 "선택 없음"을 표현하고 있어 의미적 불일치가 있습니다.

♻️ 타입 일관성을 위한 수정 제안
`@Preview`(showBackground = true)
`@Composable`
private fun ExistenceContentPreview() {
    CherrishTheme {
-        var selectedIndex by remember { mutableIntStateOf(-1) }
+        var selectedIndex by remember { mutableStateOf<Int?>(null) }

        ExistenceContent(
            selectedIndex = selectedIndex,
            onItemClick = { selectedIndex = it }
        )
    }
}

추가로 import 필요:

import androidx.compose.runtime.mutableStateOf
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt (1)

14-17: 하드코딩된 기본 텍스트를 문자열 리소스로 이동 권장

기본 description 값이 코드에 직접 하드코딩되어 있습니다. 다국어 지원(i18n)과 유지보수를 위해 strings.xml 리소스로 이동하는 것을 고려해 주세요.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.kt (1)

107-121: 아이템 간격 적용 방식 개선 제안

ProcedureCardmodifier = Modifier.padding(top = 10.dp)를 적용하는 대신, LazyColumnverticalArrangement를 사용하면 더 일관된 간격 관리가 가능합니다.

♻️ 리팩토링 제안
     LazyColumn(
         modifier = modifier.fillMaxWidth(),
-        contentPadding = PaddingValues(horizontal = 24.dp, vertical = 20.dp)
+        contentPadding = PaddingValues(horizontal = 24.dp, vertical = 20.dp),
+        verticalArrangement = Arrangement.spacedBy(10.dp)
     ) {
         // ...
         itemsIndexed(
             items = cardItems,
             key = { _, item -> item.id }
         ) { _, item ->
             ProcedureCard(
                 name = item.name,
                 category = item.category,
                 minDowntimeDays = item.minDowntimeDays,
                 maxDowntimeDays = item.maxDowntimeDays,
                 onCardClick = { onCardClick(item.id) },
                 isSelected = selectedCardId == item.id,
-                displayMode = item.displayMode,
-                modifier = Modifier.padding(top = 10.dp)
+                displayMode = item.displayMode
             )
         }

단, 헤더 아이템과 카드 아이템 사이의 간격을 다르게 유지하려면 현재 방식이 더 적합할 수 있습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt (1)

34-37: 불필요한 recomposition 시 리스트 재생성 가능성

itemsselectedIndex 계산이 매 recomposition마다 실행됩니다. worries 리스트가 작다면 큰 문제는 아니지만, rememberderivedStateOf를 사용하면 불필요한 재계산을 방지할 수 있습니다.

♻️ 최적화 제안
 `@Composable`
 fun CategoryContent(
     worries: ImmutableList<ProcedureWorryUiModel>,
     selectedWorryId: Long?,
     onWorryClick: (Long) -> Unit
 ) {
-    val items = worries.map { it.content }.toImmutableList()
-
-    val selectedIndex = worries.indexOfFirst { it.id == selectedWorryId }
-        .takeIf { it >= 0 }
+    val items = remember(worries) {
+        worries.map { it.content }.toImmutableList()
+    }
+
+    val selectedIndex = remember(worries, selectedWorryId) {
+        worries.indexOfFirst { it.id == selectedWorryId }.takeIf { it >= 0 }
+    }
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt (1)

130-134: 내부 함수 파라미터명 일관성

ProcedureCardDuration의 파라미터명(minDowntimeDay, maxDowntimeDay)이 public API(minDowntimeDays, maxDowntimeDays)와 다릅니다. 일관성을 위해 통일하는 것을 고려해 보세요.

♻️ 네이밍 일관성 제안
 `@Composable`
 private fun ProcedureCardDuration(
-    minDowntimeDay: Int,
-    maxDowntimeDay: Int
+    minDowntimeDays: Int,
+    maxDowntimeDays: Int
 ) {
     Row(
         verticalAlignment = Alignment.CenterVertically
     ) {
         Icon(
             imageVector = ImageVector.vectorResource(id = R.drawable.ic_clock),
             contentDescription = null,
             tint = CherrishTheme.colors.gray700
         )

         Text(
-            text = "다운타임* $minDowntimeDay-${maxDowntimeDay}일",
+            text = "다운타임* $minDowntimeDays-${maxDowntimeDays}일",
             style = CherrishTheme.typography.body2R13,
             color = CherrishTheme.colors.gray700
         )
     }
 }
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt (1)

87-87: ImmutableList 사용 권장

cardItems 파라미터가 List<ProcedureCardItemUiModel>로 선언되어 있습니다. CategoryContent에서는 ImmutableList를 사용하고 있으므로, 일관성과 Compose 안정성을 위해 ImmutableList로 변경하는 것을 권장합니다.

♻️ ImmutableList 사용 제안
+import kotlinx.collections.immutable.ImmutableList
+
 `@Composable`
 fun FilteringContent(
     id: Long,
     name: String,
-    cardItems: List<ProcedureCardItemUiModel>,
+    cardItems: ImmutableList<ProcedureCardItemUiModel>,
     selectedCardId: Long?,
     onCardClick: (Long) -> Unit,
     modifier: Modifier = Modifier
 )

mock 데이터도 persistentListOf로 변경:

+import kotlinx.collections.immutable.persistentListOf
+
-private val mockProcedureCardItems = listOf(
+private val mockProcedureCardItems = persistentListOf(
📜 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 c50d82b and cf97848.

📒 Files selected for processing (13)
  • app/src/main/java/com/cherrish/android/core/designsystem/component/chip/CherrishSelectionChip.kt
  • app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringWithSearchContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureCardItemUiModel.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureWorryUiModel.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/calendar/procedure/content/CategoryContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureWorryUiModel.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureCardItemUiModel.kt
  • app/src/main/java/com/cherrish/android/core/designsystem/component/chip/CherrishSelectionChip.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringWithSearchContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt
  • app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt
🧠 Learnings (3)
📚 Learning: 2026-01-12T19:49:27.085Z
Learnt from: nhyeonii
Repo: TEAM-Cherrish/Cherrish-Android PR: 41
File: app/src/main/java/com/cherrish/android/presentation/challenge/ChallengeScreen.kt:30-39
Timestamp: 2026-01-12T19:49:27.085Z
Learning: When a Jetpack Compose screen composable receives a Scaffold paddingValues: PaddingValues parameter (commonly from Scaffold), apply it to the root container's modifier first (e.g., .padding(paddingValues)) before applying any additional padding. This ensures content respects system bars (status/navigation) and avoids layout overlap. This pattern should be followed across presentation screens under app/src/main/java/com/cherrish/android/presentation/ to maintain consistent insets handling.

Applied to files:

  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureWorryUiModel.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureCardItemUiModel.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringWithSearchContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt
  • app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt
📚 Learning: 2026-01-09T08:25:52.533Z
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: Enforce that the Kotlin file name under the design system chip package matches the main Jetpack Compose function name defined in that file. For example, CherrishBasicChip.kt should declare a top-level composable function named CherrishBasicChip. If the file name and main composable name do not align, flag for refactor. This improves consistency and discovery across the Android codebase (TEAM-Cherrish/Cherrish-Android).

Applied to files:

  • app/src/main/java/com/cherrish/android/core/designsystem/component/chip/CherrishSelectionChip.kt
📚 Learning: 2026-01-12T19:49:27.085Z
Learnt from: nhyeonii
Repo: TEAM-Cherrish/Cherrish-Android PR: 41
File: app/src/main/java/com/cherrish/android/presentation/challenge/ChallengeScreen.kt:30-39
Timestamp: 2026-01-12T19:49:27.085Z
Learning: In the Cherrish-Android codebase, Screen composables that receive a `paddingValues: PaddingValues` parameter from Scaffold must apply it to their root container's modifier (e.g., `.padding(paddingValues)`) before applying additional padding, to avoid layout overlap with system bars.

Applied to files:

  • app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt
🧬 Code graph analysis (6)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt (2)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/SelectionSection.kt (1)
  • SelectionSection (26-53)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringWithSearchContent.kt (4)
app/src/main/java/com/cherrish/android/presentation/calendar/component/ProcedureSearchTextField.kt (1)
  • ProcedureTextField (30-85)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt (1)
  • CautionDescription (13-35)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt (1)
  • ProcedureCard (37-86)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.kt (3)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt (1)
  • ProcedureCard (37-86)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt (1)
  • CautionDescription (13-35)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt (1)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/CautionDescription.kt (1)
  • CautionDescription (13-35)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt (3)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/SelectionSection.kt (1)
  • SelectionSection (26-53)
app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt (1)
  • CherrishTextField (30-89)
app/src/main/java/com/cherrish/android/core/designsystem/theme/Theme.kt (1)
  • CherrishTheme (38-61)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt (3)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt (1)
  • ProcedureTitleSection (16-39)
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt (1)
  • ProcedureCard (37-86)
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 (16)
app/src/main/java/com/cherrish/android/core/designsystem/component/chip/CherrishSelectionChip.kt (2)

18-43: LGTM!

타이포그래피 스타일을 CherrishTheme.typography.body1SB14로 변경하여 디자인 시스템의 테마 일관성을 유지하고 있습니다. PR 전반의 테마 정리 방향과 잘 맞습니다. 파일명(CherrishSelectionChip.kt)과 메인 컴포저블 함수명(CherrishSelectionChip)이 일치하여 네이밍 컨벤션도 준수하고 있습니다. (Based on learnings)


45-59: LGTM!

프리뷰 함수에서 remembermutableStateOf를 적절히 사용하여 상태 관리가 잘 되어 있고, CherrishTheme으로 감싸 테마 적용도 올바르게 되어 있습니다.

app/src/main/java/com/cherrish/android/core/designsystem/component/textfield/CherrishTextField.kt (2)

72-86: placeholder의 fillMaxWidth() 추가는 적절합니다.

placeholder Text에 Modifier.fillMaxWidth()를 추가하여 TextField가 특정 너비를 가질 때 placeholder가 전체 너비를 차지하도록 개선한 점이 좋습니다.

다만, 일관성을 위해 innerTextField()도 동일한 너비 동작을 보장하도록 고려해볼 수 있습니다. 현재 구현에서는 실제 입력 텍스트와 placeholder의 레이아웃 동작이 미세하게 다를 수 있습니다. 만약 입력 중에도 동일한 너비 동작이 필요하다면, decorationBox 내부 Box에 fillMaxWidth()를 적용하는 방식도 검토해 보세요.


47-49: remember를 활용한 recomposition 최적화가 적절합니다.

inputTextStyleinputTextColor를 key로 사용하여 불필요한 TextStyle 객체 생성을 방지하고 있습니다. Compose 최적화 모범 사례를 잘 따르고 있습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/RecoveryScheduleContent.kt (2)

84-139: LGTM!

ScheduleSettingSection은 관심사 분리가 잘 되어있고, state hoisting 패턴을 올바르게 적용했습니다. CherrishTheme 스타일링도 일관되게 사용되었습니다.


179-223: LGTM!

두 가지 시나리오(선택 전/후)를 커버하는 프리뷰 함수들이 잘 구성되어 있습니다. CherrishTheme으로 감싸고 interactive state를 사용한 점이 좋습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/ExistenceContent.kt (2)

1-11: 패키지 및 import 구성이 적절합니다.

persistentListOf를 위한 kotlinx.collections.immutable 사용은 Compose에서 불필요한 recomposition을 방지하는 좋은 패턴입니다.


13-26: 컴포넌트 구현이 깔끔합니다.

SelectionSection을 재사용하여 간결하게 구현했고, persistentListOf를 사용하여 안정적인 리스트를 전달하는 것이 좋습니다. 단방향 데이터 흐름 패턴도 잘 적용되어 있습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureWorryUiModel.kt (1)

1-6: LGTM!

간결하고 적절한 UI 모델 정의입니다. CategoryContent에서 worry 항목을 렌더링하는 데 필요한 속성들이 잘 정의되어 있습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/model/ProcedureCardItemUiModel.kt (1)

1-10: LGTM!

ProcedureCard 컴포저블에 필요한 속성들이 잘 정의된 UI 모델입니다. 여러 content 컴포넌트에서 재사용되는 공통 모델로 적합합니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringWithSearchContent.kt (1)

119-133: LGTM!

itemsIndexedkey 함수를 사용하여 안정적인 아이템 식별을 제공하고 있습니다. 이는 리스트 아이템의 recomposition 최적화에 도움이 됩니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/DowntimeContent.kt (1)

85-132: LGTM!

DowntimeContent의 전체 구조가 잘 구성되어 있습니다:

  • 안내 텍스트 헤더
  • itemsIndexedkey 함수를 사용한 최적화된 리스트 렌더링
  • 맥락에 맞는 커스텀 CautionDescription
app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/CategoryContent.kt (1)

28-50: LGTM!

CategoryContent의 전체 구조가 깔끔합니다. ImmutableList 사용과 단방향 데이터 흐름 패턴(onWorryClick 콜백)이 적절하게 적용되어 있습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureTitleSection.kt (1)

41-61: LGTM!

ProcedureTitleWithCaution 추출이 잘 되어 있고, CautionDescription 컴포넌트 재사용이 적절합니다. 레이아웃 구조와 스타일링이 일관성 있게 적용되어 있습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/component/ProcedureCard.kt (1)

38-46: LGTM!

파라미터명 변경(name, category, minDowntimeDays, maxDowntimeDays)이 서버 응답 스펙 및 ProcedureCardItemUiModel과 일관성 있게 적용되었습니다.

app/src/main/java/com/cherrish/android/presentation/calendar/procedure/content/FilteringContent.kt (1)

92-123: LGTM!

LazyColumn 구조가 적절합니다. itemsIndexedkey를 제공하여 아이템 안정성을 보장하고 있으며, 헤더 콘텐츠를 item {} 블록으로 분리한 것도 좋습니다.

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

Copy link
Copy Markdown
Contributor

@hyeminililo hyeminililo left a comment

Choose a reason for hiding this comment

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

수고하셨습니다 궁금 한 것 답변 부탁드릴게용ㅇ ~~ !!


itemsIndexed(
items = cardItems,
key = { _, item -> item.id }
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: index를 사용하지 않는데, 적은 이유가 있을까요 ? ☺️

items(
    items = cardItems,
    key = { it.id }
) 

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.

앗 !! 원래 index 기반으로 구현했다가 API 명세서 기준으로 id 기반 목데이터 적용하면서 index를 더 이상 사용하지 않게 되엇네용 !! 수정하겠습니당 ~~

ProcedureTextField(
value = text,
onValueChange = { text = it },
onSearchAction = {},
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.

P4: 이것은 따로 빼지 않은 이유가 있을까요 ?? 궁금합니다 !!

Copy link
Copy Markdown
Contributor Author

@usuuhyn usuuhyn Jan 14, 2026

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

Choose a reason for hiding this comment

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

스크린샷 2026-01-15 오후 5 32 00 왜 수정안해줬지 베이비?ㅋ

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.

햄찌


itemsIndexed(
items = cardItems,
key = { _, item -> item.id }
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: 이것도 index 사용하지 않으니 it을 사용해보는건 어떨까용 ??

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

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

폰트 틀렸습니다

) {
Text(
text = text,
style = CherrishTheme.typography.body1SB14,
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: 폰트 틀렸습니다...................................................................................................................................

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

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

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

수고하셨습니다!!

color = placeholderTextColor,
style = placeholderTextStyle
style = placeholderTextStyle,
modifier = Modifier.fillMaxWidth()
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.

이거 없애면 텍스트 필드 placeholder 가운데 정렬이 안먹더라구용.. 그대로 두겟습니다!

placeholderTextStyle = CherrishTheme.typography.title2R16.copy(
                textAlign = TextAlign.Center
            ),

ProcedureCardTitle(
title = title,
description = description,
title = name,
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: 개인적인 건의 사항..ㅎㅎㅎ
name 대신에 procedureName 어떠신가요??

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.

좋ㅏ요잉

)

ProcedureTitleWithCaution(
content = content
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.

p1999: 저는 잘 모르겠는데..ㅜㅜ 저의 이해력의 문제니 거의 공부를 더 해오도록 하겠스빈다!

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.

worryName으로 바꿔드렷습니다 베이비

item {
Text(
text = "필요에 맞게 다운타임을 조정할 수 있어요.",
style = CherrishTheme.typography.title1SB18
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: 이건 왜 컬러가 없습니까~?

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 DowntimeContent(
cardItems: List<ProcedureCardItemUiModel>,
Copy link
Copy Markdown
Contributor

@sohee6989 sohee6989 Jan 15, 2026

Choose a reason for hiding this comment

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

p2: ImmutableList??
스크린샷 2026-01-15 오후 5 33 00

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.

contentPadding = PaddingValues(horizontal = 24.dp, vertical = 20.dp)
) {
item {
Text(
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.

이미 확인하고 구현햇습니다!! 소히 베이비

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.

츠짱이 수현이임?

import com.cherrish.android.presentation.calendar.procedure.model.ProcedureCardDisplayMode
import com.cherrish.android.presentation.calendar.procedure.model.ProcedureCardItemUiModel

/* TODO: 삭제 예정 */
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.

스크린샷 2026-01-15 오후 5 17 19 p10000: (츠짱 say) 베이비 언제 지우나?

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.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


AnimatedVisibility(
visible = hasSelection,
enter = fadeIn() + expandVertically(),
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.

생각해보니 그냥 단순한게 좋을 것 같아서 애니 대신에 조건부 렌더링으로 수정햇슴둥.

ProcedureTextField(
value = text,
onValueChange = { text = it },
onSearchAction = {},
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.

스크린샷 2026-01-15 오후 5 32 00 왜 수정안해줬지 베이비?ㅋ

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.

와웅 넘 잘하는데 ?!?!! 리뷰 몇개만 확인하고 수정 부악드려용이 ~~~~ 고생해써 ~~~~~

Comment on lines +46 to +47
val clickedId = worries[index].id
onWorryClick(clickedId)
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.

Suggested change
val clickedId = worries[index].id
onWorryClick(clickedId)
onWorryClick(worries[index].id)

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.

넹~~!!!!! 조아요잉


@Composable
fun DowntimeContent(
cardItems: List<ProcedureCardItemUiModel>,
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.

Suggested change
cardItems: List<ProcedureCardItemUiModel>,
cardItems: ImmutableList<ProcedureCardItemUiModel>,

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.

넵 !!! 확인확인 ~!

Text(
text = "필요에 맞게 다운타임을 조정할 수 있어요.",
style = CherrishTheme.typography.title1SB18
)
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 : 여기 컬러 지정해줘야 할 거 가트융 ~~

Copy link
Copy Markdown
Contributor Author

@usuuhyn usuuhyn Jan 15, 2026

Choose a reason for hiding this comment

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

헉스 ! !! !
수정하겟습니다!

onItemClick: (Int) -> Unit
) {
SelectionSection(
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.

image

P1 : 요기 텍스트 더 필요할거 가타여 ~~

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 FilteringContent(
name: String,
cardItems: List<ProcedureCardItemUiModel>,
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.

Suggested change
cardItems: List<ProcedureCardItemUiModel>,
cardItems: ImmutableList<ProcedureCardItemUiModel>,

P1 : 여기도 !!

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.

넵 !!!

) {
ProcedureTextField(
value = text,
onValueChange = { text = it },
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 : 요 onValueChanege두 상태 호이스팅 해쥬세용 ~~~~

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.

넵 !!

ProcedureTextField(
value = text,
onValueChange = { text = it },
onSearchAction = {},
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 : 얘도 !! 상태호이스팅 ~~

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 DateInputBasicRow(
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.

Suggested change
private fun DateInputBasicRow(
private fun DateInputBasicSection

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,10 @@
package com.cherrish.android.presentation.calendar.procedure.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 어노테이션 붙여줍시닿ㅎ @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.

넹!!! ! ! ! 확인화긴 👍

@@ -0,0 +1,6 @@
package com.cherrish.android.presentation.calendar.procedure.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.

넹!!! ! ! ! 확인화긴 👍

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 ~~ 🚀🚀🚀🚀🚀🚀🚀 고생해떠잉 이제 진짜 마지막 화면 조립만 하면 대겟다 !~~~

@usuuhyn usuuhyn merged commit 6055ae1 into develop Jan 15, 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] 시술 플로우 컨텐트 UI 구현

4 participants