[Feat] 마이페이지 UI 구현 - 대표 화면 (#11)#18
Conversation
- ProfileCard 및 SettingsSectionCard 컴포넌트 제작
- 충전/구매/내역/문의하기 클릭 시 준비중(ComingSoon) 화면 노출 - 뒤로가기+타이틀 상단바를 CommonTopAppBar로 분리
📝 WalkthroughWalkthrough마이페이지 프로필 모델과 저장소를 추가하고, 더미 프로필 조회·로그아웃·계정 삭제를 Hilt와 ViewModel에 연결했습니다. Compose 기반 프로필 카드, 설정 메뉴, 다이얼로그 및 상태 기반 대표 화면을 구현했습니다. Changes마이페이지 기능
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant MyPageScreen
participant MyPageViewModel
participant MyPageRepository
participant MyPageRepositoryImpl
MyPageScreen->>MyPageViewModel: 프로필 로딩 시작
MyPageViewModel->>MyPageRepository: getMyProfile()
MyPageRepository->>MyPageRepositoryImpl: 구현체 호출
MyPageRepositoryImpl-->>MyPageViewModel: MyPageProfile 반환
MyPageViewModel-->>MyPageScreen: 상태 업데이트 및 화면 렌더링
Possibly related PRs
🚥 Pre-merge checks | ✅ 5 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Gemini AI 코드리뷰코드 리뷰: 마이페이지 기능 구현안녕하세요! 마이페이지 기능 구현 PR 잘 봤습니다. Orbit MVI, Jetpack Compose, Hilt 등 최신 기술 스택을 활용하여 모듈화되고 깔끔하게 구현해주셨네요. 전반적으로 코드 품질이 높고 가이드라인을 잘 따라주신 것 같아 만족스럽습니다. 몇 가지 개선 사항과 Follow-up 할 부분에 대한 코멘트 남깁니다. 1. Kotlin 코드 리뷰
2. Jetpack Compose 코드
3. Repository/DataSource 레이어
4. ViewModel (Orbit)
5. FCM/SSE/실시간 통신 관련 코드
총평전반적으로 위에 언급된 개선 사항들은 대부분 마이너한 부분이며, 주로 디자인 시스템 컬러 하드코딩 제거, 접근성 향상을 위한 Content Description 개선, 로딩 UI 구현, 국제화를 위한 문자열 리소스 분리에 집중되어 있습니다. 이 부분들을 반영하면 더욱 완성도 높은 코드가 될 것입니다. 훌륭한 PR 감사합니다! 👍 |
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (3)
feature/mypage/impl/src/main/java/kr/co/call/impl/screen/ComingSoonScreen.kt (2)
47-52: 📐 Maintainability & Code Quality | 🔵 Trivial앱 로고 아이콘 TODO 처리
Line 48에
TODO: 실제 앱 로고 아이콘으로 교체주석이 있습니다. 현재ic_mypage_ticket을 임시로 사용 중입니다. 실제 로고 아이콘으로 교체하는 작업을 추적할 이슈가 필요해 보입니다.도움이 필요하시면 교체용 drawable 리소스 추가 및 참조 변경 작업을 도와드릴 수 있습니다. 별도 이슈를 열어 추적하시겠습니까?
🤖 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/ComingSoonScreen.kt` around lines 47 - 52, Track the TODO in ComingSoonScreen’s Icon by creating a follow-up issue for replacing the temporary ic_mypage_ticket painter with the actual app logo drawable; leave the current resource reference unchanged until that asset is available.
32-39: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win전체 화면 Dialog를 위한
decorFitsSystemWindows검토
fillMaxSize()와usePlatformDefaultWidth = false를 사용해 전체 화면 Dialog를 의도한 것으로 보이나,decorFitsSystemWindows = false가 설정되어 있지 않아 시스템 바(상태바/내비게이션바) 영역까지 콘텐츠가 확장되지 않습니다.CommonTopAppBar가 화면 최상단에 닿지 않을 수 있습니다.🔧 제안: decorFitsSystemWindows 추가
Dialog( onDismissRequest = onBackClick, - properties = DialogProperties(usePlatformDefaultWidth = false), + properties = DialogProperties( + usePlatformDefaultWidth = false, + decorFitsSystemWindows = false, + ), ) {🤖 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/ComingSoonScreen.kt` around lines 32 - 39, Update the full-screen Dialog in ComingSoonScreen by configuring its DialogProperties with decorFitsSystemWindows disabled, while preserving usePlatformDefaultWidth = false and the existing Column layout so the content can extend into system bar areas.feature/mypage/impl/src/main/java/kr/co/call/impl/screen/MyPageScreen.kt (1)
174-182: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win버전 정보 메뉴의 빈
onClick— 클릭 ripple이 표시되지만 동작 없음
onClick = { }로 전달된 버전 정보 행은SettingsMenuContent내부에서.clickable(onClick = onClick)이 항상 적용되어, 사용자가 탭하면 ripple 효과만 나타나고 아무 일도 일어나지 않습니다.SettingsMenuContent의onClick을 nullable로 변경하여 비클릭 항목을 지원하는 것을 권장합니다.♻️ 제안: SettingsMenuContent onClick을 nullable로 변경
SettingsMenuContent.kt:`@Composable` fun SettingsMenuContent( icon: String, label: String, modifier: Modifier = Modifier, - onClick: () -> Unit, + onClick: (() -> Unit)? = null, trailing: `@Composable` () -> Unit = { ... }, ) { Row( modifier = modifier - .clickable(onClick = onClick) + .then(if (onClick != null) Modifier.clickable(onClick = onClick) else Modifier) .padding(vertical = 11.dp, horizontal = 25.dp), ...
MyPageScreen.kt버전 정보 항목:SettingsMenuContent( - icon = "ℹ️", label = "버전 정보", onClick = { }, + icon = "ℹ️", label = "버전 정보", trailing = { ... } })🤖 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/MyPageScreen.kt` around lines 174 - 182, Update SettingsMenuContent to accept a nullable onClick callback and apply clickable behavior only when onClick is non-null. Change the version information item in MyPageScreen to pass null instead of an empty lambda, preserving click behavior for other menu items while removing the inactive ripple.
🤖 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/component/ProfileSummaryContent.kt`:
- Around line 86-102: Update the Box modifier in TierBadge to use the function’s
modifier parameter as the base before applying clip, background, and padding, so
modifiers supplied by callers are preserved.
- Around line 48-57: Update the AsyncImage contentDescription expression in
ProfileSummaryContent so it no longer exposes profileImageUrl as accessibility
text. Since profileImageUrl is non-nullable, use isBlank() for any blank check
and provide a fixed meaningful description such as “프로필 이미지”, or null when the
image should be decorative.
In
`@feature/mypage/impl/src/main/java/kr/co/call/impl/component/ProfileTicketContent.kt`:
- Around line 76-96: Update TicketActionButton to remove the fixed width(105.dp)
modifier so callers’ Modifier.weight(1f) controls equal-width distribution
within the Row; preserve the button’s other sizing, styling, click behavior, and
content alignment.
In `@feature/mypage/impl/src/main/java/kr/co/call/impl/screen/MyPageScreen.kt`:
- Line 36: MyPageScreen에서 Orbit MVI 상태 구독에 collectAsState() 대신
collectAsStateWithLifecycle()을 사용하도록 import와 해당 상태 수집 호출을 변경하세요. 화면의 기존 상태 처리와
UI 동작은 그대로 유지하세요.
In
`@feature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/MyPageViewModel.kt`:
- Around line 60-67: Update MyPageViewModel.logout and deleteAccount to catch
repository exceptions, convert them into the established domain error type, and
publish the UI error flow through the existing ShowError-style side effect or
explicit operation state. Only post NavigateToLogin or NavigateToLanding after
the repository call succeeds, preserving the current success destinations.
- Around line 13-15: MyPageViewModel의 MyPageRepository 직접 의존성을 제거하고, 프로필
조회·로그아웃·탈퇴에 대응하는 core:domain UseCase를 주입하세요. ViewModel의 관련 처리 로직은 Repository 호출
대신 각 UseCase를 호출하도록 변경하며, 상태 업데이트와 SideEffect 처리 흐름은 유지하세요.
- Around line 42-56: Update the failure handling in MyPageViewModel’s
runCatching flow so CancellationException is rethrown instead of being converted
to LoadStatus.Error. Keep the existing error-state reduction for all other
exceptions, and add the necessary cancellation check before reduce.
---
Nitpick comments:
In
`@feature/mypage/impl/src/main/java/kr/co/call/impl/screen/ComingSoonScreen.kt`:
- Around line 47-52: Track the TODO in ComingSoonScreen’s Icon by creating a
follow-up issue for replacing the temporary ic_mypage_ticket painter with the
actual app logo drawable; leave the current resource reference unchanged until
that asset is available.
- Around line 32-39: Update the full-screen Dialog in ComingSoonScreen by
configuring its DialogProperties with decorFitsSystemWindows disabled, while
preserving usePlatformDefaultWidth = false and the existing Column layout so the
content can extend into system bar areas.
In `@feature/mypage/impl/src/main/java/kr/co/call/impl/screen/MyPageScreen.kt`:
- Around line 174-182: Update SettingsMenuContent to accept a nullable onClick
callback and apply clickable behavior only when onClick is non-null. Change the
version information item in MyPageScreen to pass null instead of an empty
lambda, preserving click behavior for other menu items while removing the
inactive ripple.
🪄 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: 92e3b12d-b938-40d9-9ff7-1e5a10b97cad
📒 Files selected for processing (21)
core/data/src/main/java/kr/co/call/data/di/RepositoryModule.ktcore/data/src/main/java/kr/co/call/data/repositoryImpl/MyPageRepositoryImpl.ktcore/designsystem/src/main/res/drawable/ic_mypage_arrow_left.xmlcore/designsystem/src/main/res/drawable/ic_mypage_arrow_right.xmlcore/designsystem/src/main/res/drawable/ic_mypage_ticket.xmlcore/designsystem/src/main/res/drawable/img_mypage_profile_default.xmlcore/domain/src/main/java/kr/co/call/domain/model/mypage/MyPageProfile.ktcore/domain/src/main/java/kr/co/call/domain/repository/MyPageRepository.ktfeature/mypage/impl/build.gradle.ktsfeature/mypage/impl/src/main/java/kr/co/call/impl/component/CommonTopAppBar.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/ProfileCard.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/ProfileSummaryContent.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/ProfileTicketContent.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/SettingSectionCard.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/SettingsMenuContent.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/screen/ComingSoonScreen.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/screen/MyPageScreen.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/MyPageIntent.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/MyPageSideEffect.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/MyPageState.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/MyPageViewModel.kt
| class MyPageViewModel @Inject constructor( | ||
| private val myPageRepository: MyPageRepository, | ||
| ) : ViewModel(), ContainerHost<MyPageState, MyPageSideEffect> { |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift
ViewModel에서 Repository를 직접 호출하지 말고 UseCase로 위임하세요.
현재 MyPageViewModel이 MyPageRepository를 직접 주입해 프로필 조회·로그아웃·탈퇴를 모두 수행합니다. core:domain에 각 작업의 UseCase를 두고 ViewModel은 UseCase만 호출하도록 분리해야 계정 정책과 오류 매핑이 ViewModel에 누적되지 않습니다.
As per path instructions: ViewModel의 비즈니스 로직은 UseCase(core:domain) 호출로 위임해야 합니다.
Also applies to: 40-67
🤖 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/viewmodel/MyPageViewModel.kt`
around lines 13 - 15, MyPageViewModel의 MyPageRepository 직접 의존성을 제거하고, 프로필
조회·로그아웃·탈퇴에 대응하는 core:domain UseCase를 주입하세요. ViewModel의 관련 처리 로직은 Repository 호출
대신 각 UseCase를 호출하도록 변경하며, 상태 업데이트와 SideEffect 처리 흐름은 유지하세요.
Source: Path instructions
| private fun logout() = intent { | ||
| myPageRepository.logout() | ||
| postSideEffect(MyPageSideEffect.NavigateToLogin) | ||
| } | ||
|
|
||
| private fun deleteAccount() = intent { | ||
| myPageRepository.deleteAccount() | ||
| postSideEffect(MyPageSideEffect.NavigateToLanding) |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
로그아웃·탈퇴 실패를 UI 오류 흐름으로 전달하세요.
logout()과 deleteAccount()가 예외를 던지면 성공 SideEffect가 게시되지 않고, 사용자에게 실패 원인이나 재시도 방법도 전달되지 않습니다. 일반 예외를 도메인 오류로 변환한 뒤 ShowError 같은 SideEffect 또는 명시적인 작업 상태로 전달하고, 성공한 경우에만 로그인/랜딩 화면으로 이동해야 합니다.
🤖 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/viewmodel/MyPageViewModel.kt`
around lines 60 - 67, Update MyPageViewModel.logout and deleteAccount to catch
repository exceptions, convert them into the established domain error type, and
publish the UI error flow through the existing ShowError-style side effect or
explicit operation state. Only post NavigateToLogin or NavigateToLanding after
the repository call succeeds, preserving the current success destinations.
- contentDescription에 URL 문자열 수정 - modifier 파라미터 오타 수정 - 무효화된 width(105.dp) 제거
Gemini AI 코드리뷰안녕하세요! 시니어 Android 개발자입니다. 마이페이지 기능 구현을 위한 PR을 올려주셔서 감사합니다. 전반적으로 코드 품질이 매우 좋고, 최신 아키텍처 패턴(Orbit MVI, Hilt, Clean Architecture)을 잘 적용하셨습니다. Jetpack Compose UI 구현도 깔끔하고 State Hoisting 원칙도 잘 지켜진 것 같습니다. 몇 가지 개선 사항과 TODO 항목에 대한 코멘트들을 남깁니다. 1. Kotlin 코드 리뷰
2. Jetpack Compose 코드 리뷰
3. Repository/DataSource 레이어
4. ViewModel
5. FCM/SSE/실시간 통신 관련 코드
기타 개선 사항
총평전반적으로 매우 높은 수준의 코드이며, 마이페이지 기능 구현에 필요한 핵심 요소들을 잘 갖추고 있습니다. 특히 Orbit MVI 패턴과 Clean Architecture 구조를 효과적으로 적용한 점이 인상 깊습니다. 위에서 언급한 하드코딩된 문자열/매직 넘버들을 리소스 및 디자인 시스템 상수로 분리하고, TODO 항목들을 보완하면 더욱 완성도 높은 코드가 될 것입니다. 수고하셨습니다! 👍 |
| // 프로필 이미지 | ||
| AsyncImage( | ||
| model = profileImageUrl, | ||
| contentDescription = if (profileImageUrl.isBlank()) null else "프로필 이미지", |
There was a problem hiding this comment.
description에 굳이 url이 있어야할까요..?! 프로필 이미지 정도로 해도 될 것 같아요
- contentDescription을 프로필 이미지로 통일
Gemini AI 코드리뷰안녕하세요! PR 리뷰 요청 감사합니다. 시니어 Android 개발자의 관점에서 PR diff를 꼼꼼히 살펴보겠습니다. 전반적으로 아키텍처(Orbit MVI, Hilt DI, Repository 패턴)와 Jetpack Compose 활용(State Hoisting, UI 상태 관리)이 잘 적용되어 있으며, 코드도 깔끔하게 작성되어 있습니다. 특히 다만, 몇 가지 개선할 점들이 있어 피드백을 드립니다. 주로 하드코딩된 문자열과 몇몇 Compose 관행에 대한 내용입니다. 1. Kotlin 코드 리뷰
2. Jetpack Compose 코드
3. Repository/DataSource 레이어
4. ViewModel
5. FCM/SSE/실시간 통신 관련 코드
총평 및 최종 제안전반적으로 매우 좋은 코드이며, 아키텍처 및 Compose 설계 원칙을 잘 따르고 있습니다. 주요 개선 사항은 하드코딩된 문자열을 Action Items:
위 피드백이 PR 개선에 도움이 되기를 바랍니다. 궁금한 점이 있다면 언제든지 다시 문의해주세요! |
codebidoof
left a comment
There was a problem hiding this comment.
너무 최고야 난그냥 approve줄게 레포지토리 메서드 반환값만 고쳐줭
| override suspend fun getMyProfile(): MyPageProfile { | ||
| delay(500) | ||
| return MyPageProfile( | ||
| profileImageUrl = "", | ||
| nickname = "김수현", | ||
| tier = "Basic", | ||
| remainingTicketCount = 18, | ||
| appVersion = "1.0.0", | ||
| ) | ||
| } |
There was a problem hiding this comment.
이거 반환타입 Result로 하는거 추천~~!!
| data class MyPageProfile( | ||
| val profileImageUrl: String, | ||
| val nickname: String, | ||
| val tier: String, | ||
| val remainingTicketCount: Int, | ||
| val appVersion: String, | ||
| ) |
There was a problem hiding this comment.
크게 상관은 없을 것 같긴 한데
String들에 = "" 디폴트값 빈 문자열 처리 어때?
| fun CommonTopAppBar( | ||
| modifier: Modifier = Modifier, | ||
| title: String? = null, | ||
| onBackClick: (() -> Unit), |
There was a problem hiding this comment.
이거 맨 밖에 괄호는 빼는 게 더 예뻐보일듯?
| } | ||
|
|
||
| // 상단 타이틀 | ||
| if (title != null) { |
There was a problem hiding this comment.
title을 디폴트를 "" 으로 바꾸고 isEmpty 로 처리하는게 어때~?
| // 버튼 컴포넌트 | ||
| @Composable | ||
| private fun TicketActionButton( | ||
| label: String, | ||
| onClick: () -> Unit, | ||
| modifier: Modifier = Modifier, | ||
| ) { | ||
| Box( | ||
| modifier = modifier | ||
| .height(46.dp) | ||
| .clip(RoundedCornerShape(8.dp)) | ||
| .background(CallTheme.colors.gray100) | ||
| .clickable(onClick = onClick), | ||
| contentAlignment = Alignment.Center, | ||
| ) { | ||
| Text( | ||
| text = label, | ||
| style = CallTheme.typography.bodyMediumMedium, | ||
| color = CallTheme.colors.black, | ||
| ) | ||
| } | ||
| } |
| @Composable | ||
| fun SettingsSectionCard( | ||
| modifier: Modifier = Modifier, | ||
| title: String? = null, |
There was a problem hiding this comment.
이것도 디폴트값 빈 문자열이 더 개취긴해
| trailing: @Composable () -> Unit = { | ||
| Icon( | ||
| painter = painterResource(id = R.drawable.ic_mypage_arrow_right), | ||
| contentDescription = "바로가기", | ||
| ) | ||
| }, |
There was a problem hiding this comment.
너무 기발한 발상이야 최고최고 안드 천재 개발자 최고!!!!!!!!!!!!!! 너무 탐난다~~~~~ 너 내 동료가 되라
| import kr.co.call.impl.component.CommonTopAppBar | ||
|
|
||
| @Composable | ||
| fun ComingSoonScreen( |
| Dialog( | ||
| onDismissRequest = onBackClick, | ||
| properties = DialogProperties(usePlatformDefaultWidth = false), | ||
| ) { |
There was a problem hiding this comment.
와 넌 진짜... 어떻게 이런 발상을 해? 다이알로그를 전체 화면처럼 띄워지게 하다니.... 역시 너야....
- 반환 타입을 Result<MyPageProfile> 변경 - String 필드 기본값 "" 변경 및 추가 - TicketActionButton 파일 분리
Gemini AI 코드리뷰안녕하세요! GitHub Pull Request 리뷰 요청해주셔서 감사합니다. 시니어 Android 개발자로서 마이페이지 기능 구현 PR을 꼼꼼히 리뷰해 드리겠습니다. 전반적으로 Jetpack Compose와 Orbit MVI 패턴을 잘 적용하여 구조화된 코드를 작성해 주셨습니다. 특히 ViewModel에서 UI 상태와 SideEffect를 명확히 분리하고, Compose UI에서 상태 호이스팅 원칙을 잘 지킨 점이 인상 깊습니다. 아래에 카테고리별로 상세한 피드백을 드립니다. 🔍 코드 리뷰1. Kotlin & General
2. Jetpack Compose
3. Repository/DataSource 레이어
4. ViewModel
5. FCM/SSE/실시간 통신 관련 코드
💡 종합 피드백 및 제안 사항
전반적으로 매우 깔끔하고 좋은 코드입니다. 제안 드린 사항들을 반영하시면 더 견고하고 유지보수하기 좋은 마이페이지 기능이 될 것입니다. 수고 많으셨습니다! |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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/component/TicketActionButton.kt`:
- Around line 30-34: TicketActionButton의 고정 너비 설정을 제거하여 호출부의
Modifier.weight(1f)가 버튼 너비를 제어하도록 수정하세요. ProfileTicketContent의 weight(1f) 호출부는
TicketActionButton 수정으로 정상 동작하므로 변경하지 마세요.
🪄 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: 6c03725e-bac2-45d8-b37a-e5e5ef22201a
📒 Files selected for processing (8)
core/data/src/main/java/kr/co/call/data/repositoryImpl/MyPageRepositoryImpl.ktcore/domain/src/main/java/kr/co/call/domain/model/mypage/MyPageProfile.ktcore/domain/src/main/java/kr/co/call/domain/repository/MyPageRepository.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/CommonTopAppBar.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/ProfileTicketContent.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/SettingSectionCard.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/component/TicketActionButton.ktfeature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/MyPageViewModel.kt
🚧 Files skipped from review as they are similar to previous changes (4)
- core/domain/src/main/java/kr/co/call/domain/repository/MyPageRepository.kt
- core/domain/src/main/java/kr/co/call/domain/model/mypage/MyPageProfile.kt
- feature/mypage/impl/src/main/java/kr/co/call/impl/component/SettingSectionCard.kt
- feature/mypage/impl/src/main/java/kr/co/call/impl/viewmodel/MyPageViewModel.kt
| .height(46.dp) | ||
| .clip(RoundedCornerShape(8.dp)) | ||
| .width(105.dp) | ||
| .background(CallTheme.colors.gray100) | ||
| .clickable(onClick = onClick), |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
TicketActionButton의 width(105.dp)가 호출부의 Modifier.weight(1f)를 무효화합니다. 두 파일 모두 동일한 근본 원인에서 비롯됩니다: TicketActionButton 내부의 고정 너비가 ProfileTicketContent에서 전달한 weight(1f) 균등 분배를 덮어씁니다.
feature/mypage/impl/src/main/java/kr/co/call/impl/component/TicketActionButton.kt#L30-L34:.width(105.dp)제거하여 호출부의weight(1f)가 너비를 제어하도록 수정.feature/mypage/impl/src/main/java/kr/co/call/impl/component/ProfileTicketContent.kt#L62-L66:TicketActionButton수정 후weight(1f)가 정상 작동하므로 호출부는 변경 불필요.
📍 Affects 2 files
feature/mypage/impl/src/main/java/kr/co/call/impl/component/TicketActionButton.kt#L30-L34(this comment)feature/mypage/impl/src/main/java/kr/co/call/impl/component/ProfileTicketContent.kt#L62-L66
🤖 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/component/TicketActionButton.kt`
around lines 30 - 34, TicketActionButton의 고정 너비 설정을 제거하여 호출부의
Modifier.weight(1f)가 버튼 너비를 제어하도록 수정하세요. ProfileTicketContent의 weight(1f) 호출부는
TicketActionButton 수정으로 정상 동작하므로 변경하지 마세요.
📄 작업 내용 요약
📎 Issue 번호
✅ 작업 목록
📝 기타 참고사항
Summary by CodeRabbit
Summary by CodeRabbit
새 기능
UI 개선