@@ -90,19 +90,25 @@ private data class MentionChipModel(
9090private data class MentionRichText (val annotated : AnnotatedString , val inlineContent : Map <String , InlineTextContent >)
9191
9292@Composable
93- fun MentionEnrichedText (message : ChatMessageUi , modifier : Modifier = Modifier , textStyle : TextStyle ) {
93+ fun MentionEnrichedText (
94+ message : ChatMessageUi ,
95+ modifier : Modifier = Modifier ,
96+ textStyle : TextStyle ,
97+ enableLinks : Boolean = true
98+ ) {
9499 var isMultilineLayout by remember(message.id, message.message) {
95100 mutableStateOf(message.message.contains(" \n " ) || message.message.contains(" \r " ))
96101 }
97102 val linkColor = MaterialTheme .colorScheme.primary
98103 val codeBackground = MaterialTheme .colorScheme.surfaceVariant
99- val richText = remember(message, isMultilineLayout, linkColor, codeBackground, textStyle) {
104+ val richText = remember(message, isMultilineLayout, linkColor, codeBackground, textStyle, enableLinks ) {
100105 buildMentionRichText(
101106 message = message,
102107 linkColor = linkColor,
103108 codeBackground = codeBackground,
104109 textStyle = textStyle,
105- isMultilineLayout = isMultilineLayout
110+ isMultilineLayout = isMultilineLayout,
111+ enableLinks = enableLinks
106112 )
107113 }
108114 val resolvedTextStyle = if (richText.inlineContent.isEmpty()) {
@@ -125,12 +131,14 @@ fun MentionEnrichedText(message: ChatMessageUi, modifier: Modifier = Modifier, t
125131 )
126132}
127133
134+ @Suppress(" LongParameterList" )
128135private fun buildMentionRichText (
129136 message : ChatMessageUi ,
130137 linkColor : Color ,
131138 codeBackground : Color ,
132139 textStyle : TextStyle ,
133- isMultilineLayout : Boolean
140+ isMultilineLayout : Boolean ,
141+ enableLinks : Boolean
134142): MentionRichText {
135143 val inlineContent = linkedMapOf<String , InlineTextContent >()
136144 var mentionCounter = 0
@@ -177,10 +185,13 @@ private fun buildMentionRichText(
177185 token.startsWith(" [" ) -> {
178186 val textPart = token.substringAfter(" [" ).substringBefore(" ]" )
179187 val url = token.substringAfter(" (" ).substringBefore(" )" )
180- appendLinkedToken(textPart, url, linkColor)
188+ appendLinkedToken(textPart, url, linkColor, enableLinks )
181189 }
182190
183- token.startsWith(" http" ) -> appendLinkedToken(token, token, linkColor)
191+ token.startsWith(" http" ) -> appendLinkedToken(token, token, linkColor, enableLinks)
192+ token.matches(
193+ Regex (""" https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^\s)]*)?""" )
194+ ) -> appendLinkedToken(token, token, linkColor, enableLinks)
184195 }
185196
186197 lastIndex = range.last + 1
@@ -200,11 +211,18 @@ private fun AnnotatedString.Builder.appendStyledToken(text: String, style: SpanS
200211 addStyle(style, start, length)
201212}
202213
203- private fun AnnotatedString.Builder.appendLinkedToken (text : String , url : String , linkColor : Color ) {
214+ private fun AnnotatedString.Builder.appendLinkedToken (
215+ text : String ,
216+ url : String ,
217+ linkColor : Color ,
218+ enableLinks : Boolean
219+ ) {
204220 val start = length
205221 append(text)
206- addStyle(SpanStyle (color = linkColor, textDecoration = TextDecoration .Underline ), start, length)
207- addLink(LinkAnnotation .Url (url), start, length)
222+ if (enableLinks) {
223+ addStyle(SpanStyle (color = linkColor, textDecoration = TextDecoration .Underline ), start, length)
224+ addLink(LinkAnnotation .Url (url), start, length)
225+ }
208226}
209227
210228private fun AnnotatedString.Builder.appendFallbackParameter (
0 commit comments