From 68c270ed5cd9d0ad1ac74544cd61557248eec8be Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 18 Jun 2026 19:15:13 -0300 Subject: [PATCH] feat(deck): show loading feedback while deleting a deck Deleting a deck sweeps every card, the manifest, all media blobs, SRS records, and tag records over the network, which takes noticeable time. Previously the UI gave no feedback between confirming and navigating away, so the action felt unresponsive and could be double-fired. Add an isDeleting flag to DeckDetailUiState.Content, set it when the delete starts, and render a full-screen EchoLoadingScreen overlay while it's in progress. Success navigates back via the existing Deleted effect; failure falls through to the existing Error state. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../github/jvsena42/echo/ui/decks/DeckDetailScreen.kt | 9 +++++++++ composeApp/src/androidMain/res/values/strings.xml | 1 + .../echo/presentation/decks/DeckDetailViewModel.kt | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/composeApp/src/androidMain/kotlin/com/github/jvsena42/echo/ui/decks/DeckDetailScreen.kt b/composeApp/src/androidMain/kotlin/com/github/jvsena42/echo/ui/decks/DeckDetailScreen.kt index 5648864..f93a1cb 100644 --- a/composeApp/src/androidMain/kotlin/com/github/jvsena42/echo/ui/decks/DeckDetailScreen.kt +++ b/composeApp/src/androidMain/kotlin/com/github/jvsena42/echo/ui/decks/DeckDetailScreen.kt @@ -174,6 +174,15 @@ fun DeckDetailScreen( onDismiss = onDismissDelete, ) } + if (state.isDeleting) { + Box( + modifier = Modifier + .fillMaxSize() + .background(colors.surfacePrimary), + ) { + EchoLoadingScreen(message = stringResource(R.string.deck_detail_deleting)) + } + } } } } diff --git a/composeApp/src/androidMain/res/values/strings.xml b/composeApp/src/androidMain/res/values/strings.xml index 925ca1e..d20ae90 100644 --- a/composeApp/src/androidMain/res/values/strings.xml +++ b/composeApp/src/androidMain/res/values/strings.xml @@ -39,6 +39,7 @@ Something went wrong Retry Opening deck… + Deleting deck… Start studying · %1$d due Study this deck Back diff --git a/shared/src/commonMain/kotlin/com/github/jvsena42/echo/presentation/decks/DeckDetailViewModel.kt b/shared/src/commonMain/kotlin/com/github/jvsena42/echo/presentation/decks/DeckDetailViewModel.kt index 4f6d5a3..8b39448 100644 --- a/shared/src/commonMain/kotlin/com/github/jvsena42/echo/presentation/decks/DeckDetailViewModel.kt +++ b/shared/src/commonMain/kotlin/com/github/jvsena42/echo/presentation/decks/DeckDetailViewModel.kt @@ -119,7 +119,7 @@ class DeckDetailViewModel( fun onConfirmDelete() { val current = _state.value as? DeckDetailUiState.Content ?: return - _state.value = current.copy(showDeleteConfirm = false) + _state.value = current.copy(showDeleteConfirm = false, isDeleting = true) scope.launch { Log.d(TAG, "onConfirmDelete: deckId=$deckId") deckRepository.delete(deckId) @@ -208,6 +208,7 @@ sealed interface DeckDetailUiState { val masteredPercent: String, val cardPreviews: List, val showDeleteConfirm: Boolean = false, + val isDeleting: Boolean = false, ) : DeckDetailUiState data class Error(val message: String) : DeckDetailUiState }