Design/#116 면접 UI 구현 - #129
Conversation
|
Warning Review limit reached
Next review available in: 54 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. 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: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthrough인터뷰 API·구현 모듈과 Navigation 3 엔트리를 추가했습니다. CameraX 기반 프리뷰와 Compose 인터뷰 화면을 구현했습니다. 인터뷰 상태, 오류 처리, 디자인 시스템 아이콘과 버튼 스타일을 확장했습니다. Changes인터뷰 기능 기반 및 네비게이션
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related PRs
Suggested labels: Suggested reviewers: Sequence Diagram(s)sequenceDiagram
participant Navigation
participant InterviewScreen
participant InterviewViewModel
participant InterviewContent
participant CameraX
participant InterviewScreenOngoingLayer
Navigation->>InterviewScreen: InterviewRoute 진입
InterviewScreen->>InterviewViewModel: 상태 수집
InterviewViewModel-->>InterviewScreen: InterviewState 반환
InterviewScreen->>InterviewContent: 상태와 Intent 전달
InterviewContent->>CameraX: 전면 카메라 프리뷰 바인딩
InterviewContent->>InterviewScreenOngoingLayer: 진행 상태 렌더링
InterviewScreenOngoingLayer->>InterviewViewModel: ChangeSpeaker Intent
InterviewViewModel-->>InterviewContent: 변경된 InterviewState 반환
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 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 |
Catalog Preview상태: ❌ 최신 Preview 배포 실패 마지막으로 성공한 Preview가 없습니다. 실패 Commit: 실행: GitHub Actions |
There was a problem hiding this comment.
Actionable comments posted: 8
🤖 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/interview/api/src/main/kotlin/com/dminus14/app/feature/interview/api/InterviewRoute.kt`:
- Around line 4-15: Update InterviewRoute and InterviewErrorRoute to implement
the Navigation 3 NavKey contract and annotate both types with `@Serializable` so
they can be used with entry<T> and persisted by rememberNavBackStack; add the
required imports without changing their existing route data or error-type
fields.
In
`@feature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewCameraPreview.kt`:
- Around line 83-85: Update the camera-binding flow in CameraPreviewReal so
failures from cameraProvider.bindToLifecycle() are exposed through UI state
instead of being swallowed. Use that failure state to render CameraPreviewMock
or an explicit error UI, ensuring the empty AndroidView is not shown after
binding fails.
- Around line 76-82: Update the camera setup and cleanup flow around the visible
cameraProvider binding block: remove both unbindAll() calls, obtain the
ProcessCameraProvider inside the existing future listener rather than waiting on
the UI executor, and clean up only the created preview use case via
cameraProvider.unbind(preview) before rebinding it. Preserve the lifecycleOwner,
cameraSelector, and preview binding behavior.
In
`@feature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewTimer.kt`:
- Around line 39-47: Update the timer formatting logic around remainingSeconds
so negative values are clamped to zero before calculating minutes and seconds,
then always render the result with the existing String.format(Locale.US,
"%d:%02d", minutes, seconds) MM:SS format; remove the special sub-minute
"${remainingSeconds...}초" branch.
In
`@feature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/di/InterviewNavigationModule.kt`:
- Around line 16-21: InterviewNavigationModule의 provideInterviewEntryInstaller에서
비어 있는 onNavigateHome 및 onResumeInterview 람다를 실제 상위 Navigator 호출로 연결하십시오.
InterviewErrorScreen의 NavigateToHome과 ResumeInterview 효과가 각각 홈 화면 이동과 면접 재개 동작으로
전달되도록 기존 Navigation API와 대상 라우트를 재사용하십시오.
In
`@feature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/interview/InterviewContract.kt`:
- Around line 47-48: Update the canFinishedEarly getter in InterviewContract so
early completion is allowed when elapsedSeconds is exactly equal to or greater
than InterviewConstants.CAN_FINISH_INTERVIEW_SECONDS, including the 480-second
boundary.
In
`@feature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/interview/InterviewScreen.kt`:
- Line 39: InterviewScreen의 권한 흐름에서 권한 상태를 하드코딩하거나 기본값에 의존하지 말고,
InterviewViewModel 또는 기존 권한 처리 계층의 isCameraPermissionGranted를 실제 상태로 공급하세요. 이 값을
InterviewScreenBaseLayer와 InterviewScreenPrepareLayer에서 InterviewCameraPreview까지
전달해 거부 시 CameraPreviewReal() bind를 시도하지 않도록 하고, 거부 상태의 뒤로가기 아이콘에는 홈 이동 effect
경계까지 연결되는 클릭 콜백을 전달하세요.
In
`@feature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/layer/InterviewScreenOngoingLayer.kt`:
- Around line 51-62: InterviewScreenOngoingLayer의 `면접 종료하기` 버튼이 실제 종료 동작을 수행하도록
연결하십시오. 레이어에 `onFinishRequest` 콜백을 추가하고, `InterviewScreen`에서 종료 모달 또는 종료 Intent를
실행하는 핸들러를 전달하십시오. 버튼의 `onClick`에서 빈 람다 대신 해당 콜백을 호출하고 기존 `isInterviewOngoing`
활성화 조건은 유지하십시오.
🪄 Autofix
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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: a2fdf10f-d61a-43f1-b81d-e3aee880b65a
📒 Files selected for processing (40)
.gitignoreCLAUDE.mdcore/resources/src/commonMain/composeResources/drawable/alert_red.xmlcore/resources/src/commonMain/composeResources/drawable/finish.xmlcore/resources/src/commonMain/composeResources/drawable/mic.xmlcore/resources/src/commonMain/composeResources/drawable/network.xmldata/src/test/kotlin/com/dminus14/app/data/remote/datasource/InterviewRemoteDataSourceTest.ktdesignsystem/src/commonMain/kotlin/com/dminus14/designsystem/component/button/HilitFixedBottomButton.ktdesignsystem/src/commonMain/kotlin/com/dminus14/designsystem/component/button/HilitMiniButton.ktdesignsystem/src/commonMain/kotlin/com/dminus14/designsystem/component/icon/HilitIcon.ktdesignsystem/src/commonMain/kotlin/com/dminus14/designsystem/component/modal/HilitModal.ktdesignsystem/src/commonMain/kotlin/com/dminus14/designsystem/component/text/HilitTextHighlight.ktfeature/interview/api/build.gradle.ktsfeature/interview/api/src/main/kotlin/com/dminus14/app/feature/interview/api/InterviewRoute.ktfeature/interview/impl/build.gradle.ktsfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/InterviewConstants.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewAbortModal.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewCameraFrame.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewCameraPreview.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewCompletableBubble.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewFinishModal.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewReadinessIndicator.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewSpeakerIndicator.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewStartButton.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/InterviewTimer.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/TrapezoidShape.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/component/VideoOverlay.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/di/InterviewNavigationModule.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/error/InterviewErrorContract.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/error/InterviewErrorScreen.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/error/InterviewErrorViewModel.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/interview/InterviewContract.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/interview/InterviewScreen.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/interview/InterviewViewModel.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/layer/InterviewScreenBaseLayer.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/layer/InterviewScreenOngoingLayer.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/layer/InterviewScreenPrepareLayer.ktfeature/interview/impl/src/main/kotlin/com/dminus14/app/feature/interview/navigation/InterviewEntryBuilder.ktgradle/libs.versions.tomlsettings.gradle.kts
There was a problem hiding this comment.
질문
- 흐르는 애니메이션이 요구사항이었던걸로 기억하는데, 변경되었거나 혹은 후속작업 예정이신가요?
There was a problem hiding this comment.
아! 그럼 그렇게 반영해서 병합해 둘게용
lyh5427
left a comment
There was a problem hiding this comment.
승인합니다!
질문 1건, coflict, ci 확인 부탁드립니다!
|
/noti |
|
스윙스 ㅋㅋㅋㅋㅋㅋㅋㅋ |
🚩 연관 이슈
closed #116
📝 작업 내용
면접 진행/오류 화면 UI 구현. UI 완성도에 집중하기 위해 로직은 최소한으로만 연결함 (아래 "신경 써야 할 부분" 참고).
feature:interview모듈 신설:feature:interview:api,:feature:interview:impl모듈 추가InterviewRoute,InterviewErrorRoute(MIC/NETWORK) 정의, Navigation3 EntryProvider 연결camera-core/camera2/lifecycle/view) 의존성 추가InterviewNavigationModule의onNavigateHome,onResumeInterview콜백이 빈 람다로 스텁 처리되어 있음. 실제 상위 네비게이션 연결은 후속 작업 필요.면접 진행 화면 (
InterviewScreen)InterviewScreenBaseLayer(카메라 프리뷰 + 그라데이션 오버레이 + 얼굴 가이드 프레임),InterviewScreenPrepareLayer(준비 상태 안내/시작 버튼),InterviewScreenOngoingLayer(타이머/발언자 인디케이터/조기 종료 버튼) 3개 레이어로 구성InterviewCameraPreview: 전면 카메라 CameraX 프리뷰,@Preview/권한 미허용 시 Mock Placeholder로 대체InterviewReadinessIndicator,InterviewTimer,InterviewSpeakerIndicator,InterviewCompletableBubble,InterviewStartButton,InterviewAbortModal,InterviewFinishModal등 하위 Composable 신설InterviewAbortModal/InterviewFinishModal의 버튼 클릭 콜백,InterviewScreenOngoingLayer의 종료 버튼onClick이 아직 상위로 연결되지 않은 부분 있음(로직 연결 최소화 스코프).면접 오류 화면 (
InterviewErrorScreen)609:9269,609:9259)InterviewErrorViewModelMVI 연결, 오류 유형별 문구·버튼 구성 분기디자인 시스템 변경
HilitMiniButton:enabled파라미터 추가, 비활성 스타일 분기 추가HilitFixedBottomButton:when분기를 Kotlin guard 문법(if)으로 정리HilitTextHighlight:Black하이라이트 색상 추가HilitModalPreviewHost를internal→public으로 변경 (feature 모듈 Preview에서 재사용 목적)alert_red,finish,mic,network권한 추가
매니페스트에 음성 녹음 및 카메라 권한 추가
기타
InterviewRemoteDataSourceTest: deprecated된ResponseBody.create→toResponseBody확장 함수로 교체 (CI 오류 대응)🏞️ 스크린샷 (선택)
면접 화면
InterviewScreen면접 오류 화면
기타 세부 UI
Base Layer
Prepare Layer
Ongoing Layer
실제 실행 화면
🗣️ 리뷰 요구사항 (선택)
별도 없음
Summary by CodeRabbit
새로운 기능
개선 사항