From 18e4877736d7723adfb8aa1d2b1531c8d4c6d2fa Mon Sep 17 00:00:00 2001 From: Justin Caveda Date: Tue, 13 Jan 2026 14:32:29 -0600 Subject: [PATCH] Fix wrong dialog showing after Seerr login (#688) **Description** Fixes a race condition in the Seerr integration. When you added a new Seerr server and logged in successfully, the app would immediately show the "Disable Seerr?" dialog instead of a success message. The state was getting mixed up during recomposition and thinking you wanted to remove the server you just added. Fixed by being more explicit about what mode the dialog is in (adding vs removing) so it can't get confused by background state changes. Also added a success toast when login works. **AI/LLM usage** Used Claude Code to analyze the issue. --- .../ui/preferences/PreferencesContent.kt | 49 +++++++++++++------ .../ui/setup/seerr/SwitchSeerrViewModel.kt | 4 ++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt index e79fdc96..95432283 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt @@ -92,7 +92,7 @@ fun PreferencesContent( val navDrawerPins by viewModel.navDrawerPins.observeAsState(mapOf()) var cacheUsage by remember { mutableStateOf(CacheUsage(0, 0, 0)) } val seerrIntegrationEnabled by viewModel.seerrEnabled.collectAsState(false) - var showSeerrServerDialog by remember { mutableStateOf(false) } + var seerrDialogMode by remember { mutableStateOf(SeerrDialogMode.None) } LaunchedEffect(Unit) { viewModel.preferenceDataStore.data.collect { @@ -393,7 +393,14 @@ fun PreferencesContent( AppPreference.SeerrIntegration -> { ClickPreference( title = stringResource(pref.title), - onClick = { showSeerrServerDialog = true }, + onClick = { + if (seerrIntegrationEnabled) { + seerrDialogMode = SeerrDialogMode.Remove + } else { + seerrVm.resetStatus() + seerrDialogMode = SeerrDialogMode.Add + } + }, modifier = Modifier, summary = if (seerrIntegrationEnabled) { @@ -465,25 +472,29 @@ fun PreferencesContent( ) } } - if (showSeerrServerDialog) { - val status by seerrVm.serverConnectionStatus.collectAsState(LoadingState.Pending) - LaunchedEffect(status) { - if (status == LoadingState.Success) { - showSeerrServerDialog = false - } - } - if (seerrIntegrationEnabled) { + when (seerrDialogMode) { + SeerrDialogMode.Remove -> { ConfirmDialog( title = stringResource(R.string.remove_seerr_server), body = "", - onCancel = { showSeerrServerDialog = false }, + onCancel = { seerrDialogMode = SeerrDialogMode.None }, onConfirm = { seerrVm.removeServer() - showSeerrServerDialog = false + seerrDialogMode = SeerrDialogMode.None }, ) - } else { + } + + SeerrDialogMode.Add -> { val currentUser by seerrVm.currentUser.observeAsState() + val status by seerrVm.serverConnectionStatus.collectAsState(LoadingState.Pending) + val serverAddedMessage = stringResource(R.string.seerr_server_added) + LaunchedEffect(status) { + if (status == LoadingState.Success) { + Toast.makeText(context, serverAddedMessage, Toast.LENGTH_SHORT).show() + seerrDialogMode = SeerrDialogMode.None + } + } AddSeerServerDialog( currentUsername = currentUser?.name, status = status, @@ -494,9 +505,11 @@ fun PreferencesContent( seerrVm.submitServer(url, username ?: "", passwordOrApiKey, method) } }, - onDismissRequest = { showSeerrServerDialog = false }, + onDismissRequest = { seerrDialogMode = SeerrDialogMode.None }, ) } + + SeerrDialogMode.None -> {} } } } @@ -539,3 +552,11 @@ data class CacheUsage( val imageMemoryMax: Long, val imageDiskUsed: Long, ) + +private sealed class SeerrDialogMode { + data object None : SeerrDialogMode() + + data object Add : SeerrDialogMode() + + data object Remove : SeerrDialogMode() +} diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt index c0cf1759..0b067287 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt @@ -107,4 +107,8 @@ class SwitchSeerrViewModel seerrServerRepository.removeServer() } } + + fun resetStatus() { + serverConnectionStatus.update { LoadingState.Pending } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d428a76a..82bf3210 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -434,6 +434,7 @@ Pending Seerr integration Remove Seerr Server + Seerr server added Password Username URL