android, desktop: protocol servers fix (#3755)

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
This commit is contained in:
Stanislav Dmitrenko 2024-01-26 03:59:02 +07:00 committed by GitHub
parent cd349e80ce
commit f102f39147
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 10 additions and 22 deletions

View File

@ -63,8 +63,6 @@ object ChatModel {
val terminalItems = mutableStateOf<List<TerminalItem>>(listOf()) val terminalItems = mutableStateOf<List<TerminalItem>>(listOf())
val userAddress = mutableStateOf<UserContactLinkRec?>(null) val userAddress = mutableStateOf<UserContactLinkRec?>(null)
// Allows to temporary save servers that are being edited on multiple screens
val userSMPServersUnsaved = mutableStateOf<(List<ServerCfg>)?>(null)
val chatItemTTL = mutableStateOf<ChatItemTTL>(ChatItemTTL.None) val chatItemTTL = mutableStateOf<ChatItemTTL>(ChatItemTTL.None)
// set when app opened from external intent // set when app opened from external intent

View File

@ -47,10 +47,6 @@ fun NetworkAndServersView(
val onionHosts = remember { mutableStateOf(netCfg.onionHosts) } val onionHosts = remember { mutableStateOf(netCfg.onionHosts) }
val sessionMode = remember { mutableStateOf(netCfg.sessionMode) } val sessionMode = remember { mutableStateOf(netCfg.sessionMode) }
LaunchedEffect(Unit) {
chatModel.userSMPServersUnsaved.value = null
}
val proxyPort = remember { derivedStateOf { chatModel.controller.appPrefs.networkProxyHostPort.state.value?.split(":")?.lastOrNull()?.toIntOrNull() ?: 9050 } } val proxyPort = remember { derivedStateOf { chatModel.controller.appPrefs.networkProxyHostPort.state.value?.split(":")?.lastOrNull()?.toIntOrNull() ?: 9050 } }
NetworkAndServersLayout( NetworkAndServersLayout(
currentRemoteHost = currentRemoteHost, currentRemoteHost = currentRemoteHost,

View File

@ -28,19 +28,18 @@ import chat.simplex.res.MR
@Composable @Composable
fun ModalData.ProtocolServersView(m: ChatModel, rhId: Long?, serverProtocol: ServerProtocol, close: () -> Unit) { fun ModalData.ProtocolServersView(m: ChatModel, rhId: Long?, serverProtocol: ServerProtocol, close: () -> Unit) {
var presetServers by remember(rhId) { mutableStateOf(emptyList<String>()) } var presetServers by remember(rhId) { mutableStateOf(emptyList<String>()) }
var servers by remember(rhId) { var servers by remember { stateGetOrPut("servers") { emptyList<ServerCfg>() } }
mutableStateOf(m.userSMPServersUnsaved.value ?: emptyList()) var serversAlreadyLoaded by remember { stateGetOrPut("serversAlreadyLoaded") { false } }
}
val currServers = remember(rhId) { mutableStateOf(servers) } val currServers = remember(rhId) { mutableStateOf(servers) }
val testing = rememberSaveable(rhId) { mutableStateOf(false) } val testing = rememberSaveable(rhId) { mutableStateOf(false) }
val serversUnchanged = remember { derivedStateOf { servers == currServers.value || testing.value } } val serversUnchanged = remember(servers) { derivedStateOf { servers == currServers.value || testing.value } }
val allServersDisabled = remember { derivedStateOf { servers.all { !it.enabled } } } val allServersDisabled = remember { derivedStateOf { servers.none { it.enabled } } }
val saveDisabled = remember { val saveDisabled = remember(servers) {
derivedStateOf { derivedStateOf {
servers.isEmpty() || servers.isEmpty() ||
servers == currServers.value || servers == currServers.value ||
testing.value || testing.value ||
!servers.all { srv -> servers.none { srv ->
val address = parseServerAddress(srv.server) val address = parseServerAddress(srv.server)
address != null && uniqueAddress(srv, address, servers) address != null && uniqueAddress(srv, address, servers)
} || } ||
@ -49,8 +48,8 @@ fun ModalData.ProtocolServersView(m: ChatModel, rhId: Long?, serverProtocol: Ser
} }
KeyChangeEffect(rhId) { KeyChangeEffect(rhId) {
m.userSMPServersUnsaved.value = null
servers = emptyList() servers = emptyList()
serversAlreadyLoaded = false
} }
LaunchedEffect(rhId) { LaunchedEffect(rhId) {
@ -59,8 +58,9 @@ fun ModalData.ProtocolServersView(m: ChatModel, rhId: Long?, serverProtocol: Ser
if (res != null) { if (res != null) {
currServers.value = res.protoServers currServers.value = res.protoServers
presetServers = res.presetServers presetServers = res.presetServers
if (servers.isEmpty()) { if (servers.isEmpty() && !serversAlreadyLoaded) {
servers = currServers.value servers = currServers.value
serversAlreadyLoaded = true
} }
} }
} }
@ -80,13 +80,11 @@ fun ModalData.ProtocolServersView(m: ChatModel, rhId: Long?, serverProtocol: Ser
newServers.add(index, updated) newServers.add(index, updated)
old = updated old = updated
servers = newServers servers = newServers
m.userSMPServersUnsaved.value = servers
}, },
onDelete = { onDelete = {
val newServers = ArrayList(servers) val newServers = ArrayList(servers)
newServers.removeAt(index) newServers.removeAt(index)
servers = newServers servers = newServers
m.userSMPServersUnsaved.value = servers
close() close()
}) })
} }
@ -125,7 +123,6 @@ fun ModalData.ProtocolServersView(m: ChatModel, rhId: Long?, serverProtocol: Ser
ScanProtocolServer(rhId) { ScanProtocolServer(rhId) {
close() close()
servers = servers + it servers = servers + it
m.userSMPServersUnsaved.value = servers
} }
} }
} }
@ -150,13 +147,11 @@ fun ModalData.ProtocolServersView(m: ChatModel, rhId: Long?, serverProtocol: Ser
testServersJob.value = withLongRunningApi { testServersJob.value = withLongRunningApi {
testServers(testing, servers, m) { testServers(testing, servers, m) {
servers = it servers = it
m.userSMPServersUnsaved.value = servers
} }
} }
}, },
resetServers = { resetServers = {
servers = currServers.value ?: emptyList() servers = currServers.value
m.userSMPServersUnsaved.value = null
}, },
saveSMPServers = { saveSMPServers = {
saveServers(rhId, serverProtocol, currServers, servers, m) saveServers(rhId, serverProtocol, currServers, servers, m)
@ -355,7 +350,6 @@ private fun saveServers(rhId: Long?, protocol: ServerProtocol, currServers: Muta
withBGApi { withBGApi {
if (m.controller.setUserProtoServers(rhId, protocol, servers)) { if (m.controller.setUserProtoServers(rhId, protocol, servers)) {
currServers.value = servers currServers.value = servers
m.userSMPServersUnsaved.value = null
} }
afterSave() afterSave()
} }