Skip to content

Comments

[Feat] 홈 추가정보 화면 UI 구현#93

Merged
t1nm1ksun merged 27 commits intodevelopfrom
feat-home-extra
Oct 10, 2025
Merged

[Feat] 홈 추가정보 화면 UI 구현#93
t1nm1ksun merged 27 commits intodevelopfrom
feat-home-extra

Conversation

@t1nm1ksun
Copy link
Collaborator

@t1nm1ksun t1nm1ksun commented Sep 22, 2025

Related issue 🛠

Work Description 📝

홈 추가 화면들 UI를 구현합니다

  • 보호소, 동물병원 뷰
    • CenterItem 컴포넌트 구현
    • 주소복사 기능
    • 센터 번호 전화 기능
  • 보호부서 뷰
    • DepartmentItem 컴포넌트 구현
    • 주소복사 기능
    • 부서 번호 전화 기능
  • 봉사활동 뷰
    • VolunteerItem 컴포넌트 구현
    • 웹뷰 기능
  • Home -> HomeExtra nav_graph 추가
  • HomeExtra 분기처리

Screenshot 📸

Screen_recording_20250922_170249.mp4

Uncompleted Tasks 😅

  • 지도 추가

To Reviewers 📢

지역 선택 드롭다운 버튼은 API 연동하면서 추가할게요!

Summary by CodeRabbit

  • 신규 기능

    • 홈 화면에서 보호 센터/보호 부서/자원봉사 추가 정보 화면으로 이동 가능
    • 각 화면에서 항목 리스트 제공: 전화 걸기, 주소 복사, 상세 링크 열기 등 상호작용 지원
    • 상단 앱 바 컴포넌트 도입으로 뒤로가기/액션 아이콘 제공
  • UI

    • 센터/부서/자원봉사 전용 아이콘과 레이아웃 추가
    • 홈 버튼 목록을 단일 목록으로 통합해 일관된 탐색 제공
  • 문구/현지화

    • 배너 숫자 표시 형식 개선
    • 버튼/화면 타이틀 관련 문자열 추가 및 명칭 정비

# 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
@coderabbitai
Copy link

coderabbitai bot commented Sep 22, 2025

Walkthrough

홈 추가정보 기능을 도메인/프레젠테이션 모델, 컴포저블 UI, ViewModel, 내비게이션, 문자열/아이콘 리소스 전반에 걸쳐 추가했다. 홈 버튼 타입·리스트를 재구성하고, 새 HomeExtraFragment와 Compose 화면(센터/부서/봉사) 및 아이템 컴포넌트를 도입했으며, 인자 기반 로드 흐름과 다이얼/복사/브라우저 액션을 연계했다.

Changes

