feat: 마이페이지 - 고객지원 UI구현 (#17)#28
Conversation
- QnA부분에서 질문(Q)만 clickable하게 수정
- 플랜/결제, 계정/설정 Faq 내용 추가
…l-from-ai/CallFromAi_Android into feature/17-mypage-support-ui
|
Warning Review limit reached
Next review available in: 56 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (6)
📝 WalkthroughWalkthrough마이페이지에 FAQ와 약관 화면을 추가하고, FAQ 데이터를 도메인·데이터 계층에서 제공하도록 구성했습니다. 새로운 라우팅 키와 엔트리를 앱 네비게이션에 연결했으며, 관련 마이페이지 UI와 BottomBar 매핑도 변경했습니다. Changes마이페이지 고객지원
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant 사용자
participant MyPageScreen
participant AppScreen
participant FaqScreen
사용자->>MyPageScreen: FAQ 선택
MyPageScreen->>AppScreen: navigateToFaq()
AppScreen->>FaqScreen: FaqNavKey 엔트리 표시
FaqScreen->>FaqScreen: 카테고리 선택 및 질문 펼침
Possibly related PRs
🚥 Pre-merge checks | ✅ 5 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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 |
Gemini AI 코드리뷰안녕하세요! PR 잘 봤습니다. FAQ와 약관 화면 추가 및 마이페이지 내비게이션 연결 작업으로 보이네요. 전반적으로 Orbit MVI 패턴과 Jetpack Compose의 모범 사례들을 잘 적용하고 계셔서 인상 깊습니다. 특히 ViewModel에서 비즈니스 로직과 UI 상태를 분리하고, Compose에서 상태 호이스팅 및 불필요한 리컴포지션을 방지하려는 노력이 돋보입니다. 다만, 몇 가지 개선할 점이 있어 코멘트 남깁니다. 💡 General Feedback가장 중요한 부분은 하드코딩된 문자열 관리입니다. 현재 FAQ 내용과 약관 내용, 그리고 UI에 표시되는 일부 텍스트들이 코드 내에 직접 입력되어 있습니다. 이는 다국어 지원, 유지보수, 그리고 텍스트 변경 시 앱 업데이트가 필요하다는 점에서 지양해야 합니다. FAQ와 약관 내용은 백엔드 API를 통해 가져오거나, 최소한 로컬 그 외에는 대체적으로 깔끔하고 좋은 코드라고 생각합니다. 🔎 Detailed Review
|
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@feature/mypage/impl/src/main/java/kr/co/call/impl/screen/FaqScreen.kt`:
- Around line 109-123: Update the FAQ UI rendering around FaqViewModel and the
existing loadStatus/items branches so LoadStatus.Error is displayed as a
distinct error state instead of “등록된 질문이 없습니다.”, while preserving the
empty-state message only for successful empty results. Subscribe to
FaqSideEffect.ShowError using LaunchedEffect and collect, then surface the
failure to the user through the established error presentation mechanism.
In `@feature/mypage/impl/src/main/java/kr/co/call/impl/screen/TermScreen.kt`:
- Around line 42-67: Replace the hardcoded body text in TermScreen with the
approved 전화왔어 terms and privacy-policy content, removing all references to the
unrelated “화록” service, its features, and Kakao login. Keep the existing title
and rendering structure unless the approved source requires corresponding
content updates.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 401062b3-7a51-4063-a11e-ec296d9582c9
📒 Files selected for processing (17)
app/src/main/java/kr/co/call/callfromai/AppScreen.ktapp/src/main/java/kr/co/call/callfromai/util/MainTabExt.ktcore/data/src/main/java/kr/co/call/data/di/RepositoryModule.ktcore/data/src/main/java/kr/co/call/data/repositoryImpl/FaqRepositoryImpl.ktcore/domain/src/main/java/kr/co/call/domain/model/mypage/FaqCategory.ktcore/domain/src/main/java/kr/co/call/domain/model/mypage/FaqItem.ktcore/domain/src/main/java/kr/co/call/domain/repository/FaqRepository.ktfeature/mypage/api/src/main/java/kr/co/call/api/MyPageRoute.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/SettingSectionCard.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/entry/MyPageEntryBuilder.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/screen/ComingSoonScreen.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/screen/FaqScreen.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/screen/MyPageScreen.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/screen/TermScreen.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/FaqSideEffect.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/FaqState.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/FaqViewModel.kt
| when { | ||
| loadStatus == LoadStatus.Loading -> { | ||
| Text( | ||
| text = "불러오는 중...", | ||
| style = CallTheme.typography.bodyMedium, | ||
| color = CallTheme.colors.gray400, | ||
| ) | ||
| } | ||
| items.isEmpty() -> { | ||
| Text( | ||
| text = "등록된 질문이 없습니다.", | ||
| style = CallTheme.typography.bodyMedium, | ||
| color = CallTheme.colors.gray400, | ||
| ) | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
오류 상태를 빈 FAQ 상태로 표시하지 마세요.
FaqViewModel은 실패 시 LoadStatus.Error와 ShowError를 발생시키지만, 여기서는 결국 “등록된 질문이 없습니다.”로 렌더링됩니다. 오류 상태를 별도 표시하고 FaqSideEffect.ShowError도 구독해 실제 실패를 사용자에게 알리세요.
As per path instructions, “sideEffect는 LaunchedEffect + collect로 구독”해야 합니다.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@feature/mypage/impl/src/main/java/kr/co/call/impl/screen/FaqScreen.kt` around
lines 109 - 123, Update the FAQ UI rendering around FaqViewModel and the
existing loadStatus/items branches so LoadStatus.Error is displayed as a
distinct error state instead of “등록된 질문이 없습니다.”, while preserving the
empty-state message only for successful empty results. Subscribe to
FaqSideEffect.ShowError using LaunchedEffect and collect, then surface the
failure to the user through the established error presentation mechanism.
Source: Path instructions
Gemini AI 코드리뷰안녕하세요, 시니어 Android 개발자입니다. PR 잘 봤습니다! FAQ 및 약관 화면 추가와 관련된 전반적인 구조 개선이 잘 진행된 것 같습니다. 특히 Jetpack Compose의 모범 사례와 Orbit MVI 패턴을 잘 적용하려는 노력이 돋보입니다. 몇 가지 중점적으로 살펴본 부분과 개선할 점을 말씀드리겠습니다. ✨ 전반적인 개선 사항 요약새로운 FAQ 및 약관 화면을 추가하고, 기존 마이페이지 내비게이션에 통합하는 작업을 깔끔하게 처리했습니다. Compose 상태 관리 원칙(State Hoisting, 다만, 대부분의 사용자에게 노출되는 FAQ와 약관 내용이 현재는 하드코딩되어 있습니다. 이 부분은 실제 서비스 운영 시 유연한 대응을 위해 반드시 개선되어야 할 부분입니다. 1. Kotlin 코드 리뷰 (공통)
2. Jetpack Compose 코드
3. Repository/DataSource 레이어
4. ViewModel
5. FCM/SSE/실시간 통신 관련 코드
기타 사항
최종 의견전반적으로 매우 좋은 PR입니다. 특히 Jetpack Compose와 Orbit MVI 패턴을 모범적으로 적용하고 있으며, UI 상태 관리도 견고하게 설계되었습니다. 위에서 언급한 하드코딩된 문자열 처리와 파일 끝 빈 줄 추가만 보완된다면 완벽할 것 같습니다. 계속해서 좋은 코드 기대하겠습니다! |
Gemini AI 코드리뷰안녕하세요! GitHub PR 리뷰를 담당하는 시니어 Android 개발자입니다. 새로운 FAQ 및 약관 화면 추가 PR에 대해 리뷰를 진행하겠습니다. 전반적으로 MVI 패턴과 Jetpack Compose의 모범 사례를 잘 적용하려고 노력한 흔적이 보여서 좋습니다. 몇 가지 개선 사항과 잠재적 문제점에 대해 피드백 드리겠습니다. PR 요약이 PR은 앱에 FAQ (자주 묻는 질문) 및 약관 화면을 추가하는 기능입니다. 이를 위해 다음과 같은 변경 사항이 포함되었습니다:
코드 리뷰 상세1. Kotlin 코드 리뷰
2. Jetpack Compose 코드 리뷰
3. Repository/DataSource 레이어
4. ViewModel
5. FCM/SSE/실시간 통신 관련 코드
기타 개선 사항
결론 및 다음 단계전반적으로 이 PR은 Jetpack Compose와 Orbit MVI 패턴을 사용하여 FAQ 및 약관 화면을 잘 구현했습니다. 특히 Composable의 State Hoisting과 가장 중요한 개선점은 하드코딩된 문자열 (특히 FAQ 내용과 약관 내용)을 이 외의 지적사항들은 주로 컨벤션이나 향후 확장을 위한 조언이므로, 하드코딩된 문자열 문제만 해결된다면 이 PR은 merge 될 수 있을 것 같습니다. 수정 후 다시 리뷰를 요청해주세요. 감사합니다! |
codebidoof
left a comment
There was a problem hiding this comment.
아마 faq 관련 부분은 ViewModel까지 안 가고 문자열만 xml로 관리해서 컴포저블 단에서만 처리해도 될 것 같긴 한데 추후에 확장성까지 고려한다면 지금 방식이 맞을 수 도 있겠당 어프루브 할 게여~!!
| interface FaqRepository { | ||
| suspend fun getFaqItems(): Result<Map<FaqCategory, List<FaqItem>>> | ||
| } No newline at end of file |
There was a problem hiding this comment.
아마 이게 "자주 하는 질문" 쪽 같은데, 음 api 호출이 없다면 나같으면 UseCase 썼을 듯? 레포지토리는 약간 실제 저장소와 통하는 창구 느낌이라고 생각해서..근데 머 크게 상관은 없는 듯 해 헤헷
| fun EntryProviderScope<NavKey>.myPageEntry( | ||
| navigateToFaq: () -> Unit, | ||
| navigateToTerms: () -> Unit, | ||
| onBack: () -> Unit = {}, | ||
| ) { | ||
| entry<MyPageNavKey> { | ||
| MyPageScreen() | ||
| MyPageScreen( | ||
| navigateToFaq = navigateToFaq, | ||
| navigateToTerms = navigateToTerms, | ||
| ) | ||
| } | ||
| } | ||
|
|
||
| entry<FaqNavKey> { | ||
| FaqScreen(onBackClick = onBack) | ||
| } | ||
|
|
||
| entry<TermNavKey> { | ||
| TermScreen(onBackClick = onBack) | ||
| } | ||
| } No newline at end of file |
There was a problem hiding this comment.
이런 식으로 나의 초기세팅을 사용 해 주니 뿌듯하네..
| Column(modifier = modifier | ||
| .fillMaxSize() | ||
| .background(CallTheme.colors.background) | ||
| .statusBarsPadding()) { |
Gemini AI 코드리뷰안녕하세요! 시니어 안드로이드 개발자로서 이번 PR에 대한 코드 리뷰를 진행하겠습니다. 전반적으로 Jetpack Compose, Orbit MVI, Hilt 등 최신 기술 스택을 활용하여 깔끔하게 잘 구현된 PR이라고 생각합니다. 특히 Compose의 상태 호이스팅, 다만, 몇 가지 개선할 점과 고려해야 할 사항들이 있으니 아래 내용을 참고하여 반영해 주시면 더욱 완성도 높은 코드가 될 것 같습니다. 🔍 전체 PR 요약이번 PR은 '자주 하는 질문(FAQ)' 및 '약관/개인정보 처리 방침(Terms)' 화면을 추가하는 내용입니다.
코드 리뷰 상세1.
|
📄 작업 내용 요약
📎 Issue 번호
✅ 작업 목록
📝 기타 참고사항
Summary by CodeRabbit