From bc64d6fb36a15a7fc19d4df44a963a88a0ab4824 Mon Sep 17 00:00:00 2001 From: Avently <7953703+avently@users.noreply.github.com> Date: Wed, 1 Jan 2025 22:41:51 +0700 Subject: [PATCH] tmp --- .../kotlin/chat/simplex/common/App.kt | 2 +- .../chat/simplex/common/model/ChatModel.kt | 8 +++++-- .../chat/simplex/common/model/SimpleXAPI.kt | 3 +++ .../chat/simplex/common/views/TerminalView.kt | 3 ++- .../simplex/common/views/chat/ChatView.kt | 8 ++++--- .../views/chat/group/GroupChatInfoView.kt | 2 +- .../common/views/chatlist/ChatListView.kt | 22 +++++++++---------- .../common/views/chatlist/ShareListView.kt | 3 ++- .../common/views/chatlist/UserPicker.kt | 3 ++- 9 files changed, 33 insertions(+), 21 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt index 3310e0aeb8..fee2746ab0 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt @@ -338,7 +338,7 @@ fun AndroidScreen(userPickerState: MutableStateFlow) { .then(if (hasCutout) Modifier.clip(RectangleShape) else Modifier) .graphicsLayer { translationX = maxWidth.toPx() - minOf(offset.value.dp, maxWidth).toPx() } ) Box2@{ - currentChatId.value?.let { + currentChatId.collectAsState().value?.let { ChatView(currentChatId, onComposed) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 9439412518..8d1d38f716 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -157,7 +157,7 @@ object ChatModel { val updatingProgress = MutableStateFlow(null as Float?) var updatingRequest: Closeable? = null - private val updatingChatsMutex: Mutex = Mutex() +// private val updatingChatsMutex: Mutex = Mutex() val changingActiveUserMutex: Mutex = Mutex() val desktopNoUserNoRemote: Boolean @Composable get() = appPlatform.isDesktop && currentUser.value == null && currentRemoteHost.value == null @@ -348,7 +348,11 @@ object ChatModel { } } - suspend fun withChats(action: suspend ChatsContext.() -> T): T = updatingChatsMutex.withLock { +// suspend fun withChats(action: suspend ChatsContext.() -> T): T = updatingChatsMutex.withLock { +// chatsContext.action() +// } + + suspend fun withChats(action: suspend ChatsContext.() -> T): T = withContext(Dispatchers.Main) { chatsContext.action() } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index abfe51e4f9..783fe9e118 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -620,10 +620,13 @@ object ChatController { val hasUser = chatModel.currentUser.value != null chatModel.userAddress.value = if (hasUser) apiGetUserAddress(rhId) else null chatModel.chatItemTTL.value = if (hasUser) getChatItemTTL(rhId) else ChatItemTTL.None + println("LALAL WAIT") withChats { val chats = apiGetChats(rhId) + println("LALAL WAIT1 ${chats.size}") updateChats(chats) } + println("LALAL WAIT2 ${chatModel.chats.size}") chatModel.userTags.value = apiGetChatTags(rhId).takeIf { hasUser } ?: emptyList() chatModel.activeChatTagFilter.value = null chatModel.updateChatTags(rhId) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt index 6a6db0da85..c395a7d0f6 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt @@ -123,8 +123,9 @@ fun TerminalLayout( @Composable fun TerminalLog(floating: Boolean, composeViewHeight: State) { + val items = chatModel.terminalItems.collectAsState() val reversedTerminalItems by remember { - derivedStateOf { chatModel.terminalItems.value.asReversed() } + derivedStateOf { items.value.asReversed(); } } val listState = LocalAppBarHandler.current?.listState ?: rememberLazyListState() var autoScrollToBottom = rememberSaveable { mutableStateOf(true) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index 81a505d041..d1b7087b1e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -58,9 +58,11 @@ data class ItemSeparation(val timestamp: Boolean, val largeGap: Boolean, val dat // staleChatId means the id that was before chatModel.chatId becomes null. It's needed for Android only to make transition from chat // to chat list smooth. Otherwise, chat view will become blank right before the transition starts fun ChatView(staleChatId: StateFlow, onComposed: suspend (chatId: String) -> Unit) { - val remoteHostId = remember { derivedStateOf { chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.remoteHostId } } + println("LALAL CHAT VIEW") + val chats = chatModel.chats.collectAsState() + val remoteHostId = remember { derivedStateOf { chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.remoteHostId } } val showSearch = rememberSaveable { mutableStateOf(false) } - val activeChatInfo = remember { derivedStateOf { chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.chatInfo } } + val activeChatInfo = remember { derivedStateOf { chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.chatInfo } } val user = chatModel.currentUser.value val chatInfo = activeChatInfo.value if (chatInfo == null || user == null) { @@ -107,7 +109,7 @@ fun ChatView(staleChatId: StateFlow, onComposed: suspend (chatId: Strin // Having activeChat reloaded on every change in it is inefficient (UI lags) val unreadCount = remember { derivedStateOf { - chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == activeChatInfo.value?.id }?.chatStats?.unreadCount ?: 0 + chats.value.firstOrNull { chat -> chat.chatInfo.id == activeChatInfo.value?.id }?.chatStats?.unreadCount ?: 0 } } val clipboard = LocalClipboardManager.current diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt index dd1f10c042..3dbeae668b 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt @@ -64,7 +64,7 @@ fun ModalData.GroupChatInfoView(chatModel: ChatModel, rhId: Long?, chatId: Strin updateChatSettings(chat.remoteHostId, chat.chatInfo, chatSettings, chatModel) sendReceipts.value = sendRcpts }, - members = chatModel.groupMembers.value + members = chatModel.groupMembers.collectAsState().value .filter { it.memberStatus != GroupMemberStatus.MemLeft && it.memberStatus != GroupMemberStatus.MemRemoved } .sortedByDescending { it.memberRole }, developerTools, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt index d368e746c2..e4b6720825 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt @@ -44,8 +44,7 @@ import chat.simplex.res.MR import dev.icerock.moko.resources.ImageResource import dev.icerock.moko.resources.StringResource import kotlinx.coroutines.* -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.* import kotlinx.serialization.json.Json import kotlin.time.Duration.Companion.seconds @@ -306,7 +305,7 @@ private fun BoxScope.ChatListWithLoadingScreen(searchText: MutableState } } } else { - val users by remember { derivedStateOf { chatModel.users.value.filter { u -> u.user.activeUser || !u.user.hidden } } } + val us = chatModel.users.collectAsState() + val users by remember { derivedStateOf { us.value.filter { u -> u.user.activeUser || !u.user.hidden } } } val allRead = users .filter { u -> !u.user.activeUser && !u.user.hidden } .all { u -> u.unreadCount == 0 } @@ -777,7 +777,7 @@ private fun BoxScope.ChatList(searchText: MutableState, listStat DisposableEffect(Unit) { onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset } } - val allChats = remember { chatModel.chats } + val allChats = chatModel.chats.collectAsState() // In some not always reproducible situations this code produce IndexOutOfBoundsException on Compose's side // which is related to [derivedStateOf]. Using safe alternative instead // val chats by remember(search, showUnreadAndFavorites) { derivedStateOf { filteredChats(showUnreadAndFavorites, search, allChats.toList()) } } @@ -926,10 +926,10 @@ private val TAG_MIN_HEIGHT = 35.dp @Composable private fun TagsView() { - val userTags = remember { chatModel.userTags } - val presetTags = remember { chatModel.presetTags } - val activeFilter = remember { chatModel.activeChatTagFilter } - val unreadTags = remember { chatModel.unreadTags } + val userTags = chatModel.userTags.collectAsState() + val presetTags = chatModel.presetTags.collectAsState() + val activeFilter = chatModel.activeChatTagFilter.collectAsState() + val unreadTags = chatModel.unreadTags.collectAsState() val rhId = chatModel.remoteHostId() fun showTagList() { @@ -949,7 +949,7 @@ private fun TagsView() { TagsRow { if (presetTags.value.size > 1) { if (presetTags.value.size + userTags.value.size <= 3) { - PresetTagKind.entries.filter { t -> (presetTags[t] ?: 0) > 0 }.forEach { tag -> + PresetTagKind.entries.filter { t -> (presetTags.value[t] ?: 0) > 0 }.forEach { tag -> ExpandedTagFilterView(tag) } } else { @@ -995,7 +995,7 @@ private fun TagsView() { } Spacer(Modifier.width(4.dp)) Box { - val badgeText = if ((unreadTags[tag.chatTagId] ?: 0) > 0) " ●" else "" + val badgeText = if ((unreadTags.value[tag.chatTagId] ?: 0) > 0) " ●" else "" val invisibleText = buildAnnotatedString { append(tag.chatTagText) withStyle(SpanStyle(fontSize = 12.sp, fontWeight = FontWeight.SemiBold)) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt index b13543148a..a2784f570c 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt @@ -94,7 +94,8 @@ private fun ShareListToolbar(chatModel: ChatModel, stopped: Boolean, onSearchVal if (showSearch) { BackHandler(onBack = hideSearchOnBack) } - val users by remember { derivedStateOf { chatModel.users.value.filter { u -> u.user.activeUser || !u.user.hidden } } } + val us = chatModel.users.collectAsState() + val users by remember { derivedStateOf { us.value.filter { u -> u.user.activeUser || !u.user.hidden } } } val navButton: @Composable RowScope.() -> Unit = { when { showSearch -> NavigationButtonBack(hideSearchOnBack) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt index ced070d9aa..1c1c62191d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt @@ -53,9 +53,10 @@ fun UserPicker( userPickerState.value = AnimatedViewState.HIDING } } + val us = chatModel.users.collectAsState() val users by remember { derivedStateOf { - chatModel.users.value + us.value .filter { u -> u.user.activeUser || !u.user.hidden } .sortedByDescending { it.user.activeOrder } }