Cohort / File(s) Summary
Domain extra models
app/src/main/java/com/example/findu/domain/model/extra/HomeExtraDataType.kt
HomeExtraDataType 마커 인터페이스와 Department, VolunteerWork, Center 데이터 클래스 추가
Presentation content sum type
app/src/main/java/com/example/findu/presentation/model/HomeExtraContent.kt
홈 추가정보 컨텐츠를 표현하는 sealed interfaceNone/Centers/Volunteers/Departments 변형 추가
Button type rename
app/src/main/java/com/example/findu/presentation/type/HomeExtraButtonType.kt
HomeButtonTypeHomeExtraButtonType로 개명, HOSPITAL 제거, PROTECT_PARTPROTECT_DEPARTMENT로 변경
Top app bar base UI
app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt
FindUTopAppBar 컴포저블 추가(타이틀, 선택적 내비/액션 아이콘)
Extra fragment & nav
app/src/main/java/com/example/findu/presentation/ui/extra/HomeExtraFragment.kt, app/src/main/res/layout/fragment_home_extra.xml, app/src/main/res/navigation/nav_graph.xml
HomeExtraFragment 추가(ComposeView, Hilt, 인자 수신), 레이아웃/내비 그래프에 fragment_home_extra와 액션, 인자(homeExtraType) 추가
Extra screens
.../ui/extra/view/ExtraCenterScreen.kt, .../ExtraDepartmentScreen.kt, .../ExtraVolunteerScreen.kt
센터/부서/봉사 리스트 화면 컴포저블 추가, 상단 앱바 및 리스트 구성
Extra item components
.../ui/extra/component/ExtraCenterItem.kt, .../ExtraDepartmentItem.kt, .../ExtraVolunteerItem.kt
각 아이템 UI 추가: 전화 다이얼, 주소/구역 복사, 웹 링크 열기 등 액션 포함
Home integration
.../ui/home/composeview/HomeScreen.kt, .../ui/home/component/HomeButtonList.kt, .../ui/home/HomeFragment.kt
HomeButtonListHomeExtraButtonList로 대체, 콜백 시그니처 변경 및 navigateToHomeExtra(HomeExtraButtonType) 연동, 프래그먼트에서 내비게이션 처리 추가
Home extra ViewModel
.../ui/extra/viewmodel/HomeExtraViewModel.kt
HomeExtraUiState/Event/Effect 정의, 인자 기반 LoadData 처리, 더미 데이터로 HomeExtraContent 생성
Strings
app/src/main/res/values/strings.xml
포맷 수정(home_banner_num), 키 변경(home_button_PROTECT_DEPARTMENT), 추가 문자열(home_extra_*, home_extra_copy)
Drawables
app/src/main/res/drawable/ic_home_extra_*, ic_right_arrow_gray_20.xml
복사/봉사 관련 아이콘 및 화살표 벡터 리소스 추가

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
Loading
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
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • [Feat] Home UI 구현 #70: 홈 버튼 타입/리스트 개편과 연계되어, 이번 PR의 HomeExtraButtonType/HomeExtraButtonList 변경과 직접적으로 맞물립니다.

Suggested reviewers

  • MinseoSONG
  • ikseong00
  • nasohee

Poem

버튼을 톡, 길은 셋으로 갈라지고
센터는 전화로, 부서는 주소로, 봉사는 링크로
가을빛 아이콘 반짝이며 길잡이 되고
탑앱바 아래 스크롤은 조용히 흐른다
홈의 밖, 또 다른 홈이 피어났네 🌿📱

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Out of Scope Changes Check ⚠️ Warning HomeViewModel의 상태 업데이트 리팩토링과 배너 문자열 변경 등 홈 추가정보 기능과 직접 관련 없는 사소한 코드 및 리소스 수정이 포함되어 있어 이슈 범위에서 벗어난 변경이 발견됩니다. 홈 추가정보 화면 구현 기능 이외의 리팩토링과 문자열 수정을 별도 PR로 분리하거나 해당 변경을 축소하여 이 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 (3 passed)
Check name Status Explanation
Title Check ✅ Passed 제목은 변경사항의 핵심인 홈 추가정보 화면 UI 구현을 간결하고 명확하게 요약하고 있어 PR의 주요 내용을 잘 반영합니다.
Linked Issues Check ✅ Passed 링크된 이슈 #85에서 요구한 보호소·동물병원(센터 통합), 보호부서, 봉사 화면의 UI 컴포넌트 구현과 네비게이션 분기 로직이 모두 구현되어 있으며 미완료로 명시된 지도 연동을 제외하고는 목표를 온전히 달성했습니다.
Description Check ✅ Passed PR 설명은 템플릿의 모든 필수 섹션(Related issue, Work Description, Screenshot, Uncompleted Tasks, To Reviewers)을 정확하게 포함하고 있으며 각 섹션에 구체적인 내용이 잘 기입되어 있습니다.
✨ 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-home-extra

📜 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 4413764 and b13126a.

