add welcome screen to navigation
This commit is contained in:
@ -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)
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
@ -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")
|
||||
|
||||
Reference in New Issue
Block a user