stream-chat-react 14.0.1 → 14.1.0

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.
Files changed (159) hide show
  1. package/dist/cjs/emojis.js +8 -8
  2. package/dist/cjs/emojis.js.map +1 -1
  3. package/dist/cjs/index.js +18361 -16460
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/{WithAudioPlayback.ba05c770.js → useNotificationApi.fd802923.js} +1439 -1360
  6. package/dist/cjs/useNotificationApi.fd802923.js.map +1 -0
  7. package/dist/css/index.css +455 -489
  8. package/dist/css/index.css.map +1 -1
  9. package/dist/es/emojis.mjs +1 -1
  10. package/dist/es/index.mjs +18031 -16130
  11. package/dist/es/index.mjs.map +1 -1
  12. package/dist/es/{WithAudioPlayback.610fdf2c.mjs → useNotificationApi.e0c52de6.mjs} +1573 -1494
  13. package/dist/es/useNotificationApi.e0c52de6.mjs.map +1 -0
  14. package/dist/types/a11y/a11yUtils.d.ts +23 -0
  15. package/dist/types/a11y/a11yUtils.d.ts.map +1 -0
  16. package/dist/types/a11y/hooks/useAriaIdentifiers.d.ts +15 -0
  17. package/dist/types/a11y/hooks/useAriaIdentifiers.d.ts.map +1 -0
  18. package/dist/types/a11y/hooks/useResolvedModalAriaProps.d.ts +22 -0
  19. package/dist/types/a11y/hooks/useResolvedModalAriaProps.d.ts.map +1 -0
  20. package/dist/types/components/Accessibility/AriaLiveRegion.d.ts +3 -0
  21. package/dist/types/components/Accessibility/AriaLiveRegion.d.ts.map +1 -0
  22. package/dist/types/components/Accessibility/NotificationAnnouncer.d.ts +14 -0
  23. package/dist/types/components/Accessibility/NotificationAnnouncer.d.ts.map +1 -0
  24. package/dist/types/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts +9 -0
  25. package/dist/types/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts.map +1 -0
  26. package/dist/types/components/Accessibility/index.d.ts +5 -0
  27. package/dist/types/components/Accessibility/index.d.ts.map +1 -0
  28. package/dist/types/components/Accessibility/useAriaLiveAnnouncer.d.ts +9 -0
  29. package/dist/types/components/Accessibility/useAriaLiveAnnouncer.d.ts.map +1 -0
  30. package/dist/types/components/Attachment/Audio.d.ts.map +1 -1
  31. package/dist/types/components/Attachment/LinkPreview/CardAudio.d.ts.map +1 -1
  32. package/dist/types/components/Attachment/ModalGallery.d.ts.map +1 -1
  33. package/dist/types/components/Attachment/VoiceRecording.d.ts.map +1 -1
  34. package/dist/types/components/AudioPlayback/components/DurationDisplay.d.ts.map +1 -1
  35. package/dist/types/components/AudioPlayback/components/ProgressBar.d.ts +5 -1
  36. package/dist/types/components/AudioPlayback/components/ProgressBar.d.ts.map +1 -1
  37. package/dist/types/components/AudioPlayback/components/WaveProgressBar.d.ts +5 -1
  38. package/dist/types/components/AudioPlayback/components/WaveProgressBar.d.ts.map +1 -1
  39. package/dist/types/components/AudioPlayback/components/formatTime.d.ts +2 -0
  40. package/dist/types/components/AudioPlayback/components/formatTime.d.ts.map +1 -0
  41. package/dist/types/components/AudioPlayback/components/keyboardSeek.d.ts +12 -0
  42. package/dist/types/components/AudioPlayback/components/keyboardSeek.d.ts.map +1 -0
  43. package/dist/types/components/AudioPlayback/components/progressBarA11y.d.ts +10 -0
  44. package/dist/types/components/AudioPlayback/components/progressBarA11y.d.ts.map +1 -0
  45. package/dist/types/components/Avatar/Avatar.d.ts +1 -1
  46. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  47. package/dist/types/components/Button/PlayButton.d.ts.map +1 -1
  48. package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.d.ts.map +1 -1
  49. package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts.map +1 -1
  50. package/dist/types/components/ChannelListItem/ChannelListItemUI.d.ts.map +1 -1
  51. package/dist/types/components/Chat/Chat.d.ts.map +1 -1
  52. package/dist/types/components/ChatView/ChatView.a11y.utility.d.ts +26 -0
  53. package/dist/types/components/ChatView/ChatView.a11y.utility.d.ts.map +1 -0
  54. package/dist/types/components/ChatView/ChatView.d.ts +9 -0
  55. package/dist/types/components/ChatView/ChatView.d.ts.map +1 -1
  56. package/dist/types/components/Dialog/components/Alert.d.ts +3 -1
  57. package/dist/types/components/Dialog/components/Alert.d.ts.map +1 -1
  58. package/dist/types/components/Dialog/components/ContextMenu.d.ts +31 -6
  59. package/dist/types/components/Dialog/components/ContextMenu.d.ts.map +1 -1
  60. package/dist/types/components/Dialog/components/Prompt.d.ts +3 -1
  61. package/dist/types/components/Dialog/components/Prompt.d.ts.map +1 -1
  62. package/dist/types/components/Dialog/components/Viewer.d.ts +3 -1
  63. package/dist/types/components/Dialog/components/Viewer.d.ts.map +1 -1
  64. package/dist/types/components/Dialog/service/DialogAnchor.d.ts.map +1 -1
  65. package/dist/types/components/Form/Dropdown.d.ts.map +1 -1
  66. package/dist/types/components/Form/NumericInput.d.ts.map +1 -1
  67. package/dist/types/components/Form/SwitchField.d.ts +5 -2
  68. package/dist/types/components/Form/SwitchField.d.ts.map +1 -1
  69. package/dist/types/components/Form/TextInput.d.ts.map +1 -1
  70. package/dist/types/components/Icons/BaseIcon.d.ts +4 -1
  71. package/dist/types/components/Icons/BaseIcon.d.ts.map +1 -1
  72. package/dist/types/components/Icons/createIcon.d.ts +6 -3
  73. package/dist/types/components/Icons/createIcon.d.ts.map +1 -1
  74. package/dist/types/components/Icons/icons.d.ts +81 -82
  75. package/dist/types/components/Icons/icons.d.ts.map +1 -1
  76. package/dist/types/components/InfiniteScrollPaginator/InfiniteScroll.d.ts.map +1 -1
  77. package/dist/types/components/Loading/LoadingIndicator.d.ts +2 -2
  78. package/dist/types/components/Loading/LoadingIndicator.d.ts.map +1 -1
  79. package/dist/types/components/Location/ShareLocationDialog.d.ts +1 -0
  80. package/dist/types/components/Location/ShareLocationDialog.d.ts.map +1 -1
  81. package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.d.ts.map +1 -1
  82. package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.d.ts.map +1 -1
  83. package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.d.ts.map +1 -1
  84. package/dist/types/components/Message/Message.d.ts.map +1 -1
  85. package/dist/types/components/Message/MessageText.d.ts.map +1 -1
  86. package/dist/types/components/Message/MessageUI.d.ts.map +1 -1
  87. package/dist/types/components/Message/types.d.ts +4 -2
  88. package/dist/types/components/Message/types.d.ts.map +1 -1
  89. package/dist/types/components/MessageActions/DeleteMessageAlert.d.ts.map +1 -1
  90. package/dist/types/components/MessageActions/MessageActions.d.ts.map +1 -1
  91. package/dist/types/components/MessageActions/MessageActions.defaults.d.ts.map +1 -1
  92. package/dist/types/components/MessageBounce/MessageBouncePrompt.d.ts.map +1 -1
  93. package/dist/types/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.d.ts.map +1 -1
  94. package/dist/types/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.d.ts.map +1 -1
  95. package/dist/types/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.d.ts.map +1 -1
  96. package/dist/types/components/MessageComposer/AttachmentSelector/AttachmentSelector.d.ts.map +1 -1
  97. package/dist/types/components/MessageComposer/CommandChip.d.ts.map +1 -1
  98. package/dist/types/components/MessageComposer/QuotedMessagePreview.d.ts.map +1 -1
  99. package/dist/types/components/MessageList/MessageList.d.ts.map +1 -1
  100. package/dist/types/components/MessageList/NewMessageNotification.d.ts.map +1 -1
  101. package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts +1 -2
  102. package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts.map +1 -1
  103. package/dist/types/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -1
  104. package/dist/types/components/MessageList/UnreadMessagesSeparator.d.ts.map +1 -1
  105. package/dist/types/components/MessageList/VirtualizedMessageList.d.ts +1 -1
  106. package/dist/types/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  107. package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +1 -0
  108. package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts.map +1 -1
  109. package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -1
  110. package/dist/types/components/MessageList/hooks/useReducedMotionPreference.d.ts +2 -0
  111. package/dist/types/components/MessageList/hooks/useReducedMotionPreference.d.ts.map +1 -0
  112. package/dist/types/components/Modal/CloseButtonOnModalOverlay.d.ts.map +1 -1
  113. package/dist/types/components/Modal/GlobalModal.d.ts +9 -1
  114. package/dist/types/components/Modal/GlobalModal.d.ts.map +1 -1
  115. package/dist/types/components/Notifications/Notification.d.ts.map +1 -1
  116. package/dist/types/components/Notifications/NotificationList.d.ts.map +1 -1
  117. package/dist/types/components/Poll/PollActions/AddCommentPrompt.d.ts.map +1 -1
  118. package/dist/types/components/Poll/PollActions/PollAnswerList.d.ts.map +1 -1
  119. package/dist/types/components/Poll/PollActions/PollOptionsFullList.d.ts.map +1 -1
  120. package/dist/types/components/Poll/PollActions/PollResults/PollResults.d.ts.map +1 -1
  121. package/dist/types/components/Poll/PollActions/SuggestPollOptionPrompt.d.ts.map +1 -1
  122. package/dist/types/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts.map +1 -1
  123. package/dist/types/components/Poll/PollCreationDialog/NameField.d.ts.map +1 -1
  124. package/dist/types/components/Poll/PollCreationDialog/OptionFieldSet.d.ts.map +1 -1
  125. package/dist/types/components/Poll/PollCreationDialog/PollCreationDialog.d.ts.map +1 -1
  126. package/dist/types/components/Poll/PollOptionSelector.d.ts.map +1 -1
  127. package/dist/types/components/Reactions/MessageReactions.d.ts.map +1 -1
  128. package/dist/types/components/Reactions/MessageReactionsDetail.d.ts.map +1 -1
  129. package/dist/types/components/Reactions/ReactionSelector.d.ts.map +1 -1
  130. package/dist/types/components/Search/SearchBar/SearchBar.d.ts.map +1 -1
  131. package/dist/types/components/Search/SearchResults/SearchResultItem.d.ts.map +1 -1
  132. package/dist/types/components/Search/SearchResults/SearchResultsHeader.d.ts.map +1 -1
  133. package/dist/types/components/SkipNavigation/SkipNavigation.d.ts +38 -0
  134. package/dist/types/components/SkipNavigation/SkipNavigation.d.ts.map +1 -0
  135. package/dist/types/components/SkipNavigation/index.d.ts +2 -0
  136. package/dist/types/components/SkipNavigation/index.d.ts.map +1 -0
  137. package/dist/types/components/TextareaComposer/SuggestionList/SuggestionList.d.ts.map +1 -1
  138. package/dist/types/components/Threads/ThreadList/ThreadList.d.ts.map +1 -1
  139. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts.map +1 -1
  140. package/dist/types/components/TypingIndicator/TypingIndicatorHeader.d.ts.map +1 -1
  141. package/dist/types/components/TypingIndicator/utils/getTypingStatusMessage.d.ts +8 -0
  142. package/dist/types/components/TypingIndicator/utils/getTypingStatusMessage.d.ts.map +1 -0
  143. package/dist/types/components/VisuallyHidden/VisuallyHidden.d.ts +7 -0
  144. package/dist/types/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  145. package/dist/types/components/VisuallyHidden/index.d.ts +2 -0
  146. package/dist/types/components/VisuallyHidden/index.d.ts.map +1 -0
  147. package/dist/types/components/index.d.ts +3 -0
  148. package/dist/types/components/index.d.ts.map +1 -1
  149. package/dist/types/context/ComponentContext.d.ts +10 -1
  150. package/dist/types/context/ComponentContext.d.ts.map +1 -1
  151. package/dist/types/context/ModalContext.d.ts +1 -0
  152. package/dist/types/context/ModalContext.d.ts.map +1 -1
  153. package/dist/types/context/index.d.ts +1 -0
  154. package/dist/types/context/index.d.ts.map +1 -1
  155. package/dist/types/i18n/Streami18n.d.ts +55 -2
  156. package/dist/types/i18n/Streami18n.d.ts.map +1 -1
  157. package/package.json +1 -1
  158. package/dist/cjs/WithAudioPlayback.ba05c770.js.map +0 -1
  159. package/dist/es/WithAudioPlayback.610fdf2c.mjs.map +0 -1