📒 Files selected for processing (5)
  • app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt (3 hunks)
  • app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt (4 hunks)
  • app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (3 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 (1)
  • app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt (1)
app/src/main/java/com/example/findu/presentation/ui/home/component/HomeButtonList.kt (1)
  • HomeExtraButtonList (25-47)
🔇 Additional comments (13)
app/src/main/java/com/example/findu/presentation/ui/home/HomeFragment.kt (3)

21-21: LGTM!

새로운 HomeExtraButtonType을 위한 import가 정상적으로 추가되었습니다.


136-137: LGTM!

HomeScreen에 navigateToHomeExtra 콜백이 올바르게 연결되었습니다. 기존 navigation 패턴과 일관성 있게 구현되었네요.


205-209: LGTM!

navigateToHomeExtra 메서드가 기존 navigation 메서드들과 동일한 패턴으로 깔끔하게 구현되었습니다. Safe Args를 활용한 type-safe navigation이 잘 적용되었네요.

app/src/main/res/values/strings.xml (3)

242-242: "+" 기호 제거 의도 확인 필요

배너 번호 포맷이 "%d/%d +" 에서 "%1$d / %2$d"로 변경되면서 trailing "+" 기호가 제거되었습니다. 위치 기반 파라미터 사용과 spacing 개선은 좋은 변경이지만, "+" 기호 제거가 의도된 것인지 확인이 필요합니다.


507-507: LGTM!

String key가 enum 이름(PROTECT_DEPARTMENT)과 일치하도록 변경되었습니다. 네이밍 일관성이 개선되었네요.


511-514: LGTM!

HomeExtra 화면을 위한 새로운 string 리소스들이 명확하고 적절하게 추가되었습니다.

app/src/main/java/com/example/findu/presentation/ui/home/composeview/HomeScreen.kt (5)

33-33: LGTM!

HomeExtraButtonType import가 정상적으로 추가되었습니다.


37-37: LGTM!

HomeButtonList에서 HomeExtraButtonList로 import가 업데이트되었습니다.


63-63: LGTM!

navigateToHomeExtra 파라미터가 올바르게 추가되었습니다. 기존 navigation callback 패턴과 일관성 있게 정의되었네요.


133-138: LGTM!

HomeExtraButtonList 컴포넌트가 올바르게 적용되었고, navigateToHomeExtra 콜백이 정상적으로 연결되었습니다.


237-238: LGTM!

Preview 함수가 새로운 파라미터를 포함하도록 올바르게 업데이트되었습니다.

app/src/main/res/navigation/nav_graph.xml (2)

31-33: LGTM!

fragment_home에서 fragment_home_extra로 연결되는 navigation action이 올바르게 추가되었습니다.


36-45: LGTM!

fragment_home_extra destination이 완벽하게 구성되었습니다. HomeExtraButtonType을 argument로 받아 type-safe navigation을 지원하도록 잘 설정되었네요.


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.

@t1nm1ksun t1nm1ksun changed the title Feat home extra [Feat] 홈 추가화면 UI를 구현합니다 Sep 22, 2025
@t1nm1ksun t1nm1ksun changed the title [Feat] 홈 추가화면 UI를 구현합니다 [Feat] 홈 추가정보 화면 UI를 구현합니다 Sep 22, 2025
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: 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가 "실종신고"에 연결되어 있는데, 네이밍이 직관적이지 않습니다. onWitnessReportClickedonMissingReportClicked 같은 네이밍이 더 명확할 것 같습니다.

함수명을 더 직관적으로 변경하는 것을 고려해보세요:

-    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 인터페이스를 구현하지 않음

다른 데이터 클래스들과 달리 CenterHomeExtraDataType을 구현하지 않아 일관성이 떨어집니다.

 data class Center(
     val jurisdiction: List<String>,
     val centerName: String,
     val phoneNumber: String,
     val address: String
-)
+) : HomeExtraDataType
app/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 매핑 로직 확인

reportIdprotectId로 매핑하는 부분이 의도적인지 확인이 필요합니다. 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 구현 필요

NavigateToProtectListNavigateToReportList 이벤트 처리가 아직 구현되지 않았습니다.

이 네비게이션 로직을 구현하는 코드를 작성해드릴까요? 새 이슈로 등록하시겠습니까?


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

📥 Commits

Reviewing files that changed from the base of the PR and between f6d1f0c and f04aa7f.

📒 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: 통계 데이터 구조 설계

HomeStatisticsPeriodStatistics가 잘 구조화되어 있고, getAllStatistics() 메서드를 통해 UI 렌더링에 편리한 형태로 데이터를 제공하고 있네요. 최근 7일, 3개월, 1년 단위로 나뉘어진 것도 사용자 관점에서 직관적입니다.


