From 10c5cc33746e5ac2379322b984b3d845ead38510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Sun, 30 Aug 2026 03:17:18 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor(afternote):=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=ED=99=94=EB=A9=B4=20=EC=A1=B0=EB=A6=BD=EB=B6=80?= =?UTF-8?q?=EB=A5=BC=20=EA=B8=B0=EB=8A=A5=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20?= =?UTF-8?q?=EC=98=AE=EA=B8=B4=EB=8B=A4=20(#1514)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 한 모듈 안에서 작성자와 수신자가 서로 다른 규칙을 쓰고 있었다. 수신자는 Route·Screen·VM· UiState·매퍼가 기능 폴더에 모여 있는데, 작성자는 조립부만 author/navigation/ 에 따로 있어 상세 화면 하나를 고치려면 두 폴더를 오가야 했다. 이름도 내용과 달랐다. author/navigation/ 의 9파일 중 NavGraphBuilder 확장을 가진 것은 2개뿐이고 나머지 6개는 «NavGraph» 라는 이름을 단 화면 조립부였다. 수신자 쪽은 같은 역할을 …Route.kt 로 부른다. 여섯을 기능 폴더로 옮기고 …Route.kt 로 개명한다. author/navigation/ 에는 진짜 NavGraph 2개와 model/, AfternoteNavActions.kt 만 남는다. 공용 컴포넌트 DetailLoadErrorContent·DesignPendingDetailContent 는 shared/detail 로 올린다 — 수신자 화면 2곳이 쓰는 자원이 작성자의 내비게이션 폴더에 얹혀 있었다. 이제 수신자 화면이 author.navigation 을 import 하지 않는다. 에디터 헬퍼 4종은 AfternoteEditorRouteHelpers.kt 로 나눠 Route 파일에는 조립만 남긴다. 순수 이동·개명이라 동작 변경이 없다. 스크린샷 골든은 패키지 경로에 저장되므로 두 screenshotTest 와 함께 디렉터리를 옮겼다 — 파일명의 해시는 렌더 설정 기반이라(모듈을 가로질러 반복된다) 이름은 그대로이고 재생성이 필요 없다. --- .../AfternoteDetailRoute.kt} | 83 +-------------- .../AfternoteEditorRoute.kt} | 72 +------------ .../editor/AfternoteEditorRouteHelpers.kt | 79 ++++++++++++++ .../memorial/playlist/AddSongRoute.kt} | 2 +- .../receiver/select/SelectReceiverRoute.kt} | 2 +- .../AfternoteHomeRoute.kt} | 2 +- .../author/navigation/AfternoteNavGraph.kt | 6 ++ .../detail/ReceivedAfternoteDetailRoute.kt | 4 +- .../navigation/ReceivedAfternoteNavGraph.kt | 2 +- .../shared/detail/DetailStateContents.kt | 97 ++++++++++++++++++ .../fingerprint/FingerprintLoginRoute.kt} | 2 +- .../DeleteInProgressOverlayScreenshotTest.kt | 2 +- .../DetailLoadErrorContentScreenshotTest.kt | 2 +- ...InProgressOverlayScreenshot_748aa731_0.png | Bin ...ntDefaultFallbackScreenshot_748aa731_0.png | Bin ...ContentMessageResScreenshot_748aa731_0.png | Bin ...ErrorContentRetryScreenshot_748aa731_0.png | Bin .../MemorialVideoLauncherTest.kt | 2 +- ...ProcessingMethodDefaultsInteractionTest.kt | 2 +- 19 files changed, 197 insertions(+), 162 deletions(-) rename feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/{navigation/AfternoteNavGraphDetail.kt => detail/AfternoteDetailRoute.kt} (78%) rename feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/{navigation/AfternoteNavGraphEditor.kt => editor/AfternoteEditorRoute.kt} (72%) create mode 100644 feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRouteHelpers.kt rename feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/{navigation/AfternoteNavGraphAddSong.kt => editor/memorial/playlist/AddSongRoute.kt} (88%) rename feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/{navigation/AfternoteNavGraphSelectReceiver.kt => editor/receiver/select/SelectReceiverRoute.kt} (93%) rename feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/{navigation/AfternoteNavGraphHome.kt => home/AfternoteHomeRoute.kt} (88%) create mode 100644 feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/detail/DetailStateContents.kt rename feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/{author/navigation/AfternoteNavGraphFingerprint.kt => shared/fingerprint/FingerprintLoginRoute.kt} (98%) rename feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/{navigation => detail}/DeleteInProgressOverlayScreenshotTest.kt (93%) rename feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/{author/navigation => shared/detail}/DetailLoadErrorContentScreenshotTest.kt (95%) rename feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/{navigation => detail}/DeleteInProgressOverlayScreenshotTestKt/deleteInProgressOverlayScreenshot_748aa731_0.png (100%) rename feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/{author/navigation => shared/detail}/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentDefaultFallbackScreenshot_748aa731_0.png (100%) rename feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/{author/navigation => shared/detail}/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentMessageResScreenshot_748aa731_0.png (100%) rename feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/{author/navigation => shared/detail}/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentRetryScreenshot_748aa731_0.png (100%) rename feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/{navigation => detail}/MemorialVideoLauncherTest.kt (97%) diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphDetail.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/detail/AfternoteDetailRoute.kt similarity index 78% rename from feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphDetail.kt rename to feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/detail/AfternoteDetailRoute.kt index d94faf3c0a..0533e60634 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphDetail.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/detail/AfternoteDetailRoute.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.author.detail import android.content.ActivityNotFoundException import android.content.Intent @@ -43,88 +43,11 @@ import com.afternote.core.ui.theme.AfternoteDesign import com.afternote.core.ui.topbar.DetailTopBar import com.afternote.feature.afternote.domain.AfternoteType import com.afternote.feature.afternote.presentation.R -import com.afternote.feature.afternote.presentation.author.detail.AfternoteDetailDeleteResult -import com.afternote.feature.afternote.presentation.author.detail.AfternoteDetailUiState -import com.afternote.feature.afternote.presentation.author.detail.AfternoteDetailViewModel -import com.afternote.feature.afternote.presentation.author.detail.DetailContentUiModel -import com.afternote.feature.afternote.presentation.author.detail.GalleryDetailScreen -import com.afternote.feature.afternote.presentation.author.detail.MemorialDetailScreen import com.afternote.feature.afternote.presentation.author.detail.account.AccountDetailScreen +import com.afternote.feature.afternote.presentation.shared.detail.DesignPendingDetailContent +import com.afternote.feature.afternote.presentation.shared.detail.DetailLoadErrorContent import kotlinx.coroutines.launch -@Composable -fun DesignPendingDetailContent(onBackClick: () -> Unit) { - Scaffold( - modifier = Modifier.fillMaxSize(), - containerColor = Color.Transparent, - topBar = { - DetailTopBar(title = "", onBackClick = onBackClick) - }, - ) { paddingValues -> - Box( - modifier = - Modifier - .fillMaxSize() - .padding(paddingValues), - contentAlignment = Alignment.Center, - ) { - Text(text = stringResource(R.string.design_pending)) - } - } -} - -/** - * 상세 데이터 로드 실패 화면. - * - * [com.afternote.feature.afternote.presentation.author.detail.AfternoteDetailUiState.Error] 계약대로 - * [messageRes] 를 [stringResource] 로 변환해 표시한다 (없으면 [R.string.afternote_detail_load_error] 폴백). - * 예외 원문은 받지 않는다 — 서버 5xx 본문·역직렬화 예외 메시지에 내부 SQL·응답 원문 발췌가 섞여 오기 때문. - * - * 표시 방식 통일(#446) 결론이 나오면 이 컴포저블의 본문 표현만 교체한다 — Route 의 Error 분기 배선은 유지. - * [DesignPendingDetailContent] 는 ESTATE 등 아직 구현되지 않은 상세 타입의 폴백으로만 유지한다. - * - * @param messageRes 앱에 박힌 문자열 리소스 ID(`R.string.*`). `@StringRes` 는 이 Int 가 임의 정수가 아니라 - * string 리소스 id 임을 Lint 에 알리는 표식이며, [stringResource] 로 실제 텍스트로 변환한다. - * @param onRetryClick 재조회 진입점. `null` 이면 재시도 버튼을 그리지 않는다 — 잘못된 항목 ID 처럼 - * 같은 요청을 다시 보내도 결과가 달라지지 않는 실패에 쓴다. - */ -@Composable -fun DetailLoadErrorContent( - @StringRes messageRes: Int?, - onBackClick: () -> Unit, - onRetryClick: (() -> Unit)? = null, -) { - Scaffold( - modifier = Modifier.fillMaxSize(), - containerColor = Color.Transparent, - topBar = { - DetailTopBar(title = "", onBackClick = onBackClick) - }, - ) { paddingValues -> - Box( - modifier = - Modifier - .fillMaxSize() - .padding(paddingValues), - contentAlignment = Alignment.Center, - ) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text(text = stringResource(messageRes ?: R.string.afternote_detail_load_error)) - if (onRetryClick != null) { - Spacer(modifier = Modifier.height(16.dp)) - TextButton(onClick = onRetryClick) { - Text( - text = stringResource(R.string.afternote_detail_retry), - style = AfternoteDesign.typography.captionLargeB, - color = AfternoteDesign.colors.gray9, - ) - } - } - } - } - } -} - /** * 삭제 진행([com.afternote.feature.afternote.presentation.author.detail.AfternoteDetailUiState.Success.isDeleting]) * 동안 상세 화면 위에 겹쳐 그리는 오버레이. diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphEditor.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRoute.kt similarity index 72% rename from feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphEditor.kt rename to feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRoute.kt index 11cbad81b7..149a1c8790 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphEditor.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRoute.kt @@ -1,6 +1,5 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.author.editor -import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -21,75 +20,6 @@ import com.afternote.feature.afternote.presentation.author.editor.state.Afternot import com.afternote.feature.afternote.presentation.author.editor.state.rememberAfternoteEditorState import com.afternote.feature.afternote.presentation.author.navigation.model.SELECTED_RECEIVER_ID_KEY -@StringRes -internal fun AfternoteEditorError.messageResId(): Int = - when (this) { - is AfternoteEditorError.Validation -> { - reason.messageResId - } - - AfternoteEditorError.Network, - AfternoteEditorError.Server, - -> { - R.string.afternote_editor_save_failed_generic - } - - is AfternoteEditorError.Upload -> { - when (target) { - AfternoteEditorError.Upload.Target.THUMBNAIL -> R.string.afternote_editor_thumbnail_upload_failed - AfternoteEditorError.Upload.Target.SAVE_MEDIA -> R.string.afternote_editor_save_failed_generic - } - } - } - -internal fun tryApplyReceiverSelectionFromSavedState( - backStackEntry: NavBackStackEntry, - viewModel: AfternoteEditorViewModel, - state: AfternoteEditorState, -) { - val id = backStackEntry.savedStateHandle[SELECTED_RECEIVER_ID_KEY] as? Long ?: return - backStackEntry.savedStateHandle.remove(SELECTED_RECEIVER_ID_KEY) - // 목록 로드 실패 시 선택이 조용히 소실되는 경로, #1405 - val receiver = viewModel.getReceiverById(id) ?: return - state.addReceiverById(id, receiver.name, receiver.label) -} - -internal fun buildOnRegisterClick( - editViewModel: AfternoteEditorViewModel, - state: AfternoteEditorState, -): () -> Unit = - { - // 폼 스냅샷은 한 번만 읽는다 — 필드마다 다시 읽으면 조립 도중 갱신이 끼어 서로 다른 시점의 값이 섞인다. - val form = state.currentForm() - val payload = - SaveAfternotePayloadBuilder.build( - form = form, - messageBlocks = state.currentEditorMessageBlocks(), - accountId = - state.idState.text - .toString(), - password = - state.passwordState.text - .toString(), - ) - editViewModel.saveAfternote( - payload = payload, - selectedReceiverIds = form.afternoteEditReceivers.map { it.id }, - memorialMedia = - SaveAfternoteMemorialMedia( - memorialVideoUrl = form.memorialVideoUrl, - memorialThumbnailUrl = form.memorialThumbnailUrl, - memorialPhotoUrl = form.memorialPhotoUrl, - pickedMemorialPhotoUri = form.pickedMemorialPhotoUri, - ), - ) - } - -internal fun shouldDeferEditorBaselineCapture( - isPrefillLoading: Boolean, - isProcessingMethodDefaultsInitializing: Boolean, -): Boolean = isPrefillLoading || isProcessingMethodDefaultsInitializing - /** * 작성자 에디터 화면: type-safe editor flow + 단방향 이벤트. * diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRouteHelpers.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRouteHelpers.kt new file mode 100644 index 0000000000..4404a09d58 --- /dev/null +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRouteHelpers.kt @@ -0,0 +1,79 @@ +package com.afternote.feature.afternote.presentation.author.editor + +import androidx.annotation.StringRes +import androidx.navigation.NavBackStackEntry +import com.afternote.feature.afternote.presentation.R +import com.afternote.feature.afternote.presentation.author.editor.state.AfternoteEditorError +import com.afternote.feature.afternote.presentation.author.editor.state.AfternoteEditorState +import com.afternote.feature.afternote.presentation.author.navigation.model.SELECTED_RECEIVER_ID_KEY + +// 에디터 조립부가 쓰는 순수 헬퍼들이다. Route 파일에는 조립만 남긴다 (#1514). + +@StringRes +internal fun AfternoteEditorError.messageResId(): Int = + when (this) { + is AfternoteEditorError.Validation -> { + reason.messageResId + } + + AfternoteEditorError.Network, + AfternoteEditorError.Server, + -> { + R.string.afternote_editor_save_failed_generic + } + + is AfternoteEditorError.Upload -> { + when (target) { + AfternoteEditorError.Upload.Target.THUMBNAIL -> R.string.afternote_editor_thumbnail_upload_failed + AfternoteEditorError.Upload.Target.SAVE_MEDIA -> R.string.afternote_editor_save_failed_generic + } + } + } + +internal fun tryApplyReceiverSelectionFromSavedState( + backStackEntry: NavBackStackEntry, + viewModel: AfternoteEditorViewModel, + state: AfternoteEditorState, +) { + val id = backStackEntry.savedStateHandle[SELECTED_RECEIVER_ID_KEY] as? Long ?: return + backStackEntry.savedStateHandle.remove(SELECTED_RECEIVER_ID_KEY) + // 목록 로드 실패 시 선택이 조용히 소실되는 경로, #1405 + val receiver = viewModel.getReceiverById(id) ?: return + state.addReceiverById(id, receiver.name, receiver.label) +} + +internal fun buildOnRegisterClick( + editViewModel: AfternoteEditorViewModel, + state: AfternoteEditorState, +): () -> Unit = + { + // 폼 스냅샷은 한 번만 읽는다 — 필드마다 다시 읽으면 조립 도중 갱신이 끼어 서로 다른 시점의 값이 섞인다. + val form = state.currentForm() + val payload = + SaveAfternotePayloadBuilder.build( + form = form, + messageBlocks = state.currentEditorMessageBlocks(), + accountId = + state.idState.text + .toString(), + password = + state.passwordState.text + .toString(), + ) + editViewModel.saveAfternote( + payload = payload, + selectedReceiverIds = form.afternoteEditReceivers.map { it.id }, + memorialMedia = + SaveAfternoteMemorialMedia( + memorialVideoUrl = form.memorialVideoUrl, + memorialThumbnailUrl = form.memorialThumbnailUrl, + memorialPhotoUrl = form.memorialPhotoUrl, + pickedMemorialPhotoUri = form.pickedMemorialPhotoUri, + ), + ) + } + +internal fun shouldDeferEditorBaselineCapture( + isPrefillLoading: Boolean, + isProcessingMethodDefaultsInitializing: Boolean, +): Boolean = isPrefillLoading || isProcessingMethodDefaultsInitializing diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphAddSong.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/memorial/playlist/AddSongRoute.kt similarity index 88% rename from feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphAddSong.kt rename to feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/memorial/playlist/AddSongRoute.kt index 2d94ea21a0..a8ab24b080 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphAddSong.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/memorial/playlist/AddSongRoute.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.author.editor.memorial.playlist import androidx.compose.runtime.Composable import com.afternote.feature.afternote.presentation.author.editor.memorial.playlist.AddSongEntry diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphSelectReceiver.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/receiver/select/SelectReceiverRoute.kt similarity index 93% rename from feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphSelectReceiver.kt rename to feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/receiver/select/SelectReceiverRoute.kt index 05bef4b11c..01a4d4a9ca 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphSelectReceiver.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/receiver/select/SelectReceiverRoute.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.author.editor.receiver.select import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphHome.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/home/AfternoteHomeRoute.kt similarity index 88% rename from feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphHome.kt rename to feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/home/AfternoteHomeRoute.kt index 0b5a6c12e3..cf2e363fb3 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphHome.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/home/AfternoteHomeRoute.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.author.home import androidx.compose.runtime.Composable import com.afternote.feature.afternote.domain.AfternoteType diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraph.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraph.kt index 02346e5e6d..a8513a4f32 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraph.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraph.kt @@ -10,10 +10,16 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.navigation import com.afternote.core.ui.Route import com.afternote.feature.afternote.presentation.AfternoteHostViewModel +import com.afternote.feature.afternote.presentation.author.detail.AfternoteDetailNavigation +import com.afternote.feature.afternote.presentation.author.editor.AfternoteEditorNavigation import com.afternote.feature.afternote.presentation.author.editor.AfternoteEditorViewModel import com.afternote.feature.afternote.presentation.author.editor.memorial.playlist.AddSongViewModel +import com.afternote.feature.afternote.presentation.author.editor.memorial.playlist.AfternoteAddSongNavigation import com.afternote.feature.afternote.presentation.author.editor.memorial.playlist.MemorialPlaylistEntry +import com.afternote.feature.afternote.presentation.author.editor.receiver.select.AfternoteSelectReceiverNavigation +import com.afternote.feature.afternote.presentation.author.home.AfternoteHomeNavigation import com.afternote.feature.afternote.presentation.author.navigation.model.AfternoteRoute +import com.afternote.feature.afternote.presentation.shared.fingerprint.AfternoteFingerprintLoginNavigation /** * Afternote 피처의 네비게이션 그래프. diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/detail/ReceivedAfternoteDetailRoute.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/detail/ReceivedAfternoteDetailRoute.kt index 0465e60326..a007997ef8 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/detail/ReceivedAfternoteDetailRoute.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/detail/ReceivedAfternoteDetailRoute.kt @@ -7,8 +7,8 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LifecycleEventEffect import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.afternote.core.ui.loading.LoadingBody -import com.afternote.feature.afternote.presentation.author.navigation.DesignPendingDetailContent -import com.afternote.feature.afternote.presentation.author.navigation.DetailLoadErrorContent +import com.afternote.feature.afternote.presentation.shared.detail.DesignPendingDetailContent +import com.afternote.feature.afternote.presentation.shared.detail.DetailLoadErrorContent /** * 수신 애프터노트 상세 Stateful Route. diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/navigation/ReceivedAfternoteNavGraph.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/navigation/ReceivedAfternoteNavGraph.kt index 2abd6b3b4c..c70c566ff0 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/navigation/ReceivedAfternoteNavGraph.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/receiver/navigation/ReceivedAfternoteNavGraph.kt @@ -7,7 +7,6 @@ import androidx.lifecycle.compose.LifecycleEventEffect import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavGraphBuilder import com.afternote.core.ui.loading.LoadingBody -import com.afternote.feature.afternote.presentation.author.navigation.DetailLoadErrorContent import com.afternote.feature.afternote.presentation.author.navigation.afternoteComposable import com.afternote.feature.afternote.presentation.receiver.afternotelist.ReceiverAfternoteHomeEntry import com.afternote.feature.afternote.presentation.receiver.detail.ReceivedAfternoteDetailRoute @@ -15,6 +14,7 @@ import com.afternote.feature.afternote.presentation.receiver.navigation.model.Re import com.afternote.feature.afternote.presentation.receiver.playlist.MemorialPlaylistScreen import com.afternote.feature.afternote.presentation.receiver.playlist.ReceiverMemorialPlaylistUiState import com.afternote.feature.afternote.presentation.receiver.playlist.ReceiverMemorialPlaylistViewModel +import com.afternote.feature.afternote.presentation.shared.detail.DetailLoadErrorContent /** * 수신 애프터노트 목록·상세·추억 플레이리스트를 루트 NavHost 에 등록한다. diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/detail/DetailStateContents.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/detail/DetailStateContents.kt new file mode 100644 index 0000000000..a48df983c8 --- /dev/null +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/detail/DetailStateContents.kt @@ -0,0 +1,97 @@ +package com.afternote.feature.afternote.presentation.shared.detail + +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.afternote.core.ui.theme.AfternoteDesign +import com.afternote.core.ui.topbar.DetailTopBar +import com.afternote.feature.afternote.presentation.R + +// 작성자·수신자 상세가 함께 쓰는 «내용 대신 상태를 보여 주는» 화면들이다. 한쪽 기능 폴더에 +// 두면 다른 쪽이 남의 폴더를 import 해야 한다 (#1514). + +@Composable +fun DesignPendingDetailContent(onBackClick: () -> Unit) { + Scaffold( + modifier = Modifier.fillMaxSize(), + containerColor = Color.Transparent, + topBar = { + DetailTopBar(title = "", onBackClick = onBackClick) + }, + ) { paddingValues -> + Box( + modifier = + Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center, + ) { + Text(text = stringResource(R.string.design_pending)) + } + } +} + +/** + * 상세 데이터 로드 실패 화면. + * + * [com.afternote.feature.afternote.presentation.author.detail.AfternoteDetailUiState.Error] 계약대로 + * [messageRes] 를 [stringResource] 로 변환해 표시한다 (없으면 [R.string.afternote_detail_load_error] 폴백). + * 예외 원문은 받지 않는다 — 서버 5xx 본문·역직렬화 예외 메시지에 내부 SQL·응답 원문 발췌가 섞여 오기 때문. + * + * 표시 방식 통일(#446) 결론이 나오면 이 컴포저블의 본문 표현만 교체한다 — Route 의 Error 분기 배선은 유지. + * [DesignPendingDetailContent] 는 ESTATE 등 아직 구현되지 않은 상세 타입의 폴백으로만 유지한다. + * + * @param messageRes 앱에 박힌 문자열 리소스 ID(`R.string.*`). `@StringRes` 는 이 Int 가 임의 정수가 아니라 + * string 리소스 id 임을 Lint 에 알리는 표식이며, [stringResource] 로 실제 텍스트로 변환한다. + * @param onRetryClick 재조회 진입점. `null` 이면 재시도 버튼을 그리지 않는다 — 잘못된 항목 ID 처럼 + * 같은 요청을 다시 보내도 결과가 달라지지 않는 실패에 쓴다. + */ +@Composable +fun DetailLoadErrorContent( + @StringRes messageRes: Int?, + onBackClick: () -> Unit, + onRetryClick: (() -> Unit)? = null, +) { + Scaffold( + modifier = Modifier.fillMaxSize(), + containerColor = Color.Transparent, + topBar = { + DetailTopBar(title = "", onBackClick = onBackClick) + }, + ) { paddingValues -> + Box( + modifier = + Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center, + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text(text = stringResource(messageRes ?: R.string.afternote_detail_load_error)) + if (onRetryClick != null) { + Spacer(modifier = Modifier.height(16.dp)) + TextButton(onClick = onRetryClick) { + Text( + text = stringResource(R.string.afternote_detail_retry), + style = AfternoteDesign.typography.captionLargeB, + color = AfternoteDesign.colors.gray9, + ) + } + } + } + } + } +} diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphFingerprint.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/fingerprint/FingerprintLoginRoute.kt similarity index 98% rename from feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphFingerprint.kt rename to feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/fingerprint/FingerprintLoginRoute.kt index d9d42042bd..08ad46210b 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/navigation/AfternoteNavGraphFingerprint.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/fingerprint/FingerprintLoginRoute.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.shared.fingerprint import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect diff --git a/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/navigation/DeleteInProgressOverlayScreenshotTest.kt b/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/detail/DeleteInProgressOverlayScreenshotTest.kt similarity index 93% rename from feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/navigation/DeleteInProgressOverlayScreenshotTest.kt rename to feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/detail/DeleteInProgressOverlayScreenshotTest.kt index 29e81e029c..b0764e9d1d 100644 --- a/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/navigation/DeleteInProgressOverlayScreenshotTest.kt +++ b/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/detail/DeleteInProgressOverlayScreenshotTest.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.author.detail import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize diff --git a/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTest.kt b/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTest.kt similarity index 95% rename from feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTest.kt rename to feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTest.kt index e1b73cb44a..518207b9c7 100644 --- a/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTest.kt +++ b/feature/afternote/presentation/src/screenshotTest/kotlin/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTest.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.shared.detail import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview diff --git a/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DeleteInProgressOverlayScreenshotTestKt/deleteInProgressOverlayScreenshot_748aa731_0.png b/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/detail/DeleteInProgressOverlayScreenshotTestKt/deleteInProgressOverlayScreenshot_748aa731_0.png similarity index 100% rename from feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DeleteInProgressOverlayScreenshotTestKt/deleteInProgressOverlayScreenshot_748aa731_0.png rename to feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/detail/DeleteInProgressOverlayScreenshotTestKt/deleteInProgressOverlayScreenshot_748aa731_0.png diff --git a/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentDefaultFallbackScreenshot_748aa731_0.png b/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentDefaultFallbackScreenshot_748aa731_0.png similarity index 100% rename from feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentDefaultFallbackScreenshot_748aa731_0.png rename to feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentDefaultFallbackScreenshot_748aa731_0.png diff --git a/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentMessageResScreenshot_748aa731_0.png b/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentMessageResScreenshot_748aa731_0.png similarity index 100% rename from feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentMessageResScreenshot_748aa731_0.png rename to feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentMessageResScreenshot_748aa731_0.png diff --git a/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentRetryScreenshot_748aa731_0.png b/feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentRetryScreenshot_748aa731_0.png similarity index 100% rename from feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/author/navigation/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentRetryScreenshot_748aa731_0.png rename to feature/afternote/presentation/src/screenshotTestDebug/reference/com/afternote/feature/afternote/presentation/shared/detail/DetailLoadErrorContentScreenshotTestKt/detailLoadErrorContentRetryScreenshot_748aa731_0.png diff --git a/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/navigation/MemorialVideoLauncherTest.kt b/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/detail/MemorialVideoLauncherTest.kt similarity index 97% rename from feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/navigation/MemorialVideoLauncherTest.kt rename to feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/detail/MemorialVideoLauncherTest.kt index 9af81dc529..4733b0ccea 100644 --- a/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/navigation/MemorialVideoLauncherTest.kt +++ b/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/detail/MemorialVideoLauncherTest.kt @@ -1,4 +1,4 @@ -package com.afternote.feature.afternote.presentation.author.navigation +package com.afternote.feature.afternote.presentation.author.detail import android.content.ActivityNotFoundException import android.content.Intent diff --git a/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt b/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt index 1a5cfbc800..5b903b8b7a 100644 --- a/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt +++ b/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt @@ -9,9 +9,9 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.performClick import com.afternote.core.ui.theme.AfternoteTheme import com.afternote.feature.afternote.presentation.author.editor.processing.model.ProcessingMethodItem +import com.afternote.feature.afternote.presentation.author.editor.shouldDeferEditorBaselineCapture import com.afternote.feature.afternote.presentation.author.editor.state.AfternoteTypeForm import com.afternote.feature.afternote.presentation.author.editor.state.EditorFormState -import com.afternote.feature.afternote.presentation.author.navigation.shouldDeferEditorBaselineCapture import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test From 71ce83acbb25a7f2ad846b83e6576f9221cb9ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=BC=ED=98=81?= Date: Sun, 30 Aug 2026 12:08:55 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor(afternote):=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=82=A8=EC=9D=80=20=EC=9E=90=EA=B8=B0=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20import=20=EB=A5=BC=20=EC=A7=80?= =?UTF-8?q?=EC=9A=B4=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 화면 조립부가 기능 폴더로 옮겨지면서 import 대상과 같은 패키지가 됐는데 import 줄은 그대로 따라와 무의미하게 남았다. 6파일 16줄 삭제 — 다른 변경 없음. --- .../presentation/author/editor/AfternoteEditorRoute.kt | 5 ----- .../author/editor/memorial/playlist/AddSongRoute.kt | 3 --- .../author/editor/receiver/select/SelectReceiverRoute.kt | 2 -- .../afternote/presentation/author/home/AfternoteHomeRoute.kt | 1 - .../presentation/shared/fingerprint/FingerprintLoginRoute.kt | 4 ---- ...AfternoteEditorProcessingMethodDefaultsInteractionTest.kt | 1 - 6 files changed, 16 deletions(-) diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRoute.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRoute.kt index 149a1c8790..8a16bf3c4a 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRoute.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorRoute.kt @@ -9,11 +9,6 @@ import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavBackStackEntry import com.afternote.feature.afternote.presentation.R -import com.afternote.feature.afternote.presentation.author.editor.AfternoteEditorBody -import com.afternote.feature.afternote.presentation.author.editor.AfternoteEditorScreen -import com.afternote.feature.afternote.presentation.author.editor.AfternoteEditorViewModel -import com.afternote.feature.afternote.presentation.author.editor.SaveAfternoteMemorialMedia -import com.afternote.feature.afternote.presentation.author.editor.SaveAfternotePayloadBuilder import com.afternote.feature.afternote.presentation.author.editor.processing.AfternoteProcessingMethodDefaults import com.afternote.feature.afternote.presentation.author.editor.state.AfternoteEditorError import com.afternote.feature.afternote.presentation.author.editor.state.AfternoteEditorState diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/memorial/playlist/AddSongRoute.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/memorial/playlist/AddSongRoute.kt index a8ab24b080..64e4eb98e5 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/memorial/playlist/AddSongRoute.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/memorial/playlist/AddSongRoute.kt @@ -1,9 +1,6 @@ package com.afternote.feature.afternote.presentation.author.editor.memorial.playlist import androidx.compose.runtime.Composable -import com.afternote.feature.afternote.presentation.author.editor.memorial.playlist.AddSongEntry -import com.afternote.feature.afternote.presentation.author.editor.memorial.playlist.AddSongViewModel -import com.afternote.feature.afternote.presentation.author.editor.memorial.playlist.Song @Composable internal fun AfternoteAddSongNavigation( diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/receiver/select/SelectReceiverRoute.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/receiver/select/SelectReceiverRoute.kt index 01a4d4a9ca..6727f5e534 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/receiver/select/SelectReceiverRoute.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/editor/receiver/select/SelectReceiverRoute.kt @@ -4,8 +4,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.afternote.feature.afternote.presentation.author.editor.receiver.select.SelectReceiverScreen -import com.afternote.feature.afternote.presentation.author.editor.receiver.select.SelectReceiverViewModel /** * 수신자 선택 화면 진입점 (#540). diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/home/AfternoteHomeRoute.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/home/AfternoteHomeRoute.kt index cf2e363fb3..2ace1523ac 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/home/AfternoteHomeRoute.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/author/home/AfternoteHomeRoute.kt @@ -2,7 +2,6 @@ package com.afternote.feature.afternote.presentation.author.home import androidx.compose.runtime.Composable import com.afternote.feature.afternote.domain.AfternoteType -import com.afternote.feature.afternote.presentation.author.home.AfternoteHomeEntry @Composable internal fun AfternoteHomeNavigation( diff --git a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/fingerprint/FingerprintLoginRoute.kt b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/fingerprint/FingerprintLoginRoute.kt index 08ad46210b..f93182553f 100644 --- a/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/fingerprint/FingerprintLoginRoute.kt +++ b/feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/shared/fingerprint/FingerprintLoginRoute.kt @@ -12,10 +12,6 @@ import androidx.compose.ui.res.stringResource import androidx.fragment.app.FragmentActivity import com.afternote.core.ui.findActivity import com.afternote.feature.afternote.presentation.R -import com.afternote.feature.afternote.presentation.shared.fingerprint.BiometricAuthResult -import com.afternote.feature.afternote.presentation.shared.fingerprint.BiometricMessages -import com.afternote.feature.afternote.presentation.shared.fingerprint.FingerprintLoginScreen -import com.afternote.feature.afternote.presentation.shared.fingerprint.authenticateBiometric import kotlinx.coroutines.launch @Composable diff --git a/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt b/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt index 5b903b8b7a..51b63c029c 100644 --- a/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt +++ b/feature/afternote/presentation/src/test/kotlin/com/afternote/feature/afternote/presentation/author/editor/AfternoteEditorProcessingMethodDefaultsInteractionTest.kt @@ -9,7 +9,6 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.performClick import com.afternote.core.ui.theme.AfternoteTheme import com.afternote.feature.afternote.presentation.author.editor.processing.model.ProcessingMethodItem -import com.afternote.feature.afternote.presentation.author.editor.shouldDeferEditorBaselineCapture import com.afternote.feature.afternote.presentation.author.editor.state.AfternoteTypeForm import com.afternote.feature.afternote.presentation.author.editor.state.EditorFormState import org.junit.Assert.assertEquals