fix: align session state across transitions
This commit is contained in:
@@ -16,6 +16,7 @@ import com.flagship.abox.manager.designsystem.ABoxSurface
|
||||
import com.flagship.abox.manager.designsystem.ABoxTheme
|
||||
import com.flagship.abox.manager.ui.authenticated.AuthenticatedPlaceholderScreen
|
||||
import com.flagship.abox.manager.ui.login.LoginRoute
|
||||
import com.flagship.abox.manager.ui.login.LoginViewModel
|
||||
import com.flagship.abox.manager.ui.provider.ProviderSelectionRoute
|
||||
import com.flagship.abox.manager.ui.session.AppSessionUiState
|
||||
import com.flagship.abox.manager.ui.session.AppSessionViewModel
|
||||
@@ -25,12 +26,16 @@ import com.flagship.abox.manager.ui.session.SessionActionsViewModel
|
||||
fun ABoxManagerApp(
|
||||
appSessionViewModel: AppSessionViewModel = hiltViewModel(),
|
||||
sessionActionsViewModel: SessionActionsViewModel = hiltViewModel(),
|
||||
loginViewModel: LoginViewModel = hiltViewModel(),
|
||||
) {
|
||||
val actionState = sessionActionsViewModel.uiState.collectAsStateWithLifecycle().value
|
||||
val sessionState = appSessionViewModel.uiState.collectAsStateWithLifecycle().value
|
||||
val screenKey = sessionState.screenKey()
|
||||
LaunchedEffect(screenKey) {
|
||||
sessionActionsViewModel.dismissError()
|
||||
if (sessionState !is AppSessionUiState.Login) {
|
||||
loginViewModel.clearSensitiveState()
|
||||
}
|
||||
}
|
||||
ABoxTheme {
|
||||
ABoxSurface(modifier = Modifier.fillMaxSize()) {
|
||||
@@ -50,6 +55,7 @@ fun ABoxManagerApp(
|
||||
actionError = actionState.errorMessage,
|
||||
actionInProgress = actionState.inProgress,
|
||||
onSwitchProvider = sessionActionsViewModel::switchProvider,
|
||||
viewModel = loginViewModel,
|
||||
)
|
||||
is AppSessionUiState.Authenticated -> AuthenticatedPlaceholderScreen(
|
||||
profile = state.profile,
|
||||
|
||||
@@ -21,7 +21,6 @@ import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
@@ -51,9 +50,6 @@ fun LoginRoute(
|
||||
viewModel: LoginViewModel = hiltViewModel(),
|
||||
) {
|
||||
LaunchedEffect(profile.id) { viewModel.loadProfile(profile) }
|
||||
DisposableEffect(profile.id) {
|
||||
onDispose(viewModel::clearSensitiveState)
|
||||
}
|
||||
val state = viewModel.uiState.collectAsStateWithLifecycle().value
|
||||
val errorText = state.errorMessage?.let { stringResource(it.stringResource()) }
|
||||
?: actionError
|
||||
|
||||
+1
-1
@@ -98,7 +98,7 @@ class AppSessionViewModel @Inject constructor(
|
||||
): AppSessionUiState = when {
|
||||
profile == null -> AppSessionUiState.ProviderSelection
|
||||
availability.forType(profile.type) is Availability.Disabled -> AppSessionUiState.ProviderSelection
|
||||
session != null -> AppSessionUiState.Authenticated(profile)
|
||||
session?.profileId == profile.id -> AppSessionUiState.Authenticated(profile)
|
||||
else -> AppSessionUiState.Login(profile, bootstrapError)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user