Feature/147: 알림함 클릭 및 백그라운드 알람 클릭 시 화면 이동 & 알람 읽음 처리#195
Conversation
- 공지사항 상세 내용을 표시하는 `NoticeScreen` 및 제목 섹션 컴포넌트 `NoticeTitleSection` 추가 - `AlarmTopBar`에서 텍스트를 주입받을 수 있도록 `topText` 파라미터 추가 및 하드코딩된 문자열 제거 - 공지사항 비즈니스 로직을 위한 `NoticeViewModel` 신규 생성 및 `AlarmRepository` 주입 - `AlarmScreen` 등 기존 호출부에서 변경된 `AlarmTopBar` 파라미터 대응 및 `onHomeClick` 기본값 적용 - `NoticeScreenContent` 내부에 스크롤 가능한 레이아웃 및 구분선(Divider) 적용 등의 기본 UI 구조 설계
- 알림 관련 DTO 패키지 이동 - 알람 상세 조회 DTO 작성 - 알림 읽음 및 알람 상세 조회 api 인터페이스 명세 작성
- 알림의 제목, 내용, 생성 날짜를 포함하는 `AlarmDetail` 도메인 모델 추가 - `AlarmRepository` 및 `AlarmRepositoryImpl`에 알림 상세 조회 및 읽음 상태 업데이트 메서드 구현 - `AlarmMapper`에 `AlarmDetailDTO`를 도메인 모델로 변환하는 매핑 로직 추가 - ISO 8601 형식의 문자열을 "yy.mm.dd" 포맷으로 변환하는 `String.toDate()` 확장 함수 추가
- 특정 알람을 읽음 상태로 업데이트하고 상세 정보를 반환하는 `NoticeAlarmReadUseCase` 추가 - `AlarmRepository`를 통해 읽음 처리(`readAlarm`)와 상세 조회(`getAlarmDetail`)를 순차적으로 수행하도록 구현 - `runCatching` 블록 내에서 `CancellationException` 발생 시에는 결과를 감싸지 않고 즉시 전파하도록 예외 처리 로직 적용
- `UseCaseModule`에 `NoticeAlarmReadUseCase`를 제공하는 `@Provides` 메서드 추가 - `AlarmRepository`를 의존성으로 주입받아 싱글톤 객체로 생성하도록 정의하여 core 모듈 내 유스케이스 사용 환경 구축
- `NoticeAlarmReadUseCase`의 `invoke` 함수 내 `runCatching` 블록 상단과 하단에 공백 라인을 추가하여 코드 가독성 향상
- `AlarmItem` 컴포저블에 `onClick` 콜백 매개변수 추가 및 프리뷰 구성 업데이트 - `HomeApp` 내비게이션 그래프에 알림 상세(`NoticeScreen`) 경로 추가 및 내비게이션 로직 작성 - `AlarmScreen`에서 상세 화면으로 이동하기 위한 `onNavigateToNotice` 콜백 정의 및 연동 - `NoticeAlarmReadUseCase`에서 상세 정보 조회보다 알림 읽음 처리를 먼저 수행하도록 로직 순서 변경 - `AlarmRepositoryImpl`의 `readAlarm` 함수에 실행 확인을 위한 디버그 로그 추가 - `HomeApp` 내 `openUrl` 함수의 `Intent`, `Uri` 참조 방식 최적화 및 임포트 정리
- `AlarmApi`의 상세 조회 API 명세를 `@Query`에서 `@Path` 파라미터 방식으로 변경 - `NoticeViewModel`에서 `SavedStateHandle`을 통해 알림 ID를 추출하고 상세 데이터를 로드하는 로직 구현 - `NoticeUiState`를 정의하고 `NoticeScreen`에 상태 관리를 위한 `collectAsStateWithLifecycle` 적용 - `NoticeScreen`의 하드코딩된 공지사항 제목, 날짜, 내용을 `uiState` 데이터로 연결 - `AlarmItem` 컴포넌트에 `onClick` 속성을 추가하여 클릭 상호작용 지원 - `AlarmDetail` 데이터 모델의 각 필드에 기본값 추가 및 Preview 환경 개선 (LinkuPreview 적용)
- 마크다운 형식을 지원하는 `LinkUMarkdownText` 컴포저블 및 `MarkdownLineType` 정의 - 불렛 포인트(`* `) 접두사를 감지하여 리스트 스타일로 렌더링하는 로직 추가 - `NoticeScreen`의 공지 본문 표시 컴포넌트를 `Text`에서 `LinkUMarkdownText`로 교체 - `NoticeScreen` 내 불필요한 import 및 TODO 주석 제거
- `LinkUMarkdownText`에 `1. ` 형식의 순서가 있는 목록(Ordered List)을 파싱하고 렌더링하는 로직 추가 - `MarkdownLineType`에 `OrderedList` 타입을 정의하고, 숫자와 마침표 접두사를 식별하도록 파싱 로직 개선 - `BulletPoint` 렌더링 시 좌측 패딩(16.dp)을 추가하여 목록의 들여쓰기 시각화 개선 - `LinkUMarkdownText` 및 `MarkdownLineType` 클래스에 KDoc 및 코드 내 상세 주석 추가하여 가독성 향상 - `MarkdownLineType`의 접두사 매칭 방식을 `when` 문 기반으로 변경하여 확장성 확보
- `AlarmItem` 컴포저블에 `isRead` 매개변수를 추가하여 외부 상태에 따른 UI 변경 지원 - `AlarmViewModel`에 `readAlarmIds` 상태를 도입하여 알람 클릭 시 서버 응답 대기 없이 즉시 읽음 표시(낙관적 업데이트) - 알람 읽기 API 호출 실패 시 `readAlarmIds`에서 해당 아이디를 제거하는 롤백 로직 추가 - `AlarmIntent.Refresh` 의도를 추가하고, 새로고침 시 로컬에서 관리하는 읽음 목록을 초기화하도록 구현 - `AlarmScreen`에서 페이징 데이터의 읽음 상태와 ViewModel의 실시간 읽음 상태를 결합하여 UI 반영
- `HomeApp`에서 `AlarmViewModel`을 생성하여 주입하던 방식을 `AlarmScreen` 내부에서 `hiltViewModel()`을 통해 직접 생성하도록 변경 - `NoticeScreen`에 `BackHandler`를 추가하여 시스템 백버튼 클릭 시 `onBack` 콜백이 실행되도록 개선 - `NoticeScreen`에서 뒤로가기 시 `alarm` 경로를 inclusive하게 pop한 후 다시 이동하도록 내비게이션 로직 수정 - `AlarmViewModel` 인스턴스 생성을 확인하기 위한 디버그 로그 추가 및 불필요한 로그 제거
- `AlarmViewModel` 내부에 `refreshTrigger`를 추가하여 페이징 데이터의 동적 갱신 로직 구현 - `flatMapLatest`를 사용하여 트리거 값이 변경될 때마다 `alarmRepository.getAlarms`를 다시 호출하여 데이터를 최신화하도록 수정 - `AlarmIntent.Refresh` 인텐트 수신 시, 읽은 알람 ID 목록(`_readAlarmIds`) 초기화와 함께 페이징 새로고침(`refreshPaging`)이 수행되도록 변경 - `ExperimentalCoroutinesApi` 어노테이션 추가 및 관련 Flow 연산자 적용
- 공지사항 화면에서 뒤로 이동 시 알람 화면을 백스택에서 제거(inclusive)하여 알람 상태 및 Paging 캐시가 초기화되도록 변경 - `AlarmViewModel` 내 낙관적 업데이트를 위한 `readAlarmIds` 및 Paging 갱신 로직에 대한 상세 설명 주석 추가 - `AlarmViewModel`의 `readAlarmIds` 명시적 타입 선언 제거 및 코드 가독성 개선 - `HomeApp` 내 폴더 이동 및 큐레이션 네비게이션 콜백 관련 TODO 주석 내용 보완
- `AndroidManifest.xml`에 `notice_icon_click` 액션을 수신하기 위한 `intent-filter` 추가 - `MainActivity`의 `onCreate` 및 `onNewIntent` 시점에 인텐트를 처리할 수 있도록 `handleIntent` 호출 로직 구현 - `handleIntent` 메서드를 통해 전달받은 인텐트의 `extras` 데이터와 `targetId`를 추출하고 로그로 출력하는 디버깅 코드 추가
- `AlarmApi`에 읽지 않은 알림 여부 조회를 위한 `GET alarm/unread` 엔드포인트 추가 - 알림 존재 여부 응답 처리를 위한 `UnreadAlarmExistDTO` 데이터 클래스 생성 - `AlarmRepository` 인터페이스에 `getUnreadAlarmExists` 메서드 정의 - `AlarmRepositoryImpl`에서 API를 호출하여 읽지 않은 알림 여부(`Boolean`)를 반환하도록 구현
- `HomeViewModel`에 `AlarmRepository` 의존성 추가 및 읽지 않은 알림 유무를 관리하는 `isUnreadAlarmExists` 상태 추가 - `HomeViewModel`에 알림 상태를 최신화하는 `refreshUnreadAlarm` 함수 구현 - `HomeScreen` 진입 시 `LaunchedEffect`를 사용하여 알림 상태를 갱신하도록 로직 추가 - `HomeTopBar`의 알림 아이콘 표시 여부(`isNoticeExist`)를 실제 데이터와 연결하여 UI에 반영
- `NavigationRoute`에 `Alarm` 경로를 추가하고 `MainApp` 내 네비게이션 그래프에 `AlarmScreen` 연결 - `AlarmButton` 컴포넌트 내부로 클릭 이벤트 핸들링(`onClick`) 및 `noRippleClickable` 로직을 이동하여 캡슐화 - `HomeTopBar` 및 `MypageTopBar`에서 `AlarmButton`을 감싸던 불필요한 `Box` 레이아웃 제거 및 코드 단순화 - `MyPageApp`에서 알림 화면으로의 이동을 내부 라우팅 대신 외부 콜백(`onNavigateToAlarm`)을 통하도록 변경 - 알림 화면(`AlarmScreen`) 진입 시 시스템 네비게이션 바를 숨기도록 설정 및 주요 화면 이동 로직 정의
- `MyPageViewModel`에 `AlarmRepository` 의존성 추가 및 읽지 않은 알림 여부를 확인하는 `checkUnreadAlarm` 함수 구현 - `MyPageUiState`에 `isUnreadAlarmExists` 상태 필드를 추가하여 UI 레이어와 연동 - `MyPageApp` 진입 시 `LaunchedEffect`를 통해 사용자 정보와 함께 알림 상태를 확인하도록 개선 - `MyPageScreen` 및 상단 바(`MypageTopBar`)에 실제 알림 유무 데이터를 전달하여 UI 업데이트 반영 - `MyPageScreen` 미리보기(Preview)에 알림 상태 파라미터 추가 적용
- `MyPageUiState` 업데이트 시 새 객체를 생성하는 대신 `copy()`를 사용하여 기존 상태를 유지하도록 변경 - 유저 정보 조회 성공 시 `error` 상태를 명시적으로 `null`로 초기화하도록 수정 - API 호출 결과 반영 시 로딩 상태 및 에러 메시지 업데이트 로직 안정화
- `NavigationRoute`에 공지사항 상세 경로(`Notice`) 및 `targetId` 인자 추가 - `MainApp` 네비게이션 그래프에 `NoticeScreen` 컴포저블 등록 - 공지사항 화면 진입 시 `LaunchedEffect`를 통해 하단 네비게이션 바(`showNavBar`) 숨김 처리 - 알림 화면 등에서의 공지사항 이동 콜백(`onNavigateToNotice`) 구현 - `onNavigateToLinkDetail` 파라미터 이름을 `targetId`로 변경하여 일관성 유지
- 상태바 전용 단색 아이콘(`ic_noti_logo.xml`) 추가 및 AndroidManifest에 FCM 기본 알림 아이콘으로 등록 - `LinkUFireBaseMessageService`에서 Small Icon은 신규 단색 아이콘으로, Large Icon은 기존 앱 로고(Bitmap)로 분리 적용하여 알림 시인성 개선 - `MainApplication`에서 기본 알림 채널의 중요도 설정을 `IMPORTANCE_HIGH`에서 `IMPORTANCE_DEFAULT`로 하향 조정
- 기존 벡터 에셋(`ic_noti_logo.xml`)을 삭제하고 PNG 이미지(`img_noti_ex.png`) 추가 - `LinkUFireBaseMessageService`에서 알림 생성 시 사용하는 `setSmallIcon` 리소스 변경 - `AndroidManifest.xml` 내 FCM 기본 알림 아이콘(`default_notification_icon`) 리소스 경로 수정 - 백그라운드 알림 수신 시 아이콘이 비정상적으로 단색 처리되는 문제를 리소스 포맷 변경(Vector → PNG)을 통해 해결
- 신규 알림 아이콘 이미지(`img_noti_ex_2.png`) 추가 - `LinkUFireBaseMessageService`에서 알림 생성 시 사용하는 소형 아이콘(`smallIcon`) 리소스 수정 - `AndroidManifest.xml` 내 FCM 기본 알림 아이콘(`default_notification_icon`) 설정 업데이트
- `HomeApp` 내 `NoticeScreen`에서 뒤로가기 시 `AlarmScreen`을 백스택에서 제거하고 다시 생성하던 비효율적인 로직 삭제 - `AlarmScreen`에 `LaunchedEffect`를 추가하여 화면 진입(리컴포지션) 시 `refreshPaging`을 호출하도록 변경 - `AlarmViewModel`의 `refreshPaging` 함수를 외부에서 호출 가능하도록 접근 제한자 수정 - 알람 목록 갱신 시 로그 기록 추가를 통해 동작 확인 가능하도록 개선
- `LinkUFireBaseMessageService`에서 FCM 데이터 메시지의 `type`과 `targetId`를 `Intent`에 포함하도록 수정 - `MainActivity`에서 `Intent`에 포함된 알림 데이터를 추출하여 `MainViewModel`로 전달하는 로직 추가 - `MainViewModel` 내 알림 처리용 `handleNotification` 함수 및 `NavigateByNotification` 사이드 이펙트 정의 - `MainApp`에서 사이드 이펙트를 수집하여 알림 타입(`NOTICE`, `LINK`)에 따라 해당 화면으로 네비게이션 수행 - 알림 데이터 기반의 딥링크 연동을 위한 기본적인 구조 설계 및 TODO 작성 (FOLDER, CURATION 타입)
# Conflicts: # app/src/main/java/com/linku/MainActivity.kt # feature/home/src/main/java/com/linku/home/HomeApp.kt
- `NoticeScreen`의 `onBack` 콜백에서 특정 경로(`alarm`)로 이동하던 로직을 `popBackStack()`으로 변경 - 공지사항 화면에서 뒤로가기 시 하드코딩된 경로가 아닌 직전 화면으로 올바르게 복귀하도록 수정
- `LinkUFireBaseMessageService`의 `onMessageReceived` 내 단계별 실행 로그를 추가하여 푸시 수신 과정 추적 강화 - 알림 제목(title), 본문(body) 또는 실행 인텐트가 없을 때 로직이 중단되던 조기 반환(early return) 코드 제거 - `AlarmRepositoryImpl`에서 서버로부터 알림 설정을 가져올 때 푸시 활성화 여부를 확인할 수 있는 로그 추가 - `LinkUFireBaseMessageService` 내 불필요한 주석 기호 정리 및 코드 가독성 개선
- `MainViewModel`에 인증 전 수신된 알림 정보를 임시 보관하고 소비하는 `pendingNotificationNav` 관련 로직 추가 - `MainApp` 내 공통 알림 내비게이션 함수 `navigateByNotification` 정의 및 `popUpTo`를 통한 백스택 관리 적용 - 자동 로그인 및 수동 로그인 성공 시점에 대기 중인 알림이 있을 경우 해당 목적지로 이동하는 로직 구현 - 알림 사이드 이펙트 수신 시 로그인 상태(`showNavBar`)에 따라 즉시 이동하거나 대기 상태로 전환하도록 수정 - `deepLinkViewModel` 호출부의 Null 안정성 처리 및 주석 정리
- `MainViewModel`에 `AlarmRepository` 의존성을 주입하고, 알림 처리 시 `alarmId`가 존재하면 읽음 처리(`readAlarm`)를 수행하도록 구현 - `LinkUFireBaseMessageService`에서 수신한 FCM 데이터 중 `alarmId`를 추출하여 인텐트에 포함하도록 수정 - `MainActivity`에서 인텐트 데이터를 추출할 때 `alarmId`를 함께 가져오며, `AlarmType` 파싱 시 `runCatching`을 사용하여 안정성 강화 - 알림 처리에 필수적인 데이터(`type`, `targetId`)가 없을 경우 로직을 중단하는 얼리 리턴(Early Return) 구문 적용
- `AlarmItem` 메시지 텍스트의 폰트 두께를 `Bold`에서 `FontWeight(500)`으로 변경하여 디자인 가이드 적용 - `AlarmScreen` 프리뷰에서 `PagingData.from` 사용 시 로딩 상태가 유지되어 아이템이 보이지 않던 이슈 수정 (`sourceLoadStates` 명시) - 프리뷰 샘플 데이터의 날짜 형식을 절대 시간에서 상대 시간(예: 1일 전, 3일 전)으로 업데이트 - 프리뷰 내 알람 허용 상태(`isAlarmAllowed`) 기본값을 `true`로 변경하여 실제 화면 구성 확인 용이성 확보
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughFCM 알림 수신·클릭 라우팅을 확장하고, 알람 상세·읽음·미읽음 조회 API와 저장소를 추가했습니다. 알림함 읽음 상태, 공지 상세 화면과 마크다운 렌더링을 구현했으며 홈·마이페이지 배지와 알림 이동을 연결했습니다. Changes알림 처리 및 화면 통합
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant FCM as LinkUFireBaseMessageService
participant Activity as MainActivity
participant VM as MainViewModel
participant App as MainApp
participant Notice as NoticeScreen
FCM->>Activity: 알림 클릭 인텐트 전달
Activity->>VM: type, targetId, alarmId 전달
VM->>App: NavigateByNotification 이벤트 발행
App->>Notice: 공지 라우트로 이동
Notice->>Notice: NoticeViewModel로 상세 조회 상태 표시
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 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 |
There was a problem hiding this comment.
Actionable comments posted: 18
🧹 Nitpick comments (9)
feature/mypage/src/main/java/com/linku/mypage/MyPageApp.kt (1)
332-334: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win주석 처리된 죽은 코드 제거 권장.
"alarm"라우트가 이제 사용되지 않으며(onNavigateAlarm이onNavigateToAlarm()콜백으로 대체됨) 주석으로만 남아있습니다. 혼선을 방지하기 위해 완전히 삭제하는 것을 권장합니다.♻️ 제안
-// composable("alarm") { -// // TODO: 알림 화면 연결 -// } -🤖 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/src/main/java/com/linku/mypage/MyPageApp.kt` around lines 332 - 334, Remove the commented-out "alarm" composable route and its TODO block; keep the active navigation flow through onNavigateAlarm and onNavigateToAlarm() unchanged.feature/home/src/main/java/com/linku/home/screen/AlarmScreen.kt (2)
94-98: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value주석과 실제 동작 불일치.
LaunchedEffect(Unit)은 컴포저블이 최초로 컴포지션에 진입할 때 한 번만 실행되며, 재컴포지션마다 실행되는 것이 아닙니다. "리컴포지션 시 알림 목록 갱신"이라는 주석/로그 메시지는 이 동작을 오해하게 만듭니다. 화면 재진입(remount) 시에만 갱신됨을 명확히 하는 주석으로 수정하는 것을 권장합니다.🤖 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/home/src/main/java/com/linku/home/screen/AlarmScreen.kt` around lines 94 - 98, AlarmScreen의 LaunchedEffect(Unit) 주변 주석과 Log.d 메시지를 재컴포지션마다가 아닌 화면 최초 진입 또는 재진입 시 한 번 갱신된다는 실제 동작에 맞게 수정하세요. viewModel.refreshPaging() 실행 로직은 변경하지 마세요.
107-107: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low value미해결 개발자 메모 정리 필요.
NavigateToNotice.alarmId == targetId라는 의도는AlarmSideEffect.NavigateToNotice에 명시되어 있으니, 이 주석은 제거하는 편으로 정리하면 됩니다.🤖 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/home/src/main/java/com/linku/home/screen/AlarmScreen.kt` at line 107, Remove the unresolved inline comment from the AlarmSideEffect.NavigateToNotice handling in AlarmScreen, leaving the existing onNavigateToNotice(effect.targetId) call unchanged.feature/home/src/main/java/com/linku/home/screen/HomeScreen.kt (1)
92-96: 🚀 Performance & Scalability | 🔵 Trivial미확인 알림 상태 조회가 화면별로 독립적으로 중복 수행됩니다.
HomeScreen은 진입 시refreshUnreadAlarm()을,MyPageApp은 진입 시checkUnreadAlarm()을 각각 독립적으로 호출합니다. 두 화면을 번갈아 이동하면 매번 동일한 미확인 여부를 재조회하게 됩니다. 두 ViewModel이 공유 가능한 상위 캐시/리포지토리 레벨 상태를 참조하도록 하면 중복 네트워크 호출을 줄일 수 있습니다.🤖 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/home/src/main/java/com/linku/home/screen/HomeScreen.kt` around lines 92 - 96, Update the unread-alarm flow involving HomeScreen’s LaunchedEffect and the corresponding MyPageApp checkUnreadAlarm call so both screens read and refresh a shared cache or repository-level state instead of independently requesting the same status. Preserve the existing unread-state behavior while preventing repeated network calls when navigating between the screens.app/src/main/java/com/linku/MainActivity.kt (1)
8-29: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
viewModel을 두 가지 방식으로 중복 획득Activity scope에서
by viewModels()(L24)로MainViewModel을 이미 획득했는데,setContent내부에서 다시hiltViewModel()(L38)로 조회합니다. 둘 다 Activity의 ViewModelStore를 기본 key로 사용하므로 결과적으로 같은 인스턴스를 가리키긴 하지만, 이미 보유한viewModel프로퍼티를 그대로 넘기는 것이 더 명확합니다.♻️ 제안
setContent { MainApp( - viewModel = hiltViewModel(), + viewModel = viewModel, ) }🤖 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 `@app/src/main/java/com/linku/MainActivity.kt` around lines 8 - 29, setContent 내부에서 hiltViewModel()로 MainViewModel을 다시 조회하지 말고, MainActivity의 by viewModels()로 획득한 viewModel 프로퍼티를 Composable에 전달하세요. 기존 MainViewModel 인스턴스를 유지하고 중복 조회만 제거하세요.data/src/main/java/com/linku/data/implementation/repository/AlarmRepositoryImpl.kt (1)
102-107: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win성공 여부 확인 전에 "읽음 처리 완료" 로그가 찍힘
Log.d("AlarmList","알람 읽음 처리 완료")가alarmApi.readAlarm(alarmId)호출보다 먼저 실행됩니다. API 호출이 실패해도 로그에는 이미 "완료"로 남아, 실패 케이스 트러블슈팅 시 오탐을 유발합니다.updateAlarmSetting(L54-57)처럼.onSuccess에서 로그를 남기는 것이 일관됩니다.♻️ 제안
override suspend fun readAlarm(alarmId: Long): Result<Unit> { return safeApiCallUnit { - Log.d("AlarmList","알람 읽음 처리 완료") alarmApi.readAlarm(alarmId) + }.onSuccess { + Log.d("AlarmList", "알람 읽음 처리 완료") } }🤖 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 `@data/src/main/java/com/linku/data/implementation/repository/AlarmRepositoryImpl.kt` around lines 102 - 107, Move the success log in readAlarm so it executes only after alarmApi.readAlarm(alarmId) succeeds, using the existing safeApiCallUnit success-handling pattern consistent with updateAlarmSetting. Remove the current log before the API call and preserve the existing Result<Unit> behavior.app/src/main/java/com/linku/MainApplication.kt (1)
22-27: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win채널 importance 변경이 기존 설치 사용자에게는 반영되지 않을 수 있음
NotificationChannel의 importance는 최초 생성 시점에 고정되며, 이후 앱 코드에서 값을 바꿔도 이미 채널이 생성된 기존 사용자에게는 적용되지 않습니다(사용자가 시스템 설정에서 직접 변경해야 함). 채널 ID("default_channel")를 그대로 두면 기존 사용자는 계속IMPORTANCE_HIGH로 남아 있고 신규 설치자만IMPORTANCE_DEFAULT를 받는 불일치가 생깁니다. 의도한 동작인지 확인해 주세요. 기존 사용자에게도 반영하려면 채널 ID를 변경(예:default_channel_v2)해야 합니다.🤖 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 `@app/src/main/java/com/linku/MainApplication.kt` around lines 22 - 27, Update createNotificationChannels so the intended IMPORTANCE_DEFAULT setting applies consistently to existing installations by using a new notification channel ID, such as default_channel_v2, instead of reusing default_channel. Ensure all references that post notifications to the old channel are updated to the new ID.app/src/main/java/com/linku/MainViewModel.kt (1)
170-170: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win리포지토리 직접 호출이 기존 유스케이스 패턴과 불일치
같은 클래스에서
firstPushAlarmAllowedUseCase()처럼 유스케이스를 경유하는 반면,alarmRepository.readAlarm(it)는 저장소를 직접 호출합니다. 일관성과 테스트 용이성을 위해 별도 유스케이스로 감싸는 것을 고려해 보세요.🤖 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 `@app/src/main/java/com/linku/MainViewModel.kt` at line 170, Update the alarm-loading flow in MainViewModel around alarmId?.let so it uses a dedicated read-alarm use case instead of calling alarmRepository.readAlarm directly. Inject and invoke that use case consistently with firstPushAlarmAllowedUseCase(), preserving the existing alarm ID and result behavior.app/src/main/java/com/linku/NavigationDestination.kt (1)
28-30: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win공지 라우트 문자열을 단일 계약으로 통합하세요.
NavigationRoute.Notice를 정의했지만MainApp.kt에서"notice_screen/$targetId"를 다시 하드코딩하고 있습니다. 현재 값은 일치하지만, 이후 라우트 변경 시 클릭 내비게이션이 깨질 수 있습니다.권장 수정
- data object Notice: NavigationRoute("notice_screen/{targetId}") + data object Notice: NavigationRoute("notice_screen/{targetId}") { + fun buildRoute(targetId: Long) = "notice_screen/$targetId" + }호출부에서는
NavigationRoute.Notice.buildRoute(targetId)를 사용하세요.🤖 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 `@app/src/main/java/com/linku/NavigationDestination.kt` around lines 28 - 30, Replace the hardcoded "notice_screen/$targetId" navigation route in MainApp.kt with NavigationRoute.Notice.buildRoute(targetId), using the existing Notice route contract for notice click navigation.
🤖 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 `@app/src/main/java/com/linku/LinkUFireBaseMessageService.kt`:
- Around line 47-75: In LinkUFireBaseMessageService.onMessageReceived, gate the
diagnostic logs for message.notification, message.data, title, and body behind
BuildConfig.DEBUG, matching the existing onNewToken pattern. Remove or downgrade
the non-error Log.e usage as appropriate, while keeping production behavior and
the notification handling flow unchanged.
- Around line 64-68: Restore the title and body fallback in the FCM message
handling flow around `message.notification`, using corresponding values from
`message.data` when notification payload fields are absent. Preserve the
existing `type`, `targetId`, and `alarmId` routing behavior while ensuring
data-only messages do not produce notifications with empty title or body.
- Around line 85-92: Restore the null guard around
packageManager.getLaunchIntentForPackage in the launchIntent initialization flow
before PendingIntent.getActivity is called. Exit the notification-tap handling
early when no launch intent is available, while preserving the existing extras
for valid intents.
In `@app/src/main/java/com/linku/MainActivity.kt`:
- Around line 59-69: Update handleIntent to remove the processed type, targetId,
and alarmId extras from the Intent after successfully calling
viewModel.handleNotification, so Activity recreation cannot process the same
notification again. Keep the existing validation and early returns unchanged.
- Around line 59-69: 외부에서 조작 가능한 알림 Intent를 신뢰하지 않도록
MainActivity.handleIntent()에서 type, targetId, alarmId의 허용 범위를 엄격히 검증하고, alarmId가
해당 targetId의 소유이며 일치하는지 확인한 뒤 ViewModel.handleNotification()을 호출하세요.
AndroidManifest.xml의 notice_icon_click 액션은 앱 패키지 네임스페이스를 포함한 이름으로 변경하세요.
In `@app/src/main/java/com/linku/MainApp.kt`:
- Around line 327-330: LoginApp의 onAutoLoginSuccess 콜백에도 Splash의
AutoLoginState.Success 및 login_root의 onLoginSuccess와 동일하게
viewModel.consumePendingNotificationNav()를 호출하고, 반환된 type과 targetId로
navigateByNotification을 실행하도록 추가하세요.
In `@app/src/main/java/com/linku/MainViewModel.kt`:
- Around line 167-175: Update handleNotification so alarmRepository.readAlarm is
deferred when authentication is unavailable and retried after authentication
completes, matching the existing pendingNotificationNav flow. Ensure
authenticated notifications still mark the alarm as read before navigation,
while pre-authentication taps retain the alarmId and process it once after login
instead of silently losing the request.
In `@design/src/main/java/com/linku/design/markdown/MarkDownLineType.kt`:
- Around line 29-33: Update MarkdownLineType.from so OrderedList is recognized
only when the line begins with one or more digits immediately followed by ". ".
Replace the broad line.contains(". ") check with an anchored start-of-line
pattern, while preserving BulletPoint and Body classification.
In `@design/src/main/java/com/linku/design/top/bar/AlarmButton.kt`:
- Around line 24-32: Update AlarmButton’s clickable container so its touch
target is at least 48dp while preserving the alarm icon’s 30dp visual size.
Adjust the BoxWithConstraints/noRippleClickable layout or add a separate outer
clickable container, ensuring the existing onClick behavior remains unchanged.
In `@feature/home/src/main/java/com/linku/home/HomeApp.kt`:
- Line 28: Update the notification click handling around onNavigateToCuration
and the callbacks at lines 132-133 so folder and curation notifications preserve
their targetId and invoke real navigation callbacks instead of empty lambdas.
Wire the required navigation handlers from the parent through
onNavigateToCuration, ensuring each notification is marked read and then
navigates to its corresponding destination.
In `@feature/home/src/main/java/com/linku/home/HomeViewModel.kt`:
- Around line 333-341: Reset the unread-alarm state during logout by updating
clearData() to set _isUnreadAlarmExists.value to false. Keep
refreshUnreadAlarm() unchanged so the state is still populated from
alarmRepository for the active account.
In `@feature/home/src/main/java/com/linku/home/screen/AlarmScreen.kt`:
- Around line 121-125: Update the onRefresh callback to use only one refresh
mechanism: retain viewModel.handleIntent(AlarmIntent.Refresh), which creates the
new Pager, and remove alarmPagingItems.refresh(). Ensure the existing
isUserRefreshing state and loading-status handling remain tied to the new
Pager’s load lifecycle.
- Line 159: Update the topText assignment in AlarmScreen to use the existing
string resource through stringResource instead of the hardcoded "알림함" literal,
preserving the displayed text.
In `@feature/home/src/main/java/com/linku/home/screen/NoticeScreen.kt`:
- Around line 50-59: NoticeScreen의 Column modifier 체인을 전달받은 modifier에서 시작하도록
수정하세요. 새 Modifier 대신 modifier.fillMaxSize()를 사용하고, 기존
background·verticalScroll·padding 동작은 그대로 유지하세요.
- Around line 51-85: Update the notice screen composable around NoticeUiState
and its AlarmDetail content to branch on isLoading and the error state before
rendering notice details. Show a loading state during requests, and for failures
render a fallback message even when Throwable.message is null together with a
retry action wired to the existing NoticeViewModel retry flow; preserve the
current detail layout for successful state.
- Line 64: UI 하드코딩 문자열을 문자열 리소스로 이동하세요.
feature/home/src/main/java/com/linku/home/screen/NoticeScreen.kt 64행의
NoticeScreen 텍스트와 97-98행 Preview 샘플,
feature/home/src/main/java/com/linku/home/component/NoticeTitleSection.kt 49-50행
Preview 샘플은 새 리소스를 stringResource로 사용하도록 변경하고,
design/src/main/java/com/linku/design/markdown/LinkUMarkdownText.kt 53행의 글머리 기호도
해당 모듈의 문자열 리소스로 분리해 렌더링에 사용하세요.
In `@feature/home/src/main/java/com/linku/home/viewmodel/AlarmViewModel.kt`:
- Line 3: Remove the android.util.Log dependency from AlarmViewModel and replace
the Log usages in AlarmViewModel with the repository’s platform-independent
logging abstraction, such as the established Timber or core/domain Logger API.
Preserve the existing log levels and messages without introducing other Android
framework references.
- Around line 66-81: Update the alarm paging refresh flow around alarmFlows,
refreshPaging, and getAlarms so refreshing one AlarmType only recreates that
type’s Pager instead of broadcasting through the shared refreshTrigger to every
previously subscribed tab. Track refresh state per AlarmType and ensure each
type’s Flow observes only its own trigger while preserving the existing
cachedIn(viewModelScope) behavior.
---
Nitpick comments:
In `@app/src/main/java/com/linku/MainActivity.kt`:
- Around line 8-29: setContent 내부에서 hiltViewModel()로 MainViewModel을 다시 조회하지 말고,
MainActivity의 by viewModels()로 획득한 viewModel 프로퍼티를 Composable에 전달하세요. 기존
MainViewModel 인스턴스를 유지하고 중복 조회만 제거하세요.
In `@app/src/main/java/com/linku/MainApplication.kt`:
- Around line 22-27: Update createNotificationChannels so the intended
IMPORTANCE_DEFAULT setting applies consistently to existing installations by
using a new notification channel ID, such as default_channel_v2, instead of
reusing default_channel. Ensure all references that post notifications to the
old channel are updated to the new ID.
In `@app/src/main/java/com/linku/MainViewModel.kt`:
- Line 170: Update the alarm-loading flow in MainViewModel around alarmId?.let
so it uses a dedicated read-alarm use case instead of calling
alarmRepository.readAlarm directly. Inject and invoke that use case consistently
with firstPushAlarmAllowedUseCase(), preserving the existing alarm ID and result
behavior.
In `@app/src/main/java/com/linku/NavigationDestination.kt`:
- Around line 28-30: Replace the hardcoded "notice_screen/$targetId" navigation
route in MainApp.kt with NavigationRoute.Notice.buildRoute(targetId), using the
existing Notice route contract for notice click navigation.
In
`@data/src/main/java/com/linku/data/implementation/repository/AlarmRepositoryImpl.kt`:
- Around line 102-107: Move the success log in readAlarm so it executes only
after alarmApi.readAlarm(alarmId) succeeds, using the existing safeApiCallUnit
success-handling pattern consistent with updateAlarmSetting. Remove the current
log before the API call and preserve the existing Result<Unit> behavior.
In `@feature/home/src/main/java/com/linku/home/screen/AlarmScreen.kt`:
- Around line 94-98: AlarmScreen의 LaunchedEffect(Unit) 주변 주석과 Log.d 메시지를
재컴포지션마다가 아닌 화면 최초 진입 또는 재진입 시 한 번 갱신된다는 실제 동작에 맞게 수정하세요.
viewModel.refreshPaging() 실행 로직은 변경하지 마세요.
- Line 107: Remove the unresolved inline comment from the
AlarmSideEffect.NavigateToNotice handling in AlarmScreen, leaving the existing
onNavigateToNotice(effect.targetId) call unchanged.
In `@feature/home/src/main/java/com/linku/home/screen/HomeScreen.kt`:
- Around line 92-96: Update the unread-alarm flow involving HomeScreen’s
LaunchedEffect and the corresponding MyPageApp checkUnreadAlarm call so both
screens read and refresh a shared cache or repository-level state instead of
independently requesting the same status. Preserve the existing unread-state
behavior while preventing repeated network calls when navigating between the
screens.
In `@feature/mypage/src/main/java/com/linku/mypage/MyPageApp.kt`:
- Around line 332-334: Remove the commented-out "alarm" composable route and its
TODO block; keep the active navigation flow through onNavigateAlarm and
onNavigateToAlarm() unchanged.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: a60e0594-bf95-4037-9594-5a5349eb8ffd
⛔ Files ignored due to path filters (2)
app/src/main/res/drawable/img_noti_ex.pngis excluded by!**/*.pngapp/src/main/res/drawable/img_noti_ex_2.pngis excluded by!**/*.png
📒 Files selected for processing (43)
app/src/main/AndroidManifest.xmlapp/src/main/java/com/linku/LinkUFireBaseMessageService.ktapp/src/main/java/com/linku/MainActivity.ktapp/src/main/java/com/linku/MainApp.ktapp/src/main/java/com/linku/MainApplication.ktapp/src/main/java/com/linku/MainViewModel.ktapp/src/main/java/com/linku/NavigationDestination.ktapp/src/main/res/drawable/ic_alarm.xmlcore/src/main/java/com/linku/core/model/alarm/AlarmDetail.ktcore/src/main/java/com/linku/core/repository/AlarmRepository.ktdata/src/main/java/com/linku/data/api/alarm/AlarmApi.ktdata/src/main/java/com/linku/data/api/dto/alarm/AlarmDetailDTO.ktdata/src/main/java/com/linku/data/api/dto/alarm/AlarmSettingDTO.ktdata/src/main/java/com/linku/data/api/dto/alarm/AlarmSettingRequest.ktdata/src/main/java/com/linku/data/api/dto/alarm/AlarmsDTO.ktdata/src/main/java/com/linku/data/api/dto/alarm/FcmTokenRequest.ktdata/src/main/java/com/linku/data/api/dto/alarm/UnreadAlarmExistDTO.ktdata/src/main/java/com/linku/data/implementation/repository/AlarmRepositoryImpl.ktdata/src/main/java/com/linku/data/mapper/AlarmMapper.ktdata/src/main/java/com/linku/data/mapper/StringExt.ktdesign/src/main/java/com/linku/design/markdown/LinkUMarkdownText.ktdesign/src/main/java/com/linku/design/markdown/MarkDownLineType.ktdesign/src/main/java/com/linku/design/top/bar/AlarmButton.ktfeature/curation/src/main/res/drawable/ic_alarm.xmlfeature/home/src/main/java/com/linku/home/HomeApp.ktfeature/home/src/main/java/com/linku/home/HomeViewModel.ktfeature/home/src/main/java/com/linku/home/component/NoticeTitleSection.ktfeature/home/src/main/java/com/linku/home/model/AlarmIntent.ktfeature/home/src/main/java/com/linku/home/model/AlarmSideEffect.ktfeature/home/src/main/java/com/linku/home/model/NoticeUiState.ktfeature/home/src/main/java/com/linku/home/screen/AlarmScreen.ktfeature/home/src/main/java/com/linku/home/screen/HomeScreen.ktfeature/home/src/main/java/com/linku/home/screen/NoticeScreen.ktfeature/home/src/main/java/com/linku/home/ui/alarm/component/AlarmItem.ktfeature/home/src/main/java/com/linku/home/ui/alarm/component/AlarmTopBar.ktfeature/home/src/main/java/com/linku/home/ui/home/bar/HomeTopBar.ktfeature/home/src/main/java/com/linku/home/viewmodel/AlarmViewModel.ktfeature/home/src/main/java/com/linku/home/viewmodel/NoticeViewModel.ktfeature/login/src/main/res/drawable/ic_alarm.xmlfeature/mypage/src/main/java/com/linku/mypage/MyPageApp.ktfeature/mypage/src/main/java/com/linku/mypage/MyPageViewModel.ktfeature/mypage/src/main/java/com/linku/mypage/screen/MyPageScreen.ktfeature/mypage/src/main/java/com/linku/mypage/ui/top/bar/MypageTopBar.kt
💤 Files with no reviewable changes (3)
- feature/curation/src/main/res/drawable/ic_alarm.xml
- app/src/main/res/drawable/ic_alarm.xml
- feature/login/src/main/res/drawable/ic_alarm.xml
| @@ -1,23 +1,43 @@ | |||
| package com.linku.home.viewmodel | |||
|
|
|||
| import android.util.Log | |||
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
ViewModel에 Android 프레임워크 의존성(android.util.Log) 도입.
android.util.Log는 Android 프레임워크 클래스이며, 리포지토리 가이드라인상 ViewModel은 이런 프레임워크 의존성을 도입하면 안 됩니다(Line 34, 107, 111에서 사용). 플랫폼 독립적인 로깅 추상화(예: Timber, 또는 domain/core 계층의 Logger 인터페이스)로 교체하는 것을 권장합니다. As per coding guidelines, "ViewModel classes must not reference android.content.Context or introduce Android framework dependencies."
🤖 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/home/src/main/java/com/linku/home/viewmodel/AlarmViewModel.kt` at
line 3, Remove the android.util.Log dependency from AlarmViewModel and replace
the Log usages in AlarmViewModel with the repository’s platform-independent
logging abstraction, such as the established Timber or core/domain Logger API.
Preserve the existing log levels and messages without introducing other Android
framework references.
Source: Coding guidelines
- `MainViewModel` 및 `MainApp` 내 알림 대기(Pending) 로직에 `alarmId`를 포함하고, 인증 완료 시점에 자동 읽음 처리(`readAlarm`)를 수행하도록 개선 - `MainActivity`에서 처리된 알림 Intent의 Extra 데이터를 제거하여 액티비티 재생성(화면 회전 등) 시 중복 네비게이션 및 읽음 처리 방지 - `MarkDownLineType`에서 정규식(`orderedListPattern`)을 사용하여 Markdown 순서 목록(`1. `) 판별 로직의 정확도 개선 - `LinkUFireBaseMessageService` 내 불필요한 로그 제거 및 디버그 모드에서만 로그가 출력되도록 `BuildConfig.DEBUG` 조건 추가 - `HomeViewModel` 초기화(`clear`) 시 알림 미확인 상태(`_isUnreadAlarmExists`)를 초기화하도록 수정 - `NoticeScreen` 컴포저블의 `modifier` 파라미터 누락 수정 및 `AlarmScreen` 내 중복된 Paging refresh 호출 제거
KateteDeveloper
left a comment
There was a problem hiding this comment.
간단하게 봤습니다~!
두분의 사랑을 응원합니다 👍
| navController.navigate("notice/$targetId") | ||
| }, | ||
| onNavigateToLinkDetail = onNavigateToLinkDetail, | ||
| onNavigateToFolder = {}, // TODO: 지민오빠가 나중에 이동 함수 준다고 했씀!(근데 걍 라우트만 주면 내가 할수 있을 듯?) |
There was a problem hiding this comment.
....?
둘의 사랑을 진심으로 응원합니다...
# Conflicts: # app/src/main/java/com/linku/MainApp.kt # feature/home/src/main/java/com/linku/home/screen/HomeScreen.kt
- `MainApp`의 `LaunchedEffect` 내 `AutoLoginState.Success` 대응 로직에 `showNavBar = true` 설정 추가 - 불필요해진 `onAutoLoginSuccess` 및 `onAutoLoginFail` 콜백을 제거하고 관련 로직을 상태 기반으로 통합 - `MainViewModel`에 알림 처리를 위한 `AlarmType` 및 `AlarmRepository` 임포트 추가
- `isAuthenticated` 상태 변수를 도입하여 바텀바 표시 여부(`showNavBar`)와 독립적인 인증 상태 관리 - 알림 수신 시 즉시 이동 여부를 판단하는 조건을 `showNavBar`에서 `isAuthenticated`로 변경하여 네비게이션 정확도 향상 - 자동 로그인 및 일반 로그인 성공 시 `isAuthenticated`를 true로, 로그아웃 시 false로 전환하는 로직 추가 - 공지사항 알림(`NOTICE`) 이동 시 바텀바를 숨기도록(`showNavBar = false`) 처리 추가
- `MainApp`의 `onNavigateToNotice` 콜백에서 내비게이션 바를 숨기도록 로직 추가 - `HomeApp`의 `onAlarmClick`에서 알림 화면 이동 전 `onShowNavBar(false)`를 호출하도록 변경 - `AlarmScreen` 내부에 존재하던 `DisposableEffect` 기반의 내비게이션 바 상태 제어 로직을 제거하여 네비게이션 시점의 로직으로 일원화
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
app/src/main/java/com/linku/MainApp.kt (1)
169-174: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winNotice 목적지 라우트를 한 곳에서 생성하세요.
notice_screen/$targetId가 두 경로에 직접 중복되어 있습니다.NavigationRoute.Notice.createRoute(targetId)같은 helper를 만들어 FCM 클릭과 알림함 클릭이 동일한 라우트 계약을 사용하게 하세요.Also applies to: 547-550
🤖 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 `@app/src/main/java/com/linku/MainApp.kt` around lines 169 - 174, 중복된 notice 목적지 문자열 생성을 제거하세요. NavigationRoute.Notice에 targetId를 받아 notice 라우트를 생성하는 helper를 추가하고, MainApp의 AlarmType.NOTICE 처리와 FCM·알림함 클릭 경로에서 직접 작성한 "notice_screen/$targetId" 대신 해당 helper를 사용해 동일한 라우트 계약을 공유하게 하세요.
🤖 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 `@app/src/main/java/com/linku/MainApp.kt`:
- Around line 135-138: MainApp의 isAuthenticated를 rememberSaveable에서 제거하고
MainViewModel의 세션 인증 상태에서 파생하세요. 자동 로그인·로그인 성공과 실패·로그아웃이 동일한 ViewModel 세션 상태를
갱신하도록 연결하고, pending 알림 소비 및 보호 화면 이동 로직(198-203, 326-337, 378-381, 493-494)은 해당
세션 상태가 인증됨일 때만 실행되도록 수정하세요.
---
Nitpick comments:
In `@app/src/main/java/com/linku/MainApp.kt`:
- Around line 169-174: 중복된 notice 목적지 문자열 생성을 제거하세요. NavigationRoute.Notice에
targetId를 받아 notice 라우트를 생성하는 helper를 추가하고, MainApp의 AlarmType.NOTICE 처리와
FCM·알림함 클릭 경로에서 직접 작성한 "notice_screen/$targetId" 대신 해당 helper를 사용해 동일한 라우트 계약을
공유하게 하세요.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 391d86aa-c765-43a1-8b31-a3ff24dc1e5c
📒 Files selected for processing (4)
app/src/main/java/com/linku/MainApp.ktapp/src/main/java/com/linku/MainViewModel.ktfeature/home/src/main/java/com/linku/home/HomeApp.ktfeature/home/src/main/java/com/linku/home/viewmodel/AlarmViewModel.kt
🚧 Files skipped from review as they are similar to previous changes (3)
- app/src/main/java/com/linku/MainViewModel.kt
- feature/home/src/main/java/com/linku/home/HomeApp.kt
- feature/home/src/main/java/com/linku/home/viewmodel/AlarmViewModel.kt
- `MainApp`에서 `rememberSaveable`로 관리하던 `isAuthenticated` 상태를 `MainViewModel`의 `StateFlow`로 변경 - `MainViewModel` 내부에 인증 상태를 저장하는 `_isAuthenticated`와 상태 갱신을 위한 `setAuthenticated` 함수 추가 - 로그인, 자동 로그인 성공 및 로그아웃 시 UI 레이어에서 ViewModel의 인증 상태를 직접 업데이트하도록 수정 - 프로세스 종료 후 복원 시 유효하지 않은 인증 상태(stale state)가 유지되는 문제를 방지하여 세션 관리 안정성 확보
- `HomeApp`에서 `currentBackStackEntryAsState`를 사용하여 현재 경로에 따라 내비게이션 바 노출 여부를 결정하도록 수정 - `AlarmScreen` 진입 시 내비게이션 바를 수동으로 숨기던 `LaunchedEffect` 및 `onAlarmClick` 내 중복 로직 제거 - `AlarmScreen`에서 뒤로 가기(`onBack`) 시 내비게이션 바를 다시 표시하도록 상태 변경 로직 추가
- `HomeApp` 내부에 정의되어 있던 알림(`AlarmScreen`) 및 공지(`NoticeScreen`) 내비게이션 로직을 `MainApp`으로 이관 - `HomeApp`에서 내비게이션 바 상태 제어 콜백(`onShowNavBar`)을 제거하고 알림 화면 이동을 위한 `onNavigateToAlarm` 콜백 추가 - `MainApp`의 알림 화면 진입 시 내비게이션 바를 숨기도록 `LaunchedEffect` 로직 활성화 - 공지 화면에서 뒤로 가기 시, 이전 경로가 알림 화면이 아닌 경우에만 내비게이션 바를 다시 표시하도록 로직 개선 - `HomeApp` 내 불필요한 `NavHost` 설정 및 미사용 임포트, 주석 정리
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
feature/home/src/main/java/com/linku/home/HomeApp.kt (1)
60-66: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winLine [66]의 사용자 노출 문구를 문자열 리소스로 이동하세요.
Toast문구가 직접 하드코딩되어 시스템 언어가 바뀌어도 번역되지 않습니다.strings.xml에 등록한 뒤context.getString(...)으로 읽어오세요.As per coding guidelines, UI 문자열은 하드코딩하지 않고 리소스를 사용해야 합니다.
수정 예시
- Toast.makeText(context, "링크를 열 수 없어요.", Toast.LENGTH_SHORT).show() + Toast.makeText( + context, + context.getString(R.string.link_open_failed), + Toast.LENGTH_SHORT + ).show()🤖 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/home/src/main/java/com/linku/home/HomeApp.kt` around lines 60 - 66, Move the hardcoded Toast message in HomeApp.openUrl into a localized strings.xml resource, then retrieve it with context.getString(...) when calling Toast.makeText. Keep the existing failure handling and Toast behavior unchanged.Source: Coding guidelines
🤖 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.
Outside diff comments:
In `@feature/home/src/main/java/com/linku/home/HomeApp.kt`:
- Around line 60-66: Move the hardcoded Toast message in HomeApp.openUrl into a
localized strings.xml resource, then retrieve it with context.getString(...)
when calling Toast.makeText. Keep the existing failure handling and Toast
behavior unchanged.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: f324d636-7e5a-4d10-9b82-77e4cdf0a9f2
📒 Files selected for processing (3)
app/src/main/java/com/linku/MainApp.ktapp/src/main/java/com/linku/MainViewModel.ktfeature/home/src/main/java/com/linku/home/HomeApp.kt
🚧 Files skipped from review as they are similar to previous changes (2)
- app/src/main/java/com/linku/MainViewModel.kt
- app/src/main/java/com/linku/MainApp.kt
📝 설명
큐레이션 및 폴더는 아직 구현 전이므로 TODO로 남김
✔️ PR 유형
어떤 변경 사항이 있나요?
📎 관련 이슈 번호
Summary by CodeRabbit