From ce2f0d4b6f646c23d8c9359969199d85fdae7cff Mon Sep 17 00:00:00 2001 From: Stefano Sansone Date: Wed, 1 May 2024 01:59:09 +0200 Subject: [PATCH] add welcome screen to navigation --- .../omnivore/feature/auth/LoginViewModel.kt | 11 +++++-- .../omnivore/feature/root/RootView.kt | 31 +++++++++++-------- .../omnivore/omnivore/navigation/Routes.kt | 1 + 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/auth/LoginViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/auth/LoginViewModel.kt index dec8b12d3..b8d6183cb 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/auth/LoginViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/auth/LoginViewModel.kt @@ -45,6 +45,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import io.intercom.android.sdk.Intercom import kotlinx.coroutines.Job import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.distinctUntilChanged @@ -78,7 +79,7 @@ class LoginViewModel @Inject constructor( var errorMessage by mutableStateOf(null) private set - var hasValidUsername by mutableStateOf(false) + var hasValidUsername by mutableStateOf(false) private set var usernameValidationErrorMessage by mutableStateOf(null) @@ -87,8 +88,12 @@ class LoginViewModel @Inject constructor( var pendingEmailUserCreds by mutableStateOf(null) private set - val hasAuthTokenLiveData: LiveData = - datastoreRepository.hasAuthTokenFlow.distinctUntilChanged().asLiveData() + val hasAuthTokenState: StateFlow = + datastoreRepository.hasAuthTokenFlow.distinctUntilChanged().stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = true + ) val registrationStateLiveData = MutableLiveData(RegistrationState.SocialLogin) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/root/RootView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/root/RootView.kt index 4c4df4f30..5a7c39493 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/root/RootView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/root/RootView.kt @@ -22,7 +22,6 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -59,10 +58,12 @@ import app.omnivore.omnivore.navigation.TopLevelDestination fun RootView( loginViewModel: LoginViewModel = hiltViewModel() ) { - val hasAuthToken: Boolean by loginViewModel.hasAuthTokenLiveData.observeAsState(false) + val snackbarHostState = remember { SnackbarHostState() } val navController = rememberNavController() + val followingTabActive by loginViewModel.followingTabActiveState.collectAsStateWithLifecycle() + val hasAuthToken by loginViewModel.hasAuthTokenState.collectAsStateWithLifecycle() val destinations = if (followingTabActive) { TopLevelDestination.entries @@ -90,15 +91,13 @@ fun RootView( ), ) ) { - if (hasAuthToken) { - PrimaryNavigator( - navController = navController, - snackbarHostState = snackbarHostState - ) - } else { - WelcomeScreen(viewModel = loginViewModel) - } - + val startDestination = if (hasAuthToken) Routes.Home.route else Routes.Welcome.route + PrimaryNavigator( + navController = navController, + snackbarHostState = snackbarHostState, + startDestination = startDestination, + loginViewModel = loginViewModel + ) DisposableEffect(hasAuthToken) { if (hasAuthToken) { loginViewModel.registerUser() @@ -114,16 +113,22 @@ private const val INITIAL_OFFSET_FACTOR = 0.10f @Composable fun PrimaryNavigator( navController: NavHostController, - snackbarHostState: SnackbarHostState + snackbarHostState: SnackbarHostState, + startDestination: String, + loginViewModel: LoginViewModel ) { NavHost(navController = navController, - startDestination = Routes.Home.route, + startDestination = startDestination, enterTransition = { materialSharedAxisXIn(initialOffsetX = { (it * INITIAL_OFFSET_FACTOR).toInt() }) }, exitTransition = { materialSharedAxisXOut(targetOffsetX = { -(it * INITIAL_OFFSET_FACTOR).toInt() }) }, popEnterTransition = { materialSharedAxisXIn(initialOffsetX = { -(it * INITIAL_OFFSET_FACTOR).toInt() }) }, popExitTransition = { materialSharedAxisXOut(targetOffsetX = { (it * INITIAL_OFFSET_FACTOR).toInt() }) }) { + composable(Routes.Welcome.route) { + WelcomeScreen(viewModel = loginViewModel) + } + navigation(startDestination = Routes.Inbox.route, route = Routes.Home.route, enterTransition = { EnterTransition.None }, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt index d317fdc37..e40e06aa1 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt @@ -2,6 +2,7 @@ package app.omnivore.omnivore.navigation sealed class Routes(val route: String) { data object Home : Routes("Home") + data object Welcome : Routes("Welcome") data object Following : Routes("Following") data object Inbox : Routes("Inbox") data object Settings : Routes("Settings")