Fix: add back navigation to Clean Node Database screen (#6264)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
James Rich
2026-07-14 09:03:48 -05:00
committed by GitHub
parent ff049cd1a1
commit 842436d629
2 changed files with 40 additions and 22 deletions

View File

@@ -126,7 +126,7 @@ fun EntryProviderScope<NavKey>.settingsGraph(backStack: NavBackStack<NavKey>) {
entry<SettingsRoute.CleanNodeDb> {
val viewModel: CleanNodeDatabaseViewModel = koinViewModel()
CleanNodeDatabaseScreen(viewModel = viewModel)
CleanNodeDatabaseScreen(viewModel = viewModel, onBack = dropUnlessResumed { backStack.removeLastOrNull() })
}
ConfigRoute.entries.forEach { routeInfo ->

View File

@@ -27,6 +27,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Slider
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
@@ -46,6 +47,7 @@ import org.meshtastic.core.resources.clean_nodes_older_than
import org.meshtastic.core.resources.clean_now
import org.meshtastic.core.resources.clean_unknown_nodes
import org.meshtastic.core.resources.nodes_queued_for_deletion
import org.meshtastic.core.ui.component.MainAppBar
import org.meshtastic.core.ui.component.NodeChip
/**
@@ -53,40 +55,56 @@ import org.meshtastic.core.ui.component.NodeChip
* nodes to be deleted updates automatically as filter criteria change.
*/
@Composable
fun CleanNodeDatabaseScreen(viewModel: CleanNodeDatabaseViewModel) {
fun CleanNodeDatabaseScreen(viewModel: CleanNodeDatabaseViewModel, onBack: () -> Unit) {
val olderThanDays by viewModel.olderThanDays.collectAsStateWithLifecycle()
val onlyUnknownNodes by viewModel.onlyUnknownNodes.collectAsStateWithLifecycle()
val nodesToDelete by viewModel.nodesToDelete.collectAsStateWithLifecycle()
LaunchedEffect(olderThanDays, onlyUnknownNodes) { viewModel.getNodesToDelete() }
Column(modifier = Modifier.padding(16.dp).verticalScroll(rememberScrollState())) {
Text(stringResource(Res.string.clean_node_database_title))
Text(stringResource(Res.string.clean_node_database_description), style = MaterialTheme.typography.bodySmall)
Spacer(modifier = Modifier.height(16.dp))
Scaffold(
topBar = {
MainAppBar(
title = stringResource(Res.string.clean_node_database_title),
ourNode = null,
showNodeChip = false,
canNavigateUp = true,
onNavigateUp = onBack,
actions = {},
onClickChip = {},
)
},
) { paddingValues ->
Column(modifier = Modifier.padding(paddingValues).padding(16.dp).verticalScroll(rememberScrollState())) {
Text(stringResource(Res.string.clean_node_database_description), style = MaterialTheme.typography.bodySmall)
Spacer(modifier = Modifier.height(16.dp))
DaysThresholdFilter(
olderThanDays = olderThanDays,
onlyUnknownNodes = onlyUnknownNodes,
onDaysChanged = viewModel::onOlderThanDaysChanged,
)
DaysThresholdFilter(
olderThanDays = olderThanDays,
onlyUnknownNodes = onlyUnknownNodes,
onDaysChanged = viewModel::onOlderThanDaysChanged,
)
Spacer(modifier = Modifier.height(8.dp))
Spacer(modifier = Modifier.height(8.dp))
UnknownNodesFilter(onlyUnknownNodes = onlyUnknownNodes, onCheckedChanged = viewModel::onOnlyUnknownNodesChanged)
UnknownNodesFilter(
onlyUnknownNodes = onlyUnknownNodes,
onCheckedChanged = viewModel::onOnlyUnknownNodesChanged,
)
Spacer(modifier = Modifier.height(32.dp))
Spacer(modifier = Modifier.height(32.dp))
NodesDeletionPreview(nodesToDelete = nodesToDelete)
NodesDeletionPreview(nodesToDelete = nodesToDelete)
Spacer(modifier = Modifier.height(16.dp))
Spacer(modifier = Modifier.height(16.dp))
Button(
onClick = { if (nodesToDelete.isNotEmpty()) viewModel.requestCleanNodes() },
modifier = Modifier.fillMaxWidth(),
enabled = nodesToDelete.isNotEmpty(),
) {
Text(stringResource(Res.string.clean_now))
Button(
onClick = { if (nodesToDelete.isNotEmpty()) viewModel.requestCleanNodes() },
modifier = Modifier.fillMaxWidth(),
enabled = nodesToDelete.isNotEmpty(),
) {
Text(stringResource(Res.string.clean_now))
}
}
}
}