fix: harden provider session restoration

This commit is contained in:
2026-08-23 23:30:11 +08:00
parent 344fa6dafa
commit 7cb0480a7a
5 changed files with 83 additions and 30 deletions
@@ -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
}
}
}