@sendbird/uikit-react-native 3.9.1 → 3.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/hooks/useMentionTextInput.js +4 -4
- package/lib/commonjs/hooks/useMentionTextInput.js.map +1 -1
- package/lib/commonjs/libs/MentionManager.js +1 -1
- package/lib/commonjs/libs/MentionManager.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/hooks/useMentionTextInput.js +4 -4
- package/lib/module/hooks/useMentionTextInput.js.map +1 -1
- package/lib/module/libs/MentionManager.js +1 -1
- package/lib/module/libs/MentionManager.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +6 -6
- package/src/hooks/useMentionTextInput.ts +3 -1
- package/src/libs/MentionManager.tsx +5 -3
- package/src/version.ts +1 -1
|
@@ -25,14 +25,14 @@ const useMentionTextInput = params => {
|
|
|
25
25
|
// TODO: Refactor text edit logic more clearly
|
|
26
26
|
(0, _react.useEffect)(() => {
|
|
27
27
|
if (mentionManager.shouldUseMentionedMessageTemplate(params.messageToEdit, sbOptions.uikit.groupChannel.channel.enableMention)) {
|
|
28
|
-
var _params$messageToEdit
|
|
29
|
-
const result = mentionManager.templateToTextAndMentionedUsers(
|
|
28
|
+
var _params$messageToEdit;
|
|
29
|
+
const result = mentionManager.templateToTextAndMentionedUsers(params.messageToEdit && 'mentionedMessageTemplate' in params.messageToEdit ? params.messageToEdit.mentionedMessageTemplate ?? '' : '', ((_params$messageToEdit = params.messageToEdit) === null || _params$messageToEdit === void 0 ? void 0 : _params$messageToEdit.mentionedUsers) ?? []);
|
|
30
30
|
mentionedUsersRef.current = result.mentionedUsers;
|
|
31
31
|
setText(result.mentionedText);
|
|
32
32
|
} else {
|
|
33
|
-
var _params$
|
|
33
|
+
var _params$messageToEdit2;
|
|
34
34
|
mentionedUsersRef.current = [];
|
|
35
|
-
if ((_params$
|
|
35
|
+
if ((_params$messageToEdit2 = params.messageToEdit) !== null && _params$messageToEdit2 !== void 0 && _params$messageToEdit2.isUserMessage()) {
|
|
36
36
|
setText(params.messageToEdit.message);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_uikitUtils","_useContext","useMentionTextInput","params","mentionManager","sbOptions","useSendbirdChat","mentionedUsersRef","useRef","textInputRef","text","setText","useState","selection","setSelection","start","end","useEffect","shouldUseMentionedMessageTemplate","messageToEdit","uikit","groupChannel","channel","enableMention","_params$messageToEdit","_params$messageToEdit2","result","templateToTextAndMentionedUsers","mentionedMessageTemplate","mentionedUsers","current","mentionedText","_params$messageToEdit3","isUserMessage","message","onChangeText","useFreshCallback","_nextText","addedMentionedUser","prevText","nextText","offset","length","push","reconcileRangeOfMentionedUsers","filtered","lastSelection","removeMentionedUsersInSelection","Math","max","foundIndex","findIndex","it","rangeHelpers","overlaps","range","remainderLength","replace","splice","onSelectionChange","e","nativeSelection","nativeEvent","setTimeout","mentionedUser","find","_textInputRef$current","selectionBlock","setNativeProps","Platform","OS","_textInputRef$current2","_default","exports","default"],"sources":["useMentionTextInput.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { NativeSyntheticEvent, TextInput, TextInputSelectionChangeEventData } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport { SendbirdFileMessage, SendbirdUserMessage, replace, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser } from '../types';\nimport { useSendbirdChat } from './useContext';\n\n// Note: The selection change with the keyboard cursor might not work properly with RTL languages\nconst useMentionTextInput = (params: { messageToEdit?: SendbirdUserMessage | SendbirdFileMessage }) => {\n const { mentionManager, sbOptions } = useSendbirdChat();\n\n const mentionedUsersRef = useRef<MentionedUser[]>([]);\n const textInputRef = useRef<TextInput>();\n\n const [text, setText] = useState('');\n const [selection, setSelection] = useState({ start: 0, end: 0 });\n\n // TODO: Refactor text edit logic more clearly\n useEffect(() => {\n if (\n mentionManager.shouldUseMentionedMessageTemplate(\n params.messageToEdit,\n sbOptions.uikit.groupChannel.channel.enableMention,\n )\n ) {\n const result = mentionManager.templateToTextAndMentionedUsers(\n params.messageToEdit?.mentionedMessageTemplate ?? '',\n params.messageToEdit?.mentionedUsers ?? [],\n );\n\n mentionedUsersRef.current = result.mentionedUsers;\n setText(result.mentionedText);\n } else {\n mentionedUsersRef.current = [];\n if (params.messageToEdit?.isUserMessage()) {\n setText(params.messageToEdit.message);\n }\n }\n }, [params.messageToEdit]);\n\n const onChangeText = useFreshCallback((_nextText: string, addedMentionedUser?: MentionedUser) => {\n const prevText = text;\n let nextText = _nextText;\n let offset = nextText.length - prevText.length;\n\n // Text clear\n if (nextText === '') {\n mentionedUsersRef.current = [];\n }\n // Text add\n else if (offset > 0) {\n /** Add mentioned user **/\n if (addedMentionedUser) mentionedUsersRef.current.push(addedMentionedUser);\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n // Text remove\n else if (offset < 0) {\n // Ranged remove\n if (selection.start !== selection.end) {\n /** Filter mentioned users in selection range **/\n const { filtered, lastSelection } = mentionManager.removeMentionedUsersInSelection(\n selection,\n mentionedUsersRef.current,\n );\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n Math.max(selection.end, lastSelection),\n filtered,\n );\n }\n // Single remove\n else {\n /** Find mentioned user who ranges in removed selection **/\n const foundIndex = mentionedUsersRef.current.findIndex((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, selection, 'underMore'),\n );\n /** If found, remove from the mentioned user list and remove remainder text **/\n if (foundIndex > -1) {\n const it = mentionedUsersRef.current[foundIndex];\n const remainderLength = it.range.end - it.range.start + offset;\n\n offset = -remainderLength + offset;\n nextText = replace(nextText, it.range.start, it.range.start + remainderLength, '');\n\n mentionedUsersRef.current.splice(foundIndex, 1);\n }\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n }\n\n setText(nextText);\n });\n\n return {\n textInputRef,\n selection,\n onSelectionChange: useFreshCallback((e: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {\n const nativeSelection = { ...e.nativeEvent.selection };\n\n // NOTE: To synchronize call onSelectionChange after onChangeText called on each platform.\n setTimeout(() => {\n const mentionedUser = mentionedUsersRef.current.find((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, nativeSelection),\n );\n\n // Selection should be blocked if changed into mentioned area\n if (mentionedUser) {\n const selectionBlock = { start: mentionedUser.range.start, end: mentionedUser.range.end };\n textInputRef.current?.setNativeProps({ selection: selectionBlock });\n // BUG: setNativeProps called again when invoked onChangeText\n // https://github.com/facebook/react-native/issues/33520\n if (Platform.OS === 'android') {\n setTimeout(() => {\n textInputRef.current?.setNativeProps({ selection: { start: 0 } });\n }, 250);\n }\n setSelection(selectionBlock);\n } else {\n setSelection(nativeSelection);\n }\n }, 10);\n }),\n text,\n onChangeText,\n mentionedUsers: mentionedUsersRef.current,\n };\n};\n\nexport default useMentionTextInput;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_uikitUtils","_useContext","useMentionTextInput","params","mentionManager","sbOptions","useSendbirdChat","mentionedUsersRef","useRef","textInputRef","text","setText","useState","selection","setSelection","start","end","useEffect","shouldUseMentionedMessageTemplate","messageToEdit","uikit","groupChannel","channel","enableMention","_params$messageToEdit","result","templateToTextAndMentionedUsers","mentionedMessageTemplate","mentionedUsers","current","mentionedText","_params$messageToEdit2","isUserMessage","message","onChangeText","useFreshCallback","_nextText","addedMentionedUser","prevText","nextText","offset","length","push","reconcileRangeOfMentionedUsers","filtered","lastSelection","removeMentionedUsersInSelection","Math","max","foundIndex","findIndex","it","rangeHelpers","overlaps","range","remainderLength","replace","splice","onSelectionChange","e","nativeSelection","nativeEvent","setTimeout","mentionedUser","find","_textInputRef$current","selectionBlock","setNativeProps","Platform","OS","_textInputRef$current2","_default","exports","default"],"sources":["useMentionTextInput.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { NativeSyntheticEvent, TextInput, TextInputSelectionChangeEventData } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport { SendbirdFileMessage, SendbirdUserMessage, replace, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser } from '../types';\nimport { useSendbirdChat } from './useContext';\n\n// Note: The selection change with the keyboard cursor might not work properly with RTL languages\nconst useMentionTextInput = (params: { messageToEdit?: SendbirdUserMessage | SendbirdFileMessage }) => {\n const { mentionManager, sbOptions } = useSendbirdChat();\n\n const mentionedUsersRef = useRef<MentionedUser[]>([]);\n const textInputRef = useRef<TextInput>();\n\n const [text, setText] = useState('');\n const [selection, setSelection] = useState({ start: 0, end: 0 });\n\n // TODO: Refactor text edit logic more clearly\n useEffect(() => {\n if (\n mentionManager.shouldUseMentionedMessageTemplate(\n params.messageToEdit,\n sbOptions.uikit.groupChannel.channel.enableMention,\n )\n ) {\n const result = mentionManager.templateToTextAndMentionedUsers(\n params.messageToEdit && 'mentionedMessageTemplate' in params.messageToEdit\n ? params.messageToEdit.mentionedMessageTemplate ?? ''\n : '',\n params.messageToEdit?.mentionedUsers ?? [],\n );\n\n mentionedUsersRef.current = result.mentionedUsers;\n setText(result.mentionedText);\n } else {\n mentionedUsersRef.current = [];\n if (params.messageToEdit?.isUserMessage()) {\n setText(params.messageToEdit.message);\n }\n }\n }, [params.messageToEdit]);\n\n const onChangeText = useFreshCallback((_nextText: string, addedMentionedUser?: MentionedUser) => {\n const prevText = text;\n let nextText = _nextText;\n let offset = nextText.length - prevText.length;\n\n // Text clear\n if (nextText === '') {\n mentionedUsersRef.current = [];\n }\n // Text add\n else if (offset > 0) {\n /** Add mentioned user **/\n if (addedMentionedUser) mentionedUsersRef.current.push(addedMentionedUser);\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n // Text remove\n else if (offset < 0) {\n // Ranged remove\n if (selection.start !== selection.end) {\n /** Filter mentioned users in selection range **/\n const { filtered, lastSelection } = mentionManager.removeMentionedUsersInSelection(\n selection,\n mentionedUsersRef.current,\n );\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n Math.max(selection.end, lastSelection),\n filtered,\n );\n }\n // Single remove\n else {\n /** Find mentioned user who ranges in removed selection **/\n const foundIndex = mentionedUsersRef.current.findIndex((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, selection, 'underMore'),\n );\n /** If found, remove from the mentioned user list and remove remainder text **/\n if (foundIndex > -1) {\n const it = mentionedUsersRef.current[foundIndex];\n const remainderLength = it.range.end - it.range.start + offset;\n\n offset = -remainderLength + offset;\n nextText = replace(nextText, it.range.start, it.range.start + remainderLength, '');\n\n mentionedUsersRef.current.splice(foundIndex, 1);\n }\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n }\n\n setText(nextText);\n });\n\n return {\n textInputRef,\n selection,\n onSelectionChange: useFreshCallback((e: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {\n const nativeSelection = { ...e.nativeEvent.selection };\n\n // NOTE: To synchronize call onSelectionChange after onChangeText called on each platform.\n setTimeout(() => {\n const mentionedUser = mentionedUsersRef.current.find((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, nativeSelection),\n );\n\n // Selection should be blocked if changed into mentioned area\n if (mentionedUser) {\n const selectionBlock = { start: mentionedUser.range.start, end: mentionedUser.range.end };\n textInputRef.current?.setNativeProps({ selection: selectionBlock });\n // BUG: setNativeProps called again when invoked onChangeText\n // https://github.com/facebook/react-native/issues/33520\n if (Platform.OS === 'android') {\n setTimeout(() => {\n textInputRef.current?.setNativeProps({ selection: { start: 0 } });\n }, 250);\n }\n setSelection(selectionBlock);\n } else {\n setSelection(nativeSelection);\n }\n }, 10);\n }),\n text,\n onChangeText,\n mentionedUsers: mentionedUsersRef.current,\n };\n};\n\nexport default useMentionTextInput;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -217,7 +217,7 @@ class MentionManager {
|
|
|
217
217
|
};
|
|
218
218
|
});
|
|
219
219
|
_defineProperty(this, "shouldUseMentionedMessageTemplate", (message, mentionEnabled) => {
|
|
220
|
-
return Boolean(mentionEnabled &&
|
|
220
|
+
return Boolean(mentionEnabled && message && 'mentionedMessageTemplate' in message && message.mentionedMessageTemplate && message.mentionedUsers && message.mentionedUsers.length > 0);
|
|
221
221
|
});
|
|
222
222
|
this._invalidStartsKeywords = [this.config.trigger, this.config.delimiter];
|
|
223
223
|
this._templateRegex = (0, _uikitUtils.createMentionTemplateRegex)(this.config.trigger);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_uikitReactNativeFoundation","_uikitUtils","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","SPAN_DIRECTION","LRM","RLM","MentionManager","constructor","config","name","isEndsWithRTL","inRangeUnderOver","start","num","end","inRangeUnderMore","inRangeLessOver","inRangeLessMore","overlaps","a","b","compare","inRange","underOver","underMore","lessOver","lessMore","text","selectionIndex","lastSpan","slice","split","delimiter","pop","triggerIdx","indexOf","trigger","mentionSpan","searchString","length","isTriggered","startsWith","isValidSearchString","_invalidStartsKeywords","every","it","offset","mentionedUsers","map","range","selection","lastSelection","removedOffset","filtered","filter","shouldRemove","rangeHelpers","Math","max","user","prefix","content","userId","postfix","nickname","getDirectionOfNextSpan","mentionEnabled","leftText","components","sort","reduce","curr","currentIndex","leftSpan","rightSpan","createElement","Text","key","style","styles","mentionedText","strings","templateSpan","asMentionedMessageTemplate","join","template","actualMentionedUsers","offsetToMove","replaceWithRegex","templateRegex","match","matchIndex","groups","find","userIdSpan","userNicknameSpan","asMentionedMessageText","offsetAfterConverted","originalRange","convertedRange","push","message","Boolean","mentionedMessageTemplate","_templateRegex","createMentionTemplateRegex","createStyleSheet","fontWeight","_default","exports"],"sources":["MentionManager.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Text, createStyleSheet } from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdFileMessage, SendbirdUser, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { createMentionTemplateRegex, isEndsWithRTL, replaceWithRegex } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser, Range } from '../types';\nimport type { MentionConfigInterface } from './MentionConfig';\n\nconst SPAN_DIRECTION = {\n LRM: '\\u200E',\n RLM: '\\u200F',\n};\n\nclass MentionManager {\n private _invalidStartsKeywords: string[];\n private _templateRegex: RegExp;\n\n constructor(public config: MentionConfigInterface) {\n this._invalidStartsKeywords = [this.config.trigger, this.config.delimiter];\n this._templateRegex = createMentionTemplateRegex(this.config.trigger);\n }\n\n // Note: When the input starts in LTR and the mentioned user's name is in RTL, it appears as \"Hello @{cibarA}.\"\n // If typing continues in RTL, the mention is rendered as: \"Hello @{txeTlanoitiddA}{cibarA}.\"\n //\n // Conversely, if the input starts in RTL and the mentioned user's name is in LTR, it appears as \"{Eng}@ cibarA.\"\n // If typing continues, it is rendered as: \"{Eng}{AdditionalText}@ cibarA.\"\n //\n // While this follows the natural text direction, it can make mentions harder to distinguish.\n // To address this, we use the RLM or LRM Unicode characters to reset subsequent spans based on the last text string of the user's name.\n // By applying this trick, the result will be displayed as \"Hello @{cibarA} {txeTlanoitiddA}\" or \"{AdditionalText} {Eng}@ cibarA,\" ensuring the mention block remains clearly distinguishable.\n getDirectionOfNextSpan = (name: string) => {\n return isEndsWithRTL(name) ? SPAN_DIRECTION.LRM : SPAN_DIRECTION.RLM;\n };\n\n public rangeHelpers = {\n inRangeUnderOver(start: number, num: number, end: number) {\n return start < num && num < end;\n },\n inRangeUnderMore(start: number, num: number, end: number) {\n return start < num && num <= end;\n },\n inRangeLessOver(start: number, num: number, end: number) {\n return start <= num && num < end;\n },\n inRangeLessMore(start: number, num: number, end: number) {\n return start <= num && num <= end;\n },\n overlaps(a: Range, b: Range, compare: 'underOver' | 'underMore' | 'lessOver' | 'lessMore' = 'underOver') {\n const inRange = {\n underOver: this.inRangeUnderOver,\n underMore: this.inRangeUnderMore,\n lessOver: this.inRangeLessOver,\n lessMore: this.inRangeLessMore,\n }[compare];\n\n return inRange(a.start, b.start, a.end) || inRange(a.start, b.end, a.end);\n },\n };\n\n public get templateRegex() {\n return this._templateRegex;\n }\n\n public getSearchString = (text: string, selectionIndex: number) => {\n const lastSpan = text.slice(0, selectionIndex).split(this.config.delimiter).pop() ?? '';\n const triggerIdx = lastSpan.indexOf(this.config.trigger);\n const mentionSpan = triggerIdx === -1 ? lastSpan : lastSpan.slice(triggerIdx);\n const searchString = mentionSpan.slice(this.config.trigger.length);\n\n return {\n searchString,\n isTriggered: () => mentionSpan.startsWith(this.config.trigger),\n isValidSearchString: () => this._invalidStartsKeywords.every((it) => !searchString.startsWith(it)),\n };\n };\n\n /**\n * @description Reconcile the range by offset in the mentioned users\n * */\n public reconcileRangeOfMentionedUsers = (offset: number, selectionIndex: number, mentionedUsers: MentionedUser[]) => {\n return mentionedUsers.map((it) => {\n // Changes only on the right text of selection.\n if (selectionIndex <= it.range.start) {\n return {\n ...it,\n range: {\n start: it.range.start + offset,\n end: it.range.end + offset,\n },\n };\n }\n\n return it;\n });\n };\n\n /**\n * @description Remove users who in a range\n * */\n public removeMentionedUsersInSelection = (selection: Range, mentionedUsers: MentionedUser[]) => {\n let lastSelection = 0;\n let removedOffset = 0;\n const filtered = mentionedUsers.filter((it) => {\n const shouldRemove = this.rangeHelpers.overlaps(selection, it.range, 'lessMore');\n if (shouldRemove) {\n lastSelection = Math.max(lastSelection, it.range.end);\n removedOffset -= it.range.end - it.range.start;\n }\n return !shouldRemove;\n });\n\n return { filtered, lastSelection, removedOffset };\n };\n\n public getSearchStringRangeInText = (selectionIndex: number, searchString: string): Range => {\n return {\n start: selectionIndex - searchString.length - this.config.trigger.length,\n end: selectionIndex,\n };\n };\n\n /**\n * @description User to @{user.id} template format\n * */\n public asMentionedMessageTemplate = (user: SendbirdUser, delimiter = false) => {\n const prefix = ''; // Do not append anything to here in order to maintain backward compatibility.\n const content = `${this.config.trigger}{${user.userId}}`;\n const postfix = delimiter ? this.config.delimiter : '';\n\n return prefix + content + postfix;\n };\n\n /**\n * @description User to @user.nickname text format\n * */\n public asMentionedMessageText = (user: SendbirdUser, delimiter = false) => {\n const prefix = '';\n const content = `${this.config.trigger}${user.nickname}`;\n const postfix = this.getDirectionOfNextSpan(user.nickname) + (delimiter ? this.config.delimiter : '');\n\n return prefix + content + postfix;\n };\n\n /**\n * @description Bold @user.nickname\n * */\n public textToMentionedComponents = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled || mentionedUsers.length === 0) return text;\n\n const { leftText, components } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, components }, curr, currentIndex) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const mentionSpan = leftText.slice(curr.range.start, curr.range.end);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n components: [\n <Text key={mentionSpan + currentIndex} style={styles.mentionedText}>\n {mentionSpan}\n </Text>,\n rightSpan,\n ...components,\n ],\n };\n },\n { leftText: text, components: [] as (string | React.ReactNode)[] },\n );\n\n return [leftText, ...components];\n };\n\n public textToMentionedMessageTemplate = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled) return text;\n\n const { leftText, strings } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, strings }, curr) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const templateSpan = this.asMentionedMessageTemplate(curr.user);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n strings: [templateSpan, rightSpan, ...strings],\n };\n },\n { leftText: text, strings: [] as string[] },\n );\n\n return [leftText, ...strings].join('');\n };\n\n /**\n * @description Convert @{user.id} template to @user.nickname text and MentionedUser[] array.\n * */\n public templateToTextAndMentionedUsers = (template: string, mentionedUsers: SendbirdUser[]) => {\n const actualMentionedUsers: MentionedUser[] = [];\n\n let offsetToMove = 0;\n const mentionedText = replaceWithRegex(\n template,\n this.templateRegex,\n ({ match, matchIndex, groups }) => {\n const user = mentionedUsers.find((it) => it.userId === groups[2]);\n if (user && typeof matchIndex === 'number') {\n const userIdSpan = match;\n const userNicknameSpan = this.asMentionedMessageText(user);\n\n const offsetAfterConverted = userNicknameSpan.length - userIdSpan.length;\n\n const originalRange: Range = {\n start: matchIndex,\n end: matchIndex + userIdSpan.length,\n };\n\n const convertedRange: Range = {\n start: Math.max(0, originalRange.start + offsetToMove),\n end: originalRange.end + offsetToMove + offsetAfterConverted,\n };\n\n offsetToMove += offsetAfterConverted;\n\n actualMentionedUsers.push({ range: convertedRange, user });\n return userNicknameSpan;\n }\n return match;\n },\n '',\n ).join('');\n\n return {\n mentionedText,\n mentionedUsers: actualMentionedUsers,\n };\n };\n\n public shouldUseMentionedMessageTemplate = (\n message?: SendbirdUserMessage | SendbirdFileMessage,\n mentionEnabled?: boolean,\n ): boolean => {\n return Boolean(\n mentionEnabled &&\n message?.mentionedMessageTemplate &&\n message?.mentionedUsers &&\n message?.mentionedUsers.length > 0,\n );\n };\n}\n\nconst styles = createStyleSheet({\n mentionedText: { fontWeight: '700' },\n});\n\nexport default MentionManager;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_uikitReactNativeFoundation","_uikitUtils","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","SPAN_DIRECTION","LRM","RLM","MentionManager","constructor","config","name","isEndsWithRTL","inRangeUnderOver","start","num","end","inRangeUnderMore","inRangeLessOver","inRangeLessMore","overlaps","a","b","compare","inRange","underOver","underMore","lessOver","lessMore","text","selectionIndex","lastSpan","slice","split","delimiter","pop","triggerIdx","indexOf","trigger","mentionSpan","searchString","length","isTriggered","startsWith","isValidSearchString","_invalidStartsKeywords","every","it","offset","mentionedUsers","map","range","selection","lastSelection","removedOffset","filtered","filter","shouldRemove","rangeHelpers","Math","max","user","prefix","content","userId","postfix","nickname","getDirectionOfNextSpan","mentionEnabled","leftText","components","sort","reduce","curr","currentIndex","leftSpan","rightSpan","createElement","Text","key","style","styles","mentionedText","strings","templateSpan","asMentionedMessageTemplate","join","template","actualMentionedUsers","offsetToMove","replaceWithRegex","templateRegex","match","matchIndex","groups","find","userIdSpan","userNicknameSpan","asMentionedMessageText","offsetAfterConverted","originalRange","convertedRange","push","message","Boolean","mentionedMessageTemplate","_templateRegex","createMentionTemplateRegex","createStyleSheet","fontWeight","_default","exports"],"sources":["MentionManager.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Text, createStyleSheet } from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdFileMessage, SendbirdUser, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { createMentionTemplateRegex, isEndsWithRTL, replaceWithRegex } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser, Range } from '../types';\nimport type { MentionConfigInterface } from './MentionConfig';\n\nconst SPAN_DIRECTION = {\n LRM: '\\u200E',\n RLM: '\\u200F',\n};\n\nclass MentionManager {\n private _invalidStartsKeywords: string[];\n private _templateRegex: RegExp;\n\n constructor(public config: MentionConfigInterface) {\n this._invalidStartsKeywords = [this.config.trigger, this.config.delimiter];\n this._templateRegex = createMentionTemplateRegex(this.config.trigger);\n }\n\n // Note: When the input starts in LTR and the mentioned user's name is in RTL, it appears as \"Hello @{cibarA}.\"\n // If typing continues in RTL, the mention is rendered as: \"Hello @{txeTlanoitiddA}{cibarA}.\"\n //\n // Conversely, if the input starts in RTL and the mentioned user's name is in LTR, it appears as \"{Eng}@ cibarA.\"\n // If typing continues, it is rendered as: \"{Eng}{AdditionalText}@ cibarA.\"\n //\n // While this follows the natural text direction, it can make mentions harder to distinguish.\n // To address this, we use the RLM or LRM Unicode characters to reset subsequent spans based on the last text string of the user's name.\n // By applying this trick, the result will be displayed as \"Hello @{cibarA} {txeTlanoitiddA}\" or \"{AdditionalText} {Eng}@ cibarA,\" ensuring the mention block remains clearly distinguishable.\n getDirectionOfNextSpan = (name: string) => {\n return isEndsWithRTL(name) ? SPAN_DIRECTION.LRM : SPAN_DIRECTION.RLM;\n };\n\n public rangeHelpers = {\n inRangeUnderOver(start: number, num: number, end: number) {\n return start < num && num < end;\n },\n inRangeUnderMore(start: number, num: number, end: number) {\n return start < num && num <= end;\n },\n inRangeLessOver(start: number, num: number, end: number) {\n return start <= num && num < end;\n },\n inRangeLessMore(start: number, num: number, end: number) {\n return start <= num && num <= end;\n },\n overlaps(a: Range, b: Range, compare: 'underOver' | 'underMore' | 'lessOver' | 'lessMore' = 'underOver') {\n const inRange = {\n underOver: this.inRangeUnderOver,\n underMore: this.inRangeUnderMore,\n lessOver: this.inRangeLessOver,\n lessMore: this.inRangeLessMore,\n }[compare];\n\n return inRange(a.start, b.start, a.end) || inRange(a.start, b.end, a.end);\n },\n };\n\n public get templateRegex() {\n return this._templateRegex;\n }\n\n public getSearchString = (text: string, selectionIndex: number) => {\n const lastSpan = text.slice(0, selectionIndex).split(this.config.delimiter).pop() ?? '';\n const triggerIdx = lastSpan.indexOf(this.config.trigger);\n const mentionSpan = triggerIdx === -1 ? lastSpan : lastSpan.slice(triggerIdx);\n const searchString = mentionSpan.slice(this.config.trigger.length);\n\n return {\n searchString,\n isTriggered: () => mentionSpan.startsWith(this.config.trigger),\n isValidSearchString: () => this._invalidStartsKeywords.every((it) => !searchString.startsWith(it)),\n };\n };\n\n /**\n * @description Reconcile the range by offset in the mentioned users\n * */\n public reconcileRangeOfMentionedUsers = (offset: number, selectionIndex: number, mentionedUsers: MentionedUser[]) => {\n return mentionedUsers.map((it) => {\n // Changes only on the right text of selection.\n if (selectionIndex <= it.range.start) {\n return {\n ...it,\n range: {\n start: it.range.start + offset,\n end: it.range.end + offset,\n },\n };\n }\n\n return it;\n });\n };\n\n /**\n * @description Remove users who in a range\n * */\n public removeMentionedUsersInSelection = (selection: Range, mentionedUsers: MentionedUser[]) => {\n let lastSelection = 0;\n let removedOffset = 0;\n const filtered = mentionedUsers.filter((it) => {\n const shouldRemove = this.rangeHelpers.overlaps(selection, it.range, 'lessMore');\n if (shouldRemove) {\n lastSelection = Math.max(lastSelection, it.range.end);\n removedOffset -= it.range.end - it.range.start;\n }\n return !shouldRemove;\n });\n\n return { filtered, lastSelection, removedOffset };\n };\n\n public getSearchStringRangeInText = (selectionIndex: number, searchString: string): Range => {\n return {\n start: selectionIndex - searchString.length - this.config.trigger.length,\n end: selectionIndex,\n };\n };\n\n /**\n * @description User to @{user.id} template format\n * */\n public asMentionedMessageTemplate = (user: SendbirdUser, delimiter = false) => {\n const prefix = ''; // Do not append anything to here in order to maintain backward compatibility.\n const content = `${this.config.trigger}{${user.userId}}`;\n const postfix = delimiter ? this.config.delimiter : '';\n\n return prefix + content + postfix;\n };\n\n /**\n * @description User to @user.nickname text format\n * */\n public asMentionedMessageText = (user: SendbirdUser, delimiter = false) => {\n const prefix = '';\n const content = `${this.config.trigger}${user.nickname}`;\n const postfix = this.getDirectionOfNextSpan(user.nickname) + (delimiter ? this.config.delimiter : '');\n\n return prefix + content + postfix;\n };\n\n /**\n * @description Bold @user.nickname\n * */\n public textToMentionedComponents = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled || mentionedUsers.length === 0) return text;\n\n const { leftText, components } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, components }, curr, currentIndex) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const mentionSpan = leftText.slice(curr.range.start, curr.range.end);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n components: [\n <Text key={mentionSpan + currentIndex} style={styles.mentionedText}>\n {mentionSpan}\n </Text>,\n rightSpan,\n ...components,\n ],\n };\n },\n { leftText: text, components: [] as (string | React.ReactNode)[] },\n );\n\n return [leftText, ...components];\n };\n\n public textToMentionedMessageTemplate = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled) return text;\n\n const { leftText, strings } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, strings }, curr) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const templateSpan = this.asMentionedMessageTemplate(curr.user);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n strings: [templateSpan, rightSpan, ...strings],\n };\n },\n { leftText: text, strings: [] as string[] },\n );\n\n return [leftText, ...strings].join('');\n };\n\n /**\n * @description Convert @{user.id} template to @user.nickname text and MentionedUser[] array.\n * */\n public templateToTextAndMentionedUsers = (template: string, mentionedUsers: SendbirdUser[]) => {\n const actualMentionedUsers: MentionedUser[] = [];\n\n let offsetToMove = 0;\n const mentionedText = replaceWithRegex(\n template,\n this.templateRegex,\n ({ match, matchIndex, groups }) => {\n const user = mentionedUsers.find((it) => it.userId === groups[2]);\n if (user && typeof matchIndex === 'number') {\n const userIdSpan = match;\n const userNicknameSpan = this.asMentionedMessageText(user);\n\n const offsetAfterConverted = userNicknameSpan.length - userIdSpan.length;\n\n const originalRange: Range = {\n start: matchIndex,\n end: matchIndex + userIdSpan.length,\n };\n\n const convertedRange: Range = {\n start: Math.max(0, originalRange.start + offsetToMove),\n end: originalRange.end + offsetToMove + offsetAfterConverted,\n };\n\n offsetToMove += offsetAfterConverted;\n\n actualMentionedUsers.push({ range: convertedRange, user });\n return userNicknameSpan;\n }\n return match;\n },\n '',\n ).join('');\n\n return {\n mentionedText,\n mentionedUsers: actualMentionedUsers,\n };\n };\n\n public shouldUseMentionedMessageTemplate = (\n message?: SendbirdUserMessage | SendbirdFileMessage,\n mentionEnabled?: boolean,\n ): boolean => {\n return Boolean(\n mentionEnabled &&\n message &&\n 'mentionedMessageTemplate' in message &&\n message.mentionedMessageTemplate &&\n message.mentionedUsers &&\n message.mentionedUsers.length > 0,\n );\n };\n}\n\nconst styles = createStyleSheet({\n mentionedText: { fontWeight: '700' },\n});\n\nexport default MentionManager;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.
|
|
1
|
+
{"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.3';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACTH,OAAO","ignoreList":[]}
|
|
@@ -20,14 +20,14 @@ const useMentionTextInput = params => {
|
|
|
20
20
|
// TODO: Refactor text edit logic more clearly
|
|
21
21
|
useEffect(() => {
|
|
22
22
|
if (mentionManager.shouldUseMentionedMessageTemplate(params.messageToEdit, sbOptions.uikit.groupChannel.channel.enableMention)) {
|
|
23
|
-
var _params$messageToEdit
|
|
24
|
-
const result = mentionManager.templateToTextAndMentionedUsers(
|
|
23
|
+
var _params$messageToEdit;
|
|
24
|
+
const result = mentionManager.templateToTextAndMentionedUsers(params.messageToEdit && 'mentionedMessageTemplate' in params.messageToEdit ? params.messageToEdit.mentionedMessageTemplate ?? '' : '', ((_params$messageToEdit = params.messageToEdit) === null || _params$messageToEdit === void 0 ? void 0 : _params$messageToEdit.mentionedUsers) ?? []);
|
|
25
25
|
mentionedUsersRef.current = result.mentionedUsers;
|
|
26
26
|
setText(result.mentionedText);
|
|
27
27
|
} else {
|
|
28
|
-
var _params$
|
|
28
|
+
var _params$messageToEdit2;
|
|
29
29
|
mentionedUsersRef.current = [];
|
|
30
|
-
if ((_params$
|
|
30
|
+
if ((_params$messageToEdit2 = params.messageToEdit) !== null && _params$messageToEdit2 !== void 0 && _params$messageToEdit2.isUserMessage()) {
|
|
31
31
|
setText(params.messageToEdit.message);
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","useState","Platform","replace","useFreshCallback","useSendbirdChat","useMentionTextInput","params","mentionManager","sbOptions","mentionedUsersRef","textInputRef","text","setText","selection","setSelection","start","end","shouldUseMentionedMessageTemplate","messageToEdit","uikit","groupChannel","channel","enableMention","_params$messageToEdit","_params$messageToEdit2","result","templateToTextAndMentionedUsers","mentionedMessageTemplate","mentionedUsers","current","mentionedText","_params$messageToEdit3","isUserMessage","message","onChangeText","_nextText","addedMentionedUser","prevText","nextText","offset","length","push","reconcileRangeOfMentionedUsers","filtered","lastSelection","removeMentionedUsersInSelection","Math","max","foundIndex","findIndex","it","rangeHelpers","overlaps","range","remainderLength","splice","onSelectionChange","e","nativeSelection","nativeEvent","setTimeout","mentionedUser","find","_textInputRef$current","selectionBlock","setNativeProps","OS","_textInputRef$current2"],"sources":["useMentionTextInput.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { NativeSyntheticEvent, TextInput, TextInputSelectionChangeEventData } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport { SendbirdFileMessage, SendbirdUserMessage, replace, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser } from '../types';\nimport { useSendbirdChat } from './useContext';\n\n// Note: The selection change with the keyboard cursor might not work properly with RTL languages\nconst useMentionTextInput = (params: { messageToEdit?: SendbirdUserMessage | SendbirdFileMessage }) => {\n const { mentionManager, sbOptions } = useSendbirdChat();\n\n const mentionedUsersRef = useRef<MentionedUser[]>([]);\n const textInputRef = useRef<TextInput>();\n\n const [text, setText] = useState('');\n const [selection, setSelection] = useState({ start: 0, end: 0 });\n\n // TODO: Refactor text edit logic more clearly\n useEffect(() => {\n if (\n mentionManager.shouldUseMentionedMessageTemplate(\n params.messageToEdit,\n sbOptions.uikit.groupChannel.channel.enableMention,\n )\n ) {\n const result = mentionManager.templateToTextAndMentionedUsers(\n params.messageToEdit?.mentionedMessageTemplate ?? '',\n params.messageToEdit?.mentionedUsers ?? [],\n );\n\n mentionedUsersRef.current = result.mentionedUsers;\n setText(result.mentionedText);\n } else {\n mentionedUsersRef.current = [];\n if (params.messageToEdit?.isUserMessage()) {\n setText(params.messageToEdit.message);\n }\n }\n }, [params.messageToEdit]);\n\n const onChangeText = useFreshCallback((_nextText: string, addedMentionedUser?: MentionedUser) => {\n const prevText = text;\n let nextText = _nextText;\n let offset = nextText.length - prevText.length;\n\n // Text clear\n if (nextText === '') {\n mentionedUsersRef.current = [];\n }\n // Text add\n else if (offset > 0) {\n /** Add mentioned user **/\n if (addedMentionedUser) mentionedUsersRef.current.push(addedMentionedUser);\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n // Text remove\n else if (offset < 0) {\n // Ranged remove\n if (selection.start !== selection.end) {\n /** Filter mentioned users in selection range **/\n const { filtered, lastSelection } = mentionManager.removeMentionedUsersInSelection(\n selection,\n mentionedUsersRef.current,\n );\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n Math.max(selection.end, lastSelection),\n filtered,\n );\n }\n // Single remove\n else {\n /** Find mentioned user who ranges in removed selection **/\n const foundIndex = mentionedUsersRef.current.findIndex((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, selection, 'underMore'),\n );\n /** If found, remove from the mentioned user list and remove remainder text **/\n if (foundIndex > -1) {\n const it = mentionedUsersRef.current[foundIndex];\n const remainderLength = it.range.end - it.range.start + offset;\n\n offset = -remainderLength + offset;\n nextText = replace(nextText, it.range.start, it.range.start + remainderLength, '');\n\n mentionedUsersRef.current.splice(foundIndex, 1);\n }\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n }\n\n setText(nextText);\n });\n\n return {\n textInputRef,\n selection,\n onSelectionChange: useFreshCallback((e: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {\n const nativeSelection = { ...e.nativeEvent.selection };\n\n // NOTE: To synchronize call onSelectionChange after onChangeText called on each platform.\n setTimeout(() => {\n const mentionedUser = mentionedUsersRef.current.find((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, nativeSelection),\n );\n\n // Selection should be blocked if changed into mentioned area\n if (mentionedUser) {\n const selectionBlock = { start: mentionedUser.range.start, end: mentionedUser.range.end };\n textInputRef.current?.setNativeProps({ selection: selectionBlock });\n // BUG: setNativeProps called again when invoked onChangeText\n // https://github.com/facebook/react-native/issues/33520\n if (Platform.OS === 'android') {\n setTimeout(() => {\n textInputRef.current?.setNativeProps({ selection: { start: 0 } });\n }, 250);\n }\n setSelection(selectionBlock);\n } else {\n setSelection(nativeSelection);\n }\n }, 10);\n }),\n text,\n onChangeText,\n mentionedUsers: mentionedUsersRef.current,\n };\n};\n\nexport default useMentionTextInput;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","useState","Platform","replace","useFreshCallback","useSendbirdChat","useMentionTextInput","params","mentionManager","sbOptions","mentionedUsersRef","textInputRef","text","setText","selection","setSelection","start","end","shouldUseMentionedMessageTemplate","messageToEdit","uikit","groupChannel","channel","enableMention","_params$messageToEdit","result","templateToTextAndMentionedUsers","mentionedMessageTemplate","mentionedUsers","current","mentionedText","_params$messageToEdit2","isUserMessage","message","onChangeText","_nextText","addedMentionedUser","prevText","nextText","offset","length","push","reconcileRangeOfMentionedUsers","filtered","lastSelection","removeMentionedUsersInSelection","Math","max","foundIndex","findIndex","it","rangeHelpers","overlaps","range","remainderLength","splice","onSelectionChange","e","nativeSelection","nativeEvent","setTimeout","mentionedUser","find","_textInputRef$current","selectionBlock","setNativeProps","OS","_textInputRef$current2"],"sources":["useMentionTextInput.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { NativeSyntheticEvent, TextInput, TextInputSelectionChangeEventData } from 'react-native';\nimport { Platform } from 'react-native';\n\nimport { SendbirdFileMessage, SendbirdUserMessage, replace, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser } from '../types';\nimport { useSendbirdChat } from './useContext';\n\n// Note: The selection change with the keyboard cursor might not work properly with RTL languages\nconst useMentionTextInput = (params: { messageToEdit?: SendbirdUserMessage | SendbirdFileMessage }) => {\n const { mentionManager, sbOptions } = useSendbirdChat();\n\n const mentionedUsersRef = useRef<MentionedUser[]>([]);\n const textInputRef = useRef<TextInput>();\n\n const [text, setText] = useState('');\n const [selection, setSelection] = useState({ start: 0, end: 0 });\n\n // TODO: Refactor text edit logic more clearly\n useEffect(() => {\n if (\n mentionManager.shouldUseMentionedMessageTemplate(\n params.messageToEdit,\n sbOptions.uikit.groupChannel.channel.enableMention,\n )\n ) {\n const result = mentionManager.templateToTextAndMentionedUsers(\n params.messageToEdit && 'mentionedMessageTemplate' in params.messageToEdit\n ? params.messageToEdit.mentionedMessageTemplate ?? ''\n : '',\n params.messageToEdit?.mentionedUsers ?? [],\n );\n\n mentionedUsersRef.current = result.mentionedUsers;\n setText(result.mentionedText);\n } else {\n mentionedUsersRef.current = [];\n if (params.messageToEdit?.isUserMessage()) {\n setText(params.messageToEdit.message);\n }\n }\n }, [params.messageToEdit]);\n\n const onChangeText = useFreshCallback((_nextText: string, addedMentionedUser?: MentionedUser) => {\n const prevText = text;\n let nextText = _nextText;\n let offset = nextText.length - prevText.length;\n\n // Text clear\n if (nextText === '') {\n mentionedUsersRef.current = [];\n }\n // Text add\n else if (offset > 0) {\n /** Add mentioned user **/\n if (addedMentionedUser) mentionedUsersRef.current.push(addedMentionedUser);\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n // Text remove\n else if (offset < 0) {\n // Ranged remove\n if (selection.start !== selection.end) {\n /** Filter mentioned users in selection range **/\n const { filtered, lastSelection } = mentionManager.removeMentionedUsersInSelection(\n selection,\n mentionedUsersRef.current,\n );\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n Math.max(selection.end, lastSelection),\n filtered,\n );\n }\n // Single remove\n else {\n /** Find mentioned user who ranges in removed selection **/\n const foundIndex = mentionedUsersRef.current.findIndex((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, selection, 'underMore'),\n );\n /** If found, remove from the mentioned user list and remove remainder text **/\n if (foundIndex > -1) {\n const it = mentionedUsersRef.current[foundIndex];\n const remainderLength = it.range.end - it.range.start + offset;\n\n offset = -remainderLength + offset;\n nextText = replace(nextText, it.range.start, it.range.start + remainderLength, '');\n\n mentionedUsersRef.current.splice(foundIndex, 1);\n }\n\n /** Reconcile mentioned users range on the right side of the selection **/\n mentionedUsersRef.current = mentionManager.reconcileRangeOfMentionedUsers(\n offset,\n selection.end,\n mentionedUsersRef.current,\n );\n }\n }\n\n setText(nextText);\n });\n\n return {\n textInputRef,\n selection,\n onSelectionChange: useFreshCallback((e: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {\n const nativeSelection = { ...e.nativeEvent.selection };\n\n // NOTE: To synchronize call onSelectionChange after onChangeText called on each platform.\n setTimeout(() => {\n const mentionedUser = mentionedUsersRef.current.find((it) =>\n mentionManager.rangeHelpers.overlaps(it.range, nativeSelection),\n );\n\n // Selection should be blocked if changed into mentioned area\n if (mentionedUser) {\n const selectionBlock = { start: mentionedUser.range.start, end: mentionedUser.range.end };\n textInputRef.current?.setNativeProps({ selection: selectionBlock });\n // BUG: setNativeProps called again when invoked onChangeText\n // https://github.com/facebook/react-native/issues/33520\n if (Platform.OS === 'android') {\n setTimeout(() => {\n textInputRef.current?.setNativeProps({ selection: { start: 0 } });\n }, 250);\n }\n setSelection(selectionBlock);\n } else {\n setSelection(nativeSelection);\n }\n }, 10);\n }),\n text,\n onChangeText,\n mentionedUsers: mentionedUsersRef.current,\n };\n};\n\nexport default useMentionTextInput;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -210,7 +210,7 @@ class MentionManager {
|
|
|
210
210
|
};
|
|
211
211
|
});
|
|
212
212
|
_defineProperty(this, "shouldUseMentionedMessageTemplate", (message, mentionEnabled) => {
|
|
213
|
-
return Boolean(mentionEnabled &&
|
|
213
|
+
return Boolean(mentionEnabled && message && 'mentionedMessageTemplate' in message && message.mentionedMessageTemplate && message.mentionedUsers && message.mentionedUsers.length > 0);
|
|
214
214
|
});
|
|
215
215
|
this._invalidStartsKeywords = [this.config.trigger, this.config.delimiter];
|
|
216
216
|
this._templateRegex = createMentionTemplateRegex(this.config.trigger);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Text","createStyleSheet","createMentionTemplateRegex","isEndsWithRTL","replaceWithRegex","SPAN_DIRECTION","LRM","RLM","MentionManager","constructor","config","_defineProperty","name","inRangeUnderOver","start","num","end","inRangeUnderMore","inRangeLessOver","inRangeLessMore","overlaps","a","b","compare","inRange","underOver","underMore","lessOver","lessMore","text","selectionIndex","lastSpan","slice","split","delimiter","pop","triggerIdx","indexOf","trigger","mentionSpan","searchString","length","isTriggered","startsWith","isValidSearchString","_invalidStartsKeywords","every","it","offset","mentionedUsers","map","range","selection","lastSelection","removedOffset","filtered","filter","shouldRemove","rangeHelpers","Math","max","user","prefix","content","userId","postfix","nickname","getDirectionOfNextSpan","mentionEnabled","leftText","components","sort","reduce","curr","currentIndex","leftSpan","rightSpan","createElement","key","style","styles","mentionedText","strings","templateSpan","asMentionedMessageTemplate","join","template","actualMentionedUsers","offsetToMove","templateRegex","match","matchIndex","groups","find","userIdSpan","userNicknameSpan","asMentionedMessageText","offsetAfterConverted","originalRange","convertedRange","push","message","Boolean","mentionedMessageTemplate","_templateRegex","fontWeight"],"sources":["MentionManager.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Text, createStyleSheet } from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdFileMessage, SendbirdUser, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { createMentionTemplateRegex, isEndsWithRTL, replaceWithRegex } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser, Range } from '../types';\nimport type { MentionConfigInterface } from './MentionConfig';\n\nconst SPAN_DIRECTION = {\n LRM: '\\u200E',\n RLM: '\\u200F',\n};\n\nclass MentionManager {\n private _invalidStartsKeywords: string[];\n private _templateRegex: RegExp;\n\n constructor(public config: MentionConfigInterface) {\n this._invalidStartsKeywords = [this.config.trigger, this.config.delimiter];\n this._templateRegex = createMentionTemplateRegex(this.config.trigger);\n }\n\n // Note: When the input starts in LTR and the mentioned user's name is in RTL, it appears as \"Hello @{cibarA}.\"\n // If typing continues in RTL, the mention is rendered as: \"Hello @{txeTlanoitiddA}{cibarA}.\"\n //\n // Conversely, if the input starts in RTL and the mentioned user's name is in LTR, it appears as \"{Eng}@ cibarA.\"\n // If typing continues, it is rendered as: \"{Eng}{AdditionalText}@ cibarA.\"\n //\n // While this follows the natural text direction, it can make mentions harder to distinguish.\n // To address this, we use the RLM or LRM Unicode characters to reset subsequent spans based on the last text string of the user's name.\n // By applying this trick, the result will be displayed as \"Hello @{cibarA} {txeTlanoitiddA}\" or \"{AdditionalText} {Eng}@ cibarA,\" ensuring the mention block remains clearly distinguishable.\n getDirectionOfNextSpan = (name: string) => {\n return isEndsWithRTL(name) ? SPAN_DIRECTION.LRM : SPAN_DIRECTION.RLM;\n };\n\n public rangeHelpers = {\n inRangeUnderOver(start: number, num: number, end: number) {\n return start < num && num < end;\n },\n inRangeUnderMore(start: number, num: number, end: number) {\n return start < num && num <= end;\n },\n inRangeLessOver(start: number, num: number, end: number) {\n return start <= num && num < end;\n },\n inRangeLessMore(start: number, num: number, end: number) {\n return start <= num && num <= end;\n },\n overlaps(a: Range, b: Range, compare: 'underOver' | 'underMore' | 'lessOver' | 'lessMore' = 'underOver') {\n const inRange = {\n underOver: this.inRangeUnderOver,\n underMore: this.inRangeUnderMore,\n lessOver: this.inRangeLessOver,\n lessMore: this.inRangeLessMore,\n }[compare];\n\n return inRange(a.start, b.start, a.end) || inRange(a.start, b.end, a.end);\n },\n };\n\n public get templateRegex() {\n return this._templateRegex;\n }\n\n public getSearchString = (text: string, selectionIndex: number) => {\n const lastSpan = text.slice(0, selectionIndex).split(this.config.delimiter).pop() ?? '';\n const triggerIdx = lastSpan.indexOf(this.config.trigger);\n const mentionSpan = triggerIdx === -1 ? lastSpan : lastSpan.slice(triggerIdx);\n const searchString = mentionSpan.slice(this.config.trigger.length);\n\n return {\n searchString,\n isTriggered: () => mentionSpan.startsWith(this.config.trigger),\n isValidSearchString: () => this._invalidStartsKeywords.every((it) => !searchString.startsWith(it)),\n };\n };\n\n /**\n * @description Reconcile the range by offset in the mentioned users\n * */\n public reconcileRangeOfMentionedUsers = (offset: number, selectionIndex: number, mentionedUsers: MentionedUser[]) => {\n return mentionedUsers.map((it) => {\n // Changes only on the right text of selection.\n if (selectionIndex <= it.range.start) {\n return {\n ...it,\n range: {\n start: it.range.start + offset,\n end: it.range.end + offset,\n },\n };\n }\n\n return it;\n });\n };\n\n /**\n * @description Remove users who in a range\n * */\n public removeMentionedUsersInSelection = (selection: Range, mentionedUsers: MentionedUser[]) => {\n let lastSelection = 0;\n let removedOffset = 0;\n const filtered = mentionedUsers.filter((it) => {\n const shouldRemove = this.rangeHelpers.overlaps(selection, it.range, 'lessMore');\n if (shouldRemove) {\n lastSelection = Math.max(lastSelection, it.range.end);\n removedOffset -= it.range.end - it.range.start;\n }\n return !shouldRemove;\n });\n\n return { filtered, lastSelection, removedOffset };\n };\n\n public getSearchStringRangeInText = (selectionIndex: number, searchString: string): Range => {\n return {\n start: selectionIndex - searchString.length - this.config.trigger.length,\n end: selectionIndex,\n };\n };\n\n /**\n * @description User to @{user.id} template format\n * */\n public asMentionedMessageTemplate = (user: SendbirdUser, delimiter = false) => {\n const prefix = ''; // Do not append anything to here in order to maintain backward compatibility.\n const content = `${this.config.trigger}{${user.userId}}`;\n const postfix = delimiter ? this.config.delimiter : '';\n\n return prefix + content + postfix;\n };\n\n /**\n * @description User to @user.nickname text format\n * */\n public asMentionedMessageText = (user: SendbirdUser, delimiter = false) => {\n const prefix = '';\n const content = `${this.config.trigger}${user.nickname}`;\n const postfix = this.getDirectionOfNextSpan(user.nickname) + (delimiter ? this.config.delimiter : '');\n\n return prefix + content + postfix;\n };\n\n /**\n * @description Bold @user.nickname\n * */\n public textToMentionedComponents = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled || mentionedUsers.length === 0) return text;\n\n const { leftText, components } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, components }, curr, currentIndex) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const mentionSpan = leftText.slice(curr.range.start, curr.range.end);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n components: [\n <Text key={mentionSpan + currentIndex} style={styles.mentionedText}>\n {mentionSpan}\n </Text>,\n rightSpan,\n ...components,\n ],\n };\n },\n { leftText: text, components: [] as (string | React.ReactNode)[] },\n );\n\n return [leftText, ...components];\n };\n\n public textToMentionedMessageTemplate = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled) return text;\n\n const { leftText, strings } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, strings }, curr) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const templateSpan = this.asMentionedMessageTemplate(curr.user);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n strings: [templateSpan, rightSpan, ...strings],\n };\n },\n { leftText: text, strings: [] as string[] },\n );\n\n return [leftText, ...strings].join('');\n };\n\n /**\n * @description Convert @{user.id} template to @user.nickname text and MentionedUser[] array.\n * */\n public templateToTextAndMentionedUsers = (template: string, mentionedUsers: SendbirdUser[]) => {\n const actualMentionedUsers: MentionedUser[] = [];\n\n let offsetToMove = 0;\n const mentionedText = replaceWithRegex(\n template,\n this.templateRegex,\n ({ match, matchIndex, groups }) => {\n const user = mentionedUsers.find((it) => it.userId === groups[2]);\n if (user && typeof matchIndex === 'number') {\n const userIdSpan = match;\n const userNicknameSpan = this.asMentionedMessageText(user);\n\n const offsetAfterConverted = userNicknameSpan.length - userIdSpan.length;\n\n const originalRange: Range = {\n start: matchIndex,\n end: matchIndex + userIdSpan.length,\n };\n\n const convertedRange: Range = {\n start: Math.max(0, originalRange.start + offsetToMove),\n end: originalRange.end + offsetToMove + offsetAfterConverted,\n };\n\n offsetToMove += offsetAfterConverted;\n\n actualMentionedUsers.push({ range: convertedRange, user });\n return userNicknameSpan;\n }\n return match;\n },\n '',\n ).join('');\n\n return {\n mentionedText,\n mentionedUsers: actualMentionedUsers,\n };\n };\n\n public shouldUseMentionedMessageTemplate = (\n message?: SendbirdUserMessage | SendbirdFileMessage,\n mentionEnabled?: boolean,\n ): boolean => {\n return Boolean(\n mentionEnabled &&\n message?.mentionedMessageTemplate &&\n message?.mentionedUsers &&\n message?.mentionedUsers.length > 0,\n );\n };\n}\n\nconst styles = createStyleSheet({\n mentionedText: { fontWeight: '700' },\n});\n\nexport default MentionManager;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","Text","createStyleSheet","createMentionTemplateRegex","isEndsWithRTL","replaceWithRegex","SPAN_DIRECTION","LRM","RLM","MentionManager","constructor","config","_defineProperty","name","inRangeUnderOver","start","num","end","inRangeUnderMore","inRangeLessOver","inRangeLessMore","overlaps","a","b","compare","inRange","underOver","underMore","lessOver","lessMore","text","selectionIndex","lastSpan","slice","split","delimiter","pop","triggerIdx","indexOf","trigger","mentionSpan","searchString","length","isTriggered","startsWith","isValidSearchString","_invalidStartsKeywords","every","it","offset","mentionedUsers","map","range","selection","lastSelection","removedOffset","filtered","filter","shouldRemove","rangeHelpers","Math","max","user","prefix","content","userId","postfix","nickname","getDirectionOfNextSpan","mentionEnabled","leftText","components","sort","reduce","curr","currentIndex","leftSpan","rightSpan","createElement","key","style","styles","mentionedText","strings","templateSpan","asMentionedMessageTemplate","join","template","actualMentionedUsers","offsetToMove","templateRegex","match","matchIndex","groups","find","userIdSpan","userNicknameSpan","asMentionedMessageText","offsetAfterConverted","originalRange","convertedRange","push","message","Boolean","mentionedMessageTemplate","_templateRegex","fontWeight"],"sources":["MentionManager.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Text, createStyleSheet } from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdFileMessage, SendbirdUser, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { createMentionTemplateRegex, isEndsWithRTL, replaceWithRegex } from '@sendbird/uikit-utils';\n\nimport type { MentionedUser, Range } from '../types';\nimport type { MentionConfigInterface } from './MentionConfig';\n\nconst SPAN_DIRECTION = {\n LRM: '\\u200E',\n RLM: '\\u200F',\n};\n\nclass MentionManager {\n private _invalidStartsKeywords: string[];\n private _templateRegex: RegExp;\n\n constructor(public config: MentionConfigInterface) {\n this._invalidStartsKeywords = [this.config.trigger, this.config.delimiter];\n this._templateRegex = createMentionTemplateRegex(this.config.trigger);\n }\n\n // Note: When the input starts in LTR and the mentioned user's name is in RTL, it appears as \"Hello @{cibarA}.\"\n // If typing continues in RTL, the mention is rendered as: \"Hello @{txeTlanoitiddA}{cibarA}.\"\n //\n // Conversely, if the input starts in RTL and the mentioned user's name is in LTR, it appears as \"{Eng}@ cibarA.\"\n // If typing continues, it is rendered as: \"{Eng}{AdditionalText}@ cibarA.\"\n //\n // While this follows the natural text direction, it can make mentions harder to distinguish.\n // To address this, we use the RLM or LRM Unicode characters to reset subsequent spans based on the last text string of the user's name.\n // By applying this trick, the result will be displayed as \"Hello @{cibarA} {txeTlanoitiddA}\" or \"{AdditionalText} {Eng}@ cibarA,\" ensuring the mention block remains clearly distinguishable.\n getDirectionOfNextSpan = (name: string) => {\n return isEndsWithRTL(name) ? SPAN_DIRECTION.LRM : SPAN_DIRECTION.RLM;\n };\n\n public rangeHelpers = {\n inRangeUnderOver(start: number, num: number, end: number) {\n return start < num && num < end;\n },\n inRangeUnderMore(start: number, num: number, end: number) {\n return start < num && num <= end;\n },\n inRangeLessOver(start: number, num: number, end: number) {\n return start <= num && num < end;\n },\n inRangeLessMore(start: number, num: number, end: number) {\n return start <= num && num <= end;\n },\n overlaps(a: Range, b: Range, compare: 'underOver' | 'underMore' | 'lessOver' | 'lessMore' = 'underOver') {\n const inRange = {\n underOver: this.inRangeUnderOver,\n underMore: this.inRangeUnderMore,\n lessOver: this.inRangeLessOver,\n lessMore: this.inRangeLessMore,\n }[compare];\n\n return inRange(a.start, b.start, a.end) || inRange(a.start, b.end, a.end);\n },\n };\n\n public get templateRegex() {\n return this._templateRegex;\n }\n\n public getSearchString = (text: string, selectionIndex: number) => {\n const lastSpan = text.slice(0, selectionIndex).split(this.config.delimiter).pop() ?? '';\n const triggerIdx = lastSpan.indexOf(this.config.trigger);\n const mentionSpan = triggerIdx === -1 ? lastSpan : lastSpan.slice(triggerIdx);\n const searchString = mentionSpan.slice(this.config.trigger.length);\n\n return {\n searchString,\n isTriggered: () => mentionSpan.startsWith(this.config.trigger),\n isValidSearchString: () => this._invalidStartsKeywords.every((it) => !searchString.startsWith(it)),\n };\n };\n\n /**\n * @description Reconcile the range by offset in the mentioned users\n * */\n public reconcileRangeOfMentionedUsers = (offset: number, selectionIndex: number, mentionedUsers: MentionedUser[]) => {\n return mentionedUsers.map((it) => {\n // Changes only on the right text of selection.\n if (selectionIndex <= it.range.start) {\n return {\n ...it,\n range: {\n start: it.range.start + offset,\n end: it.range.end + offset,\n },\n };\n }\n\n return it;\n });\n };\n\n /**\n * @description Remove users who in a range\n * */\n public removeMentionedUsersInSelection = (selection: Range, mentionedUsers: MentionedUser[]) => {\n let lastSelection = 0;\n let removedOffset = 0;\n const filtered = mentionedUsers.filter((it) => {\n const shouldRemove = this.rangeHelpers.overlaps(selection, it.range, 'lessMore');\n if (shouldRemove) {\n lastSelection = Math.max(lastSelection, it.range.end);\n removedOffset -= it.range.end - it.range.start;\n }\n return !shouldRemove;\n });\n\n return { filtered, lastSelection, removedOffset };\n };\n\n public getSearchStringRangeInText = (selectionIndex: number, searchString: string): Range => {\n return {\n start: selectionIndex - searchString.length - this.config.trigger.length,\n end: selectionIndex,\n };\n };\n\n /**\n * @description User to @{user.id} template format\n * */\n public asMentionedMessageTemplate = (user: SendbirdUser, delimiter = false) => {\n const prefix = ''; // Do not append anything to here in order to maintain backward compatibility.\n const content = `${this.config.trigger}{${user.userId}}`;\n const postfix = delimiter ? this.config.delimiter : '';\n\n return prefix + content + postfix;\n };\n\n /**\n * @description User to @user.nickname text format\n * */\n public asMentionedMessageText = (user: SendbirdUser, delimiter = false) => {\n const prefix = '';\n const content = `${this.config.trigger}${user.nickname}`;\n const postfix = this.getDirectionOfNextSpan(user.nickname) + (delimiter ? this.config.delimiter : '');\n\n return prefix + content + postfix;\n };\n\n /**\n * @description Bold @user.nickname\n * */\n public textToMentionedComponents = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled || mentionedUsers.length === 0) return text;\n\n const { leftText, components } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, components }, curr, currentIndex) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const mentionSpan = leftText.slice(curr.range.start, curr.range.end);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n components: [\n <Text key={mentionSpan + currentIndex} style={styles.mentionedText}>\n {mentionSpan}\n </Text>,\n rightSpan,\n ...components,\n ],\n };\n },\n { leftText: text, components: [] as (string | React.ReactNode)[] },\n );\n\n return [leftText, ...components];\n };\n\n public textToMentionedMessageTemplate = (text: string, mentionedUsers: MentionedUser[], mentionEnabled: boolean) => {\n if (!mentionEnabled) return text;\n\n const { leftText, strings } = mentionedUsers\n .sort((a, b) => b.range.start - a.range.start)\n .reduce(\n ({ leftText, strings }, curr) => {\n const leftSpan = leftText.slice(0, curr.range.start);\n const templateSpan = this.asMentionedMessageTemplate(curr.user);\n const rightSpan = leftText.slice(curr.range.end);\n\n return {\n leftText: leftSpan,\n strings: [templateSpan, rightSpan, ...strings],\n };\n },\n { leftText: text, strings: [] as string[] },\n );\n\n return [leftText, ...strings].join('');\n };\n\n /**\n * @description Convert @{user.id} template to @user.nickname text and MentionedUser[] array.\n * */\n public templateToTextAndMentionedUsers = (template: string, mentionedUsers: SendbirdUser[]) => {\n const actualMentionedUsers: MentionedUser[] = [];\n\n let offsetToMove = 0;\n const mentionedText = replaceWithRegex(\n template,\n this.templateRegex,\n ({ match, matchIndex, groups }) => {\n const user = mentionedUsers.find((it) => it.userId === groups[2]);\n if (user && typeof matchIndex === 'number') {\n const userIdSpan = match;\n const userNicknameSpan = this.asMentionedMessageText(user);\n\n const offsetAfterConverted = userNicknameSpan.length - userIdSpan.length;\n\n const originalRange: Range = {\n start: matchIndex,\n end: matchIndex + userIdSpan.length,\n };\n\n const convertedRange: Range = {\n start: Math.max(0, originalRange.start + offsetToMove),\n end: originalRange.end + offsetToMove + offsetAfterConverted,\n };\n\n offsetToMove += offsetAfterConverted;\n\n actualMentionedUsers.push({ range: convertedRange, user });\n return userNicknameSpan;\n }\n return match;\n },\n '',\n ).join('');\n\n return {\n mentionedText,\n mentionedUsers: actualMentionedUsers,\n };\n };\n\n public shouldUseMentionedMessageTemplate = (\n message?: SendbirdUserMessage | SendbirdFileMessage,\n mentionEnabled?: boolean,\n ): boolean => {\n return Boolean(\n mentionEnabled &&\n message &&\n 'mentionedMessageTemplate' in message &&\n message.mentionedMessageTemplate &&\n message.mentionedUsers &&\n message.mentionedUsers.length > 0,\n );\n };\n}\n\nconst styles = createStyleSheet({\n mentionedText: { fontWeight: '700' },\n});\n\nexport default MentionManager;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.
|
|
1
|
+
{"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.3';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO","ignoreList":[]}
|
|
@@ -14,7 +14,7 @@ import type { StringSet } from '../localization/StringSet.type';
|
|
|
14
14
|
import type { ClipboardServiceInterface, FileServiceInterface, MediaServiceInterface, NotificationServiceInterface, PlayerServiceInterface, RecorderServiceInterface } from '../platform/types';
|
|
15
15
|
import { ErrorBoundaryProps, LocalCacheStorage } from '../types';
|
|
16
16
|
export declare const SendbirdUIKit: Readonly<{
|
|
17
|
-
VERSION: "3.9.
|
|
17
|
+
VERSION: "3.9.3";
|
|
18
18
|
PLATFORM: string;
|
|
19
19
|
DEFAULT: {
|
|
20
20
|
AUTO_PUSH_TOKEN_REGISTRATION: boolean;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const VERSION = "3.9.
|
|
1
|
+
declare const VERSION = "3.9.3";
|
|
2
2
|
export default VERSION;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sendbird/uikit-react-native",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.3",
|
|
4
4
|
"description": "Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sendbird",
|
|
@@ -60,10 +60,10 @@
|
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@openspacelabs/react-native-zoomable-view": "^2.1.5",
|
|
63
|
-
"@sendbird/uikit-chat-hooks": "3.9.
|
|
64
|
-
"@sendbird/uikit-react-native-foundation": "3.9.
|
|
65
|
-
"@sendbird/uikit-tools": "0.0.
|
|
66
|
-
"@sendbird/uikit-utils": "3.9.
|
|
63
|
+
"@sendbird/uikit-chat-hooks": "3.9.3",
|
|
64
|
+
"@sendbird/uikit-react-native-foundation": "3.9.3",
|
|
65
|
+
"@sendbird/uikit-tools": "0.0.7",
|
|
66
|
+
"@sendbird/uikit-utils": "3.9.3"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
69
|
"@bam.tech/react-native-image-resizer": "^3.0.4",
|
|
@@ -217,5 +217,5 @@
|
|
|
217
217
|
]
|
|
218
218
|
]
|
|
219
219
|
},
|
|
220
|
-
"gitHead": "
|
|
220
|
+
"gitHead": "5bb68beb43f1d52e71893dbbd88c4407c2e1b024"
|
|
221
221
|
}
|
|
@@ -26,7 +26,9 @@ const useMentionTextInput = (params: { messageToEdit?: SendbirdUserMessage | Sen
|
|
|
26
26
|
)
|
|
27
27
|
) {
|
|
28
28
|
const result = mentionManager.templateToTextAndMentionedUsers(
|
|
29
|
-
params.messageToEdit
|
|
29
|
+
params.messageToEdit && 'mentionedMessageTemplate' in params.messageToEdit
|
|
30
|
+
? params.messageToEdit.mentionedMessageTemplate ?? ''
|
|
31
|
+
: '',
|
|
30
32
|
params.messageToEdit?.mentionedUsers ?? [],
|
|
31
33
|
);
|
|
32
34
|
|
|
@@ -246,9 +246,11 @@ class MentionManager {
|
|
|
246
246
|
): boolean => {
|
|
247
247
|
return Boolean(
|
|
248
248
|
mentionEnabled &&
|
|
249
|
-
message
|
|
250
|
-
message
|
|
251
|
-
message
|
|
249
|
+
message &&
|
|
250
|
+
'mentionedMessageTemplate' in message &&
|
|
251
|
+
message.mentionedMessageTemplate &&
|
|
252
|
+
message.mentionedUsers &&
|
|
253
|
+
message.mentionedUsers.length > 0,
|
|
252
254
|
);
|
|
253
255
|
};
|
|
254
256
|
}
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const VERSION = '3.9.
|
|
1
|
+
const VERSION = '3.9.3';
|
|
2
2
|
export default VERSION;
|