about summary refs log tree commit diff
path: root/src/view
diff options
context:
space:
mode:
Diffstat (limited to 'src/view')
-rw-r--r--src/view/com/composer/ComposePost.tsx29
-rw-r--r--src/view/com/util/RichText.tsx10
2 files changed, 21 insertions, 18 deletions
diff --git a/src/view/com/composer/ComposePost.tsx b/src/view/com/composer/ComposePost.tsx
index c104041aa..cc9eca068 100644
--- a/src/view/com/composer/ComposePost.tsx
+++ b/src/view/com/composer/ComposePost.tsx
@@ -20,6 +20,7 @@ import {useStores} from '../../../state'
 import * as apilib from '../../../state/lib/api'
 import {ComposerOpts} from '../../../state/models/shell-ui'
 import {s, colors, gradients} from '../../lib/styles'
+import {detectLinkables} from '../../../lib/strings'
 
 const MAX_TEXT_LENGTH = 256
 const WARNING_TEXT_LENGTH = 200
@@ -108,24 +109,18 @@ export const ComposePost = observer(function ComposePost({
       : undefined
 
   const textDecorated = useMemo(() => {
-    const re = /(@[a-z0-9\.]*)|(https?:\/\/[\S]+)/gi
-    const segments = []
-    let match
-    let start = 0
     let i = 0
-    while ((match = re.exec(text))) {
-      segments.push(text.slice(start, match.index))
-      segments.push(
-        <Text key={i++} style={{color: colors.blue3}}>
-          {match[0]}
-        </Text>,
-      )
-      start = match.index + match[0].length
-    }
-    if (start < text.length) {
-      segments.push(text.slice(start))
-    }
-    return segments
+    return detectLinkables(text).map(v => {
+      if (typeof v === 'string') {
+        return v
+      } else {
+        return (
+          <Text key={i++} style={{color: colors.blue3}}>
+            {v.link}
+          </Text>
+        )
+      }
+    })
   }, [text])
 
   return (
diff --git a/src/view/com/util/RichText.tsx b/src/view/com/util/RichText.tsx
index 3c54094ba..a67f90a63 100644
--- a/src/view/com/util/RichText.tsx
+++ b/src/view/com/util/RichText.tsx
@@ -77,7 +77,9 @@ function* toSegments(text: string, entities: Entity[]) {
       let subtext = text.slice(currEnt.index.start, currEnt.index.end)
       if (
         !subtext.trim() ||
-        stripUsername(subtext) !== stripUsername(currEnt.value)
+        (currEnt.type === 'mention' &&
+          stripUsername(subtext) !== stripUsername(currEnt.value)) ||
+        (currEnt.type === 'link' && !isSameLink(subtext, currEnt.value))
       ) {
         // dont yield links to empty strings or strings that don't match the entity value
         yield subtext
@@ -99,3 +101,9 @@ function* toSegments(text: string, entities: Entity[]) {
 function stripUsername(v: string): string {
   return v.trim().replace('@', '')
 }
+
+function isSameLink(a: string, b: string) {
+  a = a.startsWith('http') ? a : `https://${a}`
+  b = b.startsWith('http') ? b : `https://${b}`
+  return a === b
+}