Skip to content

Conversation

@ProtossManse
Copy link
Collaborator

@ProtossManse ProtossManse commented Oct 3, 2025

🔗 관련 이슈

📙 작업 설명

  • 로그인/회원가입 플로우 화면 UI 반영이 완료되었습니다.

📸 스크린샷 또는 시연 영상 (선택)

기능 미리보기 기능 미리보기 기능 미리보기
케어콜 설정 화면 image 어르신 등록하기 화면 image 건강정보 등록 화면 image

참고사항

Summary by CodeRabbit

  • 신기능

    • AddTextField에 입력 시 활성화되는 “등록” 버튼 UI로 변경 및 미입력시 비활성화 동작 추가
    • ElderInputForm 통합 폼 도입(모델 기반 입력 및 미리보기 추가)
  • UI/UX 개선

    • 콜 시간 설정 화면 전면 개편: 할인 배지·취소선 가격·혜택 리스트·선택형 시간대(LazyRow) 등 UI 보강, 혜택 문구 변경(매일 3회)
    • 성별 토글 기본값 및 선택 로직 단순화로 사용성 향상
    • 비활성 CTA 버튼 및 일부 시간/박스 배경색 대비 조정

@ProtossManse ProtossManse self-assigned this Oct 3, 2025
@coderabbitai
Copy link

coderabbitai bot commented Oct 3, 2025

Walkthrough

온보딩과 콜타임 관련 UI 컴포넌트들을 리팩터링 및 스타일 조정. ElderInputForm을 단일 ElderData 모델+콜백 기반으로 재구성하고, 여러 입력/토글의 시각·상호작용 로직과 CallTimeScreen의 가격·시간대 UI를 개편했습니다.

Changes

Cohort / File(s) Summary
입력 컴포넌트
app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt, app/src/main/java/com/konkuk/medicarecall/ui/common/component/CTAButton.kt, app/src/main/java/com/konkuk/medicarecall/ui/common/component/GenderToggleButton.kt
AddTextField: trailingIcon을 IconButton→Box("등록")로 교체, 입력 없을 땐 비활성화 색상 적용 및 클릭 무시, Preview 추가. CTAButton: DISABLED 색상 g200→gray2로 변경. GenderToggleButton: 파라미터 null 가능성 제거(isMale: Boolean = true) 및 콜백 타입 non-null로 변경, 내부 로직 단순화.
시간 설정 UI
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/TimeSettingItem.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt
TimeSettingItem: timeText null 시 배경을 항상 g50으로 통일 및 경미한 포맷 정리. CallTimeScreen: 가격/혜택 영역 재구성(할인 배지, 원가/무료 표기 등), LazyRow 기반 시간대 선택 UI 개선, Divider→HorizontalDivider 교체, 안내문·타이포·간격 조정 및 여러 import/스타일 정리.
시니어 온보딩 폼
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderInputForm.kt
ElderInputForm을 인덱스/뷰모델 기반에서 단일 ElderData 모델과 필드별 콜백(onNameChanged 등)으로 전면 재작성. AnimatedVisibility 제거, 생년월일·전화번호 시각 변환 적용, 성별·관계·동거형 드롭다운 연동, Preview 추가 및 API 변경(새 파라미터들, nameFocusRequester 추가).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor 사용자 as U
  participant Form as ElderInputForm
  participant 화면 as Screen/Caller
  participant Model as ElderData

  U->>Form: 이름/생년월일/성별/번호 입력
  Form->>화면: onNameChanged/onBirthDateChanged/... 콜백 호출
  화면->>Model: ElderData 갱신
  Model-->>Form: 상태 변경(리컴포즈)
  note right of Form: 단일 ElderData 기반 단방향 데이터 흐름
Loading
sequenceDiagram
  autonumber
  actor 사용자 as U
  participant Screen as CallTimeScreen
  participant VM as CallTimeViewModel
  participant Backend as API

  U->>Screen: 시간대 선택 / 결제 요청
  Screen->>VM: setCallTime / requestPurchase
  VM->>Backend: API 호출
  alt 성공
    Backend-->>VM: 200 OK
    VM-->>Screen: 성공 상태
    Screen-->>U: UI 갱신 (예: 결제 화면 이동)
  else 실패
    Backend-->>VM: Error
    VM-->>Screen: 에러 상태
    Screen-->>U: Toast 로 에러 안내
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

feature

Suggested reviewers

  • librawish808
  • ikseong00
  • alswlekk

Poem

새 폼은 한 덩이 데이터로 흐르고,
회색은 쉬고 등록 버튼은 빛나네.
토글은 단순히 참/거짓으로 춤추고,
시간대는 줄지어 선택을 기다리네.
온보딩 길에 작은 토스트가 웃음을 건네 ✨

Pre-merge checks and finishing touches

