Conversation
# Conflicts: # app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt # app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt
Walkthrough홈 추가정보 기능을 도메인/프레젠테이션 모델, 컴포저블 UI, ViewModel, 내비게이션, 문자열/아이콘 리소스 전반에 걸쳐 추가했다. 홈 버튼 타입·리스트를 재구성하고, 새 HomeExtraFragment와 Compose 화면(센터/부서/봉사) 및 아이템 컴포넌트를 도입했으며, 인자 기반 로드 흐름과 다이얼/복사/브라우저 액션을 연계했다. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant HomeScreen
participant HomeFragment
participant NavController as Nav
participant HomeExtraFragment as ExtraFrag
participant Compose as ComposeView
participant VM as HomeExtraViewModel
User->>HomeScreen: 추가정보 버튼 탭
HomeScreen->>HomeFragment: navigateToHomeExtra(type)
HomeFragment->>Nav: navigate(action_fragment_home_to_fragment_home_extra, arg=type)
Nav-->>ExtraFrag: create with arg homeExtraType
ExtraFrag->>ComposeView: setContent()
ComposeView->>VM: collect uiState / uiEffect
Note over VM: SavedStateHandle에서 type 초기화
ComposeView->>VM: handleEvent(LoadData)
VM->>VM: loadState Idle→Loading
VM->>VM: homeExtraButtonType 분기<br/>Centers/Departments/Volunteers/None 생성
VM-->>ComposeView: uiState(loadState=Success, content=...)
alt content=Centers
ComposeView->>ComposeView: ExtraHomeCenterScreen(centers)
else content=Departments
ComposeView->>ComposeView: ExtraHomeDepartmentScreen(departments)
else content=Volunteers
ComposeView->>ComposeView: ExtraHomeVolunteerScreen(volunteers)
else content=None
ComposeView->>ComposeView: 빈 상태 처리
end
sequenceDiagram
participant Item as Extra*Item
participant OS as Android OS
rect rgba(240,240,255,0.6)
note right of Item: 전화 아이콘/번호 클릭
Item->>OS: ACTION_DIAL(tel:...)
end
rect rgba(240,255,240,0.6)
note right of Item: 주소/구역 복사 클릭
Item->>OS: ClipboardManager.setPrimaryClip(text)
end
rect rgba(255,248,240,0.6)
note right of Item: 상세보기 클릭(봉사)
Item->>OS: ACTION_VIEW(uri=webLink)
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (5)
🚧 Files skipped from review as they are similar to previous changes (1)
🧰 Additional context used🧬 Code graph analysis (1)app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt (1)
🔇 Additional comments (13)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (28)
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportDialog.kt (3)
77-77: 텍스트 하드코딩 개선 권장"목격신고"와 "실종신고" 텍스트가 하드코딩되어 있습니다. 다국어 지원과 유지보수성을 위해 문자열 리소스로 분리하는 것을 권장합니다.
다음과 같이 문자열 리소스로 분리할 수 있습니다:
- Text(text = "목격신고", style = FindUTheme.typography.body1SemiBold16, color = FindUTheme.colors.gray6) + Text(text = stringResource(R.string.home_report_witness), style = FindUTheme.typography.body1SemiBold16, color = FindUTheme.colors.gray6) - Text(text = "실종신고", style = FindUTheme.typography.body1SemiBold16, color = FindUTheme.colors.gray6) + Text(text = stringResource(R.string.home_report_missing), style = FindUTheme.typography.body1SemiBold16, color = FindUTheme.colors.gray6)Also applies to: 96-96
55-55: 추가 하드코딩된 텍스트들"제보하기"와 "전화로 신고하기" 텍스트도 문자열 리소스로 분리하는 것이 좋겠습니다.
- text = "제보하기", + text = stringResource(R.string.home_report_title), - text = "전화로 신고하기", + text = stringResource(R.string.home_report_phone),Also applies to: 114-114
63-63: 버튼 동작 네이밍 확인 필요
onFindReportButtonClicked가 "목격신고"에,onLostReportButtonClicked가 "실종신고"에 연결되어 있는데, 네이밍이 직관적이지 않습니다.onWitnessReportClicked와onMissingReportClicked같은 네이밍이 더 명확할 것 같습니다.함수명을 더 직관적으로 변경하는 것을 고려해보세요:
- onLostReportButtonClicked: () -> Unit, - onFindReportButtonClicked: () -> Unit, + onMissingReportClicked: () -> Unit, + onWitnessReportClicked: () -> Unit,Also applies to: 82-82
app/src/main/java/com/example/findu/presentation/ui/onboarding/viewmodel/OnboardingViewModel.kt (1)
155-157: Kakao ID 중복 설정 방지 로직 추가 고려
setKakaoId함수가 여러 번 호출될 경우를 대비한 보호 로직이 없습니다. 이미 설정된 kakaoId를 덮어쓰는 것을 방지하는 로직을 추가하면 더 안전할 것 같습니다.fun setKakaoId(id: Long) { - _uiState.update { it.copy(kakaoId = id) } + if (_uiState.value.kakaoId == -1L) { + _uiState.update { it.copy(kakaoId = id) } + } }app/src/main/java/com/example/findu/presentation/ui/login/LoginActivity.kt (1)
29-29: 상수명 일관성 개선 제안
KAKAO_ID상수가 Intent extra key로 사용되고 있는데, Android 컨벤션에 따라EXTRA_KAKAO_ID로 명명하면 용도가 더 명확해질 것 같습니다.-private const val KAKAO_ID = "kakaoId" +private const val EXTRA_KAKAO_ID = "kakaoId"그리고 Line 85에서도 동일하게 수정:
-.putExtra(KAKAO_ID, kakaoId) +.putExtra(EXTRA_KAKAO_ID, kakaoId)app/src/main/res/values/strings.xml (1)
435-435: 문자열 키 명명 일관성 확인
home_button_PROTECT_DEPARTMENT에서 대문자 사용이 다른 키들(home_button_protect_center,home_button_volunteer)과 일관성이 없어 보입니다. 보통 Android 리소스 명명 규칙에서는 모두 소문자와 언더스코어를 사용하죠.다음과 같이 일관성 있게 변경하는 것을 고려해보세요:
- <string name="home_button_PROTECT_DEPARTMENT">보호 부서</string> + <string name="home_button_protect_department">보호 부서</string>app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt (1)
39-44: 아이콘 접근성 개선 제안하드코딩된
contentDescription을 사용하고 있네요. 더 나은 접근성을 위해 매개변수로 받거나 문자열 리소스를 사용하는 것이 좋겠습니다.- contentDescription = "Navigation Icon", + contentDescription = stringResource(R.string.navigation_icon_description),또는 매개변수로 받는 방식:
@Composable fun FindUTopAppBar( modifier: Modifier = Modifier, @StringRes title: Int, @DrawableRes actionIconRes: Int? = null, onActionIconClick: () -> Unit = { }, @DrawableRes navigationIconRes: Int? = null, onNavigationIconClick: () -> Unit = { }, + navigationIconContentDescription: String? = null, + actionIconContentDescription: String? = null, ) {app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraDepartmentScreen.kt (2)
20-24: 네비게이션 콜백 구현 필요TopAppBar의 뒤로 가기 버튼에 빈 콜백이 설정되어 있어요. 실제 네비게이션 동작이 구현되어야 합니다.
다음과 같이 콜백을 받도록 함수 시그니처를 수정하는 걸 고려해보세요:
fun ExtraHomeDepartmentScreen( departments: List<Department>, + onNavigationClick: () -> Unit = {}, modifier: Modifier = Modifier ) { Column(modifier = modifier) { FindUTopAppBar( title = R.string.home_extra_department, navigationIconRes = R.drawable.ic_arrow_left, - onNavigationIconClick = {} + onNavigationIconClick = onNavigationClick )
25-25: TODO 주석 구현 계획 확인지역 선택 드롭다운 구현이 TODO로 남아있네요. PR 설명에서 API 연동 시 추가 예정이라고 했지만, 구현 일정을 확인해보세요.
이 기능의 구현을 도와드릴까요? 새로운 이슈를 생성하여 추적하시겠어요?
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraVolunteerScreen.kt (1)
20-24: 네비게이션 콜백 구현 필요Department 화면과 동일하게 TopAppBar의 뒤로 가기 콜백이 비어있네요.
함수 파라미터에 네비게이션 콜백을 추가하는 걸 고려해보세요:
fun ExtraHomeVolunteerScreen( volunteerWorks: List<VolunteerWork>, + onNavigationClick: () -> Unit = {}, modifier: Modifier = Modifier )app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraDepartmentItem.kt (1)
50-52: 중복된 클립보드 복사 로직아이콘과 텍스트 모두에 동일한 클립보드 복사 기능이 중복 구현되어 있어요. 로직을 공통화하면 코드가 더 깔끔해질 것 같아요.
다음과 같이 리팩터링을 고려해보세요:
+val onCopyClick = { clipboardManager.setText(AnnotatedString(department.district)) } + Row(verticalAlignment = Alignment.CenterVertically) { Text( text = department.name, style = FindUTheme.typography.head2SemiBold20, color = FindUTheme.colors.gray6 ) Spacer(modifier = Modifier.width(10.dp)) BaseVectorIcon( vectorResource = R.drawable.ic_home_extra_copy_15, - modifier = Modifier.noRippleClickable { - clipboardManager.setText(AnnotatedString(department.district)) - }) + modifier = Modifier.noRippleClickable(onClick = onCopyClick) + ) Text( text = stringResource(R.string.home_extra_copy), style = FindUTheme.typography.body2Regular14, color = Color(0xFF00D1CA), - modifier = Modifier.noRippleClickable { - clipboardManager.setText(AnnotatedString(department.district)) - } + modifier = Modifier.noRippleClickable(onClick = onCopyClick) ) }Also applies to: 57-59
app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraCenterItem.kt (1)
65-69: 중복 정보 표시 및 클립보드 기능센터명이 두 번 표시되고 있어요 (Line 43과 66). 아래쪽은 주소 복사용인데 센터명을 표시하는 게 맞나요? 사용자에게 혼란을 줄 수 있을 것 같아요.
주소를 표시하도록 수정하는 걸 고려해보세요:
Row(verticalAlignment = Alignment.CenterVertically) { Text( - text = center.centerName, + text = center.address, style = FindUTheme.typography.captionRegular12, color = FindUTheme.colors.gray6 )Also applies to: 73-82
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraCenterScreen.kt (1)
39-45: 중복된 TODO 주석과 빈 Row지역 선택 드롭다운에 대한 TODO가 두 번 나타나고 빈 Row가 있어요. 하나는 제거하거나 다른 UI 요소로 대체하는 게 좋을 것 같아요.
불필요한 Row를 제거하세요:
- Row { - //TODO: 지역 선택 드롭다운 구현 - } Spacer(modifier = Modifier.weight(1f)) - Row { - //TODO: 지역 선택 드롭다운 구현 - } + //TODO: 지역 선택 드롭다운 구현app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraVolunteerItem.kt (3)
31-31: Intent 생성 시 ActivityNotFoundException 처리 필요유효하지 않은 URL이나 처리할 수 있는 앱이 없는 경우 크래시가 발생할 수 있습니다.
val context = LocalContext.current -val intent = Intent(Intent.ACTION_VIEW, volunteerWork.webLink.toUri()) +val intent = remember(volunteerWork.webLink) { + Intent(Intent.ACTION_VIEW, volunteerWork.webLink.toUri()) +}그리고 클릭 핸들러에 try-catch를 추가하세요:
Column(modifier = modifier.padding(top=20.dp, start = 20.dp, end = 20.dp).noRippleClickable{ - context.startActivity(intent) + try { + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + // TODO: 사용자에게 알림 표시 + } }) {
34-35: 공백 스타일 일관성 개선modifier 체이닝 시 공백이 일관되지 않습니다.
-Column(modifier = modifier.padding(top=20.dp, start = 20.dp, end = 20.dp).noRippleClickable{ +Column(modifier = modifier.padding(top = 20.dp, start = 20.dp, end = 20.dp).noRippleClickable {
37-45: Row 내부 요소 정렬 개선 가능여러 Row에서 동일한 정렬 패턴이 반복됩니다.
공통 컴포저블로 추출하면 가독성이 향상될 수 있습니다:
@Composable private fun InfoRow( icon: Int, label: String, value: String ) { Row(verticalAlignment = Alignment.CenterVertically) { BaseVectorIcon(vectorResource = icon) Spacer(modifier = Modifier.width(5.dp)) Text(label, style = FindUTheme.typography.body2Regular14, color = FindUTheme.colors.gray5) Spacer(modifier = Modifier.weight(1f)) Text(text = value, style = FindUTheme.typography.body2SemiBold14, color = FindUTheme.colors.gray5) } }app/src/main/java/com/example/findu/domain/model/extra/HomeExtraDataType.kt (1)
21-26: Center 클래스가 HomeExtraDataType 인터페이스를 구현하지 않음다른 데이터 클래스들과 달리
Center가HomeExtraDataType을 구현하지 않아 일관성이 떨어집니다.data class Center( val jurisdiction: List<String>, val centerName: String, val phoneNumber: String, val address: String -) +) : HomeExtraDataTypeapp/src/main/java/com/example/findu/presentation/ui/extra/HomeExtraFragment.kt (3)
51-58: 미사용 LaunchedEffect 제거 권장현재 아무 동작도 하지 않는 주석 처리된 코드가 있습니다.
향후 구현 예정이 아니라면 제거하는 것이 좋습니다:
-LaunchedEffect(homeExtraViewModel.uiEffect, lifecycleOwner) { - homeExtraViewModel.uiEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) - .collect { sideEffect -> -// when (sideEffect) { -// -// } - } -}
73-73: TopAppBar의 뒤로가기 동작 구현 필요각 화면의 TopAppBar에서
onNavigationIconClick = {}로 비어있습니다.Fragment의 navigation을 활용하여 뒤로가기 기능을 연결하세요:
-ExtraHomeVolunteerScreen(volunteerWorks = content.list) +ExtraHomeVolunteerScreen( + volunteerWorks = content.list, + onBackClick = { findNavController().popBackStack() } +)각 Screen 컴포저블도 수정이 필요합니다.
Also applies to: 77-77, 82-82
94-97: 사용되지 않는 showFindDialog 함수현재 호출되는 곳이 없는 private 함수입니다.
사용 계획이 없다면 제거하세요:
-private fun showFindDialog() { - val dialog = HomeFindDialog(requireContext(), findNavController()) - dialog.show() -}app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt (2)
34-36: 빈 sealed class 구조 개선현재
HomeExtraUiEffect가 비어있습니다. 향후 사용 계획이 있다면 TODO 주석을 추가하거나, 없다면 제거를 고려하세요.sealed class HomeExtraUiEffect { - + // TODO: 향후 네비게이션, 토스트 메시지 등의 side effect 추가 예정 }
91-137: 더미 데이터를 별도 파일로 분리 권장ViewModel에 하드코딩된 더미 데이터가 많은 공간을 차지합니다.
테스트용 데이터는 별도의 object나 파일로 분리하는 것이 좋습니다:
// HomeExtraTestData.kt object HomeExtraTestData { val dummyVolunteers = listOf(...) val dummyDepartments = listOf(...) val dummyCenters = listOf(...) }app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt (1)
202-209: 다이얼로그 버튼 클릭 핸들러 간소화 가능dismiss 로직이 각 버튼 핸들러에 중복됩니다.
ViewModel에서 처리하거나 래퍼 함수를 만들어 중복을 제거할 수 있습니다:
val handleLostReportClick = { onLostReportClick() onReportDialogDismiss() }app/src/main/java/com/example/findu/data/mapper/todomain/HomeResponseDtoMapper.kt (1)
35-42: ProtectingAnimal 매핑 로직 확인
reportId를protectId로 매핑하는 부분이 의도적인지 확인이 필요합니다. API 응답의 필드명과 도메인 모델의 필드명이 다른 이유가 있다면 문서화하는 것이 좋겠습니다.fun ProtectingAnimal.toDomain() = ProtectAnimal( + // API의 reportId는 보호 동물의 고유 ID를 나타냄 protectId = reportId, thumbnailImageUrl = thumbnailImageUrl,app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt (2)
73-74: TODO 구현 필요
NavigateToProtectList와NavigateToReportList이벤트 처리가 아직 구현되지 않았습니다.이 네비게이션 로직을 구현하는 코드를 작성해드릴까요? 새 이슈로 등록하시겠습니까?
181-184: 전화 걸기 기능 구현 확인120번 전화 다이얼 기능이 잘 구현되었습니다. 다만, 사용자에게 전화를 거는 권한이 필요할 수 있으니 관련 처리를 고려해보세요.
private fun call120() { val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:120")) - startActivity(intent) + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText(requireContext(), "전화 앱을 찾을 수 없습니다", Toast.LENGTH_SHORT).show() + } }app/src/main/java/com/example/findu/data/dataremote/model/response/HomeResponseDto.kt (1)
27-36: PeriodStatistics 필드명 일관성 확인
lostAnimalCount라는 이름이 다른 필드들과 일관성이 있는지 확인이 필요합니다.rescuedAnimalCount,protectingAnimalCount,adoptedAnimalCount는 모두 긍정적인 상태를 나타내는데,lostAnimalCount는 부정적인 상태입니다.API 스펙이 허용한다면
reportedAnimalCount또는missingAnimalCount로 변경을 고려해보세요.app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (1)
164-165: TODO 처리 필요알람 버튼 클릭 기능이 아직 구현되지 않았네요.
알람 기능에 대한 요구사항이 정해지면 구현을 도와드릴 수 있습니다. 이슈로 등록하시겠습니까?
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (45)
app/src/main/java/com/example/findu/data/dataremote/datasource/HomeRemoteDataSource.kt(1 hunks)app/src/main/java/com/example/findu/data/dataremote/datasourceimpl/HomeRemoteDataSourceImpl.kt(1 hunks)app/src/main/java/com/example/findu/data/dataremote/model/response/HomeResponseDto.kt(3 hunks)app/src/main/java/com/example/findu/data/dataremote/service/HomeService.kt(1 hunks)app/src/main/java/com/example/findu/data/dataremote/util/Constraints.kt(1 hunks)app/src/main/java/com/example/findu/data/mapper/todomain/HomeResponseDtoMapper.kt(1 hunks)app/src/main/java/com/example/findu/data/repositoryimpl/HomeRepositoryImpl.kt(1 hunks)app/src/main/java/com/example/findu/domain/model/HomeData.kt(2 hunks)app/src/main/java/com/example/findu/domain/model/extra/HomeExtraDataType.kt(1 hunks)app/src/main/java/com/example/findu/domain/repository/HomeRepository.kt(1 hunks)app/src/main/java/com/example/findu/domain/usecase/GetHomeUseCase.kt(1 hunks)app/src/main/java/com/example/findu/presentation/model/HomeExtraContent.kt(1 hunks)app/src/main/java/com/example/findu/presentation/type/HomeExtraButtonType.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/HomeExtraFragment.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraCenterItem.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraDepartmentItem.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraVolunteerItem.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraCenterScreen.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraDepartmentScreen.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraVolunteerScreen.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt(5 hunks)app/src/main/java/com/example/findu/presentation/ui/home/component/HomeButtonList.kt(2 hunks)app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportCard.kt(4 hunks)app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportDialog.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt(7 hunks)app/src/main/java/com/example/findu/presentation/ui/home/dialog/HomeReportDialog.kt(0 hunks)app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt(4 hunks)app/src/main/java/com/example/findu/presentation/ui/login/LoginActivity.kt(3 hunks)app/src/main/java/com/example/findu/presentation/ui/login/viewmodel/LoginViewModel.kt(2 hunks)app/src/main/java/com/example/findu/presentation/ui/onboarding/OnboardingActivity.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/onboarding/viewmodel/OnboardingViewModel.kt(3 hunks)app/src/main/res/drawable/ic_dialog_home_report_48_blue.xml(1 hunks)app/src/main/res/drawable/ic_dialog_home_report_48_red.xml(1 hunks)app/src/main/res/drawable/ic_home_extra_copy_15.xml(1 hunks)app/src/main/res/drawable/ic_home_extra_volunteer_calendar_20.xml(1 hunks)app/src/main/res/drawable/ic_home_extra_volunteer_gps_20.xml(1 hunks)app/src/main/res/drawable/ic_home_extra_volunteer_time_20.xml(1 hunks)app/src/main/res/drawable/ic_home_extra_volunteer_time_calendar_20.xml(1 hunks)app/src/main/res/drawable/ic_home_report_dialog_phone_24.xml(1 hunks)app/src/main/res/drawable/ic_right_arrow_gray_20.xml(1 hunks)app/src/main/res/layout/fragment_home_extra.xml(1 hunks)app/src/main/res/navigation/nav_graph.xml(1 hunks)app/src/main/res/values/strings.xml(2 hunks)
💤 Files with no reviewable changes (1)
- app/src/main/java/com/example/findu/presentation/ui/home/dialog/HomeReportDialog.kt
🧰 Additional context used
🧬 Code graph analysis (12)
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraDepartmentScreen.kt (2)
app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt (1)
FindUTopAppBar(20-67)app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraDepartmentItem.kt (1)
ExtraDepartmentItem(30-82)
app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraDepartmentItem.kt (1)
app/src/main/java/com/example/findu/presentation/ui/base/BaseVectorIcon.kt (1)
BaseVectorIcon(11-24)
app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraCenterItem.kt (1)
app/src/main/java/com/example/findu/presentation/ui/base/BaseVectorIcon.kt (1)
BaseVectorIcon(11-24)
app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraVolunteerItem.kt (1)
app/src/main/java/com/example/findu/presentation/ui/base/BaseVectorIcon.kt (1)
BaseVectorIcon(11-24)
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraVolunteerScreen.kt (2)
app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt (1)
FindUTopAppBar(20-67)app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraVolunteerItem.kt (1)
ExtraVolunteerItem(26-85)
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeButtonList.kt (1)
app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt (1)
navigateToHomeExtra(186-190)
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraCenterScreen.kt (2)
app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt (1)
FindUTopAppBar(20-67)app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraCenterItem.kt (1)
ExtraCenterItem(30-92)
app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt (3)
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportCard.kt (1)
HomeReportCard(37-101)app/src/main/java/com/example/findu/presentation/ui/home/component/HomeButtonList.kt (1)
HomeExtraButtonList(25-47)app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportDialog.kt (1)
HomeReportDialog(28-124)
app/src/main/java/com/example/findu/presentation/ui/extra/HomeExtraFragment.kt (3)
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraVolunteerScreen.kt (1)
ExtraHomeVolunteerScreen(14-31)app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraDepartmentScreen.kt (1)
ExtraHomeDepartmentScreen(14-33)app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraCenterScreen.kt (1)
ExtraHomeCenterScreen(27-71)
app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt (1)
app/src/main/java/com/example/findu/presentation/ui/base/BaseVectorIcon.kt (1)
BaseVectorIcon(11-24)
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportDialog.kt (2)
app/src/main/java/com/example/findu/presentation/ui/base/BaseVectorIcon.kt (1)
BaseVectorIcon(11-24)app/src/main/java/com/example/findu/ui/theme/Theme.kt (1)
FindUTheme(39-59)
app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt (1)
app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (2)
navigateToProtectDetail(180-184)navigateToReportDetail(186-190)
🪛 detekt (1.23.8)
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt
[warning] 34-36: The class or object HomeExtraUiEffect is empty.
(detekt.empty-blocks.EmptyClassBlock)
🔇 Additional comments (52)
app/src/main/res/drawable/ic_right_arrow_gray_20.xml (1)
1-9: 새로 추가된 우향 화살표 아이콘이 잘 구현되었습니다.벡터 드로어블이 24dp 크기로 적절하게 정의되었고, 회색(#A0A0A0) 색상의 우향 화살표 패스가 정확하게 그려졌습니다. 홈 추가 정보 화면들의 리스트 아이템에서 일관된 시각적 표현을 위해 사용될 것으로 보입니다.
app/src/main/res/drawable/ic_home_extra_volunteer_gps_20.xml (1)
1-17: 깔끔한 GPS 아이콘 구현이네요!벡터 드로어블이 정확하게 구현되어 있고, 오렌지 색상(#FF9000)과 흰색 하이라이트로 시각적으로도 명확합니다. 봉사 관련 UI에서 위치 표시용으로 사용하기에 적합한 20dp 크기의 아이콘입니다.
app/src/main/res/drawable/ic_dialog_home_report_48_blue.xml (1)
1-21: 벡터 드로어블 리소스가 올바르게 구성되었습니다.48dp 크기의 벡터 드로어블이 적절한 뷰포트와 함께 정의되어 있고, 클립패스와 여러 색상의 패스가 잘 구성되어 있습니다. 파일 구조와 색상 정의도 안드로이드 표준을 따르고 있네요.
app/src/main/res/drawable/ic_home_report_dialog_phone_24.xml (1)
1-17: 전화 아이콘 리소스가 잘 구현되었습니다.24dp 크기의 전화 아이콘이 적절한 클립패스와 색상 조합(회색 #A0A0A0, 초록색 #43C661)으로 구성되어 있습니다. Home Extra 기능의 전화 걸기 기능과 잘 어울리는 디자인이네요.
app/src/main/res/drawable/ic_dialog_home_report_48_red.xml (1)
1-22: 빨간색 리포트 아이콘이 올바르게 구현되었습니다.48dp 크기의 벡터 드로어블이 적절히 구성되어 있고, 빨간색(#EF4346)과 회색(#CFCFCF) 조합이 좋습니다. 반투명 효과(fillAlpha="0.5")도 잘 적용되었네요. 파란색 버전과 함께 리포트 다이얼로그에서 사용될 것 같습니다.
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportDialog.kt (1)
28-124: 검증 결과 — 리뷰 코멘트가 코드베이스와 불일치합니다HomeReportDialog은 삭제 예정이 아니라 현재 코드에 존재하며 실제로 호출되고 있습니다.
- 파일: app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportDialog.kt (Compose 함수 및 Preview 포함)
- 사용처: app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt — uiState.isReportDialogVisible 조건에서 HomeReportDialog(...) 호출 (참고: HomeScreen.kt:200).
Likely an incorrect or invalid review comment.
app/src/main/java/com/example/findu/presentation/ui/login/LoginActivity.kt (1)
82-88: 좋은 구현입니다!Kakao ID를 OnboardingActivity로 전달하는 구현이 깔끔하게 잘 되어 있습니다. Intent extra를 통한 데이터 전달 방식이 적절합니다.
app/src/main/java/com/example/findu/presentation/ui/login/viewmodel/LoginViewModel.kt (2)
32-32: 적절한 Kakao ID 전달 구현첫 로그인 시 Kakao ID를 온보딩 화면으로 전달하는 로직이 잘 구현되어 있습니다.
25-26: SharedFlow 타입 변경 확인 — 구독자 업데이트됨LoginActivity에서 startOnboardingActivity.collect { kakaoId -> Intent에 putExtra(KAKAO_ID, kakaoId) }로 Long을 사용하고 있으므로 구독자 측 변경은 반영되어 있습니다. (위치: app/src/main/java/com/example/findu/presentation/ui/login/LoginActivity.kt:82)
app/src/main/java/com/example/findu/presentation/ui/onboarding/OnboardingActivity.kt (1)
35-38: Kakao ID 기본값(-1L) 사용 재검토 및 중앙화코드에서 -1L을 센티넬로 사용하고 있습니다 (app/src/main/java/com/example/findu/presentation/ui/onboarding/OnboardingActivity.kt:35-36, app/src/main/java/com/example/findu/presentation/ui/onboarding/viewmodel/OnboardingViewModel.kt:26). 아래 중 하나로 처리하세요:
- kakaoId를 nullable(Long?)로 변경하고 intent.hasExtra(KAKAO_ID) 또는 extras로 존재 여부 판단.
- 또는 NO_KAKAO_ID = -1L 같은 상수를 정의해 의미를 명시하고 중앙화.
- Kakao API 문서로 -1이 실제 ID로 반환될 가능성 여부를 확인한 뒤 결정.
app/src/main/res/drawable/ic_home_extra_volunteer_calendar_20.xml (1)
1-12: 새로운 벡터 드로어블 아이콘 추가 확인홈 추가 정보 UI를 위한 캘린더 아이콘이 깔끔하게 추가됐네요. 아이콘의 패스 데이터가 상당히 복잡한데, 벡터 패스는 SVG 표기법을 사용하며 M(moveTo), L(lineTo), C(cubicTo), A(arc) 등의 명령어로 구성되고, 대문자는 절대 좌표, 소문자는 상대 좌표를 의미합니다. 이 아이콘이 실제로 달력처럼 보이는지, 그리고 다른 volunteer 관련 아이콘들과 시각적으로 일관성이 있는지 확인해보면 좋을 것 같습니다.
app/src/main/res/values/strings.xml (2)
209-209: 문자열 형식 개선 확인배너 번호 형식이
%d/%d +에서%1$d / %2$d로 변경됐습니다. 위치 지정자를 사용하는 것이 더 안전하고 명확한 방법이네요.
439-442: 새로운 홈 추가 정보 문자열 확인홈 추가 정보 화면을 위한 새로운 문자열 키들이 잘 추가됐네요. 각 섹션별 제목과 복사 기능을 위한 텍스트가 적절히 정의되어 있습니다.
app/src/main/java/com/example/findu/data/dataremote/datasource/HomeRemoteDataSource.kt (1)
7-10: 위치 기반 홈 데이터 API 지원 추가홈 데이터 조회에 위도/경도 파라미터가 추가되어 위치 기반 서비스를 지원하게 됐네요. 기본값이
null로 설정되어 이전 호출 방식과의 호환성도 유지되고 있습니다.app/src/main/java/com/example/findu/presentation/type/HomeExtraButtonType.kt (2)
7-7: enum 클래스명 변경 확인
HomeButtonType에서HomeExtraButtonType으로 명확하게 변경되어 용도가 더 명확해졌네요.
15-18: 문자열 리소스 참조 일관성 확인
PROTECT_DEPARTMENT멤버에서R.string.home_button_PROTECT_DEPARTMENT를 참조하고 있는데, 앞서 strings.xml에서 언급했듯이 대문자 사용이 다른 키들과 일관성이 없습니다. 하지만 enum과 문자열 키가 올바르게 연결되어 있는 점은 좋습니다.app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt (1)
20-28: 재사용 가능한 TopAppBar 컴포넌트 추가선택적 네비게이션/액션 아이콘을 지원하는 깔끔한 TopAppBar 컴포넌트네요. 파라미터들이 적절히 기본값을 가지고 있어 유연하게 사용할 수 있겠습니다.
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeButtonList.kt (2)
26-28: 컴포넌트 명명 및 콜백 단순화
HomeExtraButtonList로 명명이 명확해지고, 개별 콜백들이 하나의navigateToHomeExtra콜백으로 단순화된 것이 좋네요. 이렇게 하면 상위 컴포넌트에서 관리하기가 훨씬 편해집니다.
34-36: 타입 안전한 네비게이션
HomeExtraButtonType.entries를 사용해서 enum의 모든 멤버를 안전하게 순회하고, 타입 안전한 방식으로 콜백에 전달하고 있네요.app/src/main/java/com/example/findu/domain/model/HomeData.kt (3)
7-9: HomeData 도메인 모델 확장
statistics필드가 추가되어 홈 화면에서 더 풍부한 통계 정보를 제공할 수 있게 됐네요. 기존 필드들과 잘 조화를 이루고 있습니다.
11-29: 통계 데이터 구조 설계
HomeStatistics와PeriodStatistics가 잘 구조화되어 있고,getAllStatistics()메서드를 통해 UI 렌더링에 편리한 형태로 데이터를 제공하고 있네요. 최근 7일, 3개월, 1년 단위로 나뉘어진 것도 사용자 관점에서 직관적입니다.
31-36: 통계 타입 enum 정의
StatisticsTypeenum이 한국어 라벨을 포함해서 UI에서 바로 사용하기 편하게 설계됐네요. 구조, 보호중, 입양, 신고라는 4가지 카테고리가 명확합니다.app/src/main/res/drawable/ic_home_extra_copy_15.xml (1)
1-12: 복사 아이콘 색상 하드코드 제거 — 리소스화 권장프로젝트 검색 결과 #00D1CA는 app/src/main/res/drawable/ic_home_extra_copy_15.xml:10에서만 사용되며, app/src/main/res/values/colors.xml 파일은 존재하지 않습니다.
- android:strokeColor="#00D1CA"를 하드코드하지 말고 app/src/main/res/values/colors.xml에 컬러 리소스(예: @color/ic_home_accent)로 정의해 사용하세요.
- 해당 색상이 디자인 토큰/디자이너와 일치하는지 및 접근성(명암비)과 UI 일관성을 확인하세요.
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportCard.kt (4)
29-31: 새로운 도메인 모델로의 전환이 잘 이루어짐기존의
HomeReportData에서HomeStatistics와PeriodStatistics로 변경되면서 더 구조화된 데이터 모델을 사용하게 되었네요.
44-48: 기간별 통계 데이터 선택 로직이 명확함
when표현식을 사용해서 선택된 기간에 따른 통계 데이터를 깔끔하게 가져오는 구조가 좋습니다.
161-165: Preview 데이터가 새로운 구조에 맞게 업데이트됨
HomeStatistics와PeriodStatistics구조로 미리보기 데이터가 잘 구성되어 있네요. 실제 데이터 구조와 일치하는지 확인해보면 좋겠습니다.
72-72: getAllStatistics() 구현 확인 필요 — 자동 검사 실패app/src/main/java/com/example/findu/presentation/ui/home/component/HomeReportCard.kt (L72)에서 currentPeriodStatistics.getAllStatistics().forEachIndexed { index, (label, count) -> } 호출됨. getAllStatistics()가 (label, count) 쌍을 반환하는지(예: List<Pair<String, Int>> 또는 Iterable<Pair<String, Int>>)와 반환 타입/구조를 검증해 주세요. ast-grep 검사에서 결과가 없어 구현을 확인하지 못했습니다.
app/src/main/java/com/example/findu/data/dataremote/util/Constraints.kt (1)
10-12: API 경로 상수 추가 확인
HOME상수가 추가되었는데, API 버전 관리 측면에서 일관성을 확인해보세요.app/src/main/res/layout/fragment_home_extra.xml (1)
1-16: 깔끔한 Compose 통합 레이아웃전체 화면을 차지하는
ComposeView로 구성된 단순하고 효율적인 레이아웃입니다. Compose와 기존 View 시스템 간의 브릿지 역할을 잘 하고 있네요.app/src/main/res/navigation/nav_graph.xml (2)
31-33: 새로운 네비게이션 액션 추가Home에서 HomeExtra로의 네비게이션 액션이 적절하게 추가되었습니다.
36-45: HomeExtraButtonType 정의 확인 필요 — enum 미발견nav_graph.xml(라인 36–45)의 argument가 com.example.findu.presentation.type.HomeExtraButtonType을 참조하지만, 레포지토리에서 해당 타입을 찾을 수 없습니다.
- enum 정의 파일 경로를 제공하거나 app:argType를 실제 정의로 수정하세요(예: src/.../HomeExtraButtonType.kt).
- 가능하면 Navigation argument에는 복잡한 enum/객체 대신 ID나 원시값(String/Int)을 전달하는 것을 권장합니다; enum 전달이 꼭 필요한지 재검토하세요.
app/src/main/res/drawable/ic_home_extra_volunteer_time_calendar_20.xml (1)
1-10: 벡터 드로어블 리소스 정상 추가캘린더 아이콘이 적절한 크기(20dp)와 색상으로 정의되어 있습니다.
app/src/main/res/drawable/ic_home_extra_volunteer_time_20.xml (1)
1-10: 시간 아이콘 벡터 드로어블 추가시계 모양의 아이콘이 봉사활동 시간 표시용으로 적절하게 정의되어 있네요.
app/src/main/java/com/example/findu/domain/repository/HomeRepository.kt (1)
6-9: 위치 기반 쿼리 지원을 위한 파라미터 추가
lat와lon파라미터가 nullable로 추가되어서 선택적으로 위치 기반 데이터를 가져올 수 있게 되었네요. 파라미터 순서도 논리적으로 적절합니다.app/src/main/java/com/example/findu/data/dataremote/datasourceimpl/HomeRemoteDataSourceImpl.kt (1)
12-16: 서비스 시그니처 수동 확인 필요ast-grep 실행이 출력 없이 종료되어 자동 검증 실패. HomeService.getHome(lat, lon) 메서드 시그니처(매개변수 타입·nullable 여부)가 아래 호출부와 정확히 일치하는지 수동 확인 필요.
파일: app/src/main/java/com/example/findu/data/dataremote/datasourceimpl/HomeRemoteDataSourceImpl.kt (lines 12–16)
override suspend fun getHome( lat: Double?, lon: Double? ): BaseResponse<HomeResponseDto> = homeService.getHome(lat, lon)확인 포인트: HomeService에 suspend fun getHome(lat: Double?, lon: Double?) 또는 호환되는 시그니처가 존재하는지.
app/src/main/java/com/example/findu/data/dataremote/service/HomeService.kt (2)
5-7: API 상수 활용으로 URL 관리 개선하드코딩된 URL 경로를 ApiConstraints 상수로 교체한 건 좋은 접근이에요. URL 관리가 중앙화되어 유지보수성이 향상됩니다.
13-16: 위치 기반 데이터를 위한 선택적 쿼리 파라미터 추가lat, lon 파라미터를 선택적으로 받도록 하여 위치 기반 홈 데이터 조회가 가능해졌네요. API 후진 호환성도 유지되고, 기본값 null 설정도 적절합니다.
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraDepartmentScreen.kt (1)
27-31: 리스트 렌더링 로직 정상LazyColumn과 items를 사용한 부서 리스트 렌더링이 적절하게 구현되어 있습니다.
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraVolunteerScreen.kt (1)
25-30: 봉사 활동 리스트 UI 구현 완료LazyColumn으로 봉사 활동 목록을 렌더링하는 로직이 깔끔하게 구현되어 있어요.
app/src/main/java/com/example/findu/data/repositoryimpl/HomeRepositoryImpl.kt (1)
13-16: 위치 정보 파라미터 전파 구현Repository 계층에서 위치 정보를 데이터 소스로 올바르게 전달하고 있어요. 전체 데이터 플로우가 일관성 있게 업데이트되었네요.
app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraDepartmentItem.kt (1)
64-68: 전화 걸기 기능 구현 완료전화번호 클릭 시 다이얼 Intent가 적절하게 구현되어 있네요. 사용자 경험이 좋을 것 같아요.
app/src/main/java/com/example/findu/presentation/ui/extra/component/ExtraCenterItem.kt (1)
48-54: 관할 구역 표시 로직forEach를 사용해서 관할 구역 목록을 표시하는 방식이 간단하고 효과적이네요.
app/src/main/java/com/example/findu/presentation/ui/extra/view/ExtraCenterScreen.kt (1)
55-62: 드래그 핸들 디자인 구현상단에 드래그 핸들 스타일의 Divider가 깔끔하게 구현되어 있네요. 사용자가 직관적으로 드래그 가능한 영역임을 알 수 있을 것 같아요.
app/src/main/java/com/example/findu/domain/usecase/GetHomeUseCase.kt (1)
9-12: UseCase 시그니처 업데이트 완료위치 정보 파라미터를 받도록 시그니처가 업데이트되고, Repository로 올바르게 전달되고 있어요. 전체 아키텍처에 일관성 있게 적용되었네요.
app/src/main/java/com/example/findu/presentation/model/HomeExtraContent.kt (1)
6-11: LGTM! 깔끔한 sealed interface 구조홈 추가 콘텐츠를 위한 명확한 타입 안전 구조입니다. sealed interface와 data class/object를 활용한 적절한 설계입니다.
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt (1)
98-98: URL 스킴 일관성 확인첫 번째 VolunteerWork은
https://를 포함하지만, 프리뷰 데이터는www.로 시작합니다.URL 처리 시 스킴이 없는 경우를 대비한 처리가 필요할 수 있습니다:
val normalizedUrl = if (!webLink.startsWith("http://") && !webLink.startsWith("https://")) { "https://$webLink" } else { webLink }Also applies to: 105-105
app/src/main/java/com/example/findu/data/mapper/todomain/HomeResponseDtoMapper.kt (2)
15-16: 통계 필드 매핑이 올바르게 구현되었습니다.
recent7days의 구조대 활동물 수와 실종 동물 수를 각각todayRescuedAnimalCount와todayReportAnimalCount로 매핑하는 로직이 적절합니다.
28-33: 필드 이름 불일치 확인 필요HomeResponseDtoMapper의 PeriodStatistics.toDomain에서 reportedAnimalCount에 lostAnimalCount를 매핑하고 있습니다. ast-grep로 도메인 data class PeriodStatistics 정의를 찾지 못해 검증이 불완전합니다. 도메인 모델의 실제 필드명(reportedAnimalCount vs lostAnimalCount)을 확인하고, 의도적이면 주석 또는 테스트로 명시하고 비의도적이면 매핑을 수정하세요.
위치: app/src/main/java/com/example/findu/data/mapper/todomain/HomeResponseDtoMapper.kt (28–33)
app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt (1)
176-179: 외부 링크 열기 로직 적절합니다.
ACTION_VIEW인텐트를 사용한 웹 링크 열기 구현이 올바릅니다.app/src/main/java/com/example/findu/data/dataremote/model/response/HomeResponseDto.kt (1)
17-24: 통계 데이터 구조 개선됨기간별 통계 데이터를
Statistics클래스로 구조화한 것이 좋은 설계입니다. 7일, 3개월, 1년 단위로 나누어 관리하는 구조가 명확합니다.app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (2)
93-99: 다이얼로그 상태 관리 적절함리포트 다이얼로그의 표시/숨김 상태를
isReportDialogVisible플래그로 관리하는 것이 깔끔합니다.
168-190: 네비게이션 헬퍼 메소드들 잘 구현됨각 네비게이션 액션을 위한 개별 메소드들이 명확하게 분리되어 있어 좋습니다. UI Effect를 통한 네비게이션 처리 패턴이 일관성 있게 적용되었습니다.
| ) | ||
|
|
||
| data class CenterList( | ||
| val departments: List<Center>, |
There was a problem hiding this comment.
CenterList의 프로퍼티명 수정 필요
CenterList에서 departments 프로퍼티명이 실제 담고 있는 Center 타입과 맞지 않습니다.
data class CenterList(
- val departments: List<Center>,
+ val centers: List<Center>,
val lastId: Int,
val isLast: Boolean
)📝 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.
| val departments: List<Center>, | |
| data class CenterList( | |
| val centers: List<Center>, | |
| val lastId: Int, | |
| val isLast: Boolean | |
| ) |
🤖 Prompt for AI Agents
In app/src/main/java/com/example/findu/domain/model/extra/HomeExtraDataType.kt
around line 36, the HomeExtraDataType property is currently named `departments`
but holds a List<Center>; rename the property to a name matching its type (e.g.,
`centers: List<Center>`) and update all usages/constructors/serialization
mappings across the codebase to use the new name.
| uiState.homeData?.let { | ||
| HomeReportCard( | ||
| modifier = Modifier.padding(15.dp), | ||
| homeStatistics = it.statistics, | ||
| indicatorClicked = indicatorClicked, | ||
| homeReportDuration = uiState.reportDataDuration | ||
| ) | ||
| } | ||
| } |
There was a problem hiding this comment.
homeData null 체크 일관성 부족
113번 줄에서 uiState.homeData?.let으로 null 체크를 하지만, 163번과 177번 줄에서는 !!를 사용합니다.
일관된 null 처리가 필요합니다:
-animalCards = uiState.homeData!!.protectAnimalCards,
+animalCards = uiState.homeData?.protectAnimalCards ?: emptyList(),-animalCards = uiState.homeData!!.reportAnimalCards,
+animalCards = uiState.homeData?.reportAnimalCards ?: emptyList(),Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In
app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt
around lines 113-121 (and also touching lines ~163 and ~177), the code uses
uiState.homeData?.let at line 113 but uses non-null assertions (!!) at lines 163
and 177 causing inconsistent and unsafe null handling; change to a single
consistent approach by either (A) early-return or show a placeholder when
uiState.homeData is null (e.g., val homeData = uiState.homeData ?: return or
showEmptyState()) and then use homeData.* without !!, or (B) expand the existing
let block to encompass the UI code at 163 and 177 so you reference the scoped
non-null it (or named homeData) instead of using !!; remove all !! operators and
replace them with safe scoped usage or safe calls.
|
|
||
| data class OnboardingUiState( | ||
| val pageState: Int = 1, | ||
| val kakaoId:Long = -1L, |
There was a problem hiding this comment.
🧩 Analysis chain
Kakao ID 초기값 일관성 확인
kakaoId의 기본값이 -1L로 설정되어 있습니다. 이 값이 서버 API와의 계약에서 유효하지 않은 ID를 나타내는지 확인이 필요합니다.
🏁 Script executed:
#!/bin/bash
# PostSignupUseCase 구현 확인
fd -t f "PostSignupUseCase" -e kt | xargs cat | head -50
# 서버로 전송되는 signup 요청 모델 확인
rg -A 10 "data class.*Signup.*Request" --type=kotlinLength of output: 1695
SignupRequestDto에 kakaoId 누락 및 기본값 처리 검증 필요
OnboardingViewModel.kt에서 kakaoId 기본값을 -1L로 설정했으나, 실제 서버 전송 모델(SignupRequestDto.kt)에는 해당 필드가 없습니다.
- 백엔드 API 계약에 kakaoId가 필수인지 확인하고, 누락됐다면
SignupRequestDto에 추가 -1L이 유효하지 않은 ID를 나타내는지 API 문서로 검증하거나, nullable 타입(null)으로 변경 검토
🤖 Prompt for AI Agents
In
app/src/main/java/com/example/findu/presentation/ui/onboarding/viewmodel/OnboardingViewModel.kt
around line 26, the ViewModel defines kakaoId with a default of -1L but
SignupRequestDto doesn't contain kakaoId; confirm the backend API contract and
either (A) if kakaoId is required by the API, add a kakaoId property to
SignupRequestDto (matching type and serialized name expected by the server) and
propagate the ViewModel value into the DTO when building the request, ensuring
serialization and unit tests updated, or (B) if the API treats missing/nullable
IDs, change the ViewModel field to a nullable Long? (or remove the -1L sentinel)
and update request mapping to omit null fields so no invalid -1 is sent.
# Conflicts: # app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (3)
app/src/main/java/com/example/findu/domain/model/extra/HomeExtraDataType.kt (3)
3-3: sealed interface로 전환해서 when exhaustiveness 보장
HomeExtraDataType는 합타입의 마커 역할이라 sealed interface가 더 안전합니다. 컴파일 타임에 분기 누락을 막을 수 있어요.-interface HomeExtraDataType +sealed interface HomeExtraDataType
5-10: 전화번호 필드 네이밍 일관화 (phone→phoneNumber)
Department.phonevsCenter.phoneNumber가 불일치합니다. 도메인 계층에서 통일해두면 매퍼/프레젠테이션에서 실수 줄일 수 있어요.data class Department( val name: String, val district: String, - val phone: String + val phoneNumber: String ) : HomeExtraDataType
11-18: VolunteerWork: URL 네이밍 간결화 및 기간/시간 타입 고도화 제안
webLink→url로 간결화 권장.- (옵션)
recruitmentPeriod,workPeriod,workTime는 문자열보다 값 객체(예: DateRange, LocalTimeRange)로 모델링하면 포맷/로케일 이슈를 하위 레이어로 밀어낼 수 있습니다.data class VolunteerWork( val institution: String, val recruitmentPeriod: String, val address: String, val workPeriod: String, val workTime: String, - val webLink: String + val url: String ) : HomeExtraDataType
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
app/src/main/java/com/example/findu/domain/model/extra/HomeExtraDataType.kt(1 hunks)app/src/main/res/navigation/nav_graph.xml(1 hunks)app/src/main/res/values/strings.xml(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- app/src/main/res/values/strings.xml
- app/src/main/res/navigation/nav_graph.xml
🔇 Additional comments (1)
app/src/main/java/com/example/findu/domain/model/extra/HomeExtraDataType.kt (1)
21-26: Center: 리스트 필드 복수형, 이름/전화 필드 일관성
jurisdiction가List<String>이면 복수형(jurisdictions)이 자연스럽습니다.centerName→name으로 단순화하면Department.name과도 맞춰져요.- 전화 필드 네이밍은 위 코멘트와 함께 전반 정리 추천.
data class Center( - val jurisdiction: List<String>, - val centerName: String, + val jurisdictions: List<String>, + val name: String, val phoneNumber: String, val address: String )아래 스크립트로 코드베이스 사용처 영향을 빠르게 확인해 주세요(리포지토리 루트에서 실행).
#!/bin/bash # 네이밍/타입 변경 영향 탐색 set -euo pipefail rg -n --type=kotlin -C2 '\b(centerName|jurisdiction\s*:\s*List<String>|webLink|phone\s*:\s*String)\b' # 과거 피드백과 연관된 CenterList 네이밍도 점검 rg -n --type=kotlin -C2 'data\s+class\s+CenterList|departments\s*:\s*List<Center>|centers\s*:\s*List<Center>'
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt
Show resolved
Hide resolved
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (1)
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt (1)
35-37: 빈 Effect 클래스(detekt 경고) 정리 권장현재 빈 sealed class로 detekt 경고(EmptyClassBlock)가 발생합니다. 유지 의도라면 규칙 억제, 아니라면 제거를 권장합니다.
detekt 기반 제안입니다.
적용 예시(억제 주석 추가):
-sealed class HomeExtraUiEffect { +@Suppress("detekt:EmptyClassBlock") +sealed class HomeExtraUiEffect { }
🧹 Nitpick comments (6)
app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (2)
124-146: 상태 업데이트 방식 통일이 필요해요.
refreshData메서드에서 대부분.update {}를 사용하고 있는데, 130번 라인에서만 직접 할당(_uiState.value = _uiState.value.copy(...))을 사용하고 있어요. 일관성을 위해.update {}로 통일하면 좋겠습니다.- _uiState.value = _uiState.value.copy( - loadState = LoadState.Success, - homeData = data, - errorMessage = null, - isRefreshing = false - ) + _uiState.update { it.copy( + loadState = LoadState.Success, + homeData = data, + errorMessage = null, + isRefreshing = false + ) }
162-164: TODO 주석이 남아있네요.알람 기능이 아직 구현되지 않았다고 표시되어 있어요. 필요하시면 기본 구조를 만들어드리거나 이슈를 생성해드릴 수 있습니다!
알람 기능 구현에 도움이 필요하시면 말씀해주세요!
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt (4)
52-54: 사용되지 않는 Channel/uiEffect 노출현재
_uiEffect에 send 사용처가 없어 Dead code에 가깝습니다. 도입 전까지 제거하거나, SharedFlow로 전환만 해두는 것도 방법입니다. 불필요한 import(kotlinx.coroutines.flow.receiveAsFlow)도 함께 정리해주세요.제거 예시:
- private val _uiEffect = Channel<HomeExtraUiEffect>() - val uiEffect = _uiEffect.receiveAsFlow() + // TODO: One-off UI effects가 필요해지는 시점에 도입SharedFlow 전환 예시:
private val _uiEffect = MutableSharedFlow<HomeExtraUiEffect>(extraBufferCapacity = 64) val uiEffect: SharedFlow<HomeExtraUiEffect> = _uiEffect
64-71: SavedStateHandle 초기화는 init 블록으로 이동(재콜렉션 시 중복 실행 방지)
onStart는 신규 컬렉터마다 실행됩니다. WhileSubscribed(5s)로 공유 중지 후 재구독되면 초기화가 반복될 수 있어, 단발 초기화는 init에서 처리하는 편이 안전합니다.diff(해당 범위 교체):
- val uiState = _uiState.onStart { - val type: HomeExtraButtonType? = savedStateHandle[HOME_EXTRA_TYPE] - type?.let { - handleEvent(HomeExtraUiEvent.SetHomeExtraType(it)) - } - }.stateIn( - scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), initialValue = HomeExtraUiState() - ) + val uiState = _uiState.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = _uiState.value + )init 추가(범위 외 보조 코드):
init { val type: HomeExtraButtonType? = savedStateHandle[HOME_EXTRA_TYPE] type?.let { t -> _uiState.update { it.copy(homeExtraButtonType = t) } } }
77-82: 내부 접근 시 파생 StateFlow 대신 백킹 상태 사용동일 클래스 내부에서는
uiState.value보다_uiState.value가 의도에 명확합니다.- val content: HomeExtraContent = when (uiState.value.homeExtraButtonType) { + val content: HomeExtraContent = when (_uiState.value.homeExtraButtonType) { HomeExtraButtonType.PROTECT_CENTER -> HomeExtraContent.Centers(dummyCenters) - HomeExtraButtonType.PROTECT_DEPARTMENT -> HomeExtraContent.Departments(dummyDepartment) - HomeExtraButtonType.VOLUNTEER -> HomeExtraContent.Volunteers(dummyVolunteer) + HomeExtraButtonType.PROTECT_DEPARTMENT -> HomeExtraContent.Departments(dummyDepartments) + HomeExtraButtonType.VOLUNTEER -> HomeExtraContent.Volunteers(dummyVolunteers) null -> HomeExtraContent.None }
93-110: 더미 리스트 네이밍 일관성(복수형으로 통일)
dummyCenters(복수)와dummyDepartment/dummyVolunteer(단수) 혼재. 가독성 위해 복수형으로 통일 권장.- private val dummyVolunteer = listOf( + private val dummyVolunteers = listOf( ... - private val dummyDepartment = listOf( + private val dummyDepartments = listOf(위 사용처 수정(when 분기):
-HomeExtraContent.Departments(dummyDepartment) +HomeExtraContent.Departments(dummyDepartments) -HomeExtraContent.Volunteers(dummyVolunteer) +HomeExtraContent.Volunteers(dummyVolunteers)Also applies to: 111-117, 77-82
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt(5 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt (1)
app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (1)
handleEvent(81-100)
app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (1)
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt (1)
handleEvent(55-62)
🪛 detekt (1.23.8)
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt
[warning] 35-37: The class or object HomeExtraUiEffect is empty.
(detekt.empty-blocks.EmptyClassBlock)
🔇 Additional comments (11)
app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (8)
18-18: import 추가 잘하셨어요!
flow.update함수를 사용하면 상태 업데이트가 더 간결하고 안전해집니다. 파일 전반에 걸쳐 잘 활용하셨네요.
22-32: 다이얼로그 상태 관리가 깔끔해졌어요!
isReportDialogVisible플래그 추가로 다이얼로그 표시 여부를 명확하게 관리할 수 있게 되었네요. 상태 구조 단순화도 좋습니다.
34-49: 이벤트 구조 개선 잘하셨습니다!
OnReportDialogDismiss이벤트 추가로 다이얼로그 닫기를 명시적으로 처리할 수 있게 되었네요.
51-61: 타입 안전한 네비게이션이 좋네요!
NavigateToProtectDetail과NavigateToReportDetail에서 animal 객체를 직접 전달하는 방식이 타입 안전하고 좋습니다.다만,
Dial이펙트에 전화번호 파라미터가 없어서 어떤 번호로 전화를 걸어야 할지 불명확해요. 나중에 전화 기능 구현 시 전화번호를 함께 전달하는 것이 좋을 것 같습니다.예시:
-data object Dial : HomeUiEffect() +data class Dial(val phoneNumber: String) : HomeUiEffect()
81-100: 다이얼로그 이벤트 핸들링 깔끔합니다!
OnReportDialogClick과OnReportDialogDismiss처리가.update {}를 사용해서 간결하고 읽기 좋네요.
148-160: 상태 업데이트 패턴 일관성 좋습니다!
clearError와changeReportDuration에서.update {}를 일관되게 사용하고 있어 좋네요.
167-189: 네비게이션 메서드 구조가 깔끔합니다!각 네비게이션 기능을 별도 메서드로 분리하고, animal 객체를 파라미터로 전달하는 방식이 명확하고 좋네요. 타입 안전성도 확보되어 있습니다.
198-205: 배너 및 스크롤 상태 관리 잘하셨어요!배너 페이지 변경과 스크롤 위치에 따른 버튼 표시 로직이 깔끔하게 구현되어 있습니다.
app/src/main/java/com/example/findu/presentation/ui/extra/viewmodel/HomeExtraViewModel.kt (3)
55-62:StateFlow.update활용 굿이전 피드백 반영되어 thread-safe하게 상태 갱신하는 방향으로 잘 정리되었습니다.
46-47: 네비게이션 인자 키 일치 확인 완료
HOME_EXTRA_TYPE("homeExtraType")가 nav_graph.xml의 android:name과 동일합니다.
30-33:data object지원 확인됨 (Kotlin 1.9.24)
프로젝트가 Kotlin 1.9.24를 사용 중이므로data object는 정상적으로 컴파일됩니다.
# Conflicts: # app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
Related issue 🛠
Work Description 📝
홈 추가 화면들 UI를 구현합니다
Screenshot 📸
Screen_recording_20250922_170249.mp4
Uncompleted Tasks 😅
To Reviewers 📢
지역 선택 드롭다운 버튼은 API 연동하면서 추가할게요!
Summary by CodeRabbit
신규 기능
UI
문구/현지화