fix: preserve tab on back and avoid nav bar overlap (0.4.5)

Keep the selected bottom tab when returning from host/event detail screens.
Add navigation bar padding on scrollable detail screens.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
PTah
2026-06-11 09:42:39 +10:00
parent 35ba0d4a4e
commit d2883db803
3 changed files with 18 additions and 9 deletions
+2 -2
View File
@@ -13,8 +13,8 @@ android {
applicationId = "ru.kalinamall.seaca" applicationId = "ru.kalinamall.seaca"
minSdk = 26 minSdk = 26
targetSdk = 35 targetSdk = 35
versionCode = 7 versionCode = 9
versionName = "0.4.3" versionName = "0.4.5"
} }
buildTypes { buildTypes {
@@ -28,6 +28,8 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.mutableStateOf as composeMutableStateOf import androidx.compose.runtime.mutableStateOf as composeMutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@@ -162,6 +164,8 @@ private fun SeacaApp(
val role = repo.session.getRole() val role = repo.session.getRole()
role == "operator" || role == "admin" role == "operator" || role == "admin"
} }
var mainTabIndex by rememberSaveable { mutableIntStateOf(MainTab.Dashboard.ordinal) }
val mainTab = MainTab.entries[mainTabIndex.coerceIn(MainTab.entries.indices)]
SeacaTheme { SeacaTheme {
if (!loggedIn) { if (!loggedIn) {
@@ -183,6 +187,8 @@ private fun SeacaApp(
composable("main") { composable("main") {
MainShell( MainShell(
repo = repo, repo = repo,
selectedTab = mainTab,
onTabSelected = { mainTabIndex = it.ordinal },
onOpenEvent = { nav.navigate("event/$it") }, onOpenEvent = { nav.navigate("event/$it") },
onOpenProblem = { nav.navigate("problem/$it") }, onOpenProblem = { nav.navigate("problem/$it") },
onOpenHost = { nav.navigate("host/$it") }, onOpenHost = { nav.navigate("host/$it") },
@@ -231,20 +237,20 @@ private enum class MainTab(val label: String) {
@Composable @Composable
private fun MainShell( private fun MainShell(
repo: SacRepository, repo: SacRepository,
selectedTab: MainTab,
onTabSelected: (MainTab) -> Unit,
onOpenEvent: (Long) -> Unit, onOpenEvent: (Long) -> Unit,
onOpenProblem: (Long) -> Unit, onOpenProblem: (Long) -> Unit,
onOpenHost: (Long) -> Unit, onOpenHost: (Long) -> Unit,
onOpenDevice: () -> Unit, onOpenDevice: () -> Unit,
) { ) {
var tab by remember { mutableStateOf(MainTab.Dashboard) }
Scaffold( Scaffold(
bottomBar = { bottomBar = {
NavigationBar { NavigationBar {
MainTab.entries.forEach { item -> MainTab.entries.forEach { item ->
NavigationBarItem( NavigationBarItem(
selected = tab == item, selected = selectedTab == item,
onClick = { tab = item }, onClick = { onTabSelected(item) },
icon = { icon = {
Icon( Icon(
when (item) { when (item) {
@@ -270,7 +276,7 @@ private fun MainShell(
}, },
) { padding -> ) { padding ->
Box(Modifier.padding(padding)) { Box(Modifier.padding(padding)) {
when (tab) { when (selectedTab) {
MainTab.Dashboard -> DashboardScreen(repo) MainTab.Dashboard -> DashboardScreen(repo)
MainTab.Events -> EventsScreen(repo, onOpenEvent) MainTab.Events -> EventsScreen(repo, onOpenEvent)
MainTab.Problems -> ProblemsScreen(repo, onOpenProblem) MainTab.Problems -> ProblemsScreen(repo, onOpenProblem)
@@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
@@ -215,7 +216,8 @@ fun DeviceScreen(repo: SacRepository, onLogout: () -> Unit) {
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
.padding(16.dp), .padding(16.dp)
.navigationBarsPadding(),
verticalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
Text("Моё устройство", style = MaterialTheme.typography.titleLarge) Text("Моё устройство", style = MaterialTheme.typography.titleLarge)
@@ -275,7 +277,8 @@ private fun DetailFrame(
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
.padding(16.dp), .padding(16.dp)
.navigationBarsPadding(),
verticalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
Button(onClick = onBack) { Text("Назад") } Button(onClick = onBack) { Text("Назад") }