Use direct navigation to nested destinations (#801)

This commit is contained in:
Brian Yencho 2024-01-26 10:59:32 -06:00 committed by Álison Fernandes
parent bc834fee93
commit f0b0859ae3
4 changed files with 12 additions and 40 deletions

View file

@ -20,13 +20,12 @@ import com.x8bit.bitwarden.ui.auth.feature.vaultunlock.vaultUnlockDestination
import com.x8bit.bitwarden.ui.platform.feature.splash.SPLASH_ROUTE
import com.x8bit.bitwarden.ui.platform.feature.splash.navigateToSplash
import com.x8bit.bitwarden.ui.platform.feature.splash.splashDestination
import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.VAULT_UNLOCKED_FOR_NEW_SEND_GRAPH_ROUTE
import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.VAULT_UNLOCKED_GRAPH_ROUTE
import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.navigateToVaultUnlockedForNewSendGraph
import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.navigateToVaultUnlockedGraph
import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.vaultUnlockedGraph
import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.vaultUnlockedGraphForNewSend
import com.x8bit.bitwarden.ui.platform.theme.RootTransitionProviders
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.model.AddSendType
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.navigateToAddSend
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import java.util.concurrent.atomic.AtomicReference
@ -70,15 +69,15 @@ fun RootNavScreen(
authGraph(navController)
vaultUnlockDestination()
vaultUnlockedGraph(navController)
vaultUnlockedGraphForNewSend(navController)
}
val targetRoute = when (state) {
RootNavState.Auth -> AUTH_GRAPH_ROUTE
RootNavState.Splash -> SPLASH_ROUTE
RootNavState.VaultLocked -> VAULT_UNLOCK_ROUTE
is RootNavState.VaultUnlocked -> VAULT_UNLOCKED_GRAPH_ROUTE
RootNavState.VaultUnlockedForNewSend -> VAULT_UNLOCKED_FOR_NEW_SEND_GRAPH_ROUTE
is RootNavState.VaultUnlocked,
RootNavState.VaultUnlockedForNewSend,
-> VAULT_UNLOCKED_GRAPH_ROUTE
}
val currentRoute = navController.currentDestination?.rootLevelRoute()
@ -109,7 +108,11 @@ fun RootNavScreen(
RootNavState.VaultLocked -> navController.navigateToVaultUnlock(rootNavOptions)
is RootNavState.VaultUnlocked -> navController.navigateToVaultUnlockedGraph(rootNavOptions)
RootNavState.VaultUnlockedForNewSend -> {
navController.navigateToVaultUnlockedForNewSendGraph(rootNavOptions)
navController.navigateToVaultUnlock(rootNavOptions)
navController.navigateToAddSend(
sendAddType = AddSendType.AddItem,
navOptions = rootNavOptions,
)
}
}
}

View file

@ -18,7 +18,6 @@ import com.x8bit.bitwarden.ui.tools.feature.generator.generatorModalDestination
import com.x8bit.bitwarden.ui.tools.feature.generator.navigateToGeneratorModal
import com.x8bit.bitwarden.ui.tools.feature.generator.passwordhistory.navigateToPasswordHistory
import com.x8bit.bitwarden.ui.tools.feature.generator.passwordhistory.passwordHistoryDestination
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.ADD_SEND_ROUTE
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.addSendDestination
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.model.AddSendType
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.navigateToAddSend
@ -37,7 +36,6 @@ import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.vaultQrCodeScanDestinatio
import com.x8bit.bitwarden.ui.vault.model.VaultAddEditType
const val VAULT_UNLOCKED_GRAPH_ROUTE: String = "vault_unlocked_graph"
const val VAULT_UNLOCKED_FOR_NEW_SEND_GRAPH_ROUTE: String = "vault_unlocked_for_new_send_graph"
/**
* Navigate to the vault unlocked screen.
@ -46,13 +44,6 @@ fun NavController.navigateToVaultUnlockedGraph(navOptions: NavOptions? = null) {
navigate(VAULT_UNLOCKED_GRAPH_ROUTE, navOptions)
}
/**
* Navigate to the vault unlocked graph for a new send.
*/
fun NavController.navigateToVaultUnlockedForNewSendGraph(navOptions: NavOptions? = null) {
navigate(VAULT_UNLOCKED_FOR_NEW_SEND_GRAPH_ROUTE, navOptions)
}
/**
* Add vault unlocked destinations to the root nav graph.
*/
@ -148,20 +139,3 @@ fun NavGraphBuilder.vaultUnlockedGraph(
)
}
}
/**
* Add vault unlocked destinations for the new send flow to the root nav graph.
*/
fun NavGraphBuilder.vaultUnlockedGraphForNewSend(
navController: NavController,
) {
navigation(
startDestination = ADD_SEND_ROUTE,
route = VAULT_UNLOCKED_FOR_NEW_SEND_GRAPH_ROUTE,
) {
addSendDestination(
defaultType = AddSendType.AddItem,
onNavigateBack = { navController.popBackStack() },
)
}
}

View file

@ -38,20 +38,15 @@ data class AddSendArgs(
/**
* Add the new send screen to the nav graph.
*
* The [defaultType] will be relevant in cases where the Add Send screen needs to be added as a
* start destination of a graph.
*/
fun NavGraphBuilder.addSendDestination(
onNavigateBack: () -> Unit,
defaultType: AddSendType = AddSendType.AddItem,
) {
composableWithSlideTransitions(
route = ADD_SEND_ROUTE,
arguments = listOf(
navArgument(ADD_SEND_ITEM_TYPE) {
type = NavType.StringType
defaultValue = defaultType.toTypeString()
},
),
) {

View file

@ -90,11 +90,11 @@ class RootNavScreenTest : BaseComposeTest() {
)
}
// Make sure navigating to vault unlocked works as expected:
// Make sure navigating to vault unlocked for new sends works as expected:
rootNavStateFlow.value = RootNavState.VaultUnlockedForNewSend
composeTestRule.runOnIdle {
fakeNavHostController.assertLastNavigation(
route = "vault_unlocked_for_new_send_graph",
route = "add_send_item/add",
navOptions = expectedNavOptions,
)
}