add welcome screen to navigation

This commit is contained in:
Stefano Sansone
2024-05-01 01:59:09 +02:00
parent 3bb60ecb96
commit ce2f0d4b6f
3 changed files with 27 additions and 16 deletions

View File

@ -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<String?>(null)
private set
var hasValidUsername by mutableStateOf<Boolean>(false)
var hasValidUsername by mutableStateOf(false)
private set
var usernameValidationErrorMessage by mutableStateOf<String?>(null)
@ -87,8 +88,12 @@ class LoginViewModel @Inject constructor(
var pendingEmailUserCreds by mutableStateOf<PendingEmailUserCreds?>(null)
private set
val hasAuthTokenLiveData: LiveData<Boolean> =
datastoreRepository.hasAuthTokenFlow.distinctUntilChanged().asLiveData()
val hasAuthTokenState: StateFlow<Boolean> =
datastoreRepository.hasAuthTokenFlow.distinctUntilChanged().stateIn(
scope = viewModelScope,
started = SharingStarted.Lazily,
initialValue = true
)
val registrationStateLiveData = MutableLiveData(RegistrationState.SocialLogin)

View File

@ -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 },

View File

@ -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")