Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,10 @@ private fun shouldShowTimeNextToContent(

private val mentionChipTypes = setOf("user", "guest", "call", "user-group", "email", "circle")

private val parentMessageLinkRegex = Regex(
"""https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^\s)]*)?"""
)

private fun ChatMessageUi.hasMentionChips(): Boolean =
messageParameters.any { (key, parameter) ->
message.contains("{$key}") && parameter["type"] in mentionChipTypes
Expand Down Expand Up @@ -686,9 +690,13 @@ fun CommonMessageQuote(message: ChatMessageUi) {
fontSize = authorTextSize,
color = colorResource(R.color.no_emphasis_text)
)

val hasParentLink = parentMessageLinkRegex.containsMatchIn(message.message)

EnrichedText(
message = message,
modifier = Modifier.padding(end = 4.dp),
message,
Modifier.padding(start = 10.dp),
!hasParentLink,
maxLines = 4
)
}
Expand Down Expand Up @@ -800,7 +808,12 @@ internal fun resolveMarkdownSource(message: ChatMessageUi): String {
}

@Composable
fun EnrichedText(message: ChatMessageUi, modifier: Modifier, maxLines: Int = Int.MAX_VALUE) {
fun EnrichedText(
message: ChatMessageUi,
modifier: Modifier,
enableLinks: Boolean = true,
maxLines: Int = Int.MAX_VALUE
) {
val isInspectionMode = LocalInspectionMode.current
val isSingleEmoji = !isInspectionMode &&
message.messageParameters.isEmpty() &&
Expand All @@ -824,6 +837,7 @@ fun EnrichedText(message: ChatMessageUi, modifier: Modifier, maxLines: Int = Int
color = colorScheme.onSurface,
lineHeight = fontSize * LINE_SPACING
),
enableLinks = enableLinks,
maxLines = maxLines
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,22 @@ fun MentionEnrichedText(
message: ChatMessageUi,
modifier: Modifier = Modifier,
textStyle: TextStyle,
enableLinks: Boolean = true,
maxLines: Int = Int.MAX_VALUE
) {
var isMultilineLayout by remember(message.id, message.message) {
mutableStateOf(message.message.contains("\n") || message.message.contains("\r"))
}
val linkColor = MaterialTheme.colorScheme.primary
val codeBackground = MaterialTheme.colorScheme.surfaceVariant
val richText = remember(message, isMultilineLayout, linkColor, codeBackground, textStyle) {
val richText = remember(message, isMultilineLayout, linkColor, codeBackground, textStyle, enableLinks) {
buildMentionRichText(
message = message,
linkColor = linkColor,
codeBackground = codeBackground,
textStyle = textStyle,
isMultilineLayout = isMultilineLayout
isMultilineLayout = isMultilineLayout,
enableLinks = enableLinks
)
}
val resolvedTextStyle = if (richText.inlineContent.isEmpty()) {
Expand All @@ -76,12 +78,14 @@ fun MentionEnrichedText(
)
}

@Suppress("LongParameterList")
private fun buildMentionRichText(
message: ChatMessageUi,
linkColor: Color,
codeBackground: Color,
textStyle: TextStyle,
isMultilineLayout: Boolean
isMultilineLayout: Boolean,
enableLinks: Boolean
): MentionRichText {
val inlineContent = linkedMapOf<String, InlineTextContent>()
var mentionCounter = 0
Expand Down Expand Up @@ -136,10 +140,13 @@ private fun buildMentionRichText(
token.startsWith("[") -> {
val textPart = token.substringAfter("[").substringBefore("]")
val url = token.substringAfter("(").substringBefore(")")
appendLinkedToken(textPart, url, linkColor)
appendLinkedToken(textPart, url, linkColor, enableLinks)
}

token.startsWith("http") -> appendLinkedToken(token, token, linkColor)
token.startsWith("http") -> appendLinkedToken(token, token, linkColor, enableLinks)
token.matches(
Regex("""https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^\s)]*)?""")
) -> appendLinkedToken(token, token, linkColor, enableLinks)
}

lastIndex = range.last + 1
Expand All @@ -159,11 +166,18 @@ private fun AnnotatedString.Builder.appendStyledToken(text: String, style: SpanS
addStyle(style, start, length)
}

private fun AnnotatedString.Builder.appendLinkedToken(text: String, url: String, linkColor: Color) {
private fun AnnotatedString.Builder.appendLinkedToken(
text: String,
url: String,
linkColor: Color,
enableLinks: Boolean
) {
val start = length
append(text)
addStyle(SpanStyle(color = linkColor, textDecoration = TextDecoration.Underline), start, length)
addLink(LinkAnnotation.Url(url), start, length)
if (enableLinks) {
addStyle(SpanStyle(color = linkColor, textDecoration = TextDecoration.Underline), start, length)
addLink(LinkAnnotation.Url(url), start, length)
}
}

private fun AnnotatedString.Builder.appendFallbackParameter(
Expand Down
Loading