@@ -25,7 +25,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
25
25
  const jsxRuntime = require("react/jsx-runtime");
26
26
  const React = require("react");
27
27
  const Picker = require("@emoji-mart/react");
28
- const WithAudioPlayback = require("./WithAudioPlayback.ba05c770.js");
28
+ const useNotificationApi = require("./useNotificationApi.fd802923.js");
29
29
  const mergeWith = require("lodash.mergewith");
30
30
  const streamChat = require("stream-chat");
31
31
  const isShadowRoot = (node) => !!node.host;
@@ -35,16 +35,16 @@ const classNames = {
35
35
  wrapperClassName: "str-chat__message-textarea-emoji-picker"
36
36
  };
37
37
  const EmojiPicker = (props) => {
38
- const { t } = WithAudioPlayback.useTranslationContext("EmojiPicker");
39
- const { textareaRef } = WithAudioPlayback.useMessageComposerContext();
40
- const { textComposer } = WithAudioPlayback.useMessageComposerController();
41
- const isCooldownActive = WithAudioPlayback.useIsCooldownActive();
38
+ const { t } = useNotificationApi.useTranslationContext("EmojiPicker");
39
+ const { textareaRef } = useNotificationApi.useMessageComposerContext();
40
+ const { textComposer } = useNotificationApi.useMessageComposerController();
41
+ const isCooldownActive = useNotificationApi.useIsCooldownActive();
42
42
  const [displayPicker, setDisplayPicker] = React.useState(false);
43
43
  const [referenceElement, setReferenceElement] = React.useState(
44
44
  null
45
45
  );
46
46
  const [popperElement, setPopperElement] = React.useState(null);
47
- const { refs, strategy, x, y } = WithAudioPlayback.usePopoverPosition({
47
+ const { refs, strategy, x, y } = useNotificationApi.usePopoverPosition({
48
48
  offset: 8,
49
49
  placement: props.placement ?? "top-end"
50
50
  });
@@ -55,7 +55,7 @@ const EmojiPicker = (props) => {
55
55
  refs.setFloating(popperElement);
56
56
  }, [popperElement, refs]);
57
57
  const { pickerContainerClassName, wrapperClassName } = classNames;
58
- const { ButtonIconComponent = WithAudioPlayback.IconEmoji } = props;
58
+ const { ButtonIconComponent = useNotificationApi.IconEmoji } = props;
59
59
  const pickerStyle = props.pickerProps?.style;
60
60
  React.useEffect(() => {
61
61
  if (!popperElement || !referenceElement) return;
@@ -97,7 +97,7 @@ const EmojiPicker = (props) => {
97
97
  }
98
98
  ),
99
99
  /* @__PURE__ */ jsxRuntime.jsx(
100
- WithAudioPlayback.Button,
100
+ useNotificationApi.Button,
101
101
  {
102
102
  appearance: "ghost",
103
103
  "aria-expanded": displayPicker,
@@ -1 +1 @@
1
- {"version":3,"file":"emojis.js","sources":["../../src/plugins/Emojis/EmojiPicker.tsx","../../src/plugins/Emojis/middleware/textComposerEmojiMiddleware.ts"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport Picker from '@emoji-mart/react';\n\nimport { useMessageComposerContext, useTranslationContext } from '../../context';\nimport {\n Button,\n IconEmoji,\n type PopperLikePlacement,\n useMessageComposerController,\n} from '../../components';\nimport { usePopoverPosition } from '../../components/Dialog/hooks/usePopoverPosition';\nimport { useIsCooldownActive } from '../../components/MessageComposer/hooks/useIsCooldownActive';\n\nconst isShadowRoot = (node: Node): node is ShadowRoot => !!(node as ShadowRoot).host;\n\nexport type EmojiPickerProps = {\n ButtonIconComponent?: React.ComponentType;\n buttonClassName?: string;\n pickerContainerClassName?: string;\n wrapperClassName?: string;\n closeOnEmojiSelect?: boolean;\n /**\n * Untyped [properties](https://github.com/missive/emoji-mart/tree/v5.5.2#options--props) to be\n * passed down to the [emoji-mart `Picker`](https://github.com/missive/emoji-mart/tree/v5.5.2#-picker) component\n */\n pickerProps?: Partial<{ theme: 'auto' | 'light' | 'dark' } & Record<string, unknown>>;\n /**\n * Floating UI placement (default: 'top-end') for the picker popover\n */\n placement?: PopperLikePlacement;\n};\n\nconst defaultButtonClassName = 'str-chat__emoji-picker-button';\n\nconst classNames: Pick<\n EmojiPickerProps,\n 'pickerContainerClassName' | 'wrapperClassName'\n> = {\n pickerContainerClassName: 'str-chat__message-textarea-emoji-picker-container',\n wrapperClassName: 'str-chat__message-textarea-emoji-picker',\n};\n\nexport const EmojiPicker = (props: EmojiPickerProps) => {\n const { t } = useTranslationContext('EmojiPicker');\n const { textareaRef } = useMessageComposerContext('EmojiPicker');\n const { textComposer } = useMessageComposerController();\n const isCooldownActive = useIsCooldownActive();\n const [displayPicker, setDisplayPicker] = useState(false);\n const [referenceElement, setReferenceElement] = useState<HTMLButtonElement | null>(\n null,\n );\n const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null);\n const { refs, strategy, x, y } = usePopoverPosition({\n offset: 8,\n placement: props.placement ?? 'top-end',\n });\n\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n useEffect(() => {\n refs.setFloating(popperElement);\n }, [popperElement, refs]);\n\n const { pickerContainerClassName, wrapperClassName } = classNames;\n\n const { ButtonIconComponent = IconEmoji } = props;\n const pickerStyle = props.pickerProps?.style as React.CSSProperties | undefined;\n\n useEffect(() => {\n if (!popperElement || !referenceElement) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n\n const rootNode = target.getRootNode();\n\n if (\n popperElement.contains(isShadowRoot(rootNode) ? rootNode.host : target) ||\n referenceElement.contains(target)\n ) {\n return;\n }\n\n setDisplayPicker(false);\n };\n\n window.addEventListener('pointerdown', handlePointerDown);\n return () => window.removeEventListener('pointerdown', handlePointerDown);\n }, [referenceElement, popperElement]);\n\n return (\n <div className={props.wrapperClassName ?? wrapperClassName}>\n {displayPicker && (\n <div\n className={props.pickerContainerClassName ?? pickerContainerClassName}\n ref={setPopperElement}\n style={{ left: x ?? 0, position: strategy, top: y ?? 0 }}\n >\n <Picker\n data={async () => (await import('@emoji-mart/data')).default}\n onEmojiSelect={(e: { native: string }) => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textComposer.insertText({ text: e.native });\n textarea.focus();\n if (props.closeOnEmojiSelect) {\n setDisplayPicker(false);\n }\n }}\n {...props.pickerProps}\n style={{ ...pickerStyle, '--shadow': 'none' }}\n />\n </div>\n )}\n <Button\n appearance='ghost'\n aria-expanded={displayPicker}\n aria-label={t('aria/Emoji picker')}\n circular\n className={props.buttonClassName ?? defaultButtonClassName}\n disabled={isCooldownActive}\n onClick={() => setDisplayPicker((cv) => !cv)}\n ref={setReferenceElement}\n size='sm'\n type='button'\n variant='secondary'\n >\n {ButtonIconComponent && <ButtonIconComponent />}\n </Button>\n </div>\n );\n};\n","import mergeWith from 'lodash.mergewith';\nimport type {\n Middleware,\n SearchSourceOptions,\n SearchSourceType,\n TextComposerMiddlewareExecutorState,\n TextComposerMiddlewareOptions,\n TextComposerSuggestion,\n} from 'stream-chat';\nimport {\n BaseSearchSource,\n getTokenizedSuggestionDisplayName,\n getTriggerCharWithToken,\n insertItemWithTrigger,\n replaceWordWithEntity,\n} from 'stream-chat';\nimport type {\n EmojiSearchIndex,\n EmojiSearchIndexResult,\n} from '../../../components/MessageComposer';\n\nexport type EmojiSuggestion<T extends EmojiSearchIndexResult = EmojiSearchIndexResult> =\n TextComposerSuggestion<T>;\n\nclass EmojiSearchSource<\n T extends TextComposerSuggestion<EmojiSearchIndexResult>,\n> extends BaseSearchSource<T> {\n readonly type: SearchSourceType = 'emoji';\n private emojiSearchIndex: EmojiSearchIndex;\n\n constructor(emojiSearchIndex: EmojiSearchIndex, options?: SearchSourceOptions) {\n super(options);\n this.emojiSearchIndex = emojiSearchIndex;\n }\n\n async query(searchQuery: string) {\n if (searchQuery.length === 0) {\n return { items: [] as T[], next: null };\n }\n const emojis = (await this.emojiSearchIndex.search(searchQuery)) ?? [];\n\n // emojiIndex.search sometimes returns undefined values, so filter those out first\n return {\n items: emojis\n .filter(Boolean)\n .slice(0, 7)\n .map(({ emoticons = [], id, name, native, skins = [] }) => {\n const [firstSkin] = skins;\n\n return {\n emoticons,\n id,\n name,\n native: native ?? firstSkin.native,\n };\n }) as T[],\n next: null, // todo: generate cursor\n };\n }\n\n protected filterQueryResults(items: T[]): T[] | Promise<T[]> {\n return items.map((item) => ({\n ...item,\n ...getTokenizedSuggestionDisplayName({\n displayName: item.id,\n searchToken: this.searchQuery,\n }),\n }));\n }\n}\n\nconst DEFAULT_OPTIONS: TextComposerMiddlewareOptions = { minChars: 1, trigger: ':' };\n\nexport type EmojiMiddleware<T extends EmojiSearchIndexResult = EmojiSearchIndexResult> =\n Middleware<\n TextComposerMiddlewareExecutorState<EmojiSuggestion<T>>,\n 'onChange' | 'onSuggestionItemSelect'\n >;\n\n/**\n * TextComposer middleware for mentions\n * Usage:\n *\n * const textComposer = new TextComposer(options);\n *\n * textComposer.use(new createTextComposerEmojiMiddleware(emojiSearchIndex, {\n * minChars: 2\n * }));\n *\n * @param emojiSearchIndex\n * @param {{\n * minChars: number;\n * trigger: string;\n * }} options\n * @returns\n */\nexport const createTextComposerEmojiMiddleware = (\n emojiSearchIndex: EmojiSearchIndex,\n options?: Partial<TextComposerMiddlewareOptions>,\n): EmojiMiddleware => {\n const finalOptions = mergeWith(DEFAULT_OPTIONS, options ?? {});\n const emojiSearchSource = new EmojiSearchSource(emojiSearchIndex);\n emojiSearchSource.activate();\n\n return {\n id: 'stream-io/emoji-middleware',\n // eslint-disable-next-line sort-keys\n handlers: {\n onChange: async ({ complete, forward, next, state }) => {\n if (!state.selection) return forward();\n\n const triggerWithToken = getTriggerCharWithToken({\n acceptTrailingSpaces: false,\n text: state.text.slice(0, state.selection.end),\n trigger: finalOptions.trigger,\n });\n\n const triggerWasRemoved =\n !triggerWithToken || triggerWithToken.length < finalOptions.minChars;\n\n if (triggerWasRemoved) {\n const hasSuggestionsForTrigger =\n state.suggestions?.trigger === finalOptions.trigger;\n const newState = { ...state };\n if (hasSuggestionsForTrigger && newState.suggestions) {\n delete newState.suggestions;\n }\n return next(newState);\n }\n\n const newSearchTriggerred =\n triggerWithToken && triggerWithToken === finalOptions.trigger;\n\n if (newSearchTriggerred) {\n emojiSearchSource.resetStateAndActivate();\n }\n\n const textWithReplacedWord = await replaceWordWithEntity({\n caretPosition: state.selection.end,\n getEntityString: async (word: string) => {\n const { items } = await emojiSearchSource.query(word);\n\n const emoji = items\n .filter(Boolean)\n .slice(0, 10)\n .find(({ emoticons }) => !!emoticons?.includes(word));\n\n if (!emoji) return null;\n\n const [firstSkin] = emoji.skins ?? [];\n\n return emoji.native ?? firstSkin.native;\n },\n text: state.text,\n });\n\n if (textWithReplacedWord !== state.text) {\n return complete({\n ...state,\n suggestions: undefined, // to prevent the TextComposerMiddlewareExecutor to run the first page query\n text: textWithReplacedWord,\n });\n }\n\n return complete({\n ...state,\n suggestions: {\n query: triggerWithToken.slice(1),\n searchSource: emojiSearchSource,\n trigger: finalOptions.trigger,\n },\n });\n },\n onSuggestionItemSelect: ({ complete, forward, state }) => {\n const { selectedSuggestion } = state.change ?? {};\n if (!selectedSuggestion || state.suggestions?.trigger !== finalOptions.trigger)\n return forward();\n\n emojiSearchSource.resetStateAndActivate();\n return complete({\n ...state,\n ...insertItemWithTrigger({\n insertText: `${'native' in selectedSuggestion ? selectedSuggestion.native : ''} `,\n selection: state.selection,\n text: state.text,\n trigger: finalOptions.trigger,\n }),\n suggestions: undefined, // Clear suggestions after selection\n });\n },\n },\n };\n};\n"],"names":["useTranslationContext","useMessageComposerContext","useMessageComposerController","useIsCooldownActive","useState","usePopoverPosition","useEffect","IconEmoji","jsxs","jsx","Button","BaseSearchSource","getTokenizedSuggestionDisplayName","getTriggerCharWithToken","replaceWordWithEntity","insertItemWithTrigger"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,eAAe,CAAC,SAAmC,CAAC,CAAE,KAAoB;AAmBhF,MAAM,yBAAyB;AAE/B,MAAM,aAGF;AAAA,EACF,0BAA0B;AAAA,EAC1B,kBAAkB;AACpB;AAEO,MAAM,cAAc,CAAC,UAA4B;AACtD,QAAM,EAAE,EAAA,IAAMA,kBAAAA,sBAAsB,aAAa;AACjD,QAAM,EAAE,gBAAgBC,kBAAAA,0BAAuC;AAC/D,QAAM,EAAE,aAAA,IAAiBC,+CAAA;AACzB,QAAM,mBAAmBC,kBAAAA,oBAAA;AACzB,QAAM,CAAC,eAAe,gBAAgB,IAAIC,MAAAA,SAAS,KAAK;AACxD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,MAAAA;AAAAA,IAC9C;AAAA,EAAA;AAEF,QAAM,CAAC,eAAe,gBAAgB,IAAIA,MAAAA,SAAgC,IAAI;AAC9E,QAAM,EAAE,MAAM,UAAU,GAAG,EAAA,IAAMC,kBAAAA,mBAAmB;AAAA,IAClD,QAAQ;AAAA,IACR,WAAW,MAAM,aAAa;AAAA,EAAA,CAC/B;AAEDC,QAAAA,UAAU,MAAM;AACd,SAAK,aAAa,gBAAgB;AAAA,EACpC,GAAG,CAAC,kBAAkB,IAAI,CAAC;AAC3BA,QAAAA,UAAU,MAAM;AACd,SAAK,YAAY,aAAa;AAAA,EAChC,GAAG,CAAC,eAAe,IAAI,CAAC;AAExB,QAAM,EAAE,0BAA0B,iBAAA,IAAqB;AAEvD,QAAM,EAAE,sBAAsBC,kBAAAA,UAAA,IAAc;AAC5C,QAAM,cAAc,MAAM,aAAa;AAEvCD,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,CAAC,iBAAkB;AAEzC,UAAM,oBAAoB,CAAC,MAAoB;AAC7C,YAAM,SAAS,EAAE;AAEjB,YAAM,WAAW,OAAO,YAAA;AAExB,UACE,cAAc,SAAS,aAAa,QAAQ,IAAI,SAAS,OAAO,MAAM,KACtE,iBAAiB,SAAS,MAAM,GAChC;AACA;AAAA,MACF;AAEA,uBAAiB,KAAK;AAAA,IACxB;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,MAAM,OAAO,oBAAoB,eAAe,iBAAiB;AAAA,EAC1E,GAAG,CAAC,kBAAkB,aAAa,CAAC;AAEpC,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAW,MAAM,oBAAoB,kBACvC,UAAA;AAAA,IAAA,iBACCC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,MAAM,4BAA4B;AAAA,QAC7C,KAAK;AAAA,QACL,OAAO,EAAE,MAAM,KAAK,GAAG,UAAU,UAAU,KAAK,KAAK,EAAA;AAAA,QAErD,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,YACrD,eAAe,CAAC,MAA0B;AACxC,oBAAM,WAAW,YAAY;AAC7B,kBAAI,CAAC,SAAU;AACf,2BAAa,WAAW,EAAE,MAAM,EAAE,QAAQ;AAC1C,uBAAS,MAAA;AACT,kBAAI,MAAM,oBAAoB;AAC5B,iCAAiB,KAAK;AAAA,cACxB;AAAA,YACF;AAAA,YACC,GAAG,MAAM;AAAA,YACV,OAAO,EAAE,GAAG,aAAa,YAAY,OAAA;AAAA,UAAO;AAAA,QAAA;AAAA,MAC9C;AAAA,IAAA;AAAA,IAGJA,2BAAAA;AAAAA,MAACC,kBAAAA;AAAAA,MAAA;AAAA,QACC,YAAW;AAAA,QACX,iBAAe;AAAA,QACf,cAAY,EAAE,mBAAmB;AAAA,QACjC,UAAQ;AAAA,QACR,WAAW,MAAM,mBAAmB;AAAA,QACpC,UAAU;AAAA,QACV,SAAS,MAAM,iBAAiB,CAAC,OAAO,CAAC,EAAE;AAAA,QAC3C,KAAK;AAAA,QACL,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QAEP,UAAA,sDAAwB,qBAAA,CAAA,CAAoB;AAAA,MAAA;AAAA,IAAA;AAAA,EAC/C,GACF;AAEJ;AC5GA,MAAM,0BAEIC,WAAAA,iBAAoB;AAAA,EAI5B,YAAY,kBAAoC,SAA+B;AAC7E,UAAM,OAAO;AAJf,SAAS,OAAyB;AAKhC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,MAAM,MAAM,aAAqB;AAC/B,QAAI,YAAY,WAAW,GAAG;AAC5B,aAAO,EAAE,OAAO,IAAW,MAAM,KAAA;AAAA,IACnC;AACA,UAAM,SAAU,MAAM,KAAK,iBAAiB,OAAO,WAAW,KAAM,CAAA;AAGpE,WAAO;AAAA,MACL,OAAO,OACJ,OAAO,OAAO,EACd,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,EAAE,YAAY,CAAA,GAAI,IAAI,MAAM,QAAQ,QAAQ,CAAA,QAAS;AACzD,cAAM,CAAC,SAAS,IAAI;AAEpB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,UAAU,UAAU;AAAA,QAAA;AAAA,MAEhC,CAAC;AAAA,MACH,MAAM;AAAA;AAAA,IAAA;AAAA,EAEV;AAAA,EAEU,mBAAmB,OAAgC;AAC3D,WAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1B,GAAG;AAAA,MACH,GAAGC,6CAAkC;AAAA,QACnC,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,MAAA,CACnB;AAAA,IAAA,EACD;AAAA,EACJ;AACF;AAEA,MAAM,kBAAiD,EAAE,UAAU,GAAG,SAAS,IAAA;AAyBxE,MAAM,oCAAoC,CAC/C,kBACA,YACoB;AACpB,QAAM,eAAe,UAAU,iBAAiB,WAAW,CAAA,CAAE;AAC7D,QAAM,oBAAoB,IAAI,kBAAkB,gBAAgB;AAChE,oBAAkB,SAAA;AAElB,SAAO;AAAA,IACL,IAAI;AAAA;AAAA,IAEJ,UAAU;AAAA,MACR,UAAU,OAAO,EAAE,UAAU,SAAS,MAAM,YAAY;AACtD,YAAI,CAAC,MAAM,UAAW,QAAO,QAAA;AAE7B,cAAM,mBAAmBC,WAAAA,wBAAwB;AAAA,UAC/C,sBAAsB;AAAA,UACtB,MAAM,MAAM,KAAK,MAAM,GAAG,MAAM,UAAU,GAAG;AAAA,UAC7C,SAAS,aAAa;AAAA,QAAA,CACvB;AAED,cAAM,oBACJ,CAAC,oBAAoB,iBAAiB,SAAS,aAAa;AAE9D,YAAI,mBAAmB;AACrB,gBAAM,2BACJ,MAAM,aAAa,YAAY,aAAa;AAC9C,gBAAM,WAAW,EAAE,GAAG,MAAA;AACtB,cAAI,4BAA4B,SAAS,aAAa;AACpD,mBAAO,SAAS;AAAA,UAClB;AACA,iBAAO,KAAK,QAAQ;AAAA,QACtB;AAEA,cAAM,sBACJ,oBAAoB,qBAAqB,aAAa;AAExD,YAAI,qBAAqB;AACvB,4BAAkB,sBAAA;AAAA,QACpB;AAEA,cAAM,uBAAuB,MAAMC,iCAAsB;AAAA,UACvD,eAAe,MAAM,UAAU;AAAA,UAC/B,iBAAiB,OAAO,SAAiB;AACvC,kBAAM,EAAE,MAAA,IAAU,MAAM,kBAAkB,MAAM,IAAI;AAEpD,kBAAM,QAAQ,MACX,OAAO,OAAO,EACd,MAAM,GAAG,EAAE,EACX,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,WAAW,SAAS,IAAI,CAAC;AAEtD,gBAAI,CAAC,MAAO,QAAO;AAEnB,kBAAM,CAAC,SAAS,IAAI,MAAM,SAAS,CAAA;AAEnC,mBAAO,MAAM,UAAU,UAAU;AAAA,UACnC;AAAA,UACA,MAAM,MAAM;AAAA,QAAA,CACb;AAED,YAAI,yBAAyB,MAAM,MAAM;AACvC,iBAAO,SAAS;AAAA,YACd,GAAG;AAAA,YACH,aAAa;AAAA;AAAA,YACb,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AAEA,eAAO,SAAS;AAAA,UACd,GAAG;AAAA,UACH,aAAa;AAAA,YACX,OAAO,iBAAiB,MAAM,CAAC;AAAA,YAC/B,cAAc;AAAA,YACd,SAAS,aAAa;AAAA,UAAA;AAAA,QACxB,CACD;AAAA,MACH;AAAA,MACA,wBAAwB,CAAC,EAAE,UAAU,SAAS,YAAY;AACxD,cAAM,EAAE,mBAAA,IAAuB,MAAM,UAAU,CAAA;AAC/C,YAAI,CAAC,sBAAsB,MAAM,aAAa,YAAY,aAAa;AACrE,iBAAO,QAAA;AAET,0BAAkB,sBAAA;AAClB,eAAO,SAAS;AAAA,UACd,GAAG;AAAA,UACH,GAAGC,iCAAsB;AAAA,YACvB,YAAY,GAAG,YAAY,qBAAqB,mBAAmB,SAAS,EAAE;AAAA,YAC9E,WAAW,MAAM;AAAA,YACjB,MAAM,MAAM;AAAA,YACZ,SAAS,aAAa;AAAA,UAAA,CACvB;AAAA,UACD,aAAa;AAAA;AAAA,QAAA,CACd;AAAA,MACH;AAAA,IAAA;AAAA,EACF;AAEJ;;;"}
1
+ {"version":3,"file":"emojis.js","sources":["../../src/plugins/Emojis/EmojiPicker.tsx","../../src/plugins/Emojis/middleware/textComposerEmojiMiddleware.ts"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport Picker from '@emoji-mart/react';\n\nimport { useMessageComposerContext, useTranslationContext } from '../../context';\nimport {\n Button,\n IconEmoji,\n type PopperLikePlacement,\n useMessageComposerController,\n} from '../../components';\nimport { usePopoverPosition } from '../../components/Dialog/hooks/usePopoverPosition';\nimport { useIsCooldownActive } from '../../components/MessageComposer/hooks/useIsCooldownActive';\n\nconst isShadowRoot = (node: Node): node is ShadowRoot => !!(node as ShadowRoot).host;\n\nexport type EmojiPickerProps = {\n ButtonIconComponent?: React.ComponentType;\n buttonClassName?: string;\n pickerContainerClassName?: string;\n wrapperClassName?: string;\n closeOnEmojiSelect?: boolean;\n /**\n * Untyped [properties](https://github.com/missive/emoji-mart/tree/v5.5.2#options--props) to be\n * passed down to the [emoji-mart `Picker`](https://github.com/missive/emoji-mart/tree/v5.5.2#-picker) component\n */\n pickerProps?: Partial<{ theme: 'auto' | 'light' | 'dark' } & Record<string, unknown>>;\n /**\n * Floating UI placement (default: 'top-end') for the picker popover\n */\n placement?: PopperLikePlacement;\n};\n\nconst defaultButtonClassName = 'str-chat__emoji-picker-button';\n\nconst classNames: Pick<\n EmojiPickerProps,\n 'pickerContainerClassName' | 'wrapperClassName'\n> = {\n pickerContainerClassName: 'str-chat__message-textarea-emoji-picker-container',\n wrapperClassName: 'str-chat__message-textarea-emoji-picker',\n};\n\nexport const EmojiPicker = (props: EmojiPickerProps) => {\n const { t } = useTranslationContext('EmojiPicker');\n const { textareaRef } = useMessageComposerContext('EmojiPicker');\n const { textComposer } = useMessageComposerController();\n const isCooldownActive = useIsCooldownActive();\n const [displayPicker, setDisplayPicker] = useState(false);\n const [referenceElement, setReferenceElement] = useState<HTMLButtonElement | null>(\n null,\n );\n const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null);\n const { refs, strategy, x, y } = usePopoverPosition({\n offset: 8,\n placement: props.placement ?? 'top-end',\n });\n\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n useEffect(() => {\n refs.setFloating(popperElement);\n }, [popperElement, refs]);\n\n const { pickerContainerClassName, wrapperClassName } = classNames;\n\n const { ButtonIconComponent = IconEmoji } = props;\n const pickerStyle = props.pickerProps?.style as React.CSSProperties | undefined;\n\n useEffect(() => {\n if (!popperElement || !referenceElement) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n\n const rootNode = target.getRootNode();\n\n if (\n popperElement.contains(isShadowRoot(rootNode) ? rootNode.host : target) ||\n referenceElement.contains(target)\n ) {\n return;\n }\n\n setDisplayPicker(false);\n };\n\n window.addEventListener('pointerdown', handlePointerDown);\n return () => window.removeEventListener('pointerdown', handlePointerDown);\n }, [referenceElement, popperElement]);\n\n return (\n <div className={props.wrapperClassName ?? wrapperClassName}>\n {displayPicker && (\n <div\n className={props.pickerContainerClassName ?? pickerContainerClassName}\n ref={setPopperElement}\n style={{ left: x ?? 0, position: strategy, top: y ?? 0 }}\n >\n <Picker\n data={async () => (await import('@emoji-mart/data')).default}\n onEmojiSelect={(e: { native: string }) => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textComposer.insertText({ text: e.native });\n textarea.focus();\n if (props.closeOnEmojiSelect) {\n setDisplayPicker(false);\n }\n }}\n {...props.pickerProps}\n style={{ ...pickerStyle, '--shadow': 'none' }}\n />\n </div>\n )}\n <Button\n appearance='ghost'\n aria-expanded={displayPicker}\n aria-label={t('aria/Emoji picker')}\n circular\n className={props.buttonClassName ?? defaultButtonClassName}\n disabled={isCooldownActive}\n onClick={() => setDisplayPicker((cv) => !cv)}\n ref={setReferenceElement}\n size='sm'\n type='button'\n variant='secondary'\n >\n {ButtonIconComponent && <ButtonIconComponent />}\n </Button>\n </div>\n );\n};\n","import mergeWith from 'lodash.mergewith';\nimport type {\n Middleware,\n SearchSourceOptions,\n SearchSourceType,\n TextComposerMiddlewareExecutorState,\n TextComposerMiddlewareOptions,\n TextComposerSuggestion,\n} from 'stream-chat';\nimport {\n BaseSearchSource,\n getTokenizedSuggestionDisplayName,\n getTriggerCharWithToken,\n insertItemWithTrigger,\n replaceWordWithEntity,\n} from 'stream-chat';\nimport type {\n EmojiSearchIndex,\n EmojiSearchIndexResult,\n} from '../../../components/MessageComposer';\n\nexport type EmojiSuggestion<T extends EmojiSearchIndexResult = EmojiSearchIndexResult> =\n TextComposerSuggestion<T>;\n\nclass EmojiSearchSource<\n T extends TextComposerSuggestion<EmojiSearchIndexResult>,\n> extends BaseSearchSource<T> {\n readonly type: SearchSourceType = 'emoji';\n private emojiSearchIndex: EmojiSearchIndex;\n\n constructor(emojiSearchIndex: EmojiSearchIndex, options?: SearchSourceOptions) {\n super(options);\n this.emojiSearchIndex = emojiSearchIndex;\n }\n\n async query(searchQuery: string) {\n if (searchQuery.length === 0) {\n return { items: [] as T[], next: null };\n }\n const emojis = (await this.emojiSearchIndex.search(searchQuery)) ?? [];\n\n // emojiIndex.search sometimes returns undefined values, so filter those out first\n return {\n items: emojis\n .filter(Boolean)\n .slice(0, 7)\n .map(({ emoticons = [], id, name, native, skins = [] }) => {\n const [firstSkin] = skins;\n\n return {\n emoticons,\n id,\n name,\n native: native ?? firstSkin.native,\n };\n }) as T[],\n next: null, // todo: generate cursor\n };\n }\n\n protected filterQueryResults(items: T[]): T[] | Promise<T[]> {\n return items.map((item) => ({\n ...item,\n ...getTokenizedSuggestionDisplayName({\n displayName: item.id,\n searchToken: this.searchQuery,\n }),\n }));\n }\n}\n\nconst DEFAULT_OPTIONS: TextComposerMiddlewareOptions = { minChars: 1, trigger: ':' };\n\nexport type EmojiMiddleware<T extends EmojiSearchIndexResult = EmojiSearchIndexResult> =\n Middleware<\n TextComposerMiddlewareExecutorState<EmojiSuggestion<T>>,\n 'onChange' | 'onSuggestionItemSelect'\n >;\n\n/**\n * TextComposer middleware for mentions\n * Usage:\n *\n * const textComposer = new TextComposer(options);\n *\n * textComposer.use(new createTextComposerEmojiMiddleware(emojiSearchIndex, {\n * minChars: 2\n * }));\n *\n * @param emojiSearchIndex\n * @param {{\n * minChars: number;\n * trigger: string;\n * }} options\n * @returns\n */\nexport const createTextComposerEmojiMiddleware = (\n emojiSearchIndex: EmojiSearchIndex,\n options?: Partial<TextComposerMiddlewareOptions>,\n): EmojiMiddleware => {\n const finalOptions = mergeWith(DEFAULT_OPTIONS, options ?? {});\n const emojiSearchSource = new EmojiSearchSource(emojiSearchIndex);\n emojiSearchSource.activate();\n\n return {\n id: 'stream-io/emoji-middleware',\n // eslint-disable-next-line sort-keys\n handlers: {\n onChange: async ({ complete, forward, next, state }) => {\n if (!state.selection) return forward();\n\n const triggerWithToken = getTriggerCharWithToken({\n acceptTrailingSpaces: false,\n text: state.text.slice(0, state.selection.end),\n trigger: finalOptions.trigger,\n });\n\n const triggerWasRemoved =\n !triggerWithToken || triggerWithToken.length < finalOptions.minChars;\n\n if (triggerWasRemoved) {\n const hasSuggestionsForTrigger =\n state.suggestions?.trigger === finalOptions.trigger;\n const newState = { ...state };\n if (hasSuggestionsForTrigger && newState.suggestions) {\n delete newState.suggestions;\n }\n return next(newState);\n }\n\n const newSearchTriggerred =\n triggerWithToken && triggerWithToken === finalOptions.trigger;\n\n if (newSearchTriggerred) {\n emojiSearchSource.resetStateAndActivate();\n }\n\n const textWithReplacedWord = await replaceWordWithEntity({\n caretPosition: state.selection.end,\n getEntityString: async (word: string) => {\n const { items } = await emojiSearchSource.query(word);\n\n const emoji = items\n .filter(Boolean)\n .slice(0, 10)\n .find(({ emoticons }) => !!emoticons?.includes(word));\n\n if (!emoji) return null;\n\n const [firstSkin] = emoji.skins ?? [];\n\n return emoji.native ?? firstSkin.native;\n },\n text: state.text,\n });\n\n if (textWithReplacedWord !== state.text) {\n return complete({\n ...state,\n suggestions: undefined, // to prevent the TextComposerMiddlewareExecutor to run the first page query\n text: textWithReplacedWord,\n });\n }\n\n return complete({\n ...state,\n suggestions: {\n query: triggerWithToken.slice(1),\n searchSource: emojiSearchSource,\n trigger: finalOptions.trigger,\n },\n });\n },\n onSuggestionItemSelect: ({ complete, forward, state }) => {\n const { selectedSuggestion } = state.change ?? {};\n if (!selectedSuggestion || state.suggestions?.trigger !== finalOptions.trigger)\n return forward();\n\n emojiSearchSource.resetStateAndActivate();\n return complete({\n ...state,\n ...insertItemWithTrigger({\n insertText: `${'native' in selectedSuggestion ? selectedSuggestion.native : ''} `,\n selection: state.selection,\n text: state.text,\n trigger: finalOptions.trigger,\n }),\n suggestions: undefined, // Clear suggestions after selection\n });\n },\n },\n };\n};\n"],"names":["useTranslationContext","useMessageComposerContext","useMessageComposerController","useIsCooldownActive","useState","usePopoverPosition","useEffect","IconEmoji","jsxs","jsx","Button","BaseSearchSource","getTokenizedSuggestionDisplayName","getTriggerCharWithToken","replaceWordWithEntity","insertItemWithTrigger"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,eAAe,CAAC,SAAmC,CAAC,CAAE,KAAoB;AAmBhF,MAAM,yBAAyB;AAE/B,MAAM,aAGF;AAAA,EACF,0BAA0B;AAAA,EAC1B,kBAAkB;AACpB;AAEO,MAAM,cAAc,CAAC,UAA4B;AACtD,QAAM,EAAE,EAAA,IAAMA,mBAAAA,sBAAsB,aAAa;AACjD,QAAM,EAAE,gBAAgBC,mBAAAA,0BAAuC;AAC/D,QAAM,EAAE,aAAA,IAAiBC,gDAAA;AACzB,QAAM,mBAAmBC,mBAAAA,oBAAA;AACzB,QAAM,CAAC,eAAe,gBAAgB,IAAIC,MAAAA,SAAS,KAAK;AACxD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,MAAAA;AAAAA,IAC9C;AAAA,EAAA;AAEF,QAAM,CAAC,eAAe,gBAAgB,IAAIA,MAAAA,SAAgC,IAAI;AAC9E,QAAM,EAAE,MAAM,UAAU,GAAG,EAAA,IAAMC,mBAAAA,mBAAmB;AAAA,IAClD,QAAQ;AAAA,IACR,WAAW,MAAM,aAAa;AAAA,EAAA,CAC/B;AAEDC,QAAAA,UAAU,MAAM;AACd,SAAK,aAAa,gBAAgB;AAAA,EACpC,GAAG,CAAC,kBAAkB,IAAI,CAAC;AAC3BA,QAAAA,UAAU,MAAM;AACd,SAAK,YAAY,aAAa;AAAA,EAChC,GAAG,CAAC,eAAe,IAAI,CAAC;AAExB,QAAM,EAAE,0BAA0B,iBAAA,IAAqB;AAEvD,QAAM,EAAE,sBAAsBC,mBAAAA,UAAA,IAAc;AAC5C,QAAM,cAAc,MAAM,aAAa;AAEvCD,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,CAAC,iBAAkB;AAEzC,UAAM,oBAAoB,CAAC,MAAoB;AAC7C,YAAM,SAAS,EAAE;AAEjB,YAAM,WAAW,OAAO,YAAA;AAExB,UACE,cAAc,SAAS,aAAa,QAAQ,IAAI,SAAS,OAAO,MAAM,KACtE,iBAAiB,SAAS,MAAM,GAChC;AACA;AAAA,MACF;AAEA,uBAAiB,KAAK;AAAA,IACxB;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,MAAM,OAAO,oBAAoB,eAAe,iBAAiB;AAAA,EAC1E,GAAG,CAAC,kBAAkB,aAAa,CAAC;AAEpC,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAW,MAAM,oBAAoB,kBACvC,UAAA;AAAA,IAAA,iBACCC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,MAAM,4BAA4B;AAAA,QAC7C,KAAK;AAAA,QACL,OAAO,EAAE,MAAM,KAAK,GAAG,UAAU,UAAU,KAAK,KAAK,EAAA;AAAA,QAErD,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,YACrD,eAAe,CAAC,MAA0B;AACxC,oBAAM,WAAW,YAAY;AAC7B,kBAAI,CAAC,SAAU;AACf,2BAAa,WAAW,EAAE,MAAM,EAAE,QAAQ;AAC1C,uBAAS,MAAA;AACT,kBAAI,MAAM,oBAAoB;AAC5B,iCAAiB,KAAK;AAAA,cACxB;AAAA,YACF;AAAA,YACC,GAAG,MAAM;AAAA,YACV,OAAO,EAAE,GAAG,aAAa,YAAY,OAAA;AAAA,UAAO;AAAA,QAAA;AAAA,MAC9C;AAAA,IAAA;AAAA,IAGJA,2BAAAA;AAAAA,MAACC,mBAAAA;AAAAA,MAAA;AAAA,QACC,YAAW;AAAA,QACX,iBAAe;AAAA,QACf,cAAY,EAAE,mBAAmB;AAAA,QACjC,UAAQ;AAAA,QACR,WAAW,MAAM,mBAAmB;AAAA,QACpC,UAAU;AAAA,QACV,SAAS,MAAM,iBAAiB,CAAC,OAAO,CAAC,EAAE;AAAA,QAC3C,KAAK;AAAA,QACL,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QAEP,UAAA,sDAAwB,qBAAA,CAAA,CAAoB;AAAA,MAAA;AAAA,IAAA;AAAA,EAC/C,GACF;AAEJ;AC5GA,MAAM,0BAEIC,WAAAA,iBAAoB;AAAA,EAI5B,YAAY,kBAAoC,SAA+B;AAC7E,UAAM,OAAO;AAJf,SAAS,OAAyB;AAKhC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,MAAM,MAAM,aAAqB;AAC/B,QAAI,YAAY,WAAW,GAAG;AAC5B,aAAO,EAAE,OAAO,IAAW,MAAM,KAAA;AAAA,IACnC;AACA,UAAM,SAAU,MAAM,KAAK,iBAAiB,OAAO,WAAW,KAAM,CAAA;AAGpE,WAAO;AAAA,MACL,OAAO,OACJ,OAAO,OAAO,EACd,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,EAAE,YAAY,CAAA,GAAI,IAAI,MAAM,QAAQ,QAAQ,CAAA,QAAS;AACzD,cAAM,CAAC,SAAS,IAAI;AAEpB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,UAAU,UAAU;AAAA,QAAA;AAAA,MAEhC,CAAC;AAAA,MACH,MAAM;AAAA;AAAA,IAAA;AAAA,EAEV;AAAA,EAEU,mBAAmB,OAAgC;AAC3D,WAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1B,GAAG;AAAA,MACH,GAAGC,6CAAkC;AAAA,QACnC,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,MAAA,CACnB;AAAA,IAAA,EACD;AAAA,EACJ;AACF;AAEA,MAAM,kBAAiD,EAAE,UAAU,GAAG,SAAS,IAAA;AAyBxE,MAAM,oCAAoC,CAC/C,kBACA,YACoB;AACpB,QAAM,eAAe,UAAU,iBAAiB,WAAW,CAAA,CAAE;AAC7D,QAAM,oBAAoB,IAAI,kBAAkB,gBAAgB;AAChE,oBAAkB,SAAA;AAElB,SAAO;AAAA,IACL,IAAI;AAAA;AAAA,IAEJ,UAAU;AAAA,MACR,UAAU,OAAO,EAAE,UAAU,SAAS,MAAM,YAAY;AACtD,YAAI,CAAC,MAAM,UAAW,QAAO,QAAA;AAE7B,cAAM,mBAAmBC,WAAAA,wBAAwB;AAAA,UAC/C,sBAAsB;AAAA,UACtB,MAAM,MAAM,KAAK,MAAM,GAAG,MAAM,UAAU,GAAG;AAAA,UAC7C,SAAS,aAAa;AAAA,QAAA,CACvB;AAED,cAAM,oBACJ,CAAC,oBAAoB,iBAAiB,SAAS,aAAa;AAE9D,YAAI,mBAAmB;AACrB,gBAAM,2BACJ,MAAM,aAAa,YAAY,aAAa;AAC9C,gBAAM,WAAW,EAAE,GAAG,MAAA;AACtB,cAAI,4BAA4B,SAAS,aAAa;AACpD,mBAAO,SAAS;AAAA,UAClB;AACA,iBAAO,KAAK,QAAQ;AAAA,QACtB;AAEA,cAAM,sBACJ,oBAAoB,qBAAqB,aAAa;AAExD,YAAI,qBAAqB;AACvB,4BAAkB,sBAAA;AAAA,QACpB;AAEA,cAAM,uBAAuB,MAAMC,iCAAsB;AAAA,UACvD,eAAe,MAAM,UAAU;AAAA,UAC/B,iBAAiB,OAAO,SAAiB;AACvC,kBAAM,EAAE,MAAA,IAAU,MAAM,kBAAkB,MAAM,IAAI;AAEpD,kBAAM,QAAQ,MACX,OAAO,OAAO,EACd,MAAM,GAAG,EAAE,EACX,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,WAAW,SAAS,IAAI,CAAC;AAEtD,gBAAI,CAAC,MAAO,QAAO;AAEnB,kBAAM,CAAC,SAAS,IAAI,MAAM,SAAS,CAAA;AAEnC,mBAAO,MAAM,UAAU,UAAU;AAAA,UACnC;AAAA,UACA,MAAM,MAAM;AAAA,QAAA,CACb;AAED,YAAI,yBAAyB,MAAM,MAAM;AACvC,iBAAO,SAAS;AAAA,YACd,GAAG;AAAA,YACH,aAAa;AAAA;AAAA,YACb,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AAEA,eAAO,SAAS;AAAA,UACd,GAAG;AAAA,UACH,aAAa;AAAA,YACX,OAAO,iBAAiB,MAAM,CAAC;AAAA,YAC/B,cAAc;AAAA,YACd,SAAS,aAAa;AAAA,UAAA;AAAA,QACxB,CACD;AAAA,MACH;AAAA,MACA,wBAAwB,CAAC,EAAE,UAAU,SAAS,YAAY;AACxD,cAAM,EAAE,mBAAA,IAAuB,MAAM,UAAU,CAAA;AAC/C,YAAI,CAAC,sBAAsB,MAAM,aAAa,YAAY,aAAa;AACrE,iBAAO,QAAA;AAET,0BAAkB,sBAAA;AAClB,eAAO,SAAS;AAAA,UACd,GAAG;AAAA,UACH,GAAGC,iCAAsB;AAAA,YACvB,YAAY,GAAG,YAAY,qBAAqB,mBAAmB,SAAS,EAAE;AAAA,YAC9E,WAAW,MAAM;AAAA,YACjB,MAAM,MAAM;AAAA,YACZ,SAAS,aAAa;AAAA,UAAA,CACvB;AAAA,UACD,aAAa;AAAA;AAAA,QAAA,CACd;AAAA,MACH;AAAA,IAAA;AAAA,EACF;AAEJ;;;"}