@sendbird/uikit-react-native 3.9.0 → 3.9.2

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.
@@ -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, _params$messageToEdit2;
29
- const result = mentionManager.templateToTextAndMentionedUsers(((_params$messageToEdit = params.messageToEdit) === null || _params$messageToEdit === void 0 ? void 0 : _params$messageToEdit.mentionedMessageTemplate) ?? '', ((_params$messageToEdit2 = params.messageToEdit) === null || _params$messageToEdit2 === void 0 ? void 0 : _params$messageToEdit2.mentionedUsers) ?? []);
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$messageToEdit3;
33
+ var _params$messageToEdit2;
34
34
  mentionedUsersRef.current = [];
35
- if ((_params$messageToEdit3 = params.messageToEdit) !== null && _params$messageToEdit3 !== void 0 && _params$messageToEdit3.isUserMessage()) {
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 && (message === null || message === void 0 ? void 0 : message.mentionedMessageTemplate) && (message === null || message === void 0 ? void 0 : message.mentionedUsers) && (message === null || message === void 0 ? void 0 : message.mentionedUsers.length) > 0);
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":[]}
@@ -24,12 +24,20 @@ const createExpoFileService = ({
24
24
  const res = await imagePickerModule.requestCameraPermissionsAsync();
25
25
  return (0, _expoPermissionGranted.default)([res]);
26
26
  }
27
- async hasMediaLibraryPermission(type) {
28
- const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(type === 'write');
27
+ async hasMediaLibraryReadPermission() {
28
+ const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(false);
29
29
  return (0, _expoPermissionGranted.default)([perms]);
30
30
  }
31
- async requestMediaLibraryPermission(type) {
32
- const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(type === 'write');
31
+ async requestMediaLibraryReadPermission() {
32
+ const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(false);
33
+ return (0, _expoPermissionGranted.default)([perms]);
34
+ }
35
+ async hasMediaLibraryWritePermission() {
36
+ const perms = await mediaLibraryModule.getPermissionsAsync(true, []);
37
+ return (0, _expoPermissionGranted.default)([perms]);
38
+ }
39
+ async requestMediaLibraryWritePermission() {
40
+ const perms = await mediaLibraryModule.requestPermissionsAsync(true, []);
33
41
  return (0, _expoPermissionGranted.default)([perms]);
34
42
  }
35
43
  async openCamera(options) {
@@ -61,9 +69,9 @@ const createExpoFileService = ({
61
69
  return file;
62
70
  }
63
71
  async openMediaLibrary(options) {
64
- const hasPermission = await this.hasMediaLibraryPermission('read');
72
+ const hasPermission = await this.hasMediaLibraryReadPermission();
65
73
  if (!hasPermission) {
66
- const granted = await this.requestMediaLibraryPermission('read');
74
+ const granted = await this.requestMediaLibraryReadPermission();
67
75
  if (!granted) {
68
76
  var _options$onOpenFailur2;
69
77
  options === null || options === void 0 || (_options$onOpenFailur2 = options.onOpenFailure) === null || _options$onOpenFailur2 === void 0 || _options$onOpenFailur2.call(options, _SBUError.default.PERMISSIONS_DENIED);
@@ -104,9 +112,9 @@ const createExpoFileService = ({
104
112
  }
105
113
  }
106
114
  async save(options) {
107
- const hasPermission = await this.hasMediaLibraryPermission('write');
115
+ const hasPermission = await this.hasMediaLibraryWritePermission();
108
116
  if (!hasPermission) {
109
- const granted = await this.requestMediaLibraryPermission('write');
117
+ const granted = await this.requestMediaLibraryWritePermission();
110
118
  if (!granted) throw new Error('Permission not granted');
111
119
  }
112
120
  const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;
@@ -1 +1 @@
1
- {"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","e","__esModule","default","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryPermission","requestMediaLibraryPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","e","__esModule","default","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryReadPermission","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryReadPermission","requestMediaLibraryPermissionsAsync","hasMediaLibraryWritePermission","getPermissionsAsync","requestMediaLibraryWritePermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","type","documentPicker","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async hasMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async hasMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryReadPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryReadPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryWritePermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryWritePermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- const VERSION = '3.9.0';
7
+ const VERSION = '3.9.2';
8
8
  var _default = exports.default = VERSION;
9
9
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.0';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACTH,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.2';\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, _params$messageToEdit2;
24
- const result = mentionManager.templateToTextAndMentionedUsers(((_params$messageToEdit = params.messageToEdit) === null || _params$messageToEdit === void 0 ? void 0 : _params$messageToEdit.mentionedMessageTemplate) ?? '', ((_params$messageToEdit2 = params.messageToEdit) === null || _params$messageToEdit2 === void 0 ? void 0 : _params$messageToEdit2.mentionedUsers) ?? []);
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$messageToEdit3;
28
+ var _params$messageToEdit2;
29
29
  mentionedUsersRef.current = [];
30
- if ((_params$messageToEdit3 = params.messageToEdit) !== null && _params$messageToEdit3 !== void 0 && _params$messageToEdit3.isUserMessage()) {
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 && (message === null || message === void 0 ? void 0 : message.mentionedMessageTemplate) && (message === null || message === void 0 ? void 0 : message.mentionedUsers) && (message === null || message === void 0 ? void 0 : message.mentionedUsers.length) > 0);
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":[]}
@@ -17,12 +17,20 @@ const createExpoFileService = ({
17
17
  const res = await imagePickerModule.requestCameraPermissionsAsync();
18
18
  return expoPermissionGranted([res]);
19
19
  }
20
- async hasMediaLibraryPermission(type) {
21
- const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(type === 'write');
20
+ async hasMediaLibraryReadPermission() {
21
+ const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(false);
22
22
  return expoPermissionGranted([perms]);
23
23
  }
24
- async requestMediaLibraryPermission(type) {
25
- const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(type === 'write');
24
+ async requestMediaLibraryReadPermission() {
25
+ const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(false);
26
+ return expoPermissionGranted([perms]);
27
+ }
28
+ async hasMediaLibraryWritePermission() {
29
+ const perms = await mediaLibraryModule.getPermissionsAsync(true, []);
30
+ return expoPermissionGranted([perms]);
31
+ }
32
+ async requestMediaLibraryWritePermission() {
33
+ const perms = await mediaLibraryModule.requestPermissionsAsync(true, []);
26
34
  return expoPermissionGranted([perms]);
27
35
  }
28
36
  async openCamera(options) {
@@ -54,9 +62,9 @@ const createExpoFileService = ({
54
62
  return file;
55
63
  }
56
64
  async openMediaLibrary(options) {
57
- const hasPermission = await this.hasMediaLibraryPermission('read');
65
+ const hasPermission = await this.hasMediaLibraryReadPermission();
58
66
  if (!hasPermission) {
59
- const granted = await this.requestMediaLibraryPermission('read');
67
+ const granted = await this.requestMediaLibraryReadPermission();
60
68
  if (!granted) {
61
69
  var _options$onOpenFailur2;
62
70
  options === null || options === void 0 || (_options$onOpenFailur2 = options.onOpenFailure) === null || _options$onOpenFailur2 === void 0 || _options$onOpenFailur2.call(options, SBUError.PERMISSIONS_DENIED);
@@ -97,9 +105,9 @@ const createExpoFileService = ({
97
105
  }
98
106
  }
99
107
  async save(options) {
100
- const hasPermission = await this.hasMediaLibraryPermission('write');
108
+ const hasPermission = await this.hasMediaLibraryWritePermission();
101
109
  if (!hasPermission) {
102
- const granted = await this.requestMediaLibraryPermission('write');
110
+ const granted = await this.requestMediaLibraryWritePermission();
103
111
  if (!granted) throw new Error('Permission not granted');
104
112
  }
105
113
  const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;
@@ -1 +1 @@
1
- {"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryPermission","requestMediaLibraryPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","createExpoFileService","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryReadPermission","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryReadPermission","requestMediaLibraryPermissionsAsync","hasMediaLibraryWritePermission","getPermissionsAsync","requestMediaLibraryWritePermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","type","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","filename","Date","now","recordFilePath"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n\n async hasMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryReadPermission(): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n false,\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async hasMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async requestMediaLibraryWritePermission(): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryReadPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryReadPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryWritePermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryWritePermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,3 @@
1
- const VERSION = '3.9.0';
1
+ const VERSION = '3.9.2';
2
2
  export default VERSION;
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.0';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.9.2';\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.0";
17
+ VERSION: "3.9.2";
18
18
  PLATFORM: string;
19
19
  DEFAULT: {
20
20
  AUTO_PUSH_TOKEN_REGISTRATION: boolean;
@@ -1,2 +1,2 @@
1
- declare const VERSION = "3.9.0";
1
+ declare const VERSION = "3.9.2";
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.0",
3
+ "version": "3.9.2",
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.0",
64
- "@sendbird/uikit-react-native-foundation": "3.9.0",
63
+ "@sendbird/uikit-chat-hooks": "3.9.2",
64
+ "@sendbird/uikit-react-native-foundation": "3.9.2",
65
65
  "@sendbird/uikit-tools": "0.0.1-alpha.77",
66
- "@sendbird/uikit-utils": "3.9.0"
66
+ "@sendbird/uikit-utils": "3.9.2"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@bam.tech/react-native-image-resizer": "^3.0.4",
@@ -83,7 +83,7 @@
83
83
  "expo-file-system": "^15.2.2",
84
84
  "expo-image-manipulator": "^11.1.1",
85
85
  "expo-image-picker": "^14.1.1",
86
- "expo-media-library": "^15.2.3",
86
+ "expo-media-library": "^16.0.0",
87
87
  "expo-notifications": "^0.18.1",
88
88
  "expo-video-thumbnails": "^7.2.1",
89
89
  "glob": "^7.2.0",
@@ -120,6 +120,7 @@
120
120
  "expo-file-system": ">=13.1.4",
121
121
  "expo-image-manipulator": ">=11.0.0",
122
122
  "expo-image-picker": ">=12.0.2",
123
+ "expo-media-library": ">=16.0.0",
123
124
  "expo-notifications": ">=0.14.1",
124
125
  "expo-video-thumbnails": ">=6.4.0",
125
126
  "react": ">=17.0.2",
@@ -177,6 +178,9 @@
177
178
  "expo-notifications": {
178
179
  "optional": true
179
180
  },
181
+ "expo-media-library": {
182
+ "optional": true
183
+ },
180
184
  "expo-video-thumbnails": {
181
185
  "optional": true
182
186
  },
@@ -213,5 +217,5 @@
213
217
  ]
214
218
  ]
215
219
  },
216
- "gitHead": "c54f9d39846d6f56f492308259afd08fcb5b398e"
220
+ "gitHead": "c4baad6f7f9cfaf3ac58e7828d5d463f46bb2a5d"
217
221
  }
@@ -26,7 +26,9 @@ const useMentionTextInput = (params: { messageToEdit?: SendbirdUserMessage | Sen
26
26
  )
27
27
  ) {
28
28
  const result = mentionManager.templateToTextAndMentionedUsers(
29
- params.messageToEdit?.mentionedMessageTemplate ?? '',
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?.mentionedMessageTemplate &&
250
- message?.mentionedUsers &&
251
- message?.mentionedUsers.length > 0,
249
+ message &&
250
+ 'mentionedMessageTemplate' in message &&
251
+ message.mentionedMessageTemplate &&
252
+ message.mentionedUsers &&
253
+ message.mentionedUsers.length > 0,
252
254
  );
253
255
  };
254
256
  }
@@ -34,23 +34,36 @@ const createExpoFileService = ({
34
34
  const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;
35
35
  return expoPermissionGranted([res]);
36
36
  }
37
+
37
38
  async requestCameraPermission(): Promise<boolean> {
38
39
  const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;
39
40
  return expoPermissionGranted([res]);
40
41
  }
41
- async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {
42
+
43
+ async hasMediaLibraryReadPermission(): Promise<boolean> {
42
44
  const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(
43
- type === 'write',
45
+ false,
44
46
  )) as ExpoMediaLibraryPermissionResponse;
45
47
  return expoPermissionGranted([perms]);
46
48
  }
47
- async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {
49
+
50
+ async requestMediaLibraryReadPermission(): Promise<boolean> {
48
51
  const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(
49
- type === 'write',
52
+ false,
50
53
  )) as ExpoMediaLibraryPermissionResponse;
51
54
  return expoPermissionGranted([perms]);
52
55
  }
53
56
 
57
+ async hasMediaLibraryWritePermission(): Promise<boolean> {
58
+ const perms = (await mediaLibraryModule.getPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;
59
+ return expoPermissionGranted([perms]);
60
+ }
61
+
62
+ async requestMediaLibraryWritePermission(): Promise<boolean> {
63
+ const perms = (await mediaLibraryModule.requestPermissionsAsync(true, [])) as ExpoMediaLibraryPermissionResponse;
64
+ return expoPermissionGranted([perms]);
65
+ }
66
+
54
67
  async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {
55
68
  const hasPermission = await this.hasCameraPermission();
56
69
  if (!hasPermission) {
@@ -81,10 +94,11 @@ const createExpoFileService = ({
81
94
  const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);
82
95
  return file;
83
96
  }
97
+
84
98
  async openMediaLibrary(options: OpenMediaLibraryOptions) {
85
- const hasPermission = await this.hasMediaLibraryPermission('read');
99
+ const hasPermission = await this.hasMediaLibraryReadPermission();
86
100
  if (!hasPermission) {
87
- const granted = await this.requestMediaLibraryPermission('read');
101
+ const granted = await this.requestMediaLibraryReadPermission();
88
102
  if (!granted) {
89
103
  options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);
90
104
  return null;
@@ -125,9 +139,9 @@ const createExpoFileService = ({
125
139
  }
126
140
 
127
141
  async save(options: SaveOptions): Promise<string> {
128
- const hasPermission = await this.hasMediaLibraryPermission('write');
142
+ const hasPermission = await this.hasMediaLibraryWritePermission();
129
143
  if (!hasPermission) {
130
- const granted = await this.requestMediaLibraryPermission('write');
144
+ const granted = await this.requestMediaLibraryWritePermission();
131
145
  if (!granted) throw new Error('Permission not granted');
132
146
  }
133
147
 
@@ -142,6 +156,7 @@ const createExpoFileService = ({
142
156
  }
143
157
  return response.uri;
144
158
  }
159
+
145
160
  createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {
146
161
  const basePath = fsModule.cacheDirectory;
147
162
  if (!basePath) throw new Error('Cannot determine directory');
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '3.9.0';
1
+ const VERSION = '3.9.2';
2
2
  export default VERSION;