fix: harden provider session restoration
This commit is contained in:
@@ -48,10 +48,6 @@ fun LoginRoute(
|
||||
) {
|
||||
LaunchedEffect(profile.id) { viewModel.loadProfile(profile) }
|
||||
val state = viewModel.uiState.collectAsStateWithLifecycle().value
|
||||
val switchProvider = {
|
||||
viewModel.clearSensitiveState()
|
||||
onSwitchProvider()
|
||||
}
|
||||
LoginScreen(
|
||||
profile = profile,
|
||||
state = state.copy(
|
||||
@@ -62,7 +58,7 @@ fun LoginRoute(
|
||||
onRememberUsernameChange = viewModel::setRememberUsername,
|
||||
onAutoLoginChange = viewModel::setAutoLogin,
|
||||
onSubmit = viewModel::submit,
|
||||
onSwitchProvider = switchProvider,
|
||||
onSwitchProvider = onSwitchProvider,
|
||||
switchingProvider = actionInProgress,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -32,8 +32,7 @@ class LoginViewModel @Inject constructor(
|
||||
private var autoLoginEdited = false
|
||||
|
||||
fun loadProfile(value: ProviderProfile) {
|
||||
val profileChanged = profile?.id != value.id
|
||||
if (!profileChanged && loadingJob != null) return
|
||||
if (profile?.id == value.id && loadingJob?.isActive == true) return
|
||||
loadingJob?.cancel()
|
||||
profile = value
|
||||
usernameEdited = false
|
||||
@@ -41,26 +40,30 @@ class LoginViewModel @Inject constructor(
|
||||
autoLoginEdited = false
|
||||
_uiState.value = LoginUiState(isLoadingPreferences = true)
|
||||
loadingJob = viewModelScope.launch {
|
||||
val preferences = profileStore.loginPreferences(value.id)
|
||||
if (profile?.id != value.id) return@launch
|
||||
_uiState.value = _uiState.value.copy(
|
||||
username = if (usernameEdited) {
|
||||
_uiState.value.username
|
||||
} else {
|
||||
preferences.rememberedUsername?.value.orEmpty()
|
||||
},
|
||||
rememberUsername = if (rememberUsernameEdited) {
|
||||
_uiState.value.rememberUsername
|
||||
} else {
|
||||
preferences.rememberUsername
|
||||
},
|
||||
autoLogin = if (autoLoginEdited) {
|
||||
_uiState.value.autoLogin
|
||||
} else {
|
||||
preferences.autoLoginEnabled
|
||||
},
|
||||
isLoadingPreferences = false,
|
||||
)
|
||||
try {
|
||||
val preferences = profileStore.loginPreferences(value.id)
|
||||
if (profile?.id != value.id) return@launch
|
||||
_uiState.value = _uiState.value.copy(
|
||||
username = if (usernameEdited) {
|
||||
_uiState.value.username
|
||||
} else {
|
||||
preferences.rememberedUsername?.value.orEmpty()
|
||||
},
|
||||
rememberUsername = if (rememberUsernameEdited) {
|
||||
_uiState.value.rememberUsername
|
||||
} else {
|
||||
preferences.rememberUsername
|
||||
},
|
||||
autoLogin = if (autoLoginEdited) {
|
||||
_uiState.value.autoLogin
|
||||
} else {
|
||||
preferences.autoLoginEnabled
|
||||
},
|
||||
isLoadingPreferences = false,
|
||||
)
|
||||
} finally {
|
||||
loadingJob = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user