android, desktop: fix terminal items crash

This commit is contained in:
Avently 2023-12-27 21:37:10 +07:00
parent bbde6d81ee
commit 4d430cfd25
2 changed files with 7 additions and 19 deletions

View File

@ -58,7 +58,7 @@ object ChatModel {
val chatItemStatuses = mutableMapOf<Long, CIStatus>() val chatItemStatuses = mutableMapOf<Long, CIStatus>()
val groupMembers = mutableStateListOf<GroupMember>() val groupMembers = mutableStateListOf<GroupMember>()
val terminalItems = mutableStateListOf<TerminalItem>() 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 // Allows to temporary save servers that are being edited on multiple screens
val userSMPServersUnsaved = mutableStateOf<(List<ServerCfg>)?>(null) val userSMPServersUnsaved = mutableStateOf<(List<ServerCfg>)?>(null)
@ -620,10 +620,10 @@ object ChatModel {
} }
fun addTerminalItem(item: TerminalItem) { fun addTerminalItem(item: TerminalItem) {
if (terminalItems.size >= 500) { if (terminalItems.value.size >= 500) {
terminalItems.removeAt(0) terminalItems.value = terminalItems.value.subList(1, terminalItems.value.size)
} }
terminalItems.add(item) terminalItems.value += item
} }
val connectedToRemote: Boolean @Composable get() = currentRemoteHost.value != null || remoteCtrlSession.value?.active == true val connectedToRemote: Boolean @Composable get() = currentRemoteHost.value != null || remoteCtrlSession.value?.active == true

View File

@ -34,7 +34,6 @@ fun TerminalView(chatModel: ChatModel, close: () -> Unit) {
close() close()
}) })
TerminalLayout( TerminalLayout(
remember { chatModel.terminalItems },
composeState, composeState,
sendCommand = { sendCommand(chatModel, composeState) }, sendCommand = { sendCommand(chatModel, composeState) },
close close
@ -63,7 +62,6 @@ private fun sendCommand(chatModel: ChatModel, composeState: MutableState<Compose
@Composable @Composable
fun TerminalLayout( fun TerminalLayout(
terminalItems: List<TerminalItem>,
composeState: MutableState<ComposeState>, composeState: MutableState<ComposeState>,
sendCommand: () -> Unit, sendCommand: () -> Unit,
close: () -> Unit close: () -> Unit
@ -111,7 +109,7 @@ fun TerminalLayout(
.fillMaxWidth(), .fillMaxWidth(),
color = MaterialTheme.colors.background color = MaterialTheme.colors.background
) { ) {
TerminalLog(terminalItems) TerminalLog()
} }
} }
} }
@ -120,22 +118,13 @@ fun TerminalLayout(
private var lazyListState = 0 to 0 private var lazyListState = 0 to 0
@Composable @Composable
fun TerminalLog(terminalItems: List<TerminalItem>) { fun TerminalLog() {
val listState = rememberLazyListState(lazyListState.first, lazyListState.second) val listState = rememberLazyListState(lazyListState.first, lazyListState.second)
DisposableEffect(Unit) { DisposableEffect(Unit) {
onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset } onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset }
} }
val reversedTerminalItems by remember { val reversedTerminalItems by remember {
derivedStateOf { derivedStateOf { chatModel.terminalItems.value.asReversed() }
// Such logic prevents concurrent modification
val res = ArrayList<TerminalItem>()
var i = 0
while (i < terminalItems.size) {
res.add(terminalItems[i])
i++
}
res.asReversed()
}
} }
val clipboard = LocalClipboardManager.current val clipboard = LocalClipboardManager.current
LazyColumn(state = listState, reverseLayout = true) { LazyColumn(state = listState, reverseLayout = true) {
@ -175,7 +164,6 @@ fun TerminalLog(terminalItems: List<TerminalItem>) {
fun PreviewTerminalLayout() { fun PreviewTerminalLayout() {
SimpleXTheme { SimpleXTheme {
TerminalLayout( TerminalLayout(
terminalItems = TerminalItem.sampleData,
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) },
sendCommand = {}, sendCommand = {},
close = {} close = {}