Fix connection details screen

This commit is contained in:
世界
2026-02-02 15:51:48 +08:00
parent 223b5899c5
commit fa538568d4
3 changed files with 35 additions and 15 deletions

View File

@@ -92,6 +92,7 @@ import io.nekohasekai.sfa.compose.base.UiEvent
import io.nekohasekai.sfa.compose.component.ServiceStatusBar import io.nekohasekai.sfa.compose.component.ServiceStatusBar
import io.nekohasekai.sfa.compose.component.UpdateAvailableDialog import io.nekohasekai.sfa.compose.component.UpdateAvailableDialog
import io.nekohasekai.sfa.compose.component.UptimeText import io.nekohasekai.sfa.compose.component.UptimeText
import io.nekohasekai.sfa.compose.model.Connection
import io.nekohasekai.sfa.compose.navigation.NewProfileArgs import io.nekohasekai.sfa.compose.navigation.NewProfileArgs
import io.nekohasekai.sfa.compose.navigation.ProfileRoutes import io.nekohasekai.sfa.compose.navigation.ProfileRoutes
import io.nekohasekai.sfa.compose.navigation.SFANavHost import io.nekohasekai.sfa.compose.navigation.SFANavHost
@@ -979,6 +980,13 @@ class MainActivity :
val connectionsUiState by connectionsViewModel.uiState.collectAsState() val connectionsUiState by connectionsViewModel.uiState.collectAsState()
var selectedConnectionId by remember { mutableStateOf<String?>(null) } var selectedConnectionId by remember { mutableStateOf<String?>(null) }
val selectedConnection = connectionsUiState.allConnections.find { it.id == selectedConnectionId } val selectedConnection = connectionsUiState.allConnections.find { it.id == selectedConnectionId }
var cachedConnection by remember { mutableStateOf<Connection?>(null) }
if (selectedConnection != null) {
cachedConnection = selectedConnection
} else if (selectedConnectionId != null && cachedConnection?.isActive == true) {
cachedConnection = cachedConnection?.copy(closedAt = System.currentTimeMillis())
}
val displayConnection = if (selectedConnectionId != null) cachedConnection else null
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
connectionsViewModel.setVisible(true) connectionsViewModel.setVisible(true)
@@ -1004,13 +1012,12 @@ class MainActivity :
.fillMaxWidth() .fillMaxWidth()
.fillMaxHeight(0.9f), .fillMaxHeight(0.9f),
) { ) {
if (selectedConnection != null) { if (displayConnection != null) {
ConnectionDetailsScreen( ConnectionDetailsScreen(
connection = selectedConnection, connection = displayConnection,
onBack = { selectedConnectionId = null }, onBack = { selectedConnectionId = null },
onClose = { onClose = {
selectedConnectionId?.let { connectionsViewModel.closeConnection(it) } selectedConnectionId?.let { connectionsViewModel.closeConnection(it) }
selectedConnectionId = null
}, },
) )
} else { } else {

View File

@@ -2,6 +2,7 @@ package io.nekohasekai.sfa.compose.screen.connections
import androidx.compose.foundation.ScrollState import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
@@ -39,6 +40,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.nekohasekai.libbox.Libbox import io.nekohasekai.libbox.Libbox
@@ -324,16 +326,21 @@ private fun DetailRow(label: String, value: String, monospace: Boolean = false,
text = label, text = label,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(end = 16.dp),
) )
Text( SelectionContainer(modifier = Modifier.weight(1f)) {
text = value, Text(
style = if (monospace) { text = value,
MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace) style = if (monospace) {
} else { MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace)
MaterialTheme.typography.bodyMedium } else {
}, MaterialTheme.typography.bodyMedium
color = valueColor, },
) color = valueColor,
textAlign = TextAlign.End,
modifier = Modifier.fillMaxWidth(),
)
}
} }
} }

View File

@@ -281,6 +281,12 @@ fun ConnectionDetailsRoute(
val connection = val connection =
uiState.allConnections.find { it.id == connectionId } uiState.allConnections.find { it.id == connectionId }
?: uiState.connections.find { it.id == connectionId } ?: uiState.connections.find { it.id == connectionId }
var cachedConnection by remember { mutableStateOf(connection) }
if (connection != null) {
cachedConnection = connection
} else if (cachedConnection?.isActive == true) {
cachedConnection = cachedConnection?.copy(closedAt = System.currentTimeMillis())
}
OverrideTopBar { OverrideTopBar {
TopAppBar( TopAppBar(
@@ -294,7 +300,7 @@ fun ConnectionDetailsRoute(
} }
}, },
actions = { actions = {
if (connection?.isActive == true) { if (cachedConnection?.isActive == true) {
IconButton(onClick = { viewModel.closeConnection(connectionId) }) { IconButton(onClick = { viewModel.closeConnection(connectionId) }) {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
@@ -320,14 +326,14 @@ fun ConnectionDetailsRoute(
viewModel.updateServiceStatus(serviceStatus) viewModel.updateServiceStatus(serviceStatus)
} }
if (connection == null) { if (cachedConnection == null) {
LaunchedEffect(connectionId) { LaunchedEffect(connectionId) {
onBack() onBack()
} }
Box(modifier = modifier.fillMaxSize()) Box(modifier = modifier.fillMaxSize())
} else { } else {
ConnectionDetailsScreen( ConnectionDetailsScreen(
connection = connection, connection = cachedConnection!!,
onBack = onBack, onBack = onBack,
onClose = { viewModel.closeConnection(connectionId) }, onClose = { viewModel.closeConnection(connectionId) },
modifier = modifier, modifier = modifier,