Add NavHost for incoming and outgoing server settings editing

This commit is contained in:
Wolf-Martell Montwé 2023-09-19 10:59:36 +02:00
parent 10cb49cbb4
commit dc142fea79
No known key found for this signature in database
GPG key ID: 6D45B21512ACBF72
3 changed files with 180 additions and 0 deletions

View file

@ -0,0 +1,75 @@
package app.k9mail.feature.account.edit.navigation
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import app.k9mail.core.ui.compose.common.navigation.getArgument
import app.k9mail.feature.account.edit.ui.EditIncomingServerSettingsNavHost
import app.k9mail.feature.account.edit.ui.EditOutgoingServerSettingsNavHost
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf
internal const val ARGUMENT_ACCOUNT_UUID = "accountUuid"
const val NAVIGATION_ROUTE_ACCOUNT_EDIT_CONFIG_INCOMING = "/account/edit/config/incoming/{accountUuid}"
const val NAVIGATION_ROUTE_ACCOUNT_EDIT_CONFIG_OUTGOING = "/account/edit/config/outgoing/{accountUuid}"
fun NavController.navigateToAccountEditConfigIncoming(accountUuid: String) {
navigate(
route = NAVIGATION_ROUTE_ACCOUNT_EDIT_CONFIG_INCOMING.withAccountUuid(accountUuid),
)
}
fun NavController.navigateToAccountEditConfigOutgoing(accountUuid: String) {
navigate(
route = NAVIGATION_ROUTE_ACCOUNT_EDIT_CONFIG_OUTGOING.withAccountUuid(accountUuid),
)
}
fun NavGraphBuilder.accountEditRoute(
startDestinationArguments: ImmutableMap<String, String> = persistentMapOf(),
onBack: () -> Unit,
onFinish: () -> Unit,
) {
composable(
route = NAVIGATION_ROUTE_ACCOUNT_EDIT_CONFIG_INCOMING,
arguments = listOf(
navArgument(ARGUMENT_ACCOUNT_UUID) {
type = NavType.StringType
defaultValue = startDestinationArguments[ARGUMENT_ACCOUNT_UUID] ?: ""
},
),
) { backStackEntry ->
val accountUuid = backStackEntry.getArgument(ARGUMENT_ACCOUNT_UUID)
EditIncomingServerSettingsNavHost(
accountUuid = accountUuid,
onFinish = { onFinish() },
onBack = onBack,
)
}
composable(
route = NAVIGATION_ROUTE_ACCOUNT_EDIT_CONFIG_OUTGOING,
arguments = listOf(
navArgument(ARGUMENT_ACCOUNT_UUID) {
type = NavType.StringType
defaultValue = startDestinationArguments[ARGUMENT_ACCOUNT_UUID] ?: ""
},
),
) { backStackEntry ->
val accountUuid = backStackEntry.getArgument(ARGUMENT_ACCOUNT_UUID)
EditOutgoingServerSettingsNavHost(
accountUuid = accountUuid,
onFinish = { onFinish() },
onBack = onBack,
)
}
}
fun String.withAccountUuid(accountUuid: String): String {
return replace(
oldValue = "{$ARGUMENT_ACCOUNT_UUID}",
newValue = accountUuid,
)
}

View file

@ -0,0 +1,52 @@
package app.k9mail.feature.account.edit.ui
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import app.k9mail.feature.account.server.settings.ui.incoming.IncomingServerSettingsScreen
import app.k9mail.feature.account.server.validation.ui.IncomingServerValidationViewModel
import app.k9mail.feature.account.server.validation.ui.ServerValidationScreen
import org.koin.androidx.compose.koinViewModel
import org.koin.core.parameter.parametersOf
private const val NESTED_NAVIGATION_ROUTE_CONFIG = "config"
private const val NESTED_NAVIGATION_ROUTE_VALIDATION = "validation"
private fun NavController.navigateToValidation() {
navigate(NESTED_NAVIGATION_ROUTE_VALIDATION)
}
@Composable
fun EditIncomingServerSettingsNavHost(
accountUuid: String,
onFinish: () -> Unit,
onBack: () -> Unit,
) {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = NESTED_NAVIGATION_ROUTE_CONFIG,
) {
composable(route = NESTED_NAVIGATION_ROUTE_CONFIG) {
IncomingServerSettingsScreen(
onBack = onBack,
onNext = { navController.navigateToValidation() },
viewModel = koinViewModel<EditIncomingServerSettingsViewModel> {
parametersOf(accountUuid)
},
)
}
composable(route = NESTED_NAVIGATION_ROUTE_VALIDATION) {
ServerValidationScreen(
onBack = { navController.popBackStack() },
onNext = onFinish,
viewModel = koinViewModel<IncomingServerValidationViewModel> {
parametersOf(accountUuid)
},
)
}
}
}

View file

@ -0,0 +1,53 @@
package app.k9mail.feature.account.edit.ui
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import app.k9mail.feature.account.server.settings.ui.outgoing.OutgoingServerSettingsScreen
import app.k9mail.feature.account.server.settings.ui.outgoing.OutgoingServerSettingsViewModel
import app.k9mail.feature.account.server.validation.ui.OutgoingServerValidationViewModel
import app.k9mail.feature.account.server.validation.ui.ServerValidationScreen
import org.koin.androidx.compose.koinViewModel
import org.koin.core.parameter.parametersOf
private const val NESTED_NAVIGATION_ROUTE_CONFIG = "config"
private const val NESTED_NAVIGATION_ROUTE_VALIDATION = "validation"
private fun NavController.navigateToValidation() {
navigate(NESTED_NAVIGATION_ROUTE_VALIDATION)
}
@Composable
fun EditOutgoingServerSettingsNavHost(
accountUuid: String,
onFinish: () -> Unit,
onBack: () -> Unit,
) {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = NESTED_NAVIGATION_ROUTE_CONFIG,
) {
composable(route = NESTED_NAVIGATION_ROUTE_CONFIG) {
OutgoingServerSettingsScreen(
onBack = onBack,
onNext = { navController.navigateToValidation() },
viewModel = koinViewModel<OutgoingServerSettingsViewModel> {
parametersOf(accountUuid)
},
)
}
composable(route = NESTED_NAVIGATION_ROUTE_VALIDATION) {
ServerValidationScreen(
onBack = { navController.popBackStack() },
onNext = onFinish,
viewModel = koinViewModel<OutgoingServerValidationViewModel> {
parametersOf(accountUuid)
},
)
}
}
}