From 9050be0ea5e9214a5e23b81ad0378ca33bad6863 Mon Sep 17 00:00:00 2001 From: Avently <7953703+avently@users.noreply.github.com> Date: Wed, 17 Apr 2024 19:27:08 +0700 Subject: [PATCH] inline content + formatted text --- .../common/views/chat/ContextItemView.kt | 30 ++++++++++--------- .../common/views/chat/item/TextItemView.kt | 8 +++-- .../common/views/chatlist/ChatPreviewView.kt | 9 +++--- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt index a65d0b056b..ce34ecf0c3 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt @@ -35,22 +35,24 @@ fun ContextItemView( @Composable fun MessageText(attachment: ImageResource?, lines: Int) { - val text = buildAnnotatedString { - if (attachment != null) { - appendInlineContent(id = "attachmentIcon") - append(" ") + val inlineContent: Pair Unit, Map>? = if (attachment != null) { + remember(contextItem.id) { + val inlineContentBuilder: AnnotatedString.Builder.() -> Unit = { + appendInlineContent(id = "attachmentIcon") + append(" ") + } + val inlineContent = mapOf( + "attachmentIcon" to InlineTextContent( + Placeholder(20.sp, 20.sp, PlaceholderVerticalAlign.TextCenter) + ) { + Icon(painterResource(attachment), null, tint = MaterialTheme.colors.secondary) + } + ) + inlineContentBuilder to inlineContent } - append(contextItem.text) - } - val inlineContent: Map? = if (attachment != null) mapOf( - "attachmentIcon" to InlineTextContent( - Placeholder(20.sp, 20.sp, PlaceholderVerticalAlign.TextCenter) - ) { - Icon(painterResource(attachment), null, tint = MaterialTheme.colors.secondary) - } - ) else null + } else null MarkdownText( - text, if (inlineContent != null) null else contextItem.formattedText, + contextItem.text, contextItem.formattedText, sender = null, toggleSecrets = false, maxLines = lines, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt index 5169d944c8..66061767e5 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt @@ -68,7 +68,7 @@ fun MarkdownText ( senderBold: Boolean = false, modifier: Modifier = Modifier, linkMode: SimplexLinkMode, - inlineContent: Map? = null, + inlineContent: Pair Unit, Map>? = null, onLinkLongClick: (link: String) -> Unit = {} ) { val textLayoutDirection = remember (text) { @@ -119,6 +119,7 @@ fun MarkdownText ( } if (formattedText == null) { val annotatedText = buildAnnotatedString { + inlineContent?.first?.invoke(this) appendSender(this, sender, senderBold) if (text is String) append(text) else if (text is AnnotatedString) append(text) @@ -127,10 +128,11 @@ fun MarkdownText ( } if (meta != null) withStyle(reserveTimestampStyle) { append(reserve) } } - Text(annotatedText, style = style, modifier = modifier, maxLines = maxLines, overflow = overflow, inlineContent = inlineContent ?: mapOf()) + Text(annotatedText, style = style, modifier = modifier, maxLines = maxLines, overflow = overflow, inlineContent = inlineContent?.second ?: mapOf()) } else { var hasAnnotations = false val annotatedText = buildAnnotatedString { + inlineContent?.first?.invoke(this) appendSender(this, sender, senderBold) for ((i, ft) in formattedText.withIndex()) { if (ft.format == null) append(ft.text) @@ -210,7 +212,7 @@ fun MarkdownText ( } ) } else { - Text(annotatedText, style = style, modifier = modifier, maxLines = maxLines, overflow = overflow) + Text(annotatedText, style = style, modifier = modifier, maxLines = maxLines, overflow = overflow, inlineContent = inlineContent?.second ?: mapOf()) } } } 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 1bb5a78996..336d104d2d 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 @@ -90,7 +90,7 @@ fun ChatPreviewView( Icon(painterResource(MR.images.ic_verified_user), null, Modifier.size(19.dp).padding(end = 3.dp, top = 1.dp), tint = MaterialTheme.colors.secondary) } - fun messageDraft(draft: ComposeState): Pair> { + fun messageDraft(draft: ComposeState): Pair Unit, Map> { fun attachment(): Pair? = when (draft.preview) { is ComposePreview.FilePreview -> MR.images.ic_draft_filled to draft.preview.fileName @@ -100,7 +100,7 @@ fun ChatPreviewView( } val attachment = attachment() - val text = buildAnnotatedString { + val inlineContentBuilder: AnnotatedString.Builder.() -> Unit = { appendInlineContent(id = "editIcon") append(" ") if (attachment != null) { @@ -110,7 +110,6 @@ fun ChatPreviewView( } append(" ") } - append(draft.message) } val inlineContent: Map = mapOf( "editIcon" to InlineTextContent( @@ -124,7 +123,7 @@ fun ChatPreviewView( Icon(if (attachment?.first != null) painterResource(attachment.first) else painterResource(MR.images.ic_edit_note), null, tint = MaterialTheme.colors.secondary) } ) - return text to inlineContent + return inlineContentBuilder to inlineContent } @Composable @@ -169,7 +168,7 @@ fun ChatPreviewView( if (ci != null) { if (showChatPreviews || (chatModelDraftChatId == chat.id && chatModelDraft != null)) { val (text: CharSequence, inlineTextContent) = when { - chatModelDraftChatId == chat.id && chatModelDraft != null -> remember(chatModelDraft) { messageDraft(chatModelDraft) } + chatModelDraftChatId == chat.id && chatModelDraft != null -> remember(chatModelDraft) { chatModelDraft.message to messageDraft(chatModelDraft) } ci.meta.itemDeleted == null -> ci.text to null else -> markedDeletedText(ci.meta) to null }