❌ Failed checks (3 warnings)
Check name Status Explanation Resolution
Linked Issues Check ⚠️ Warning PR에서는 어르신 등록 화면(ElderInputForm)과 결제/케어콜 설정 화면(CallTimeScreen) UI가 수정되었으나, 건강정보 등록 화면 관련 변경이 누락되어 링크된 이슈(#129)의 체크리스트 세 가지 항목 중 하나가 구현되지 않았습니다. 건강정보 등록 화면 컴포넌트를 추가하거나 해당 스크린의 UI를 반영하여 이슈 #129의 모든 체크리스트 항목을 완전히 구현해야 합니다.
Out of Scope Changes Check ⚠️ Warning 온보딩 UI에 직접 관련 없는 공통 컴포넌트(AddTextField, CTAButton)의 글로벌 스타일 및 API 변경이 포함되어 있어 원래 이슈의 범위를 벗어나고 잠재적 부작용을 초래할 수 있습니다. 온보딩 전용 화면 변경과 공통 컴포넌트 수정을 분리하여, 공통 컴포넌트 관련 변경은 별도의 PR로 관리하는 방안을 권장합니다.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed 제목 “[Feat] 온보딩 UI 수정사항 반영 #129”은 온보딩 화면 전반의 UI 변경을 간결하게 요약하여 PR의 주요 의도를 명확히 전달하고 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/onboarding-ui-#129

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 599b3ea and ae7c8c5.

📒 Files selected for processing (1)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt (18 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt (3)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/CTAButton.kt (1)
  • CTAButton (22-78)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/info/component/LoginBackButton.kt (1)
  • LoginBackButton (17-37)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/CallTimeBenefit.kt (1)
  • CallTimeBenefit (19-39)
⏰ 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). (1)
  • GitHub Check: ci-build
🔇 Additional comments (5)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt (5)

150-151: 타이포그래피 변경 확인

M_17에서 B_26으로 변경되어 텍스트 크기와 굵기가 상당히 달라졌어요. Figma 디자인 스펙과 일치하는지 확인해주세요.


171-206: 가격 섹션 UI 개선 확인

"특별 할인" 배지와 가격 표시 UI가 전면 개편되었네요. 시각적으로 깔끔해 보이고, 구조도 잘 잡혀있어요. Figma 디자인과 실제 렌더링이 잘 맞는지 확인만 해주시면 될 것 같습니다.


219-219: 케어콜 제공 횟수 변경 확인 필요

"매일 2회"에서 "매일 3회"로 변경되었는데, 이게 실제 비즈니스 요구사항 변경을 반영한 건가요? 프리미엄 플랜의 혜택이 실제로 3회로 업그레이드되었는지 확인이 필요해 보여요.


239-264: 어르신 선택 탭 스타일링 개선

LazyRow로 구현된 어르신 선택 UI의 스타일링이 깔끔하게 정리되었어요. 선택/비선택 상태의 시각적 구분도 명확하고, 애니메이션 스크롤 처리도 잘 되어있네요.


317-348: 안내사항 섹션 스타일 업데이트

배경색과 패딩 조정, 그리고 타이포그래피 변경(M_17 → B_17)으로 안내사항 섹션이 더 명확하게 강조되었어요. 시각적 계층 구조가 개선된 것 같습니다.


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

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/screen/MyDetailScreen.kt (1)

113-113: 불필요한 null 체크 제거 권장

isMale이 이제 non-null Boolean이므로 Line 113의 isMale != null 조건은 항상 참이며 의미가 없습니다.

다음과 같이 조건을 단순화하세요:

 type = if (name.matches(Regex("^[가-힣a-zA-Z]*$"))
     && birth.length == 8
     && birth.isValidDate()
-    && isMale != null
 ) CTAButtonType.GREEN else CTAButtonType.DISABLED,
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/screen/LoginElderMedInfoScreen.kt (1)

92-189: 수평/수직 스크롤 상태 혼선 수정 필요

Line 92에서 칩 Row용으로 다시 선언된 scrollState가 상위 Column의 수직 스크롤 상태를 가려 버려서, Line 182 DefaultDropdown에 전달되는 값이 수평 스크롤 상태로 바뀝니다. DefaultDropdown 내부에서는 부모를 아래로 끌어내리기 위해 animateScrollTo를 사용하는데, 수평 상태가 넘어가면 칩 Row가 좌우로 튀고 정작 화면 하단 컨텐츠는 보이지 않아 UX가 무너집니다. 칩 Row 전용 상태를 별도 이름으로 분리해 부모 Column의 수직 상태를 그대로 전달해주세요.

-                val scrollState = rememberScrollState()
+                val elderChipScrollState = rememberScrollState()
                 // 상단 어르신 선택 Row
-                Row(Modifier.horizontalScroll(scrollState)) {
+                Row(Modifier.horizontalScroll(elderChipScrollState)) {
                     elderUiState.eldersList.forEachIndexed { index, elder ->
                         ...
                 }
                 ...
-                DefaultDropdown(
-                    HealthIssueType.entries.map { it.displayName }.toList(),
-                    "특이사항 선택하기",
-                    null,
-                    scrollState,
-                    {
-                        loginElderViewModel.addHealthNote(it)
-                    },
-                )
+                DefaultDropdown(
+                    HealthIssueType.entries.map { it.displayName }.toList(),
+                    "특이사항 선택하기",
+                    null,
+                    scrollState,
+                    {
+                        loginElderViewModel.addHealthNote(it)
+                    },
+                )
🧹 Nitpick comments (7)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (4)

196-208: "무료 체험" 기간 명시를 고려해 보세요.

현재 "무료 체험" 텍스트만 표시되고 있는데, 사용자 입장에서는 체험 기간이 얼마나 되는지 궁금할 수 있습니다. "30일 무료 체험"처럼 구체적인 기간을 함께 표시하면 더 명확한 정보 전달이 가능합니다.

예시:

 Text(
-    text = "무료 체험",
+    text = "30일 무료 체험",
     color = MediCareCallTheme.colors.black,
     style = MediCareCallTheme.typography.B_17,
 )

198-198: 가격 정보 중앙화를 고려해 보세요.

가격 "₩29,000/월"이 하드코딩되어 있어서 향후 가격 변경 시 여러 곳을 수정해야 할 수 있습니다. Constants 객체나 ViewModel에서 관리하면 유지보수가 더 용이해집니다.

예시:

// Constants.kt 또는 ViewModel에서
object PricingConstants {
    const val PREMIUM_MONTHLY_PRICE = "₩29,000/월"
}

341-345: 안내문 표현을 더 긍정적으로 다듬어 보세요.

"AI 특성상 인식 오류가 있을 수 있습니다"는 기술적으로 정확하지만 사용자에게 불안감을 줄 수 있습니다. "AI가 더 정확하게 이해할 수 있도록 천천히 또또박또박 말씀해 주세요" 같은 표현으로 개선하면 더 친근하고 긍정적인 느낌을 줄 수 있습니다.

예시:

 Text(
-    text = "AI 특성상 인식 오류가 있을 수 있습니다",
+    text = "AI가 정확히 이해할 수 있도록 또박또박 말씀해 주세요",
     style = MediCareCallTheme.typography.R_15,
     color = MediCareCallTheme.colors.gray8,
 )

368-372: 에러 메시지를 더 구체적으로 개선할 수 있습니다.

현재 Toast 메시지가 일반적인 "콜 시간 설정에 실패했습니다. 다시 시도해주세요."로 표시됩니다. 가능하다면 에러 타입에 따라 "네트워크 연결을 확인해 주세요" 또는 "시간 설정 형식을 확인해 주세요" 같은 구체적인 안내를 제공하면 사용자 경험이 향상될 수 있습니다.

예시:

onError = { t ->
    Log.e("SetCallScreen", "콜 시간 설정 실패: $t")
    val message = when {
        t.message?.contains("network", ignoreCase = true) == true -> 
            "네트워크 연결을 확인해 주세요."
        else -> "콜 시간 설정에 실패했습니다. 다시 시도해주세요."
    }
    Toast.makeText(navController.context, message, Toast.LENGTH_SHORT).show()
}
app/src/main/java/com/konkuk/medicarecall/ui/common/component/MedicationItem.kt (1)

143-150: 약 추가 로직 검토 권장

Line 143의 조건문에서 selectedList.isNotEmpty()를 확인하는데, 사용자가 시간대를 선택하지 않고 약 이름만 입력한 경우 아무 동작도 하지 않습니다. 이 경우 사용자에게 피드백(예: 토스트 메시지 또는 시각적 표시)을 제공하는 것이 좋습니다.

다음과 같이 사용자 피드백을 추가하는 것을 고려해보세요:

clickPlus = {
    when {
        inputText.isBlank() -> {
            // 피드백: "약 이름을 입력해주세요"
        }
        selectedList.isEmpty() -> {
            // 피드백: "복약 시간을 선택해주세요"
        }
        else -> {
            selectedList.forEach { time ->
                onAddMedication(time, inputText)
            }
            onTextChange("")
        }
    }
}
app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/screen/ElderDetailScreen.kt (1)

222-222: 중복 비교 단순화 고려

isMale이 이제 non-null Boolean이므로 Line 222의 isMale == true 비교는 단순히 isMale로 작성할 수 있습니다:

-gender = if (isMale == true) GenderType.MALE else GenderType.FEMALE,
+gender = if (isMale) GenderType.MALE else GenderType.FEMALE,
app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/screen/MyDetailScreen.kt (1)

117-117: 중복 비교 단순화 고려

isMale이 non-null Boolean이므로 isMale == true 비교를 단순히 isMale로 작성할 수 있습니다.

-val gender = if (isMale == true) GenderType.MALE else GenderType.FEMALE
+val gender = if (isMale) GenderType.MALE else GenderType.FEMALE
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 28817aa and 8ba3f7f.

📒 Files selected for processing (28)
  • app/src/main/java/com/konkuk/medicarecall/MainActivity.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/data/api/ElderRegisterService.kt (2 hunks)
  • app/src/main/java/com/konkuk/medicarecall/data/dto/request/ElderBulkHealthInfoRequestDto.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/data/dto/request/ElderBulkRegisterRequestDto.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/data/dto/response/ElderBulkRegisterResponseDto.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/data/repository/ElderRegisterRepository.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderRegisterRepositoryImpl.kt (2 hunks)
  • app/src/main/java/com/konkuk/medicarecall/navigation/NavGraph.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt (4 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/common/component/CTAButton.kt (2 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/common/component/DiseaseNamesItem.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/common/component/GenderToggleButton.kt (2 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/common/component/MedicationItem.kt (5 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/TimeSettingItem.kt (3 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (16 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/info/viewmodel/LoginViewModel.kt (6 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/LoginElderViewModel.kt (0 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderChip.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderInputForm.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/screen/LoginElderInfoScreen.kt (6 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/screen/LoginElderMedInfoScreen.kt (3 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/viewmodel/LoginElderHealthUiState.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/viewmodel/LoginElderUiState.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/viewmodel/LoginElderViewModel.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/screen/ElderDetailScreen.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/screen/MyDetailScreen.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/model/ElderData.kt (1 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/model/ElderHealthData.kt (1 hunks)
💤 Files with no reviewable changes (1)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/LoginElderViewModel.kt
🧰 Additional context used
🧬 Code graph analysis (7)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderChip.kt (1)
app/src/main/java/com/konkuk/medicarecall/ui/theme/Theme.kt (1)
  • MediCareCallTheme (38-60)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/MedicationItem.kt (1)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt (1)
  • AddTextField (27-81)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/DiseaseNamesItem.kt (2)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/ChipItem.kt (1)
  • ChipItem (22-52)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt (1)
  • AddTextField (27-81)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/screen/LoginElderMedInfoScreen.kt (3)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/info/component/LoginBackButton.kt (1)
  • LoginBackButton (17-37)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/DiseaseNamesItem.kt (1)
  • DiseaseNamesItem (17-69)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/MedicationItem.kt (1)
  • MedicationItem (60-155)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (3)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/CTAButton.kt (1)
  • CTAButton (22-78)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/info/component/LoginBackButton.kt (1)
  • LoginBackButton (17-37)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/BenefitItem.kt (1)
  • BenefitItem (19-39)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/screen/LoginElderInfoScreen.kt (4)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/info/component/LoginBackButton.kt (1)
  • LoginBackButton (17-37)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderChip.kt (1)
  • ElderChip (24-77)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderInputForm.kt (1)
  • ElderInputForm (27-120)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/DefaultSnackBar.kt (1)
  • DefaultSnackBar (17-37)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderInputForm.kt (3)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/DefaultTextField.kt (1)
  • DefaultTextField (18-64)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/GenderToggleButton.kt (1)
  • GenderToggleButton (22-88)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/DefaultDropDown.kt (1)
  • DefaultDropdown (41-175)
⏰ 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). (1)
  • GitHub Check: ci-build
🔇 Additional comments (13)
app/src/main/java/com/konkuk/medicarecall/navigation/NavGraph.kt (1)

43-43: 이전 LoginElderViewModel 참조 완전 제거 확인

전체 .kt 파일에서 구 패키지 참조가 발견되지 않았으며, 새 viewmodel 경로로 일관되게 적용되었습니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/TimeSettingItem.kt (1)

31-31: LGTM - 코드 스타일 개선

trailing comma 추가 및 named argument 사용으로 Kotlin 컨벤션에 맞게 개선되었습니다. git diff도 더 깔끔해지고 가독성도 좋아졌네요 👍

Also applies to: 34-34, 40-40, 53-53, 58-58, 61-61, 72-72, 78-78

app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (3)

169-225: 프리미엄 플랜 UI 개편이 잘 되었습니다!

"특별 할인" 배지 → "프리미엄" 타이틀 → 취소선 가격 + "무료 체험"으로 이어지는 시각적 계층 구조가 명확하고, "매일 3회" 혜택 강조도 효과적입니다. 사용자 입장에서 할인과 혜택을 한눈에 파악하기 좋은 레이아웃입니다.


151-155: 타이포그래피 업데이트가 일관되게 적용되었습니다.

B_26 스타일을 헤더에 적용하고, 전체적으로 시각적 계층 구조를 명확히 한 점이 좋습니다. 디자인 시스템을 일관되게 준수하고 있어 유지보수에도 도움이 될 것 같습니다.


41-41: TextDecoration.LineThrough 임포트가 적절하게 추가되었습니다.

Line 201에서 기존 가격에 취소선을 적용하기 위해 필요한 임포트이며, 할인 프로모션을 시각적으로 강조하는 데 효과적으로 사용되고 있습니다.

app/src/main/java/com/konkuk/medicarecall/ui/common/component/CTAButton.kt (1)

35-35: 색상 매핑 업데이트 확인 완료!

DISABLED 버튼의 배경색과 클릭 색상이 g200에서 MediCareCallTheme.colors.gray2로 변경되었네요. 테마 시스템 통합의 일환으로 보이며, 시각적 일관성을 유지하면서 중앙 집중식 색상 팔레트를 사용하도록 개선되었습니다.

Also applies to: 47-47

app/src/main/java/com/konkuk/medicarecall/ui/model/ElderData.kt (1)

6-6: 기본 성별 값 검토 권장

gender 속성에 true (남성) 기본값이 추가되었습니다. 이는 no-arg 생성 경로를 지원하지만, 성별을 기본적으로 남성으로 설정하는 것이 UX 및 포용성 관점에서 적절한지 검토가 필요합니다.

대안으로 고려해볼 수 있는 옵션:

  • 명시적으로 성별을 요구하도록 기본값 제거
  • 별도의 "미지정" 상태를 나타내는 nullable 타입 유지

현재 구현이 제품 요구사항 및 사용자 경험 목표와 일치하는지 확인해주세요.

app/src/main/java/com/konkuk/medicarecall/ui/model/ElderHealthData.kt (1)

6-9: 건강 데이터 모델 개선 확인!

모든 생성자 파라미터에 기본값이 추가되어 no-arg 생성 경로가 가능해졌습니다. 이는 벌크 등록 플로우에서 점진적 데이터 입력을 지원하고 API 사용성을 개선합니다.

app/src/main/java/com/konkuk/medicarecall/data/dto/request/ElderBulkHealthInfoRequestDto.kt (1)

1-30: 벌크 건강정보 DTO 구조 확인 완료!

새로운 벌크 건강정보 요청 DTO가 잘 구성되어 있습니다:

  • 적절한 중첩 구조 (ElderBulkHealthInfoRequestDto > HealthInfo > MedicationSchedule)
  • 올바른 직렬화 애노테이션 사용
  • 명확한 필드 타입과 네이밍

서비스 계층 및 레포지토리 구현과 함께 일관된 벌크 API 패턴을 제공합니다.

app/src/main/java/com/konkuk/medicarecall/ui/common/component/MedicationItem.kt (1)

62-69: 상태 관리 패턴 개선 확인!

컴포넌트가 mutable 로컬 상태에서 불변 props + 콜백 패턴으로 전환되었습니다:

  • medicationSchedule: MutableMapMap
  • 새로운 콜백 API: onTextChange, onSelectTime, onAddMedication, onRemoveChip

이는 제어 컴포넌트(controlled component) 패턴으로의 전환이며, 다음과 같은 이점을 제공합니다:

  • 관심사의 분리 개선
  • 테스트 용이성 향상
  • 상태 흐름의 예측 가능성 증가
app/src/main/java/com/konkuk/medicarecall/MainActivity.kt (1)

43-43: ViewModel 패키지 재구성 확인!

LoginElderViewModel 임포트 경로가 새로운 viewmodel 서브패키지로 업데이트되었습니다. 코드 구조 개선을 위한 합리적인 리팩토링입니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/screen/ElderDetailScreen.kt (1)

65-65: 성별 상태 타입 업데이트 확인!

isMale 상태가 Boolean?에서 Boolean으로 변경되어 nullable 처리가 제거되었습니다. 이는 GenderToggleButton API 변경 및 ElderData.gender 기본값 추가와 일관됩니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/screen/MyDetailScreen.kt (1)

47-47: 성별 상태 타입 업데이트 확인!

isMale 상태가 non-nullable Boolean으로 변경되었습니다. 전체 앱의 성별 처리 패턴 통합의 일환입니다.

Comment on lines 90 to 103
healthInfos = elderHealthList.map { elderHealthData ->
ElderBulkHealthInfoRequestDto.HealthInfo(
elderId = elderHealthData.id!!,
diseaseNames = elderHealthData.diseaseNames,
medicationSchedules = ElderHealthMapper.toRequestSchedules(elderHealthData.medicationMap).map { schedule ->
ElderBulkHealthInfoRequestDto.HealthInfo.MedicationSchedule(
medicationName = schedule.medicationName,
scheduleTimes = schedule.scheduleTimes.map { it.name },
)
},
notes = elderHealthData.notes.map { note ->
HealthIssueType.entries.find { it.displayName == note }!!.name
},
)
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

ID null 강제 언래핑으로 인한 크래시 위험

elderHealthData.id!!를 그대로 강제 언래핑하고 있어서, 기본 UI 상태(LoginElderHealthUiState)처럼 신규 등록 직전까지 id가 null인 항목이 섞여 있으면 즉시 NullPointerException이 발생해 플로우 전체가 깨집니다. 호출부에서 미리 보장하더라도 저장소 층에서 한 번 더 방어 로직을 넣어두는 편이 안전합니다. 아래처럼 requireNotNull로 명시적으로 검증하고 의미 있는 예외를 던지는 방향을 제안드립니다.

-                    ElderBulkHealthInfoRequestDto.HealthInfo(
-                        elderId = elderHealthData.id!!,
+                    val elderId = requireNotNull(elderHealthData.id) {
+                        "Bulk 건강정보 등록에 사용할 어르신 ID가 없습니다."
+                    }
+                    ElderBulkHealthInfoRequestDto.HealthInfo(
+                        elderId = elderId,
                         diseaseNames = elderHealthData.diseaseNames,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
healthInfos = elderHealthList.map { elderHealthData ->
ElderBulkHealthInfoRequestDto.HealthInfo(
elderId = elderHealthData.id!!,
diseaseNames = elderHealthData.diseaseNames,
medicationSchedules = ElderHealthMapper.toRequestSchedules(elderHealthData.medicationMap).map { schedule ->
ElderBulkHealthInfoRequestDto.HealthInfo.MedicationSchedule(
medicationName = schedule.medicationName,
scheduleTimes = schedule.scheduleTimes.map { it.name },
)
},
notes = elderHealthData.notes.map { note ->
HealthIssueType.entries.find { it.displayName == note }!!.name
},
)
healthInfos = elderHealthList.map { elderHealthData ->
val elderId = requireNotNull(elderHealthData.id) {
"Bulk 건강정보 등록에 사용할 어르신 ID가 없습니다."
}
ElderBulkHealthInfoRequestDto.HealthInfo(
elderId = elderId,
diseaseNames = elderHealthData.diseaseNames,
medicationSchedules = ElderHealthMapper.toRequestSchedules(elderHealthData.medicationMap).map { schedule ->
ElderBulkHealthInfoRequestDto.HealthInfo.MedicationSchedule(
medicationName = schedule.medicationName,
scheduleTimes = schedule.scheduleTimes.map { it.name },
)
},
notes = elderHealthData.notes.map { note ->
HealthIssueType.entries.find { it.displayName == note }!!.name
},
)
}
🤖 Prompt for AI Agents
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderRegisterRepositoryImpl.kt
lines 90-103: the code force-unwraps elderHealthData.id with !! which can throw
NPE if an item lacks an id (e.g., new UI entries); replace the blind unwrap with
a defensive check—either use requireNotNull(elderHealthData.id) { "Elder health
data id is null for entry: ${elderHealthData}" } to throw a clear exception, or
filter/mask out entries with null ids before mapping (e.g.,
elderHealthList.filter { it.id != null } ) so the repository layer does not
crash the flow. Ensure the chosen approach preserves meaningful error messaging
and consistent upstream behavior.

@Composable
fun TimeSettingItem(
category: String,
timeType: TimeSettingType,
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

사용되지 않는 파라미터 확인 필요

timeType 파라미터가 함수 본문에서 참조되지 않고 있습니다. 이전에는 timeText가 null일 때 배경색 로직에 사용되었던 것으로 보이는데, 현재는 항상 g50을 사용하도록 단순화되었습니다.

의도적인 변경이라면 파라미터를 제거하는 것을 고려해보세요. 향후 사용 예정이라면 그대로 두셔도 됩니다.

다음 스크립트로 timeType 파라미터의 다른 사용처를 확인할 수 있습니다:


🏁 Script executed:

#!/bin/bash
# TimeSettingItem 호출부에서 timeType이 어떻게 전달되는지 확인
rg -n -A 2 -B 2 'TimeSettingItem\s*\(' --type kotlin

Length of output: 3246


timeType 파라미터 제거 제안
TimeSettingItem 함수(app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/TimeSettingItem.kt:27)에 선언된 timeType이 본문에서 참조되지 않습니다. 호출부(SetCallScreen.kt) 인자 전달도 불필요하니 시그니처와 호출부에서 함께 제거하세요.

🤖 Prompt for AI Agents
In
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/TimeSettingItem.kt
around line 29, the timeType parameter is declared but never used; remove
timeType from the TimeSettingItem function signature and delete any associated
parameter handling or imports in this file, then update all call sites (notably
SetCallScreen.kt) to stop passing that argument; ensure compilation by removing
the parameter from any composable invocations and run a build to catch remaining
references.

Comment on lines 35 to 45
.border(
(1.2).dp,
if (selected) MediCareCallTheme.colors.main
else MediCareCallTheme.colors.gray3,
shape = RoundedCornerShape(100.dp),
)
.clickable(
indication = null,
interactionSource = null,
onClick = onClick,
),
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

interactionSource = null은 빌드 오류입니다.

Compose Modifier.clickable 오버로드는 interactionSource에 non-null MutableInteractionSource를 요구합니다. 여기서 null을 넘기면 컴파일조차 되지 않아요. 무효화하려고 하셨다면 remember { MutableInteractionSource() }를 전달하고 indication = null만 사용해 주세요. Icon 쪽 clickable도 동일하게 수정이 필요합니다.

Also applies to: 61-74

🤖 Prompt for AI Agents
In
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/senior/component/ElderChip.kt
around lines 35-45 (and also apply same change for the Icon clickable at lines
~61-74): the Modifier.clickable currently passes interactionSource = null which
causes a compile error because clickable requires a non-null
MutableInteractionSource; replace the null with a remembered instance (e.g.
remember { MutableInteractionSource() }) and keep indication = null so that no
visual ripple shows; apply the same replacement for the Icon's clickable call as
well.

Copy link
Collaborator

@librawish808 librawish808 left a comment

Choose a reason for hiding this comment

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

어르신 추가하기 버튼 색상 변경해야 될것같습니다
프리뷰가 없는 UI와 컴포넌트 프리뷰를 만들어주심 좋을것같습니다!

}
Spacer(Modifier.height(10.dp))
Text(
text = "프리미엄",
Copy link
Collaborator

Choose a reason for hiding this comment

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

프리미엄 글자 밑에 HorizontalDivider 추가적용이 안되어있습니다

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

반영했습니다

Comment on lines 316 to 328
.padding(horizontal = 20.dp)
.padding(top = 20.dp, bottom = 12.dp)
.padding(top = 20.dp, bottom = 20.dp),
Copy link
Collaborator

@librawish808 librawish808 Oct 4, 2025

Choose a reason for hiding this comment

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

Suggested change
.padding(horizontal = 20.dp)
.padding(top = 20.dp, bottom = 12.dp)
.padding(top = 20.dp, bottom = 20.dp),
.padding(all = 20.dp),

합쳐주시면 좋을것 같아요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

반영했습니다

shape = RoundedCornerShape(14.dp)
shape = RoundedCornerShape(14.dp),
)
.padding(vertical = 18.dp),
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
.padding(vertical = 18.dp),
.padding(vertical = 12.dp),

수정해주셔야 할것같습니다!

),
) {
Row(
Modifier.padding(horizontal = 12.dp, vertical = 10.dp),
Copy link
Collaborator

Choose a reason for hiding this comment

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

피그마를 봤을때 왼쪽 패딩이 16.dp로 되어있는데 12.dp로 패딩주고 내부 Row에서 또 4.dp를 주는 것 보다
상하좌우 값을 통일하는게 어떨지 의견드립니다
디자이너분께 패딩값 수정 요청드려야될것같아요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

그럼 이 부분은 일단 디자인이 저렇게 돼있어서 유지하는걸로 하겠습니다 !

Copy link
Collaborator

Choose a reason for hiding this comment

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

넵 좋습니다!

else MediCareCallTheme.colors.gray3,
style = MediCareCallTheme.typography.R_14,
modifier = Modifier
.defaultMinSize(minWidth = 38.dp)
Copy link
Collaborator

@librawish808 librawish808 Oct 4, 2025

Choose a reason for hiding this comment

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

피그마 코멘트에서는 최소너비가 35인데 38로 하신 이유가 있을까요? 그리고 피그마에서는 37로 되어있네요....?!

MediCareCallTheme.colors.white
else MediCareCallTheme.colors.gray5,
modifier = Modifier.padding(vertical = 8.dp, horizontal = 24.dp)
modifier = Modifier.padding(vertical = 8.dp, horizontal = 24.dp),
Copy link
Collaborator

Choose a reason for hiding this comment

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

vertical = 6.dp로 수정부탁드려요!

style = MediCareCallTheme.typography.R_15
style = MediCareCallTheme.typography.R_15,
)
Spacer(Modifier.height(10.dp))
Copy link
Collaborator

Choose a reason for hiding this comment

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

20.dp로 복약정보 그 밑 복약 시간 텍스트 간격 수정부탁드립니다

@ProtossManse
Copy link
Collaborator Author

ProtossManse commented Oct 4, 2025

@librawish808 패딩 관련해서 리뷰 많이 남겨주셨는데, 패딩 값이 피그마와 다르게 되어있는 이유가 제가 어제 디스코드에 올렸던 Text 높이가 다른 문제 때문에 피그마에 있는 패딩 값 그대로 넣으면 실제 눈으로 볼 때는 의도된 디자인과 다르게 나오더라구요.

그래서 figma의 텍스트 박스 내부에 있는 여백 값을 직접 계산해서 넣었는데, 생각해보니 임의로 그렇게 할 게 아니라
이 부분 어떻게 하면 좋을 지 한번 의논해야 할 것 같습니다.

@librawish808
Copy link
Collaborator

개인적으로는 패딩값을 피그마에 맞춰서 수정하고
LineHeightStyle은 별도의 이슈로 등록하면 좋을 것 같은데 어떠실까요?
해당 부분은 월요일에 같이 논의해서 결정하면 좋을 것 같습니다

Copy link

@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

♻️ Duplicate comments (2)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (2)

213-218: 과거 리뷰 의견이 반영되었습니다!

이전 리뷰에서 요청된 HorizontalDivider가 프리미엄 섹션 아래에 잘 추가되었습니다.


328-328: 패딩 통합이 잘 반영되었습니다!

이전 리뷰에서 제안된 .padding(all = 20.dp) 형태로 깔끔하게 통합되었네요.

🧹 Nitpick comments (2)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (1)

170-210: 프리미엄 가격 섹션을 별도 컴포저블로 분리하는 것도 좋을 것 같아요.

현재 가격 표시 부분이 40줄 정도로 꽤 길어서, PremiumPricingCard 같은 별도 컴포저블로 추출하면 SetCallScreen의 가독성이 더 좋아질 것 같습니다. 다만 급한 건 아니니 나중에 리팩토링 기회가 있을 때 고려해보시면 됩니다!

app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt (1)

72-73: 리플 효과 제거가 의도된 건가요?

indication = nullinteractionSource = null로 설정해서 터치 피드백(리플 효과)이 완전히 사라졌어요. 사용자가 버튼을 눌렀을 때 시각적 반응이 없으면 UX가 다소 아쉬울 수 있는데, 디자인 의도가 그런 거라면 괜찮습니다.

만약 리플을 유지하고 싶다면 이렇게 수정할 수 있어요:

                        .clickable(
-                            indication = null,
-                            interactionSource = null,
-                            onClick = {
+                            enabled = inputText.isNotBlank(),
+                        ) {
-                                if (inputText.isNotBlank())
-                                    clickPlus()
+                            clickPlus()
-                            },
-                        ),
+                        }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8ba3f7f and 844b4a1.

📒 Files selected for processing (2)
  • app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt (4 hunks)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (17 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (3)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/CTAButton.kt (1)
  • CTAButton (22-78)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/info/component/LoginBackButton.kt (1)
  • LoginBackButton (17-37)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/component/BenefitItem.kt (1)
  • BenefitItem (19-39)
⏰ 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). (1)
  • GitHub Check: ci-build
🔇 Additional comments (3)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/SetCallScreen.kt (1)

223-223: 케어콜 제공 횟수 확인 필요

"매일 3회 케어콜 제공"이 프리미엄 플랜 API/스펙과 일치하는지 백엔드 또는 기획팀에 확인해 주세요.

app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt (2)

71-78: 클릭 핸들러 추가 완료! 👍

이전 리뷰에서 지적된 클릭 동작 누락 문제가 해결되었네요. clickable 모디파이어를 추가하고 inputText.isNotBlank() 체크로 빈 값일 때는 동작하지 않도록 처리한 것 좋습니다.


92-101: 프리뷰 추가 굿!

디자인 타임에 컴포넌트를 확인할 수 있는 프리뷰를 추가해 주셨네요. 개발 경험 개선에 도움이 됩니다!

modifier = modifier.size(20.dp),
tint = MediCareCallTheme.colors.black
Box(
modifier
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

모디파이어 파라미터 재사용 이슈가 있어요.

Box에 함수 파라미터인 modifier를 사용하고 있는데, 이 modifier는 이미 37번 라인의 Row와 39번 라인의 OutlinedTextField에서 사용되고 있어요. 파라미터를 여러 곳에서 재사용하면 의도하지 않은 레이아웃 체이닝이 발생할 수 있습니다.

Box는 독립적인 Modifier로 시작해야 해요.

-                Box(
-                    modifier
-                        .padding(end = 16.dp)
+                Box(
+                    Modifier
+                        .padding(end = 16.dp)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
modifier
trailingIcon = {
Box(
Modifier
.padding(end = 16.dp)
.clip(RoundedCornerShape(8.dp))
.background(
if (inputText.isBlank()) gray2
else main,
),
) {
Text(
text = "등록",
modifier = Modifier.padding(vertical = 6.dp, horizontal = 10.dp),
color = MediCareCallTheme.colors.white,
style = MediCareCallTheme.typography.R_14,
)
}
},
🤖 Prompt for AI Agents
In app/src/main/java/com/konkuk/medicarecall/ui/common/component/AddTextField.kt
around line 64, the Box currently reuses the function parameter modifier which
is also applied to the Row and OutlinedTextField causing unintended modifier
chaining; change the Box to start with a fresh Modifier instance (e.g., use
Modifier or Modifier.then(...) only for Box-specific decorations) instead of the
passed-in modifier so the Box’s layout is independent from the
Row/OutlinedTextField modifiers.

@ProtossManse
Copy link
Collaborator Author

@librawish808

개인적으로는 패딩값을 피그마에 맞춰서 수정하고 LineHeightStyle은 별도의 이슈로 등록하면 좋을 것 같은데 어떠실까요? 해당 부분은 월요일에 같이 논의해서 결정하면 좋을 것 같습니다

다만 출시가 얼마 남지 않은 상황이라서 LineHeightStyle을 바꾸면 다른 부분도 다 패딩값 수정을 해야 해서, 일단 눈에 보이는대로 적용하고 이후 수정하는 것은 어떨까요?

@librawish808
Copy link
Collaborator

넵 일정상 그게 좋을것같네여

Copy link
Collaborator

@alswlekk alswlekk left a comment

Choose a reason for hiding this comment

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

깔끔하게 코드 잘 작성하신 거 같아요

inputText: MutableState<String>,
diseaseList: MutableList<String>,
modifier: Modifier = Modifier
inputText: String,
Copy link
Collaborator

Choose a reason for hiding this comment

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

👍

Copy link

@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

♻️ Duplicate comments (1)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt (1)

222-223: BenefitItem 사용 불가

Line 47의 import 문제로 인해 이 부분도 컴파일되지 않습니다. BenefitItem 컴포넌트가 정의되면 자동으로 해결될 것 같습니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 934f4a9 and 599b3ea.

📒 Files selected for processing (1)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt (18 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt (2)
app/src/main/java/com/konkuk/medicarecall/ui/common/component/CTAButton.kt (1)
  • CTAButton (22-78)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/info/component/LoginBackButton.kt (1)
  • LoginBackButton (17-37)
🪛 GitHub Actions: Android CI
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt

[error] 47-47: Unresolved reference 'BenefitItem'.


[error] 222-222: Unresolved reference 'BenefitItem'.


[error] 223-223: Unresolved reference 'BenefitItem'.


[error] 368-368: Unresolved reference 'navController'.

🔇 Additional comments (6)
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt (6)

169-209: UI 개선 잘 적용됨

가격 표시 영역 디자인이 깔끔하게 업데이트되었습니다. "특별 할인" 배지, 취소선이 있는 원가, "무료 체험" 강조 등이 사용자에게 명확하게 전달될 것 같네요.


212-217: HorizontalDivider 적용 완료

이전 리뷰 코멘트에서 지적된 Divider 누락 건이 잘 반영되었습니다.


238-269: 어르신 선택 UI 개선

LazyRow를 활용한 탭 형태의 어르신 선택 UI가 직관적이고 깔끔합니다. 선택 상태에 따른 스타일 변경(배경색, 테두리, 글꼴)도 잘 구현되어 있고, animateScrollToItem으로 스크롤 애니메이션까지 적용한 점이 좋습니다.


276-316: 시간 설정 아이템 clickable 처리

각 TimeSettingItem에 clickable modifier를 적용하면서 trailing comma(,)를 일관되게 추가한 점이 좋습니다. Kotlin 코드 스타일에 맞춰 작성되었네요.


320-351: 안내사항 섹션 스타일 업데이트

배경색과 패딩, 타이포그래피가 깔끔하게 정리되었습니다. 항목 간 간격도 일정하게 유지되어 가독성이 좋아 보입니다.


353-376: Toast 피드백 추가

네트워크 실패 시 Toast로 사용자에게 피드백을 주는 로직을 추가한 것은 UX 개선에 도움이 됩니다. 다만 navController 이슈만 해결하면 바로 동작할 수 있을 것 같습니다.

Comment on lines 367 to 372
Toast.makeText(
navController.context,
"콜 시간 설정에 실패했습니다. 다시 시도해주세요.",
Toast.LENGTH_SHORT,
).show()
},
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

navController가 정의되지 않음

navController.context를 사용하려고 하는데 navController가 함수 파라미터나 로컬 변수로 정의되어 있지 않습니다. Line 44에서 NavHostController를 import했지만 실제로 사용할 인스턴스가 없네요.

해결 방법 두 가지를 제안합니다:

방법 1 (권장): LocalContext 사용

+import androidx.compose.ui.platform.LocalContext
+
 @Composable
 fun CallTimeScreen(
     modifier: Modifier = Modifier,
     onBack: () -> Unit = {},
     navigatedToPayment : () -> Unit = {},
     eldersInfoViewModel: EldersInfoViewModel = hiltViewModel(),
     callTimeViewModel: CallTimeViewModel = hiltViewModel(),
 ) {
+    val context = LocalContext.current
     
     // ... (나머지 코드)
     
                         onError = { t ->
                             Log.e("SetCallScreen", "콜 시간 설정 실패: $t")
                             Toast.makeText(
-                                navController.context,
+                                context,
                                 "콜 시간 설정에 실패했습니다. 다시 시도해주세요.",
                                 Toast.LENGTH_SHORT,
                             ).show()
                         },

방법 2: navController를 파라미터로 추가

 fun CallTimeScreen(
     modifier: Modifier = Modifier,
     onBack: () -> Unit = {},
     navigatedToPayment : () -> Unit = {},
+    navController: NavHostController,
     eldersInfoViewModel: EldersInfoViewModel = hiltViewModel(),
     callTimeViewModel: CallTimeViewModel = hiltViewModel(),
 ) {
🧰 Tools
🪛 GitHub Actions: Android CI

[error] 368-368: Unresolved reference 'navController'.

🤖 Prompt for AI Agents
In
app/src/main/java/com/konkuk/medicarecall/ui/feature/login/carecall/screen/CallTimeScreen.kt
around lines 367 to 372, the code calls navController.context but navController
is not defined; fix by either (recommended) using LocalContext.current to obtain
a Context and pass that to Toast.makeText, or alternatively add a
NavHostController parameter to the composable function signature and use that
instance (ensure you import/receive NavHostController where the composable is
invoked). Ensure you remove the undefined navController reference and use the
chosen valid Context source.

@ProtossManse
Copy link
Collaborator Author

추가 코드리뷰는 599b3ea 의 CallTimeScreen과 ae7c8c5 만 보시면 될 것 같아요!
컨플릭트 해결하는 과정에서 누락된 코드나 그런게 있는지 확인해주시면 좋을 것 같습니다!

Copy link
Collaborator

@librawish808 librawish808 left a comment

Choose a reason for hiding this comment

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

확인하였습니다 좋습니다!

Copy link
Collaborator

@alswlekk alswlekk left a comment

Choose a reason for hiding this comment

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

따로 컴플릭트 나는 부분도 없는 거 같고 CallTimeScreen도 요구사항 만족 다 한 거 같습니다 ! LGTM

@ProtossManse ProtossManse merged commit 0e22ef5 into develop Oct 12, 2025
2 checks passed
@ProtossManse ProtossManse deleted the feat/onboarding-ui-#129 branch October 12, 2025 12:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 온보딩 UI 수정사항 반영

4 participants