Skip to content

Commit f87799c

Browse files
committed
Only consume Text click events if a link is being clicked
1 parent 2e9132a commit f87799c

2 files changed

Lines changed: 22 additions & 10 deletions

File tree

richtext-ui/src/commonMain/kotlin/com/halilibo/richtext/ui/RichTextLocals.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package com.halilibo.richtext.ui
22

3-
import androidx.compose.foundation.gestures.detectTapGestures
43
import androidx.compose.foundation.text.BasicText
54
import androidx.compose.foundation.text.InlineTextContent
65
import androidx.compose.runtime.Composable
76
import androidx.compose.runtime.compositionLocalOf
87
import androidx.compose.runtime.mutableStateOf
98
import androidx.compose.runtime.remember
109
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.geometry.Offset
1111
import androidx.compose.ui.graphics.Color
1212
import androidx.compose.ui.graphics.takeOrElse
1313
import androidx.compose.ui.input.pointer.pointerInput
1414
import androidx.compose.ui.text.AnnotatedString
1515
import androidx.compose.ui.text.TextLayoutResult
1616
import androidx.compose.ui.text.TextStyle
1717
import androidx.compose.ui.text.style.TextOverflow
18+
import com.halilibo.richtext.ui.util.detectTapGesturesIf
1819

1920
/**
2021
* Carries the text style in Composition tree. [Heading], [CodeBlock],
@@ -111,11 +112,15 @@ internal fun RichTextScope.ClickableText(
111112
maxLines: Int = Int.MAX_VALUE,
112113
onTextLayout: (TextLayoutResult) -> Unit = {},
113114
inlineContent: Map<String, InlineTextContent> = mapOf(),
115+
isOffsetClickable: (Int) -> Boolean,
114116
onClick: (Int) -> Unit
115117
) {
116118
val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
119+
val shouldHandle = { pos: Offset ->
120+
layoutResult.value?.getOffsetForPosition(pos)?.let { isOffsetClickable(it) } ?: false
121+
}
117122
val pressIndicator = Modifier.pointerInput(onClick) {
118-
detectTapGestures { pos ->
123+
detectTapGesturesIf(predicate = shouldHandle) { pos ->
119124
layoutResult.value?.let { layoutResult ->
120125
onClick(layoutResult.getOffsetForPosition(pos))
121126
}

richtext-ui/src/commonMain/kotlin/com/halilibo/richtext/ui/string/Text.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.compose.foundation.layout.BoxWithConstraints
44
import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.remember
66
import androidx.compose.ui.Modifier
7+
import androidx.compose.ui.text.AnnotatedString
78
import androidx.compose.ui.text.TextLayoutResult
89
import androidx.compose.ui.text.style.TextOverflow
910
import com.halilibo.richtext.ui.ClickableText
@@ -48,18 +49,24 @@ public fun RichTextScope.Text(
4849
softWrap = softWrap,
4950
overflow = overflow,
5051
maxLines = maxLines,
52+
isOffsetClickable = { offset ->
53+
annotated.getConsumableAnnotations(text.formatObjects, offset).any()
54+
},
5155
onClick = { offset ->
52-
annotated.getStringAnnotations(Format.FormatAnnotationScope, offset, offset)
53-
.asSequence()
54-
.mapNotNull {
55-
Format.findTag(
56-
it.item,
57-
text.formatObjects
58-
) as? Format.Link
59-
}
56+
annotated.getConsumableAnnotations(text.formatObjects, offset)
6057
.firstOrNull()
6158
?.let { link -> link.onClick() }
6259
}
6360
)
6461
}
6562
}
63+
64+
private fun AnnotatedString.getConsumableAnnotations(textFormatObjects: Map<String, Any>, offset: Int): Sequence<Format.Link> =
65+
getStringAnnotations(Format.FormatAnnotationScope, offset, offset)
66+
.asSequence()
67+
.mapNotNull {
68+
Format.findTag(
69+
it.item,
70+
textFormatObjects
71+
) as? Format.Link
72+
}

0 commit comments

Comments
 (0)