about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Newman <mozzius@protonmail.com>2024-05-13 22:36:56 +0100
committerGitHub <noreply@github.com>2024-05-13 22:36:56 +0100
commit5d92ac2ce3eeb0e6d8f1c1f1ca2941dde74756ee (patch)
tree2833dcd44b365f6660a819cf53461bdcfdcecd1e
parent27bb73c701d812b6ce85d230cd1433d8f6d51528 (diff)
downloadvoidsky-5d92ac2ce3eeb0e6d8f1c1f1ca2941dde74756ee.tar.zst
dont send message if >1000 graphemes (#3995)
-rw-r--r--src/lib/constants.ts2
-rw-r--r--src/screens/Messages/Conversation/MessageInput.tsx12
-rw-r--r--src/screens/Messages/Conversation/MessageInput.web.tsx9
3 files changed, 19 insertions, 4 deletions
diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index 051ed4d59..05d1591f5 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -36,6 +36,8 @@ export const MAX_DESCRIPTION = 256
 
 export const MAX_GRAPHEME_LENGTH = 300
 
+export const MAX_DM_GRAPHEME_LENGTH = 1000
+
 // Recommended is 100 per: https://www.w3.org/WAI/GL/WCAG20/tests/test3.html
 // but increasing limit per user feedback
 export const MAX_ALT_TEXT = 1000
diff --git a/src/screens/Messages/Conversation/MessageInput.tsx b/src/screens/Messages/Conversation/MessageInput.tsx
index 3de15e661..926d66e7d 100644
--- a/src/screens/Messages/Conversation/MessageInput.tsx
+++ b/src/screens/Messages/Conversation/MessageInput.tsx
@@ -11,9 +11,11 @@ import {
 import {useSafeAreaInsets} from 'react-native-safe-area-context'
 import {msg} from '@lingui/macro'
 import {useLingui} from '@lingui/react'
+import Graphemer from 'graphemer'
 
-import {HITSLOP_10} from '#/lib/constants'
-import {useHaptics} from 'lib/haptics'
+import {HITSLOP_10, MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants'
+import {useHaptics} from '#/lib/haptics'
+import * as Toast from '#/view/com/util/Toast'
 import {atoms as a, useTheme} from '#/alf'
 import {PaperPlane_Stroke2_Corner0_Rounded as PaperPlane} from '#/components/icons/PaperPlane'
 
@@ -39,13 +41,17 @@ export function MessageInput({
     if (message.trim() === '') {
       return
     }
+    if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) {
+      Toast.show(_(msg`Message is too long`))
+      return
+    }
     onSendMessage(message.trimEnd())
     playHaptic()
     setMessage('')
     setTimeout(() => {
       inputRef.current?.focus()
     }, 100)
-  }, [message, onSendMessage, playHaptic])
+  }, [message, onSendMessage, playHaptic, _])
 
   const onInputLayout = React.useCallback(
     (e: NativeSyntheticEvent<TextInputContentSizeChangeEventData>) => {
diff --git a/src/screens/Messages/Conversation/MessageInput.web.tsx b/src/screens/Messages/Conversation/MessageInput.web.tsx
index a2f255bdc..2ee03bb31 100644
--- a/src/screens/Messages/Conversation/MessageInput.web.tsx
+++ b/src/screens/Messages/Conversation/MessageInput.web.tsx
@@ -2,8 +2,11 @@ import React from 'react'
 import {Pressable, StyleSheet, View} from 'react-native'
 import {msg} from '@lingui/macro'
 import {useLingui} from '@lingui/react'
+import Graphemer from 'graphemer'
 import TextareaAutosize from 'react-textarea-autosize'
 
+import {MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants'
+import * as Toast from '#/view/com/util/Toast'
 import {atoms as a, useTheme} from '#/alf'
 import {PaperPlane_Stroke2_Corner0_Rounded as PaperPlane} from '#/components/icons/PaperPlane'
 
@@ -21,9 +24,13 @@ export function MessageInput({
     if (message.trim() === '') {
       return
     }
+    if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) {
+      Toast.show(_(msg`Message is too long`))
+      return
+    }
     onSendMessage(message.trimEnd())
     setMessage('')
-  }, [message, onSendMessage])
+  }, [message, onSendMessage, _])
 
   const onKeyDown = React.useCallback(
     (e: React.KeyboardEvent<HTMLTextAreaElement>) => {