From 9198d2997c4ca81f028064d38846896794e5f4e7 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Fri, 27 Jun 2025 19:00:57 +0400 Subject: [PATCH] update chat preview --- .../common/views/chatlist/ChatPreviewView.kt | 127 ++++++++++-------- .../commonMain/resources/MR/base/strings.xml | 6 +- 2 files changed, 73 insertions(+), 60 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt index 75dc57b311..8831db2cea 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt @@ -137,45 +137,82 @@ fun ChatPreviewView( fun chatPreviewTitle() { val deleting by remember(disabled, chat.id) { mutableStateOf(chatModel.deletedChats.value.contains(chat.remoteHostId to chat.chatInfo.id)) } when (cInfo) { - is ChatInfo.Direct -> - Row(verticalAlignment = Alignment.CenterVertically) { - if (cInfo.contact.verified) { - VerifiedIcon() + is ChatInfo.Direct -> { + if (cInfo.contact.verified) { + VerifiedIcon() + } + val color = if (deleting) + MaterialTheme.colors.secondary + else if (cInfo.contact.nextAcceptContactRequest || cInfo.contact.sendMsgToConnect) { + MaterialTheme.colors.primary + } else if (!cInfo.contact.sndReady) { + MaterialTheme.colors.secondary + } else { + Color.Unspecified + } + chatPreviewTitleText(color = color) + } + is ChatInfo.Group -> { + val color = if (deleting) { + MaterialTheme.colors.secondary + } else { + when (cInfo.groupInfo.membership.memberStatus) { + GroupMemberStatus.MemInvited -> if (chat.chatInfo.incognito) Indigo else MaterialTheme.colors.primary + GroupMemberStatus.MemAccepted, GroupMemberStatus.MemRejected -> MaterialTheme.colors.secondary + else -> if (cInfo.groupInfo.nextConnectPrepared) MaterialTheme.colors.primary else Color.Unspecified } - chatPreviewTitleText( - if (deleting) - MaterialTheme.colors.secondary - else if (cInfo.contact.nextAcceptContactRequest) { - MaterialTheme.colors.primary - } else { - Color.Unspecified - } - ) - } - is ChatInfo.Group -> - when (cInfo.groupInfo.membership.memberStatus) { - GroupMemberStatus.MemInvited -> chatPreviewTitleText( - if (inProgress || deleting) - MaterialTheme.colors.secondary - else - if (chat.chatInfo.incognito) Indigo else MaterialTheme.colors.primary - ) - GroupMemberStatus.MemAccepted, GroupMemberStatus.MemRejected -> chatPreviewTitleText(MaterialTheme.colors.secondary) - else -> chatPreviewTitleText( - if (deleting) - MaterialTheme.colors.secondary - else - Color.Unspecified - ) } + chatPreviewTitleText(color = color) + } else -> chatPreviewTitleText() } } + @Composable + fun chatPreviewInfoText(): Pair? { + return when (cInfo) { + is ChatInfo.Direct -> + if (cInfo.contact.activeConn == null && cInfo.contact.profile.contactLink != null && cInfo.contact.active) { + stringResource(MR.strings.contact_tap_to_connect) to MaterialTheme.colors.primary + } else if (cInfo.contact.sendMsgToConnect) { + stringResource(MR.strings.open_to_connect) to Color.Unspecified + } else if (cInfo.contact.nextAcceptContactRequest) { + stringResource(MR.strings.open_to_accept) to Color.Unspecified + } else if (!cInfo.contact.sndReady && cInfo.contact.activeConn != null && cInfo.contact.active) { + if (cInfo.contact.preparedContact?.uiConnLinkType == ConnectionMode.Con) { + stringResource(MR.strings.contact_should_accept) to Color.Unspecified + } else { + stringResource(MR.strings.contact_connection_pending) to Color.Unspecified + } + } else { + null + } + + is ChatInfo.Group -> + if (cInfo.groupInfo.nextConnectPrepared) { + stringResource(MR.strings.group_preview_open_to_join) to Color.Unspecified + } else { + when (cInfo.groupInfo.membership.memberStatus) { + GroupMemberStatus.MemRejected -> stringResource(MR.strings.group_preview_rejected) to Color.Unspecified + GroupMemberStatus.MemInvited -> groupInvitationPreviewText(currentUserProfileDisplayName, cInfo.groupInfo) to Color.Unspecified + GroupMemberStatus.MemAccepted -> stringResource(MR.strings.group_connection_pending) to Color.Unspecified + GroupMemberStatus.MemPendingReview, GroupMemberStatus.MemPendingApproval -> + stringResource(MR.strings.reviewed_by_admins) to MaterialTheme.colors.secondary + else -> null + } + } + + else -> null + } + } + @Composable fun chatPreviewText() { + val previewText = chatPreviewInfoText() val ci = chat.chatItems.lastOrNull() - if (ci != null) { + if (ci?.content?.hasMsgContent != true && previewText != null) { + Text(previewText.first, color = previewText.second) + } else if (ci != null) { if (showChatPreviews || (chatModelDraftChatId == chat.id && chatModelDraft != null)) { val sp20 = with(LocalDensity.current) { 20.sp.toDp() } val (text: CharSequence, inlineTextContent) = when { @@ -195,6 +232,7 @@ fun ChatPreviewView( append(if (text.isEmpty()) mc.reason.text else "${mc.reason.text}: ") } } + else -> null } @@ -203,7 +241,7 @@ fun ChatPreviewView( formattedText, sender = when { chatModelDraftChatId == chat.id && chatModelDraft != null -> null - cInfo is ChatInfo.Group && !ci.chatDir.sent -> ci.memberDisplayName + cInfo is ChatInfo.Group && !ci.chatDir.sent && !ci.meta.showGroupAsSender -> ci.memberDisplayName else -> null }, mentions = ci.mentions, @@ -227,33 +265,6 @@ fun ChatPreviewView( prefix = prefix ) } - } else { - when (cInfo) { - is ChatInfo.Direct -> - if (cInfo.contact.activeConn == null && cInfo.contact.profile.contactLink != null && cInfo.contact.active) { - Text(stringResource(MR.strings.contact_tap_to_connect), color = MaterialTheme.colors.primary) - } else if (cInfo.contact.nextAcceptContactRequest) { - Text(stringResource(MR.strings.hold_or_open_to_connect)) - } else if (cInfo.contact.sendMsgToConnect) { - Text(stringResource(MR.strings.member_contact_send_direct_message)) - } else if (!cInfo.contact.sndReady && cInfo.contact.activeConn != null && cInfo.contact.active) { - Text(stringResource(MR.strings.contact_connection_pending), color = MaterialTheme.colors.secondary) - } - is ChatInfo.Group -> - if (cInfo.groupInfo.nextConnectPrepared) { - Text(stringResource(MR.strings.group_preview_open_to_join)) - } else { - when (cInfo.groupInfo.membership.memberStatus) { - GroupMemberStatus.MemRejected -> Text(stringResource(MR.strings.group_preview_rejected)) - GroupMemberStatus.MemInvited -> Text(groupInvitationPreviewText(currentUserProfileDisplayName, cInfo.groupInfo)) - GroupMemberStatus.MemAccepted -> Text(stringResource(MR.strings.group_connection_pending), color = MaterialTheme.colors.secondary) - GroupMemberStatus.MemPendingReview, GroupMemberStatus.MemPendingApproval -> - Text(stringResource(MR.strings.reviewed_by_admins), color = MaterialTheme.colors.secondary) - else -> {} - } - } - else -> {} - } } } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 3fac3d298b..fa8474454f 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -428,7 +428,7 @@ Settings connecting… send to connect - open to join + Open to join You are invited to group Join as %s rejected @@ -443,7 +443,9 @@ No chats No chats found Tap to Connect - hold or open to connect + Open to connect + Open to accept + contact should accept… Connect with %1$s? Search or paste SimpleX link Tap Create SimpleX address in the menu to create it later.