Can remove seerr server

This commit is contained in:
Damontecres 2026-01-06 13:27:35 -05:00
parent 70fd36ccab
commit 921ffadc1c
No known key found for this signature in database
5 changed files with 52 additions and 17 deletions

View file

@ -139,6 +139,12 @@ class SeerrServerRepository
return LoadingState.Error(ex) return LoadingState.Error(ex)
} }
} }
suspend fun removeServer() {
val current = _current.value ?: return
seerrServerDao.deleteUser(current.server.id, current.user.jellyfinUserRowId)
clear()
}
} }
typealias SeerrUserConfig = User typealias SeerrUserConfig = User

View file

@ -43,6 +43,7 @@ import androidx.tv.material3.surfaceColorAtElevation
import coil3.SingletonImageLoader import coil3.SingletonImageLoader
import coil3.imageLoader import coil3.imageLoader
import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.R
import com.github.damontecres.wholphin.data.model.SeerrAuthMethod
import com.github.damontecres.wholphin.preferences.AppPreference import com.github.damontecres.wholphin.preferences.AppPreference
import com.github.damontecres.wholphin.preferences.AppPreferences import com.github.damontecres.wholphin.preferences.AppPreferences
import com.github.damontecres.wholphin.preferences.PlayerBackend import com.github.damontecres.wholphin.preferences.PlayerBackend
@ -51,6 +52,7 @@ import com.github.damontecres.wholphin.preferences.basicPreferences
import com.github.damontecres.wholphin.preferences.uiPreferences import com.github.damontecres.wholphin.preferences.uiPreferences
import com.github.damontecres.wholphin.preferences.updatePlaybackPreferences import com.github.damontecres.wholphin.preferences.updatePlaybackPreferences
import com.github.damontecres.wholphin.services.UpdateChecker import com.github.damontecres.wholphin.services.UpdateChecker
import com.github.damontecres.wholphin.ui.components.ConfirmDialog
import com.github.damontecres.wholphin.ui.ifElse import com.github.damontecres.wholphin.ui.ifElse
import com.github.damontecres.wholphin.ui.isNotNullOrBlank import com.github.damontecres.wholphin.ui.isNotNullOrBlank
import com.github.damontecres.wholphin.ui.nav.Destination import com.github.damontecres.wholphin.ui.nav.Destination
@ -60,9 +62,11 @@ import com.github.damontecres.wholphin.ui.preferences.subtitle.SubtitleSettings
import com.github.damontecres.wholphin.ui.preferences.subtitle.SubtitleStylePage import com.github.damontecres.wholphin.ui.preferences.subtitle.SubtitleStylePage
import com.github.damontecres.wholphin.ui.setup.UpdateViewModel import com.github.damontecres.wholphin.ui.setup.UpdateViewModel
import com.github.damontecres.wholphin.ui.setup.seerr.AddSeerServerDialog import com.github.damontecres.wholphin.ui.setup.seerr.AddSeerServerDialog
import com.github.damontecres.wholphin.ui.setup.seerr.SwitchSeerrViewModel
import com.github.damontecres.wholphin.ui.showToast import com.github.damontecres.wholphin.ui.showToast
import com.github.damontecres.wholphin.ui.tryRequestFocus import com.github.damontecres.wholphin.ui.tryRequestFocus
import com.github.damontecres.wholphin.util.ExceptionHandler import com.github.damontecres.wholphin.util.ExceptionHandler
import com.github.damontecres.wholphin.util.LoadingState
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import timber.log.Timber import timber.log.Timber
@ -73,6 +77,7 @@ fun PreferencesContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: PreferencesViewModel = hiltViewModel(), viewModel: PreferencesViewModel = hiltViewModel(),
updateVM: UpdateViewModel = hiltViewModel(), updateVM: UpdateViewModel = hiltViewModel(),
seerrVm: SwitchSeerrViewModel = hiltViewModel(),
onFocus: (Int, Int) -> Unit = { _, _ -> }, onFocus: (Int, Int) -> Unit = { _, _ -> },
) { ) {
val context = LocalContext.current val context = LocalContext.current
@ -461,12 +466,35 @@ fun PreferencesContent(
} }
} }
if (showSeerrServerDialog) { if (showSeerrServerDialog) {
if (seerrIntegrationEnabled) {
ConfirmDialog(
title = stringResource(R.string.remove_seerr_server),
body = "",
onCancel = { showSeerrServerDialog = false },
onConfirm = {
seerrVm.removeServer()
showSeerrServerDialog = false
},
)
} else {
val currentUser by seerrVm.currentUser.observeAsState()
val status by seerrVm.serverConnectionStatus.collectAsState(LoadingState.Pending)
AddSeerServerDialog( AddSeerServerDialog(
currentUsername = currentUser?.name,
status = status,
onSubmit = { url: String, username: String?, passwordOrApiKey: String, method: SeerrAuthMethod ->
if (method == SeerrAuthMethod.API_KEY) {
seerrVm.submitServer(url, passwordOrApiKey)
} else {
seerrVm.submitServer(url, username ?: "", passwordOrApiKey, method)
}
},
onDismissRequest = { showSeerrServerDialog = false }, onDismissRequest = { showSeerrServerDialog = false },
) )
} }
} }
} }
}
@Composable @Composable
fun PreferencesPage( fun PreferencesPage(

View file

@ -2,13 +2,10 @@ package com.github.damontecres.wholphin.ui.setup.seerr
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import com.github.damontecres.wholphin.data.model.SeerrAuthMethod import com.github.damontecres.wholphin.data.model.SeerrAuthMethod
import com.github.damontecres.wholphin.ui.components.BasicDialog import com.github.damontecres.wholphin.ui.components.BasicDialog
import com.github.damontecres.wholphin.ui.components.DialogItem import com.github.damontecres.wholphin.ui.components.DialogItem
@ -18,12 +15,12 @@ import com.github.damontecres.wholphin.util.LoadingState
@Composable @Composable
fun AddSeerServerDialog( fun AddSeerServerDialog(
currentUsername: String?,
status: LoadingState,
onSubmit: (url: String, username: String?, passwordOrApiKey: String, method: SeerrAuthMethod) -> Unit,
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
viewModel: SwitchSeerrViewModel = hiltViewModel(),
) { ) {
val currentUser by viewModel.currentUser.observeAsState()
var authMethod by remember { mutableStateOf<SeerrAuthMethod?>(null) } var authMethod by remember { mutableStateOf<SeerrAuthMethod?>(null) }
val status by viewModel.serverConnectionStatus.collectAsState(LoadingState.Pending)
LaunchedEffect(status) { LaunchedEffect(status) {
if (status is LoadingState.Success) { if (status is LoadingState.Success) {
onDismissRequest.invoke() onDismissRequest.invoke()
@ -38,14 +35,9 @@ fun AddSeerServerDialog(
) { ) {
AddSeerrServerUsername( AddSeerrServerUsername(
onSubmit = { url, username, password -> onSubmit = { url, username, password ->
viewModel.submitServer( onSubmit.invoke(url, username, password, auth)
url,
username,
password,
auth,
)
}, },
username = currentUser?.name ?: "", username = currentUsername ?: "",
status = status, status = status,
) )
} }
@ -56,7 +48,9 @@ fun AddSeerServerDialog(
onDismissRequest = { authMethod = null }, onDismissRequest = { authMethod = null },
) { ) {
AddSeerrServerApiKey( AddSeerrServerApiKey(
onSubmit = { url, apiKey -> viewModel.submitServer(url, apiKey) }, onSubmit = { url, apiKey ->
onSubmit.invoke(url, null, apiKey, SeerrAuthMethod.API_KEY)
},
status = status, status = status,
) )
} }

View file

@ -81,4 +81,10 @@ class SwitchSeerrViewModel
serverConnectionStatus.update { result } serverConnectionStatus.update { result }
} }
} }
fun removeServer() {
viewModelScope.launchIO {
seerrServerRepository.removeServer()
}
}
} }

View file

@ -408,6 +408,7 @@
<string name="request">Request</string> <string name="request">Request</string>
<string name="pending">Pending</string> <string name="pending">Pending</string>
<string name="seerr_integration">Seerr integration</string> <string name="seerr_integration">Seerr integration</string>
<string name="remove_seerr_server">Remove Seerr Server</string>
<string-array name="theme_song_volume"> <string-array name="theme_song_volume">
<item>Disabled</item> <item>Disabled</item>