31-36: 통계 타입 enum 정의

StatisticsType enum이 한국어 라벨을 포함해서 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에서 HomeStatisticsPeriodStatistics로 변경되면서 더 구조화된 데이터 모델을 사용하게 되었네요.


44-48: 기간별 통계 데이터 선택 로직이 명확함

when 표현식을 사용해서 선택된 기간에 따른 통계 데이터를 깔끔하게 가져오는 구조가 좋습니다.


161-165: Preview 데이터가 새로운 구조에 맞게 업데이트됨

HomeStatisticsPeriodStatistics 구조로 미리보기 데이터가 잘 구성되어 있네요. 실제 데이터 구조와 일치하는지 확인해보면 좋겠습니다.


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: 위치 기반 쿼리 지원을 위한 파라미터 추가

latlon 파라미터가 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의 구조대 활동물 수와 실종 동물 수를 각각 todayRescuedAnimalCounttodayReportAnimalCount로 매핑하는 로직이 적절합니다.


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>,
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

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.

Suggested change
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.

Comment on lines 113 to 121
uiState.homeData?.let {
HomeReportCard(
modifier = Modifier.padding(15.dp),
homeStatistics = it.statistics,
indicatorClicked = indicatorClicked,
homeReportDuration = uiState.reportDataDuration
)
}
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

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,
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

🧩 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=kotlin

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

@t1nm1ksun t1nm1ksun changed the title [Feat] 홈 추가정보 화면 UI를 구현합니다 [Feat] 홈 추가정보 화면 UI 구현 Sep 22, 2025
# Conflicts:
#	app/src/main/java/com/example/findu/presentation/ui/base/TopAppBar.kt
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: 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: 전화번호 필드 네이밍 일관화 (phonephoneNumber)

Department.phone vs Center.phoneNumber가 불일치합니다. 도메인 계층에서 통일해두면 매퍼/프레젠테이션에서 실수 줄일 수 있어요.

 data class Department(
     val name: String,
     val district: String,
-    val phone: String
+    val phoneNumber: String
 ) : HomeExtraDataType

11-18: VolunteerWork: URL 네이밍 간결화 및 기간/시간 타입 고도화 제안

  • webLinkurl로 간결화 권장.
  • (옵션) 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

📥 Commits

Reviewing files that changed from the base of the PR and between f04aa7f and 4917ae0.

📒 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: 리스트 필드 복수형, 이름/전화 필드 일관성

  • jurisdictionList<String>이면 복수형(jurisdictions)이 자연스럽습니다.
  • centerNamename으로 단순화하면 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>'

Copy link
Collaborator

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4917ae0 and 4413764.

📒 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: 타입 안전한 네비게이션이 좋네요!

NavigateToProtectDetailNavigateToReportDetail에서 animal 객체를 직접 전달하는 방식이 타입 안전하고 좋습니다.

다만, Dial 이펙트에 전화번호 파라미터가 없어서 어떤 번호로 전화를 걸어야 할지 불명확해요. 나중에 전화 기능 구현 시 전화번호를 함께 전달하는 것이 좋을 것 같습니다.

예시:

-data object Dial : HomeUiEffect()
+data class Dial(val phoneNumber: String) : HomeUiEffect()

81-100: 다이얼로그 이벤트 핸들링 깔끔합니다!

OnReportDialogClickOnReportDialogDismiss 처리가 .update {} 를 사용해서 간결하고 읽기 좋네요.


148-160: 상태 업데이트 패턴 일관성 좋습니다!

clearErrorchangeReportDuration에서 .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는 정상적으로 컴파일됩니다.

Copy link
Collaborator

@nasohee nasohee left a comment

Choose a reason for hiding this comment

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

수고하셨습니다!!!

# Conflicts:
#	app/src/main/java/com/example/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
@t1nm1ksun t1nm1ksun merged commit 83890ce into develop Oct 10, 2025
1 check passed
@t1nm1ksun t1nm1ksun deleted the feat-home-extra branch October 10, 2025 06:51
This was referenced Oct 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 홈 추가정보 화면 구현

3 participants