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:
@@ -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("Назад") }
|
||||||
|
|||||||
Reference in New Issue
Block a user