stream-chat-react 14.0.0-beta.2 → 14.0.0-beta.4

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 (198) hide show
  1. package/dist/cjs/WithAudioPlayback.236d404c.js +4670 -0
  2. package/dist/cjs/WithAudioPlayback.236d404c.js.map +1 -0
  3. package/dist/{audioProcessing-BbOs2wMd.js → cjs/audioProcessing.56e5db9d.js} +1 -1
  4. package/dist/cjs/audioProcessing.56e5db9d.js.map +1 -0
  5. package/dist/cjs/emojis.js +2 -2
  6. package/dist/cjs/emojis.js.map +1 -1
  7. package/dist/cjs/index.js +807 -485
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/mp3-encoder.js +1 -1
  10. package/dist/css/emoji-replacement.css +34 -0
  11. package/dist/css/emoji-replacement.css.map +1 -0
  12. package/dist/css/index.css +190 -51
  13. package/dist/css/index.css.map +1 -1
  14. package/dist/es/WithAudioPlayback.89700cb5.mjs +4654 -0
  15. package/dist/es/WithAudioPlayback.89700cb5.mjs.map +1 -0
  16. package/dist/{audioProcessing-ByEVSjGG.mjs → es/audioProcessing.21cb49e1.mjs} +1 -1
  17. package/dist/es/audioProcessing.21cb49e1.mjs.map +1 -0
  18. package/dist/es/emojis.mjs +2 -2
  19. package/dist/es/emojis.mjs.map +1 -1
  20. package/dist/es/index.mjs +857 -535
  21. package/dist/es/index.mjs.map +1 -1
  22. package/dist/es/mp3-encoder.mjs +1 -1
  23. package/dist/types/components/Attachment/Giphy.d.ts.map +1 -1
  24. package/dist/types/components/Attachment/VoiceRecording.d.ts.map +1 -1
  25. package/dist/types/components/AudioPlayback/AudioPlayer.d.ts.map +1 -1
  26. package/dist/types/components/BaseImage/toBaseImageDescriptors.d.ts +1 -1
  27. package/dist/types/components/BaseImage/toBaseImageDescriptors.d.ts.map +1 -1
  28. package/dist/types/components/ChannelList/hooks/useMobileNavigation.d.ts.map +1 -1
  29. package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.d.ts +3 -1
  30. package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.d.ts.map +1 -1
  31. package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts +6 -3
  32. package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts.map +1 -1
  33. package/dist/types/components/Chat/hooks/useSplitActionSet.d.ts +5 -0
  34. package/dist/types/components/Chat/hooks/useSplitActionSet.d.ts.map +1 -1
  35. package/dist/types/components/Dialog/components/ContextMenu.d.ts +119 -3
  36. package/dist/types/components/Dialog/components/ContextMenu.d.ts.map +1 -1
  37. package/dist/types/components/Dialog/hooks/useDialog.d.ts +1 -1
  38. package/dist/types/components/Dialog/hooks/useDialog.d.ts.map +1 -1
  39. package/dist/types/components/Dialog/service/DialogAnchor.d.ts +14 -1
  40. package/dist/types/components/Dialog/service/DialogAnchor.d.ts.map +1 -1
  41. package/dist/types/components/Dialog/service/DialogManager.d.ts +14 -3
  42. package/dist/types/components/Dialog/service/DialogManager.d.ts.map +1 -1
  43. package/dist/types/components/Dialog/service/DialogPortal.d.ts.map +1 -1
  44. package/dist/types/components/Form/TextInput.d.ts +2 -2
  45. package/dist/types/components/Form/TextInput.d.ts.map +1 -1
  46. package/dist/types/components/Gallery/GalleryContext.d.ts +1 -1
  47. package/dist/types/components/Gallery/GalleryContext.d.ts.map +1 -1
  48. package/dist/types/components/Icons/IconGiphy.d.ts.map +1 -1
  49. package/dist/types/components/Icons/icons.d.ts +56 -340
  50. package/dist/types/components/Icons/icons.d.ts.map +1 -1
  51. package/dist/types/components/Loading/LoadingIndicator.d.ts +2 -2
  52. package/dist/types/components/Loading/LoadingIndicator.d.ts.map +1 -1
  53. package/dist/types/components/MessageActions/MessageActions.d.ts +14 -3
  54. package/dist/types/components/MessageActions/MessageActions.d.ts.map +1 -1
  55. package/dist/types/components/MessageActions/MessageActions.defaults.d.ts +1 -1
  56. package/dist/types/components/MessageActions/MessageActions.defaults.d.ts.map +1 -1
  57. package/dist/types/components/MessageActions/QuickMessageActionButton.d.ts.map +1 -1
  58. package/dist/types/components/MessageActions/hooks/useBaseMessageActionSetFilter.d.ts.map +1 -1
  59. package/dist/types/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.d.ts.map +1 -1
  60. package/dist/types/components/MessageComposer/AttachmentSelector/AttachmentSelector.d.ts.map +1 -1
  61. package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +18 -0
  62. package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -1
  63. package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts.map +1 -1
  64. package/dist/types/components/Poll/PollCreationDialog/OptionFieldSet.d.ts.map +1 -1
  65. package/dist/types/components/Reactions/MessageReactions.d.ts.map +1 -1
  66. package/dist/types/components/Reactions/MessageReactionsDetail.d.ts +1 -0
  67. package/dist/types/components/Reactions/MessageReactionsDetail.d.ts.map +1 -1
  68. package/dist/types/components/Reactions/ReactionSelector.d.ts +1 -1
  69. package/dist/types/components/Reactions/ReactionSelector.d.ts.map +1 -1
  70. package/dist/types/components/TextareaComposer/SuggestionList/SuggestionList.d.ts.map +1 -1
  71. package/dist/types/components/TextareaComposer/TextareaComposer.d.ts.map +1 -1
  72. package/dist/types/context/ChannelListContext.d.ts +1 -1
  73. package/dist/types/context/ChannelListContext.d.ts.map +1 -1
  74. package/dist/types/context/ComponentContext.d.ts +5 -1
  75. package/dist/types/context/ComponentContext.d.ts.map +1 -1
  76. package/dist/types/context/DialogManagerContext.d.ts +11 -7
  77. package/dist/types/context/DialogManagerContext.d.ts.map +1 -1
  78. package/package.json +5 -4
  79. package/dist/WithAudioPlayback-C1hfFIcu.mjs +0 -4716
  80. package/dist/WithAudioPlayback-C1hfFIcu.mjs.map +0 -1
  81. package/dist/WithAudioPlayback-myzUS2m6.js +0 -4732
  82. package/dist/WithAudioPlayback-myzUS2m6.js.map +0 -1
  83. package/dist/assets/icons/stream-chat-icons.eot +0 -0
  84. package/dist/assets/icons/stream-chat-icons.svg +0 -50
  85. package/dist/assets/icons/stream-chat-icons.ttf +0 -0
  86. package/dist/assets/icons/stream-chat-icons.woff +0 -0
  87. package/dist/assets/icons/stream-chat-icons.woff2 +0 -0
  88. package/dist/audioProcessing-BbOs2wMd.js.map +0 -1
  89. package/dist/audioProcessing-ByEVSjGG.mjs.map +0 -1
  90. package/dist/css/v2/emoji-mart.css +0 -1
  91. package/dist/css/v2/emoji-replacement.css +0 -1
  92. package/dist/css/v2/index.css +0 -1
  93. package/dist/css/v2/index.layout.css +0 -1
  94. package/dist/scss/v2/AIStateIndicator/AIStateIndicator-layout.scss +0 -3
  95. package/dist/scss/v2/AIStateIndicator/AIStateIndicator-theme.scss +0 -7
  96. package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +0 -701
  97. package/dist/scss/v2/AttachmentList/AttachmentList-theme.scss +0 -605
  98. package/dist/scss/v2/AttachmentPreviewList/AttachmentPreviewList-layout.scss +0 -141
  99. package/dist/scss/v2/AttachmentPreviewList/AttachmentPreviewList-theme.scss +0 -190
  100. package/dist/scss/v2/AudioRecorder/AudioRecorder-layout.scss +0 -139
  101. package/dist/scss/v2/AudioRecorder/AudioRecorder-theme.scss +0 -61
  102. package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +0 -94
  103. package/dist/scss/v2/Autocomplete/Autocomplete-theme.scss +0 -220
  104. package/dist/scss/v2/Avatar/Avatar-layout.scss +0 -137
  105. package/dist/scss/v2/Avatar/Avatar-theme.scss +0 -64
  106. package/dist/scss/v2/BaseImage/BaseImage-layout.scss +0 -21
  107. package/dist/scss/v2/BaseImage/BaseImage-theme.scss +0 -35
  108. package/dist/scss/v2/BaseImage/index.scss +0 -2
  109. package/dist/scss/v2/Channel/Channel-layout.scss +0 -141
  110. package/dist/scss/v2/Channel/Channel-theme.scss +0 -100
  111. package/dist/scss/v2/ChannelHeader/ChannelHeader-layout.scss +0 -27
  112. package/dist/scss/v2/ChannelHeader/ChannelHeader-theme.scss +0 -43
  113. package/dist/scss/v2/ChannelList/ChannelList-layout.scss +0 -65
  114. package/dist/scss/v2/ChannelList/ChannelList-theme.scss +0 -89
  115. package/dist/scss/v2/ChannelPreview/ChannelPreview-layout.scss +0 -126
  116. package/dist/scss/v2/ChannelPreview/ChannelPreview-theme.scss +0 -148
  117. package/dist/scss/v2/ChannelSearch/ChannelSearch-layout.scss +0 -122
  118. package/dist/scss/v2/ChannelSearch/ChannelSearch-theme.scss +0 -238
  119. package/dist/scss/v2/ChatView/ChatView-layout.scss +0 -43
  120. package/dist/scss/v2/ChatView/ChatView-theme.scss +0 -32
  121. package/dist/scss/v2/Dialog/Dialog-layout.scss +0 -70
  122. package/dist/scss/v2/Dialog/Dialog-theme.scss +0 -103
  123. package/dist/scss/v2/DragAndDropContainer/DragAndDropContainer-layout.scss +0 -5
  124. package/dist/scss/v2/DragAndDropContainer/DragAndDropContainer-theme.scss +0 -47
  125. package/dist/scss/v2/DropzoneContainer/DropzoneContainer-layout.scss +0 -14
  126. package/dist/scss/v2/DropzoneContainer/DropzoneContainer-theme.scss +0 -17
  127. package/dist/scss/v2/EditMessageForm/EditMessageForm-layout.scss +0 -51
  128. package/dist/scss/v2/EditMessageForm/EditMessageForm-theme.scss +0 -50
  129. package/dist/scss/v2/Form/Form-layout.scss +0 -49
  130. package/dist/scss/v2/Form/Form-theme.scss +0 -82
  131. package/dist/scss/v2/Icon/Icon-layout.scss +0 -98
  132. package/dist/scss/v2/Icon/Icon-theme.scss +0 -17
  133. package/dist/scss/v2/ImageCarousel/ImageCarousel-layout.scss +0 -51
  134. package/dist/scss/v2/ImageCarousel/ImageCarousel-theme.scss +0 -30
  135. package/dist/scss/v2/InfiniteScrollPaginator/InfiniteScrollPaginator-layout.scss +0 -4
  136. package/dist/scss/v2/LinkPreview/LinkPreview-layout.scss +0 -67
  137. package/dist/scss/v2/LinkPreview/LinkPreview-theme.scss +0 -32
  138. package/dist/scss/v2/LinkPreview/index.scss +0 -2
  139. package/dist/scss/v2/LoadingIndicator/LoadingIndicator-layout.scss +0 -64
  140. package/dist/scss/v2/LoadingIndicator/LoadingIndicator-theme.scss +0 -14
  141. package/dist/scss/v2/Location/Location-layout.scss +0 -52
  142. package/dist/scss/v2/Location/Location-theme.scss +0 -32
  143. package/dist/scss/v2/Message/Message-layout.scss +0 -619
  144. package/dist/scss/v2/Message/Message-theme.scss +0 -483
  145. package/dist/scss/v2/MessageActionsBox/MessageActionsBox-layout.scss +0 -21
  146. package/dist/scss/v2/MessageActionsBox/MessageActionsBox-theme.scss +0 -85
  147. package/dist/scss/v2/MessageBouncePrompt/MessageBouncePrompt-layout.scss +0 -19
  148. package/dist/scss/v2/MessageBouncePrompt/MessageBouncePrompt-theme.scss +0 -51
  149. package/dist/scss/v2/MessageInput/MessageInput-layout.scss +0 -268
  150. package/dist/scss/v2/MessageInput/MessageInput-theme.scss +0 -359
  151. package/dist/scss/v2/MessageList/MessageList-layout.scss +0 -65
  152. package/dist/scss/v2/MessageList/MessageList-theme.scss +0 -107
  153. package/dist/scss/v2/MessageList/VirtualizedMessageList-layout.scss +0 -57
  154. package/dist/scss/v2/MessageList/VirtualizedMessageList-theme.scss +0 -41
  155. package/dist/scss/v2/MessageReactions/MessageReactions-layout.scss +0 -143
  156. package/dist/scss/v2/MessageReactions/MessageReactions-theme.scss +0 -92
  157. package/dist/scss/v2/MessageReactions/MessageReactionsSelector-layout.scss +0 -86
  158. package/dist/scss/v2/MessageReactions/MessageReactionsSelector-theme.scss +0 -94
  159. package/dist/scss/v2/Modal/Modal-layout.scss +0 -74
  160. package/dist/scss/v2/Modal/Modal-theme.scss +0 -109
  161. package/dist/scss/v2/Notification/MessageNotification-layout.scss +0 -12
  162. package/dist/scss/v2/Notification/MessageNotification-theme.scss +0 -34
  163. package/dist/scss/v2/Notification/Notification-layout.scss +0 -7
  164. package/dist/scss/v2/Notification/Notification-theme.scss +0 -32
  165. package/dist/scss/v2/Notification/NotificationList-layout.scss +0 -11
  166. package/dist/scss/v2/Notification/NotificationList-theme.scss +0 -31
  167. package/dist/scss/v2/Poll/Poll-layout.scss +0 -493
  168. package/dist/scss/v2/Poll/Poll-theme.scss +0 -178
  169. package/dist/scss/v2/Search/Search-layout.scss +0 -148
  170. package/dist/scss/v2/Search/Search-theme.scss +0 -222
  171. package/dist/scss/v2/Thread/Thread-layout.scss +0 -65
  172. package/dist/scss/v2/Thread/Thread-theme.scss +0 -82
  173. package/dist/scss/v2/ThreadList/ThreadList-layout.scss +0 -152
  174. package/dist/scss/v2/ThreadList/ThreadList-theme.scss +0 -75
  175. package/dist/scss/v2/Tooltip/Tooltip-layout.scss +0 -10
  176. package/dist/scss/v2/Tooltip/Tooltip-theme.scss +0 -36
  177. package/dist/scss/v2/TypingIndicator/TypingIndicator-layout.scss +0 -31
  178. package/dist/scss/v2/TypingIndicator/TypingIndicator-theme.scss +0 -68
  179. package/dist/scss/v2/UnreadCountBadge/UnreadCountBadge-layout.scss +0 -49
  180. package/dist/scss/v2/UnreadCountBadge/UnreadCountBadge-theme.scss +0 -11
  181. package/dist/scss/v2/_base.scss +0 -65
  182. package/dist/scss/v2/_emoji-replacement.scss +0 -45
  183. package/dist/scss/v2/_global-layout-variables.scss +0 -65
  184. package/dist/scss/v2/_global-theme-variables.scss +0 -173
  185. package/dist/scss/v2/_icons.scss +0 -36
  186. package/dist/scss/v2/_palette-variables.scss +0 -55
  187. package/dist/scss/v2/_utils.scss +0 -212
  188. package/dist/scss/v2/_variables.scss +0 -2
  189. package/dist/scss/v2/common/CTAButton/CTAButton-layout.scss +0 -4
  190. package/dist/scss/v2/common/CTAButton/CTAButton-theme.scss +0 -42
  191. package/dist/scss/v2/common/CircleFAButton/CircleFAButton-layout.scss +0 -14
  192. package/dist/scss/v2/common/CircleFAButton/CircleFAButton-theme.scss +0 -35
  193. package/dist/scss/v2/index.layout.scss +0 -49
  194. package/dist/scss/v2/index.scss +0 -50
  195. package/dist/scss/v2/vendor/emoji-mart.scss +0 -514
  196. package/dist/scss/v2/vendor/react-image-gallery.scss +0 -258
  197. /package/dist/{assets → css/assets}/EmojiOneColor.woff2 +0 -0
  198. /package/dist/{assets → css/assets}/NotoColorEmoji-flags.woff2 +0 -0
package/dist/es/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import clsx from "clsx";
3
3
  import { nanoid } from "nanoid";
4
- import React, { useState, useEffect, useCallback, useLayoutEffect, useMemo, useContext, createContext, useRef, forwardRef, Component, createElement, Fragment as Fragment$1 } from "react";
5
- import { u as useHandleFileChangeWrapper, d as dataTransferItemsToFiles, r as renderAudio, t as toAudioBuffer, c as createFileFromBlobs, g as getExtensionFromMimeType, a as getRecordedMediaTypeFromMimeType } from "../audioProcessing-ByEVSjGG.mjs";
6
- import { u as useStateStore, a as useMessageComposerController, i as isMessageBounced, b as useChannelActionContext, C as ComponentContext, c as useTranslationContext, d as useChannelStateContext, e as useChatContext, f as isNotificationForPanel, B as BaseIcon, g as Button, I as IconPause, h as IconPlaySolid, j as getDefaultExportFromCjs, k as defaultTranslatorFunction, p as predefinedFormatters, L as LocalizedFormat, l as calendar, m as IconLoadingCircle, n as isNetworkSendFailure, v as validateAndGetMessage, o as isUserMuted, q as defaultPinPermissions, r as useThreadContext, s as usePopoverPosition, t as useComponentContext, w as IconCrossMedium, x as IconPeople, y as IconExclamation, z as IconChevronRight, A as IconChevronLeft, D as IconArrowLeft, E as IconExclamationCircle, F as IconCircleBanSign, G as isMessageErrorRetryable, H as ACTIONS_NOT_WORKING_IN_THREAD, J as useNotificationTarget, K as IconArrowRightUp, M as addNotificationTargetTag, N as IconPin, O as mapToUserNameOrId, P as IconClock, Q as IconCheckmark1Small, R as IconDoubleCheckmark1Small, S as getReadByTooltipText, T as messageHasAttachments, U as messageTextHasEmojisOnly, V as isDate, W as getDateString, X as IconTranslate, Y as useMessageComposerContext, Z as useIsCooldownActive, _ as IconCrossSmall, $ as IconImages1Alt, a0 as IconChart5, a1 as IconMapPin, a2 as IconFileBend, a3 as IconChainLink, a4 as IconVideo, a5 as IconVideoSolid, a6 as IconMicrophone, a7 as IconBookmark, a8 as IconBellNotification, a9 as IconChevronDown, aa as IconPlusSmall, ab as IconCheckmark2, ac as DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD, ad as IconTrophy, ae as IconDotGrid2x3, af as IconCircleMinus, ag as IconPaperPlane, ah as IconVolumeFull, ai as IconPeopleAdd, aj as IconMute, ak as IconFlag2, al as IconPeopleRemove, am as IconPaperclip, an as IconRunShortcut, ao as CHANNEL_CONTAINER_ID, ap as IconPlusLarge, aq as IconExclamationTriangle, ar as useAudioPlayer, as as IconArrowRotateClockwise, at as IconArrowDownCircle, au as IconThunder, av as IconTrashBin, aw as IconFileArrowLeftIn, ax as MessageComposerContextProvider, ay as useTypingContext, az as defaultDateTimeParser, aA as isLanguageSupported, aB as IconLayoutAlignLeft, aC as useChatViewContext, aD as MESSAGE_ACTIONS, aE as LegacyThreadContext, aF as IconArrowShareLeft, aG as IconEmojiSmile, aH as IconPeopleAdded, aI as IconBookmarkRemove, aJ as IconBellOff, aK as IconBubbleWideNotificationChatMessage, aL as IconEditBig, aM as IconSquareBehindSquare2_Copy, aN as IconUnpin, aO as IconCloseQuote2, aP as IconBubbleText6ChatMessage, aQ as IconDotGrid1x3Horizontal, aR as areMessageUIPropsEqual, aS as isDateSeparatorMessage, aT as isMessageBlocked, aU as messageHasSingleAttachment, aV as messageHasGiphyAttachment, aW as messageHasReactions, aX as isMessageEdited, aY as countEmojis, aZ as areMessagePropsEqual, a_ as getMessageActions, a$ as processMessages, b0 as insertIntro, b1 as getGroupStyles, b2 as getLastReceived, b3 as IconArrowUp, b4 as isIntroMessage, b5 as isLocalMessage, b6 as getIsFirstUnreadMessage, b7 as IconArrowDown, b8 as DEFAULT_NEXT_CHANNEL_PAGE_SIZE, b9 as EmptyStateIndicator, ba as getChannel, bb as IconMagnifyingGlassSearch, bc as IconCircleX, bd as useChannelListContext, be as DEFAULT_JUMP_TO_PAGE_SIZE, bf as ChannelListContextProvider, bg as IconArchive, bh as IconArrowBoxLeft, bi as IconCamera1, bj as IconExclamationCircle1, bk as ChatProvider, bl as TranslationProvider, bm as useThreadsViewContext, bn as IconBubbles, bo as IconArrowRotateRightLeftRepeatRefresh, bp as IconEyeOpen } from "../WithAudioPlayback-C1hfFIcu.mjs";
7
- import { bu, bx, dc, dd, de, df, dg, dh, bz, bC, by, bB, bD, di, bG, bH, bI, bJ, bK, bL, bM, bN, bO, bP, bQ, bR, bT, bS, bU, bV, bW, bX, bY, bZ, b_, b$, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm, cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz, cA, cB, cC, cD, cE, cF, cG, cH, cI, cJ, cK, cL, cM, cN, cO, cP, cQ, cR, cS, cT, cU, cV, cW, cX, cY, cZ, c_, dj, c$, da, db, dk, dl, dm, br, bF, bE, bs, bt, d0, d1, d7, d8, d4, d5, dn, d6, dp, d3, d2, bq, bA, bv, bw, d9 } from "../WithAudioPlayback-C1hfFIcu.mjs";
4
+ import React, { useState, useEffect, useCallback, useLayoutEffect, useMemo, useContext, createContext, useRef, forwardRef, createElement, Component, Fragment as Fragment$1 } from "react";
5
+ import { u as useHandleFileChangeWrapper, d as dataTransferItemsToFiles, r as renderAudio, t as toAudioBuffer, c as createFileFromBlobs, g as getExtensionFromMimeType, a as getRecordedMediaTypeFromMimeType } from "./audioProcessing.21cb49e1.mjs";
6
+ import { u as useStateStore, a as useMessageComposerController, i as isMessageBounced, b as useChannelActionContext, C as ComponentContext, c as useTranslationContext, d as useChannelStateContext, e as useChatContext, f as isNotificationForPanel, B as BaseIcon, g as Button, I as IconPauseFill, h as IconPlayFill, j as getDefaultExportFromCjs, k as defaultTranslatorFunction, p as predefinedFormatters, L as LocalizedFormat, l as calendar, m as IconLoading, n as isNetworkSendFailure, v as validateAndGetMessage, o as isUserMuted, q as defaultPinPermissions, r as useThreadContext, s as usePopoverPosition, t as useComponentContext, w as IconXmark, x as IconUser, y as IconExclamationMarkFill, z as IconChevronRight, A as IconChevronLeft, D as IconArrowLeft, E as IconExclamationMark, F as IconNoSign, G as isMessageErrorRetryable, H as ACTIONS_NOT_WORKING_IN_THREAD, J as useNotificationTarget, K as IconArrowUpRight, M as addNotificationTargetTag, N as IconPin, O as mapToUserNameOrId, P as IconClock, Q as IconCheckmark1Small, R as IconChecks, S as getReadByTooltipText, T as messageHasAttachments, U as messageTextHasEmojisOnly, V as isDate, W as getDateString, X as IconTranslate, Y as useMessageComposerContext, Z as useIsCooldownActive, _ as IconCrossSmall, $ as IconImage, a0 as IconPoll, a1 as IconLocation, a2 as IconFile, a3 as IconLink, a4 as IconVideo, a5 as IconVideoFill, a6 as IconVoice, a7 as IconSave, a8 as IconBell, a9 as IconChevronDown, aa as IconPlusSmall, ab as IconCheckmark, ac as DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD, ad as IconTrophy, ae as IconReorder, af as IconMinusCircle, ag as IconSend, ah as IconAudio, ai as IconUserAdd, aj as IconMute, ak as IconFlag, al as IconUserRemove, am as IconAttachment, an as IconCommand, ao as CHANNEL_CONTAINER_ID, ap as IconPlus, aq as IconExclamationTriangle, ar as useAudioPlayer, as as IconRetry, at as IconArrowDownCircle, au as IconThunder, av as IconDelete, aw as IconUpload, ax as MessageComposerContextProvider, ay as useTypingContext, az as defaultDateTimeParser, aA as isLanguageSupported, aB as IconLayoutAlignLeft, aC as useChatViewContext, aD as MESSAGE_ACTIONS, aE as LegacyThreadContext, aF as IconReply, aG as IconEmoji, aH as IconMore, aI as IconUserCheck, aJ as IconUnsave, aK as IconBellOff, aL as IconNotification, aM as IconEdit, aN as IconCopy, aO as IconUnpin, aP as IconQuote, aQ as IconThread, aR as areMessageUIPropsEqual, aS as isDateSeparatorMessage, aT as isMessageBlocked, aU as messageHasSingleAttachment, aV as messageHasGiphyAttachment, aW as messageHasReactions, aX as isMessageEdited, aY as countEmojis, aZ as areMessagePropsEqual, a_ as getMessageActions, a$ as processMessages, b0 as insertIntro, b1 as getGroupStyles, b2 as getLastReceived, b3 as IconArrowUp, b4 as isIntroMessage, b5 as isLocalMessage, b6 as getIsFirstUnreadMessage, b7 as IconArrowDown, b8 as DEFAULT_NEXT_CHANNEL_PAGE_SIZE, b9 as EmptyStateIndicator, ba as getChannel, bb as IconSearch, bc as IconXCircle, bd as useChannelListContext, be as DEFAULT_JUMP_TO_PAGE_SIZE, bf as ChannelListContextProvider, bg as IconArchive, bh as IconLeave, bi as IconCamera, bj as IconExclamationCircleFill, bk as ChatProvider, bl as TranslationProvider, bm as useThreadsViewContext, bn as IconMessageBubbles, bo as IconRefresh, bp as IconEyeOpen } from "./WithAudioPlayback.89700cb5.mjs";
7
+ import { bu, bx, c5, c6, c7, c8, c9, ca, bz, bC, by, bB, bD, cb, bG, bJ, bK, bM, bN, bH, bI, bP, bQ, bR, bL, bO, bS, bT, cc, bU, c3, c4, cd, ce, cf, br, bF, bE, bs, bt, bV, bW, c0, c1, bZ, b_, cg, b$, ch, bY, bX, bq, bA, bv, bw, c2 } from "./WithAudioPlayback.89700cb5.mjs";
8
8
  import { StateStore, formatMessage, MessageComposer as MessageComposer$1, isGiphyAttachment, isScrapedContent, isLocalVideoAttachment, isVideoAttachment, isLocalImageAttachment, isImageAttachment, isAudioAttachment, isVoiceRecordingAttachment, isFileAttachment, isVoteAnswer, VotingVisibility, isLocalVoiceRecordingAttachment, isLocalAudioAttachment, isLocalFileAttachment, isLocalAttachment, LinkPreviewsManager, SearchController, ChannelSearchSource, UserSearchSource, MessageSearchSource, StreamChat, isSharedLocationResponse, LiveLocationManager } from "stream-chat";
9
9
  import throttle from "lodash.throttle";
10
10
  import * as linkify from "linkifyjs";
@@ -19,7 +19,6 @@ import { visit, SKIP } from "unist-util-visit";
19
19
  import i18n from "i18next";
20
20
  import Dayjs from "dayjs";
21
21
  import uniqBy from "lodash.uniqby";
22
- import { match, P } from "ts-pattern";
23
22
  import { useSyncExternalStore } from "use-sync-external-store/shim";
24
23
  import debounce from "lodash.debounce";
25
24
  import fixWebmDuration from "fix-webm-duration";
@@ -72,10 +71,11 @@ const useAIState = (channel) => {
72
71
  return { aiState };
73
72
  };
74
73
  class DialogManager {
75
- constructor({ id } = {}) {
74
+ constructor({ closeOnClickOutside = true, id } = {}) {
76
75
  this.state = new StateStore({
77
76
  dialogsById: {}
78
77
  });
78
+ this.closeOnClickOutside = closeOnClickOutside;
79
79
  this.id = id ?? nanoid();
80
80
  }
81
81
  get openDialogCount() {
@@ -90,13 +90,14 @@ class DialogManager {
90
90
  get(id) {
91
91
  return this.state.getLatestValue().dialogsById[id];
92
92
  }
93
- getOrCreate({ id }) {
93
+ getOrCreate({ closeOnClickOutside, id }) {
94
94
  let dialog = this.state.getLatestValue().dialogsById[id];
95
95
  if (!dialog) {
96
96
  dialog = {
97
97
  close: () => {
98
98
  this.close(id);
99
99
  },
100
+ closeOnClickOutside,
100
101
  id,
101
102
  isOpen: false,
102
103
  open: () => {
@@ -112,21 +113,22 @@ class DialogManager {
112
113
  };
113
114
  this.state.next((current) => ({
114
115
  ...current,
115
- ...{ dialogsById: { ...current.dialogsById, [id]: dialog } }
116
+ dialogsById: { ...current.dialogsById, [id]: dialog }
116
117
  }));
117
118
  }
118
- if (dialog.removalTimeout) {
119
- clearTimeout(dialog.removalTimeout);
119
+ const shouldUpdateDialogSettings = dialog.closeOnClickOutside !== closeOnClickOutside || !!dialog.removalTimeout;
120
+ if (shouldUpdateDialogSettings) {
121
+ if (dialog.removalTimeout) clearTimeout(dialog.removalTimeout);
122
+ dialog = {
123
+ ...dialog,
124
+ closeOnClickOutside,
125
+ removalTimeout: void 0
126
+ };
120
127
  this.state.next((current) => ({
121
128
  ...current,
122
- ...{
123
- dialogsById: {
124
- ...current.dialogsById,
125
- [id]: {
126
- ...dialog,
127
- removalTimeout: void 0
128
- }
129
- }
129
+ dialogsById: {
130
+ ...current.dialogsById,
131
+ [id]: dialog
130
132
  }
131
133
  }));
132
134
  }
@@ -203,7 +205,11 @@ class DialogManager {
203
205
  }));
204
206
  }
205
207
  }
206
- const useDialog = ({ dialogManagerId, id }) => {
208
+ const useDialog = ({
209
+ closeOnClickOutside,
210
+ dialogManagerId,
211
+ id
212
+ }) => {
207
213
  const { dialogManager } = useDialogManager({ dialogManagerId });
208
214
  useEffect(
209
215
  () => () => {
@@ -211,7 +217,7 @@ const useDialog = ({ dialogManagerId, id }) => {
211
217
  },
212
218
  [dialogManager, id]
213
219
  );
214
- return dialogManager.getOrCreate({ id });
220
+ return dialogManager.getOrCreate({ closeOnClickOutside, id });
215
221
  };
216
222
  const useDialogOnNearestManager = ({ id }) => {
217
223
  const { dialogManager } = useNearestDialogManagerContext() ?? {};
@@ -258,9 +264,37 @@ const Portal = ({
258
264
  if (!portalDestination) return null;
259
265
  return createPortal(children, portalDestination);
260
266
  };
267
+ const shouldCloseOnOutsideClick = ({
268
+ dialog,
269
+ managerCloseOnClickOutside
270
+ }) => dialog.closeOnClickOutside ?? managerCloseOnClickOutside;
261
271
  const DialogPortalDestination = () => {
262
272
  const { dialogManager } = useNearestDialogManagerContext() ?? {};
263
273
  const openedDialogCount = useOpenedDialogCount({ dialogManagerId: dialogManager?.id });
274
+ const [destinationRoot, setDestinationRoot] = useState(null);
275
+ useEffect(() => {
276
+ if (!destinationRoot || !dialogManager) return;
277
+ const handleDocumentClick = (event) => {
278
+ if (destinationRoot.contains(event.target)) return;
279
+ setTimeout(() => {
280
+ Object.values(dialogManager.state.getLatestValue().dialogsById).forEach(
281
+ (dialog) => {
282
+ if (!dialog.isOpen) return;
283
+ if (!shouldCloseOnOutsideClick({
284
+ dialog,
285
+ managerCloseOnClickOutside: dialogManager.closeOnClickOutside
286
+ }))
287
+ return;
288
+ dialogManager.close(dialog.id);
289
+ }
290
+ );
291
+ }, 0);
292
+ };
293
+ document.addEventListener("click", handleDocumentClick, { capture: true });
294
+ return () => {
295
+ document.removeEventListener("click", handleDocumentClick, { capture: true });
296
+ };
297
+ }, [destinationRoot, dialogManager]);
264
298
  if (!openedDialogCount) return null;
265
299
  return /* @__PURE__ */ jsx(
266
300
  "div",
@@ -268,7 +302,22 @@ const DialogPortalDestination = () => {
268
302
  className: "str-chat__dialog-overlay",
269
303
  "data-str-chat__portal-id": dialogManager?.id,
270
304
  "data-testid": "str-chat__dialog-overlay",
271
- onClick: () => dialogManager?.closeAll(),
305
+ onClick: (event) => {
306
+ if (!dialogManager) return;
307
+ if (event.target !== event.currentTarget) return;
308
+ Object.values(dialogManager.state.getLatestValue().dialogsById).forEach(
309
+ (dialog) => {
310
+ if (!dialog.isOpen) return;
311
+ if (!shouldCloseOnOutsideClick({
312
+ dialog,
313
+ managerCloseOnClickOutside: dialogManager.closeOnClickOutside
314
+ }))
315
+ return;
316
+ dialogManager.close(dialog.id);
317
+ }
318
+ );
319
+ },
320
+ ref: setDestinationRoot,
272
321
  style: {
273
322
  "--str-chat__dialog-overlay-height": openedDialogCount > 0 ? "100%" : "0"
274
323
  }
@@ -290,11 +339,16 @@ const DialogPortalEntry = ({
290
339
  };
291
340
  const dialogManagersRegistry = new StateStore({});
292
341
  const getDialogManager = (id) => dialogManagersRegistry.getLatestValue()[id];
293
- const getOrCreateDialogManager = (id) => {
342
+ const getOrCreateDialogManager = ({
343
+ closeOnClickOutside,
344
+ id
345
+ }) => {
294
346
  let manager = getDialogManager(id);
295
347
  if (!manager) {
296
- manager = new DialogManager({ id });
348
+ manager = new DialogManager({ closeOnClickOutside, id });
297
349
  dialogManagersRegistry.partialNext({ [id]: manager });
350
+ } else if (typeof closeOnClickOutside === "boolean") {
351
+ manager.closeOnClickOutside = closeOnClickOutside;
298
352
  }
299
353
  return manager;
300
354
  };
@@ -305,20 +359,21 @@ const removeDialogManager = (id) => {
305
359
  const DialogManagerProviderContext = React.createContext(void 0);
306
360
  const DialogManagerProvider = ({
307
361
  children,
362
+ closeOnClickOutside,
308
363
  id
309
364
  }) => {
310
365
  const [dialogManager, setDialogManager] = useState(() => {
311
366
  if (id) return getDialogManager(id) ?? null;
312
- return new DialogManager();
367
+ return new DialogManager({ closeOnClickOutside });
313
368
  });
314
369
  useEffect(() => {
315
370
  if (!id) return;
316
- setDialogManager(getOrCreateDialogManager(id));
371
+ setDialogManager(getOrCreateDialogManager({ closeOnClickOutside, id }));
317
372
  return () => {
318
373
  removeDialogManager(id);
319
374
  setDialogManager(null);
320
375
  };
321
- }, [id]);
376
+ }, [closeOnClickOutside, id]);
322
377
  if (!dialogManager) return null;
323
378
  return /* @__PURE__ */ jsxs(DialogManagerProviderContext.Provider, { value: { dialogManager }, children: [
324
379
  children,
@@ -662,39 +717,37 @@ const IconGiphy = ({ className, ...props }) => /* @__PURE__ */ jsxs(
662
717
  className: clsx("str-chat__icon--giphy", className),
663
718
  viewBox: "0 0 16 16",
664
719
  children: [
665
- /* @__PURE__ */ jsxs("g", { clipPath: "url(#clip0_4197_15218)", children: [
666
- /* @__PURE__ */ jsx(
667
- "path",
668
- {
669
- clipRule: "evenodd",
670
- d: "M3.33674 1.82861H12.6639V14.171H3.33594L3.33674 1.82861Z",
671
- fill: "black",
672
- fillRule: "evenodd"
673
- }
674
- ),
675
- /* @__PURE__ */ jsx("path", { d: "M1.47217 1.37109H3.33697V14.6287H1.47217V1.37109Z", fill: "#04FF8E" }),
676
- /* @__PURE__ */ jsx("path", { d: "M12.6631 5.02881H14.5279V14.6288H12.6631V5.02881Z", fill: "#8E2EFF" }),
677
- /* @__PURE__ */ jsx("path", { d: "M1.47217 14.1714H14.5282V16.0002H1.47217V14.1714Z", fill: "#00C5FF" }),
678
- /* @__PURE__ */ jsx("path", { d: "M1.47217 0H8.93297V1.8288H1.47217V0Z", fill: "#FFF152" }),
679
- /* @__PURE__ */ jsx(
680
- "path",
681
- {
682
- d: "M12.663 3.6568V1.8288H10.7974V0H8.93262V5.4856H14.5278V3.6568",
683
- fill: "#FF5B5B"
684
- }
685
- ),
686
- /* @__PURE__ */ jsx("path", { d: "M12.6631 7.31464V5.48584H14.5279", fill: "#551C99" }),
687
- /* @__PURE__ */ jsx(
688
- "path",
689
- {
690
- clipRule: "evenodd",
691
- d: "M8.93298 0V1.8288H7.06738",
692
- fill: "#999131",
693
- fillRule: "evenodd"
694
- }
695
- )
696
- ] }),
697
- /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "clip0_4197_15218", children: /* @__PURE__ */ jsx("rect", { fill: "white", height: "16", width: "16" }) }) })
720
+ /* @__PURE__ */ jsx("rect", { fill: "black", height: "16", rx: "8", width: "16" }),
721
+ /* @__PURE__ */ jsx(
722
+ "path",
723
+ {
724
+ clipRule: "evenodd",
725
+ d: "M5.27976 4.40015H10.7206V11.5999H5.2793L5.27976 4.40015Z",
726
+ fill: "black",
727
+ fillRule: "evenodd"
728
+ }
729
+ ),
730
+ /* @__PURE__ */ jsx("path", { d: "M4.19189 4.1333H5.27969V11.8669H4.19189V4.1333Z", fill: "#04FF8E" }),
731
+ /* @__PURE__ */ jsx("path", { d: "M10.7202 6.26685H11.808V11.8668H10.7202V6.26685Z", fill: "#8E2EFF" }),
732
+ /* @__PURE__ */ jsx("path", { d: "M4.19189 11.5999H11.8079V12.6667H4.19189V11.5999Z", fill: "#00C5FF" }),
733
+ /* @__PURE__ */ jsx("path", { d: "M4.19189 3.33325H8.54403V4.40005H4.19189V3.33325Z", fill: "#FFF152" }),
734
+ /* @__PURE__ */ jsx(
735
+ "path",
736
+ {
737
+ d: "M10.72 5.46638V4.40005H9.63174V3.33325H8.54395V6.53318H11.8078V5.46638",
738
+ fill: "#FF5B5B"
739
+ }
740
+ ),
741
+ /* @__PURE__ */ jsx("path", { d: "M10.7202 7.6V6.5332H11.808", fill: "#551C99" }),
742
+ /* @__PURE__ */ jsx(
743
+ "path",
744
+ {
745
+ clipRule: "evenodd",
746
+ d: "M8.54432 3.33325V4.40005H7.45605",
747
+ fill: "#999131",
748
+ fillRule: "evenodd"
749
+ }
750
+ )
698
751
  ]
699
752
  }
700
753
  );
@@ -708,7 +761,7 @@ const PlayButton = ({ className, isPlaying, ...props }) => /* @__PURE__ */ jsx(
708
761
  size: "sm",
709
762
  variant: "secondary",
710
763
  ...props,
711
- children: isPlaying ? /* @__PURE__ */ jsx(IconPause, {}) : /* @__PURE__ */ jsx(IconPlaySolid, {})
764
+ children: isPlaying ? /* @__PURE__ */ jsx(IconPauseFill, {}) : /* @__PURE__ */ jsx(IconPlayFill, {})
712
765
  }
713
766
  );
714
767
  const Anonymous$b = "Anonym";
@@ -7232,10 +7285,10 @@ function requireRelativeTime() {
7232
7285
  function i(r2, t2, e2, o2) {
7233
7286
  return n.fromToBase(r2, t2, e2, o2);
7234
7287
  }
7235
- e.en.relativeTime = o, n.fromToBase = function(t2, n2, i2, d10, u2) {
7288
+ e.en.relativeTime = o, n.fromToBase = function(t2, n2, i2, d2, u2) {
7236
7289
  for (var a, f, s, l = i2.$locale().relativeTime || o, h = r.thresholds || [{ l: "s", r: 44, d: "second" }, { l: "m", r: 89 }, { l: "mm", r: 44, d: "minute" }, { l: "h", r: 89 }, { l: "hh", r: 21, d: "hour" }, { l: "d", r: 35 }, { l: "dd", r: 25, d: "day" }, { l: "M", r: 45 }, { l: "MM", r: 10, d: "month" }, { l: "y", r: 17 }, { l: "yy", d: "year" }], m = h.length, c = 0; c < m; c += 1) {
7237
7290
  var y = h[c];
7238
- y.d && (a = d10 ? e(t2).diff(i2, y.d, true) : i2.diff(t2, y.d, true));
7291
+ y.d && (a = d2 ? e(t2).diff(i2, y.d, true) : i2.diff(t2, y.d, true));
7239
7292
  var p = (r.rounding || Math.round)(Math.abs(a));
7240
7293
  if (s = a > 0, p <= y.r || !y.r) {
7241
7294
  p <= 1 && c > 0 && (y = h[c - 1]);
@@ -7730,7 +7783,7 @@ class NotificationTranslationTopic extends TranslationTopic {
7730
7783
  }
7731
7784
  }
7732
7785
  var de$1 = { exports: {} };
7733
- var de2 = de$1.exports;
7786
+ var de = de$1.exports;
7734
7787
  var hasRequiredDe;
7735
7788
  function requireDe() {
7736
7789
  if (hasRequiredDe) return de$1.exports;
@@ -7738,7 +7791,7 @@ function requireDe() {
7738
7791
  (function(module, exports$1) {
7739
7792
  !(function(e, n) {
7740
7793
  module.exports = n(Dayjs);
7741
- })(de2, function(e) {
7794
+ })(de, function(e) {
7742
7795
  e = e && e.hasOwnProperty("default") ? e.default : e;
7743
7796
  var n = { s: "ein paar Sekunden", m: ["eine Minute", "einer Minute"], mm: "%d Minuten", h: ["eine Stunde", "einer Stunde"], hh: "%d Stunden", d: ["ein Tag", "einem Tag"], dd: ["%d Tage", "%d Tagen"], M: ["ein Monat", "einem Monat"], MM: ["%d Monate", "%d Monaten"], y: ["ein Jahr", "einem Jahr"], yy: ["%d Jahre", "%d Jahren"] };
7744
7797
  function t(e2, t2, a2) {
@@ -8447,7 +8500,7 @@ const LoadingChannels = () => /* @__PURE__ */ jsxs("div", { className: "str-chat
8447
8500
  /* @__PURE__ */ jsx(LoadingItems, {}),
8448
8501
  /* @__PURE__ */ jsx(LoadingItems, {})
8449
8502
  ] });
8450
- const LoadingIndicator = (props) => /* @__PURE__ */ jsx(IconLoadingCircle, { ...props, className: "str-chat__loading-indicator" });
8503
+ const LoadingIndicator = (props) => /* @__PURE__ */ jsx(IconLoading, { ...props, className: "str-chat__loading-indicator" });
8451
8504
  const UnMemoizedCustomNotification = (props) => {
8452
8505
  const { active, children, className, type } = props;
8453
8506
  if (!active) return null;
@@ -9037,6 +9090,7 @@ function useDialogAnchor({
9037
9090
  setPopperElement(null);
9038
9091
  }
9039
9092
  return {
9093
+ placement: stabilisedChosenPlacement ?? chosenPlacement,
9040
9094
  setPopperElement,
9041
9095
  styles: {
9042
9096
  left: x ?? 0,
@@ -9049,6 +9103,8 @@ const DialogAnchor = ({
9049
9103
  allowFlip = true,
9050
9104
  children,
9051
9105
  className,
9106
+ closeOnClickOutside,
9107
+ closeTransitionMs = 0,
9052
9108
  dialogManagerId,
9053
9109
  focus = true,
9054
9110
  id,
@@ -9061,12 +9117,44 @@ const DialogAnchor = ({
9061
9117
  updatePositionOnContentResize,
9062
9118
  ...restDivProps
9063
9119
  }) => {
9064
- const dialog = useDialog({ dialogManagerId, id });
9120
+ const dialog = useDialog({ closeOnClickOutside, dialogManagerId, id });
9065
9121
  const open = useDialogIsOpen(id, dialogManagerId);
9066
- const { setPopperElement, styles } = useDialogAnchor({
9122
+ const [shouldRender, setShouldRender] = useState(open);
9123
+ const closeTimeoutRef = useRef(null);
9124
+ const isClosing = !open && shouldRender;
9125
+ useEffect(() => {
9126
+ if (open) {
9127
+ setShouldRender(true);
9128
+ if (closeTimeoutRef.current) {
9129
+ clearTimeout(closeTimeoutRef.current);
9130
+ closeTimeoutRef.current = null;
9131
+ }
9132
+ return;
9133
+ }
9134
+ if (!shouldRender) return;
9135
+ if (!closeTransitionMs) {
9136
+ setShouldRender(false);
9137
+ return;
9138
+ }
9139
+ closeTimeoutRef.current = setTimeout(() => {
9140
+ setShouldRender(false);
9141
+ closeTimeoutRef.current = null;
9142
+ }, closeTransitionMs);
9143
+ }, [closeTransitionMs, open, shouldRender]);
9144
+ useEffect(
9145
+ () => () => {
9146
+ if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);
9147
+ },
9148
+ []
9149
+ );
9150
+ const {
9151
+ placement: chosenPlacement,
9152
+ setPopperElement,
9153
+ styles
9154
+ } = useDialogAnchor({
9067
9155
  allowFlip,
9068
9156
  offset,
9069
- open,
9157
+ open: shouldRender,
9070
9158
  placement,
9071
9159
  referenceElement,
9072
9160
  updateKey,
@@ -9083,7 +9171,7 @@ const DialogAnchor = ({
9083
9171
  document.removeEventListener("keyup", hideOnEscape);
9084
9172
  };
9085
9173
  }, [dialog, open]);
9086
- if (!open) {
9174
+ if (!shouldRender) {
9087
9175
  return null;
9088
9176
  }
9089
9177
  return /* @__PURE__ */ jsx(DialogPortalEntry, { dialogId: id, dialogManagerId, children: /* @__PURE__ */ jsx(FocusScope, { autoFocus: focus, contain: trapFocus, restoreFocus: true, children: /* @__PURE__ */ jsx(
@@ -9091,6 +9179,8 @@ const DialogAnchor = ({
9091
9179
  {
9092
9180
  ...restDivProps,
9093
9181
  className: clsx("str-chat__dialog-contents", className),
9182
+ "data-str-chat-dialog-state": isClosing ? "closing" : "open",
9183
+ "data-str-chat-placement": chosenPlacement,
9094
9184
  "data-testid": "str-chat__dialog-contents",
9095
9185
  ref: setPopperElement,
9096
9186
  style: styles,
@@ -9122,7 +9212,7 @@ const DefaultCalloutDialog = ({ children, className, onClose }) => /* @__PURE__
9122
9212
  onClick: onClose,
9123
9213
  size: "sm",
9124
9214
  variant: "secondary",
9125
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
9215
+ children: /* @__PURE__ */ jsx(IconXmark, {})
9126
9216
  }
9127
9217
  )
9128
9218
  ] });
@@ -9192,7 +9282,7 @@ const Avatar = ({
9192
9282
  }
9193
9283
  ) : /* @__PURE__ */ jsxs(Fragment, { children: [
9194
9284
  !!sizeAwareInitials.length && /* @__PURE__ */ jsx("div", { className: "str-chat__avatar-initials", "data-testid": "avatar-fallback", children: sizeAwareInitials }),
9195
- !sizeAwareInitials.length && /* @__PURE__ */ jsx(IconPeople, {})
9285
+ !sizeAwareInitials.length && /* @__PURE__ */ jsx(IconUser, {})
9196
9286
  ] })
9197
9287
  ]
9198
9288
  }
@@ -9221,7 +9311,7 @@ const ErrorBadge = ({
9221
9311
  className,
9222
9312
  size = "sm",
9223
9313
  ...rest
9224
- }) => /* @__PURE__ */ jsx(Badge, { ...rest, className, size, variant: "error", children: /* @__PURE__ */ jsx(IconExclamation, {}) });
9314
+ }) => /* @__PURE__ */ jsx(Badge, { ...rest, className, size, variant: "error", children: /* @__PURE__ */ jsx(IconExclamationMarkFill, {}) });
9225
9315
  function AvatarStack({
9226
9316
  badgeSize,
9227
9317
  component: Component2 = "div",
@@ -9433,16 +9523,152 @@ const EmojiContextMenuButton = ({
9433
9523
  ]
9434
9524
  }
9435
9525
  );
9436
- const ContextMenuButton = ({
9437
- onBlur,
9438
- onFocus,
9439
- ...props
9526
+ const ContextMenuButtonWithSubmenu = ({
9527
+ children,
9528
+ className,
9529
+ Submenu,
9530
+ submenuContainerProps,
9531
+ submenuPlacement = "right-start",
9532
+ submenuRollAxis = "x",
9533
+ ...buttonProps
9440
9534
  }) => {
9535
+ const { className: submenuClassName, ...submenuContainerRestProps } = submenuContainerProps ?? {};
9536
+ const buttonRef = useRef(null);
9537
+ const [dialogContainer, setDialogContainer] = useState(null);
9538
+ const keepSubmenuOpenFlag = useRef(false);
9539
+ const dialogCloseTimeout = useRef(null);
9540
+ const dialogId2 = useMemo(() => `submenu-${Math.random().toString(36).slice(2)}`, []);
9541
+ const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
9542
+ const dialogIsOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
9543
+ const {
9544
+ placement: chosenPlacement,
9545
+ setPopperElement,
9546
+ styles
9547
+ } = useDialogAnchor({
9548
+ open: dialogIsOpen,
9549
+ placement: submenuPlacement,
9550
+ referenceElement: buttonRef.current
9551
+ });
9552
+ const closeDialogLazily = useCallback(() => {
9553
+ if (dialogCloseTimeout.current) clearTimeout(dialogCloseTimeout.current);
9554
+ dialogCloseTimeout.current = setTimeout(() => {
9555
+ if (keepSubmenuOpenFlag.current) return;
9556
+ dialog.close();
9557
+ }, 100);
9558
+ }, [dialog]);
9559
+ const keepSubmenuOpen = useCallback(() => {
9560
+ keepSubmenuOpenFlag.current = true;
9561
+ }, []);
9562
+ const allowToCloseSubmenu = useCallback(() => {
9563
+ keepSubmenuOpenFlag.current = false;
9564
+ }, []);
9565
+ const closeSubmenu = useCallback(() => {
9566
+ allowToCloseSubmenu();
9567
+ closeDialogLazily();
9568
+ }, [allowToCloseSubmenu, closeDialogLazily]);
9569
+ const handleClose = useCallback(
9570
+ (event) => {
9571
+ const parentButton = buttonRef.current;
9572
+ if (!dialogIsOpen || !parentButton) return;
9573
+ event.stopPropagation();
9574
+ closeDialogLazily();
9575
+ parentButton.focus();
9576
+ },
9577
+ [closeDialogLazily, dialogIsOpen, buttonRef]
9578
+ );
9579
+ const handleFocusParentButton = () => {
9580
+ if (dialogIsOpen) return;
9581
+ dialog.open();
9582
+ keepSubmenuOpen();
9583
+ };
9584
+ useEffect(() => {
9585
+ const parentButton = buttonRef.current;
9586
+ if (!dialogIsOpen || !parentButton) return;
9587
+ const hideOnEscape = (event) => {
9588
+ if (event.key !== "Escape") return;
9589
+ handleClose(event);
9590
+ closeSubmenu();
9591
+ };
9592
+ document.addEventListener("keyup", hideOnEscape, { capture: true });
9593
+ return () => {
9594
+ document.removeEventListener("keyup", hideOnEscape, { capture: true });
9595
+ };
9596
+ }, [dialogIsOpen, handleClose, closeSubmenu]);
9597
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
9598
+ /* @__PURE__ */ jsx(
9599
+ BaseContextMenuButton,
9600
+ {
9601
+ "aria-selected": "false",
9602
+ className: clsx(className, "str_chat__button-with-submenu", {
9603
+ "str_chat__button-with-submenu--submenu-open": dialogIsOpen
9604
+ }),
9605
+ hasSubMenu: true,
9606
+ onBlur: closeSubmenu,
9607
+ onClick: (event) => {
9608
+ event.stopPropagation();
9609
+ dialog.toggle();
9610
+ },
9611
+ onFocus: handleFocusParentButton,
9612
+ onMouseEnter: handleFocusParentButton,
9613
+ onMouseLeave: closeSubmenu,
9614
+ role: "option",
9615
+ ...buttonProps,
9616
+ ref: buttonRef,
9617
+ children
9618
+ }
9619
+ ),
9620
+ dialogIsOpen && /* @__PURE__ */ jsx(
9621
+ "div",
9622
+ {
9623
+ className: clsx("str-chat__context-menu__submenu-container", submenuClassName),
9624
+ "data-str-chat-placement": chosenPlacement,
9625
+ "data-str-chat-roll-axis": submenuRollAxis,
9626
+ onBlur: (event) => {
9627
+ const isBlurredDescendant = event.relatedTarget instanceof Node && dialogContainer?.contains(event.relatedTarget);
9628
+ if (isBlurredDescendant) return;
9629
+ closeSubmenu();
9630
+ },
9631
+ onFocus: keepSubmenuOpen,
9632
+ onMouseEnter: keepSubmenuOpen,
9633
+ onMouseLeave: closeSubmenu,
9634
+ ref: (element) => {
9635
+ setPopperElement(element);
9636
+ setDialogContainer(element);
9637
+ },
9638
+ style: styles,
9639
+ tabIndex: -1,
9640
+ ...submenuContainerRestProps,
9641
+ children: /* @__PURE__ */ jsx(Submenu, {})
9642
+ }
9643
+ )
9644
+ ] });
9645
+ };
9646
+ const ContextMenuButton = (props) => {
9647
+ const {
9648
+ Submenu,
9649
+ submenuContainerProps,
9650
+ submenuPlacement,
9651
+ submenuRollAxis,
9652
+ ...buttonProps
9653
+ } = props;
9441
9654
  const [isFocused, setIsFocused] = useState(false);
9655
+ if (Submenu) {
9656
+ return /* @__PURE__ */ jsx(
9657
+ ContextMenuButtonWithSubmenu,
9658
+ {
9659
+ ...buttonProps,
9660
+ Submenu,
9661
+ submenuContainerProps,
9662
+ submenuPlacement,
9663
+ submenuRollAxis
9664
+ }
9665
+ );
9666
+ }
9667
+ const { onBlur, onFocus, ...baseButtonProps } = buttonProps;
9442
9668
  return /* @__PURE__ */ jsx(
9443
9669
  BaseContextMenuButton,
9444
9670
  {
9445
- ...props,
9671
+ ...baseButtonProps,
9446
9672
  "aria-selected": isFocused ? "true" : "false",
9447
9673
  onBlur: (e) => {
9448
9674
  setIsFocused(false);
@@ -9491,12 +9717,14 @@ function ContextMenuContent({
9491
9717
  backLabel = "Back",
9492
9718
  children,
9493
9719
  className,
9720
+ enableAnimations = true,
9494
9721
  Header: Header2,
9495
9722
  items,
9496
9723
  ItemsWrapper,
9497
9724
  menuClassName,
9498
9725
  onClose,
9499
9726
  onMenuLevelChange,
9727
+ transitionDirection,
9500
9728
  ...props
9501
9729
  }) {
9502
9730
  const rootLevel = useMemo(
@@ -9509,6 +9737,7 @@ function ContextMenuContent({
9509
9737
  [Header2, items, ItemsWrapper, menuClassName]
9510
9738
  );
9511
9739
  const [menuStack, setMenuStack] = useState(() => [rootLevel]);
9740
+ const [menuBodyAnimationKey, setMenuBodyAnimationKey] = useState(0);
9512
9741
  const activeMenu = menuStack[menuStack.length - 1];
9513
9742
  const ActiveMenuItemsWrapper = activeMenu.ItemsWrapper ?? React.Fragment;
9514
9743
  const closeMenu = useCallback(() => {
@@ -9532,10 +9761,9 @@ function ContextMenuContent({
9532
9761
  [ItemsWrapper]
9533
9762
  );
9534
9763
  const returnToParentMenu = useCallback(() => {
9535
- setMenuStack(
9536
- (current) => current.length > 1 ? current.slice(0, current.length - 1) : current
9537
- );
9538
- }, []);
9764
+ if (menuStack.length <= 1) return;
9765
+ setMenuStack((current) => current.slice(0, current.length - 1));
9766
+ }, [menuStack.length]);
9539
9767
  useEffect(() => {
9540
9768
  setMenuStack((current) => {
9541
9769
  if (current.length === 1 && current[0] === rootLevel) return current;
@@ -9545,42 +9773,116 @@ function ContextMenuContent({
9545
9773
  useEffect(() => {
9546
9774
  onMenuLevelChange?.(menuStack.length);
9547
9775
  }, [menuStack.length, onMenuLevelChange]);
9548
- return /* @__PURE__ */ jsx(ContextMenuContext.Provider, { value: { closeMenu, openSubmenu, returnToParentMenu }, children: /* @__PURE__ */ jsxs(ContextMenuRoot, { className: clsx(className, activeMenu.menuClassName), ...props, children: [
9549
- activeMenu.Header ? /* @__PURE__ */ jsx(activeMenu.Header, {}) : menuStack.length > 1 ? /* @__PURE__ */ jsx(ContextMenuHeader, { children: /* @__PURE__ */ jsxs(ContextMenuBackButton, { onClick: returnToParentMenu, children: [
9550
- /* @__PURE__ */ jsx(IconChevronLeft, {}),
9551
- /* @__PURE__ */ jsx("span", { children: backLabel })
9552
- ] }) }) : null,
9553
- /* @__PURE__ */ jsx(ContextMenuBody, { children: activeMenu.Submenu ? /* @__PURE__ */ jsx(activeMenu.Submenu, {}) : /* @__PURE__ */ jsx(ActiveMenuItemsWrapper, { children: typeof children !== "undefined" ? children : activeMenu.items?.map((Item2, index) => /* @__PURE__ */ jsx(Item2, {}, `context-menu-item-${index}`)) }) })
9554
- ] }) });
9776
+ useEffect(() => {
9777
+ if (!transitionDirection) return;
9778
+ setMenuBodyAnimationKey((value) => value + 1);
9779
+ }, [transitionDirection, menuStack.length]);
9780
+ return /* @__PURE__ */ jsx(ContextMenuContext.Provider, { value: { closeMenu, openSubmenu, returnToParentMenu }, children: /* @__PURE__ */ jsxs(
9781
+ ContextMenuRoot,
9782
+ {
9783
+ className: clsx(className, activeMenu.menuClassName),
9784
+ "data-str-chat-enable-animations": enableAnimations,
9785
+ ...props,
9786
+ children: [
9787
+ activeMenu.Header ? /* @__PURE__ */ jsx(activeMenu.Header, {}) : menuStack.length > 1 ? /* @__PURE__ */ jsx(ContextMenuHeader, { children: /* @__PURE__ */ jsxs(ContextMenuBackButton, { onClick: returnToParentMenu, children: [
9788
+ /* @__PURE__ */ jsx(IconChevronLeft, {}),
9789
+ /* @__PURE__ */ jsx("span", { children: backLabel })
9790
+ ] }) }) : null,
9791
+ /* @__PURE__ */ jsx(
9792
+ ContextMenuBody,
9793
+ {
9794
+ className: clsx({
9795
+ "str-chat__context-menu__body--submenu-backward": transitionDirection === "backward",
9796
+ "str-chat__context-menu__body--submenu-forward": transitionDirection === "forward"
9797
+ }),
9798
+ children: activeMenu.Submenu ? /* @__PURE__ */ jsx(activeMenu.Submenu, {}) : /* @__PURE__ */ jsx(ActiveMenuItemsWrapper, { children: typeof children !== "undefined" ? children : activeMenu.items?.map((Item2, index) => /* @__PURE__ */ jsx(Item2, {}, `context-menu-item-${index}`)) })
9799
+ },
9800
+ `context-menu-body-${menuStack.length}-${menuBodyAnimationKey}`
9801
+ )
9802
+ ]
9803
+ }
9804
+ ) });
9555
9805
  }
9556
9806
  const ContextMenu = (props) => {
9807
+ const { ContextMenuContent: ContextMenuContentComponent = ContextMenuContent } = useComponentContext();
9557
9808
  const {
9558
9809
  allowFlip,
9810
+ closeOnClickOutside,
9811
+ closeTransitionMs = 130,
9559
9812
  dialogManagerId,
9560
9813
  focus,
9561
9814
  id,
9562
9815
  placement,
9563
9816
  referenceElement,
9817
+ submenuTransitionDurationMs,
9564
9818
  tabIndex,
9565
9819
  trapFocus,
9566
9820
  ...menuProps
9567
9821
  } = props;
9822
+ const resolvedSubmenuTransitionDurationMs = submenuTransitionDurationMs ?? 460;
9568
9823
  const isAnchored = id != null;
9569
9824
  const [menuLevel, setMenuLevel] = useState(1);
9825
+ const [transitionDirection, setTransitionDirection] = useState(void 0);
9826
+ const [contentResetToken, setContentResetToken] = useState(0);
9827
+ const transitionTimeoutRef = useRef(null);
9828
+ const previousMenuLevelRef = useRef(1);
9570
9829
  const open = useDialogIsOpen(id ?? "", dialogManagerId);
9830
+ const previousOpenRef = useRef(open);
9571
9831
  useEffect(() => {
9572
- if (isAnchored && !open) setMenuLevel(1);
9832
+ if (!isAnchored) return;
9833
+ if (previousOpenRef.current && !open) {
9834
+ setMenuLevel(1);
9835
+ setTransitionDirection(void 0);
9836
+ setContentResetToken((value) => value + 1);
9837
+ previousMenuLevelRef.current = 1;
9838
+ if (transitionTimeoutRef.current) {
9839
+ clearTimeout(transitionTimeoutRef.current);
9840
+ transitionTimeoutRef.current = null;
9841
+ }
9842
+ }
9843
+ previousOpenRef.current = open;
9573
9844
  }, [isAnchored, open]);
9574
- const content = /* @__PURE__ */ jsx(
9575
- ContextMenuContent,
9845
+ useEffect(
9846
+ () => () => {
9847
+ if (transitionTimeoutRef.current) {
9848
+ clearTimeout(transitionTimeoutRef.current);
9849
+ }
9850
+ },
9851
+ []
9852
+ );
9853
+ const handleMenuLevelChange = useCallback(
9854
+ (level) => {
9855
+ if (isAnchored) {
9856
+ const previousLevel = previousMenuLevelRef.current;
9857
+ if (level !== previousLevel) {
9858
+ setTransitionDirection(level > previousLevel ? "forward" : "backward");
9859
+ if (transitionTimeoutRef.current) clearTimeout(transitionTimeoutRef.current);
9860
+ transitionTimeoutRef.current = setTimeout(() => {
9861
+ setTransitionDirection(void 0);
9862
+ transitionTimeoutRef.current = null;
9863
+ }, resolvedSubmenuTransitionDurationMs);
9864
+ }
9865
+ previousMenuLevelRef.current = level;
9866
+ setMenuLevel(level);
9867
+ return;
9868
+ }
9869
+ menuProps.onMenuLevelChange?.(level);
9870
+ },
9871
+ [isAnchored, menuProps, resolvedSubmenuTransitionDurationMs]
9872
+ );
9873
+ const content = /* @__PURE__ */ createElement(
9874
+ ContextMenuContentComponent,
9576
9875
  {
9577
9876
  ...menuProps,
9578
- onMenuLevelChange: isAnchored ? setMenuLevel : menuProps.onMenuLevelChange
9877
+ key: `context-menu-content-${contentResetToken}`,
9878
+ onMenuLevelChange: handleMenuLevelChange,
9879
+ transitionDirection
9579
9880
  }
9580
9881
  );
9581
9882
  if (isAnchored) {
9582
9883
  const {
9583
9884
  backLabel: _b,
9885
+ enableAnimations: _ea,
9584
9886
  Header: _h,
9585
9887
  items: _i,
9586
9888
  ItemsWrapper: _w,
@@ -9593,6 +9895,8 @@ const ContextMenu = (props) => {
9593
9895
  DialogAnchor,
9594
9896
  {
9595
9897
  allowFlip,
9898
+ closeOnClickOutside,
9899
+ closeTransitionMs,
9596
9900
  dialogManagerId,
9597
9901
  focus,
9598
9902
  id,
@@ -9623,7 +9927,7 @@ const PromptHeader = ({ className, close, description, title }) => /* @__PURE__
9623
9927
  onClick: close,
9624
9928
  size: "sm",
9625
9929
  variant: "secondary",
9626
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
9930
+ children: /* @__PURE__ */ jsx(IconXmark, {})
9627
9931
  }
9628
9932
  )
9629
9933
  ] });
@@ -9692,7 +9996,7 @@ const ViewerHeader = ({
9692
9996
  onClick: close,
9693
9997
  size: "sm",
9694
9998
  variant: "secondary",
9695
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
9999
+ children: /* @__PURE__ */ jsx(IconXmark, {})
9696
10000
  }
9697
10001
  )
9698
10002
  ] });
@@ -9829,7 +10133,7 @@ function MessageBouncePrompt({ children }) {
9829
10133
  Alert.Header,
9830
10134
  {
9831
10135
  className: "str-chat__message-bounce-alert-header",
9832
- Icon: IconExclamationCircle,
10136
+ Icon: IconExclamationMark,
9833
10137
  title: !children ? t("This message did not meet our content guidelines") : void 0,
9834
10138
  children
9835
10139
  }
@@ -9880,7 +10184,7 @@ const MessageBubble = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
9880
10184
  const MessageDeletedBubble = () => {
9881
10185
  const { t } = useTranslationContext();
9882
10186
  return /* @__PURE__ */ jsx(MessageBubble, { "data-testid": "message-deleted-bubble", children: /* @__PURE__ */ jsxs("div", { className: "str-chat__message-text", children: [
9883
- /* @__PURE__ */ jsx(IconCircleBanSign, {}),
10187
+ /* @__PURE__ */ jsx(IconNoSign, {}),
9884
10188
  /* @__PURE__ */ jsx("span", { children: t("Message deleted") })
9885
10189
  ] }) });
9886
10190
  };
@@ -9930,7 +10234,9 @@ const useBaseMessageActionSetFilter = (messageActionSet, disable = false) => {
9930
10234
  if (isBounced || isInitialMessage || // not sure whether this thing even works anymore
9931
10235
  !message.type || message.type === "system" || message.type === "ephemeral" || message.status === "sending")
9932
10236
  return [];
9933
- return messageActionSet.filter(({ type }) => {
10237
+ return messageActionSet.filter((action) => {
10238
+ if (action.placement === "quick-dropdown-toggle") return true;
10239
+ const type = action.type;
9934
10240
  if (ACTIONS_NOT_WORKING_IN_THREAD.includes(type) && isMessageThreadReply)
9935
10241
  return false;
9936
10242
  if (message.error) {
@@ -10021,7 +10327,7 @@ const MessageAlsoSentInChannelIndicator = () => {
10021
10327
  };
10022
10328
  if (!message?.show_in_channel) return null;
10023
10329
  return /* @__PURE__ */ jsxs("div", { className: "str-chat__message-also-sent-in-channel", role: "status", children: [
10024
- /* @__PURE__ */ jsx(IconArrowRightUp, {}),
10330
+ /* @__PURE__ */ jsx(IconArrowUpRight, {}),
10025
10331
  /* @__PURE__ */ jsx("span", { children: threadList ? t("Also sent in channel") : t("Replied to a thread") }),
10026
10332
  /* @__PURE__ */ jsx("span", { children: " · " }),
10027
10333
  /* @__PURE__ */ jsx(
@@ -10235,7 +10541,7 @@ const UnMemoizedMessageStatus = (props) => {
10235
10541
  children: t("Delivered")
10236
10542
  }
10237
10543
  ),
10238
- /* @__PURE__ */ jsx(IconDoubleCheckmark1Small, { className: "str-chat__message-status-delivered" })
10544
+ /* @__PURE__ */ jsx(IconChecks, { className: "str-chat__message-status-delivered" })
10239
10545
  ] })),
10240
10546
  read && (MessageReadStatus ? /* @__PURE__ */ jsx(MessageReadStatus, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
10241
10547
  /* @__PURE__ */ jsx(
@@ -10247,7 +10553,7 @@ const UnMemoizedMessageStatus = (props) => {
10247
10553
  children: getReadByTooltipText(readBy, t, client, tooltipUserNameMapper)
10248
10554
  }
10249
10555
  ),
10250
- /* @__PURE__ */ jsx(IconDoubleCheckmark1Small, { className: "str-chat__message-status-read" }),
10556
+ /* @__PURE__ */ jsx(IconChecks, { className: "str-chat__message-status-read" }),
10251
10557
  readersWithoutOwnUser.length > 1 && /* @__PURE__ */ jsx(
10252
10558
  "span",
10253
10559
  {
@@ -10277,14 +10583,14 @@ const matchMarkdownLinks = (message) => {
10277
10583
  const regexMdLinks = /\[([^[]+)\](\(.*\))/gm;
10278
10584
  const matches = message.match(regexMdLinks);
10279
10585
  const singleMatch = /\[([^[]+)\]\((.*)\)/;
10280
- const links = matches ? matches.map((match2) => {
10281
- const i = singleMatch.exec(match2);
10586
+ const links = matches ? matches.map((match) => {
10587
+ const i = singleMatch.exec(match);
10282
10588
  return i && [i[1], i[2]];
10283
10589
  }) : [];
10284
10590
  return links.flat();
10285
10591
  };
10286
10592
  const emojiMarkdownPlugin = () => {
10287
- const replace = (match2) => u("element", { properties: {}, tagName: "emoji" }, [u("text", match2)]);
10593
+ const replace = (match) => u("element", { properties: {}, tagName: "emoji" }, [u("text", match)]);
10288
10594
  const transform2 = (node) => findAndReplace(node, [emojiRegex(), replace]);
10289
10595
  return transform2;
10290
10596
  };
@@ -10294,13 +10600,13 @@ const mentionsMarkdownPlugin = (mentioned_users) => () => {
10294
10600
  mentioned_usernames.map((username) => `@${username}`).join("|"),
10295
10601
  "g"
10296
10602
  );
10297
- const replace = (match2) => {
10298
- const usernameOrId = match2.replace("@", "");
10603
+ const replace = (match) => {
10604
+ const usernameOrId = match.replace("@", "");
10299
10605
  const user = mentioned_users.find(
10300
10606
  ({ id, name }) => name === usernameOrId || id === usernameOrId
10301
10607
  );
10302
10608
  return u("element", { mentionedUser: user, properties: {}, tagName: "mention" }, [
10303
- u("text", match2)
10609
+ u("text", match)
10304
10610
  ]);
10305
10611
  };
10306
10612
  const transform2 = (tree) => {
@@ -10405,12 +10711,12 @@ const plusPlusToEmphasis = () => {
10405
10711
  if (node.type !== "text" || parent == null || typeof index !== "number") return;
10406
10712
  const value = node.value;
10407
10713
  INS_REGEX.lastIndex = 0;
10408
- let match2;
10714
+ let match;
10409
10715
  let last = 0;
10410
10716
  const out = [];
10411
- while (match2 = INS_REGEX.exec(value)) {
10412
- const [full, inner] = match2;
10413
- const start = match2.index;
10717
+ while (match = INS_REGEX.exec(value)) {
10718
+ const [full, inner] = match;
10719
+ const start = match.index;
10414
10720
  if (start > last) out.push({ type: "text", value: value.slice(last, start) });
10415
10721
  out.push({
10416
10722
  children: [{ type: "text", value: inner }],
@@ -11739,7 +12045,7 @@ const ImagePlaceholder = ({ className }) => {
11739
12045
  className: clsx("str-chat__image-placeholder", className),
11740
12046
  "data-testid": "str-chat__base-image-placeholder",
11741
12047
  role: "img",
11742
- children: /* @__PURE__ */ jsx(IconImages1Alt, {})
12048
+ children: /* @__PURE__ */ jsx(IconImage, {})
11743
12049
  }
11744
12050
  );
11745
12051
  };
@@ -11838,6 +12144,7 @@ const toBaseImageDescriptors = (attachment, options = {}) => {
11838
12144
  title: attachment.title
11839
12145
  };
11840
12146
  }
12147
+ return void 0;
11841
12148
  };
11842
12149
  const BASE_FILE_ICON_CLASSNAME = "str-chat__file-icon";
11843
12150
  const FILE_ICON_GRAPHIC_CLASSNAME = "str-chat__file-icon__graphic";
@@ -12800,16 +13107,16 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
12800
13107
  };
12801
13108
  if (!groupedAttachments.total) return result;
12802
13109
  if (groupedAttachments.polls.length > 0)
12803
- return { ...result, Icon: IconChart5, previewType: "poll" };
13110
+ return { ...result, Icon: IconPoll, previewType: "poll" };
12804
13111
  if (groupedAttachments.locations.length > 0)
12805
- return { ...result, Icon: IconMapPin, previewType: "location" };
13112
+ return { ...result, Icon: IconLocation, previewType: "location" };
12806
13113
  if (groupedAttachments.giphies.length > 0 && groupedAttachments.giphies.length === groupedAttachments.total) {
12807
13114
  const giphyAttachment = groupedAttachments.giphies[0];
12808
13115
  const giphyVersion = giphyAttachment.giphy?.[giphyVersionName];
12809
13116
  const src = giphyVersion?.url || giphyAttachment.thumb_url || giphyAttachment.image_url || "";
12810
13117
  return {
12811
13118
  ...result,
12812
- Icon: IconFileBend,
13119
+ Icon: IconFile,
12813
13120
  PreviewImage: /* @__PURE__ */ jsx(
12814
13121
  BaseImage,
12815
13122
  {
@@ -12826,7 +13133,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
12826
13133
  const fileAttachment = groupedAttachments.documents[0];
12827
13134
  return {
12828
13135
  ...result,
12829
- Icon: IconFileBend,
13136
+ Icon: IconFile,
12830
13137
  PreviewImage: /* @__PURE__ */ jsx(FileIcon, { fileName: fileAttachment.title, mimeType: fileAttachment.mime_type }),
12831
13138
  previewType: "file"
12832
13139
  };
@@ -12835,7 +13142,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
12835
13142
  const linkAttachment = groupedAttachments.links[0];
12836
13143
  return {
12837
13144
  ...result,
12838
- Icon: IconChainLink,
13145
+ Icon: IconLink,
12839
13146
  PreviewImage: /* @__PURE__ */ jsx(
12840
13147
  BaseImage,
12841
13148
  {
@@ -12863,7 +13170,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
12863
13170
  title: videoAttachment.title
12864
13171
  }
12865
13172
  ),
12866
- /* @__PURE__ */ jsx("div", { className: "str-chat__attachment-preview__thumbnail__play-indicator", children: /* @__PURE__ */ jsx(IconPlaySolid, {}) })
13173
+ /* @__PURE__ */ jsx("div", { className: "str-chat__attachment-preview__thumbnail__play-indicator", children: /* @__PURE__ */ jsx(IconPlayFill, {}) })
12867
13174
  ] }),
12868
13175
  previewType: "video"
12869
13176
  };
@@ -12872,7 +13179,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
12872
13179
  const imageAttachment = groupedAttachments.images[0];
12873
13180
  return {
12874
13181
  ...result,
12875
- Icon: IconVideoSolid,
13182
+ Icon: IconVideoFill,
12876
13183
  PreviewImage: /* @__PURE__ */ jsx(
12877
13184
  BaseImage,
12878
13185
  {
@@ -12886,8 +13193,8 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
12886
13193
  };
12887
13194
  }
12888
13195
  if (groupedAttachments.voiceRecordings.length === groupedAttachments.total)
12889
- return { ...result, Icon: IconMicrophone, previewType: "voice" };
12890
- return { ...result, Icon: IconFileBend, previewType: "mixed" };
13196
+ return { ...result, Icon: IconVoice, previewType: "voice" };
13197
+ return { ...result, Icon: IconFile, previewType: "mixed" };
12891
13198
  };
12892
13199
  const QuotedMessagePreview = ({
12893
13200
  getQuotedMessageAuthor,
@@ -13038,7 +13345,7 @@ const reminderStateSelector = (state) => ({
13038
13345
  function SavedForLaterContent() {
13039
13346
  const { t } = useTranslationContext();
13040
13347
  return /* @__PURE__ */ jsxs("p", { className: "str-chat__message-saved-for-later", children: [
13041
- /* @__PURE__ */ jsx(IconBookmark, {}),
13348
+ /* @__PURE__ */ jsx(IconSave, {}),
13042
13349
  /* @__PURE__ */ jsx("span", { children: t("Saved for later") })
13043
13350
  ] });
13044
13351
  }
@@ -13082,7 +13389,7 @@ function RemindMeContent({ reminder }) {
13082
13389
  });
13083
13390
  };
13084
13391
  return /* @__PURE__ */ jsxs("p", { className: "str-chat__message-reminder", children: [
13085
- /* @__PURE__ */ jsx(IconBellNotification, {}),
13392
+ /* @__PURE__ */ jsx(IconBell, {}),
13086
13393
  /* @__PURE__ */ jsx("span", { children: t("Reminder set") }),
13087
13394
  /* @__PURE__ */ jsx("span", { children: " · " }),
13088
13395
  /* @__PURE__ */ jsx("span", { className: "str-chat__message-reminder__time-left", children: renderTime() })
@@ -13795,10 +14102,10 @@ const TextInput = forwardRef(function TextInput2({
13795
14102
  const displayMessage = displayError || displaySuccess || displayNeutralMessage;
13796
14103
  const messageId = displayMessage ? `${id}-message` : void 0;
13797
14104
  const messageContent = displayError ? /* @__PURE__ */ jsxs(Fragment, { children: [
13798
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: errorMessageIcon ?? /* @__PURE__ */ jsx(IconExclamationCircle, {}) }),
14105
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: errorMessageIcon ?? /* @__PURE__ */ jsx(IconExclamationMark, {}) }),
13799
14106
  errorMessage ?? message
13800
14107
  ] }) : displaySuccess ? /* @__PURE__ */ jsxs(Fragment, { children: [
13801
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: successMessageIcon ?? /* @__PURE__ */ jsx(IconCheckmark2, {}) }),
14108
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: successMessageIcon ?? /* @__PURE__ */ jsx(IconCheckmark, {}) }),
13802
14109
  successMessage
13803
14110
  ] }) : displayNeutralMessage ? message : null;
13804
14111
  return /* @__PURE__ */ jsxs(
@@ -14675,7 +14982,8 @@ const PollOptionWithVotes = ({
14675
14982
  "div",
14676
14983
  {
14677
14984
  className: clsx("str-chat__poll-option", {
14678
- "str-chat__poll-option--has-more-votes": isVotesPreview && voteCount > countVotesPreview
14985
+ "str-chat__poll-option--has-more-votes": isVotesPreview && voteCount > countVotesPreview,
14986
+ "str-chat__poll-option--has-votes": voteCount
14679
14987
  }),
14680
14988
  children: [
14681
14989
  /* @__PURE__ */ jsx(PollOptionWithVotesHeader, { option, optionOrderNumber: orderNumber }),
@@ -15241,7 +15549,7 @@ const OptionFieldSet = () => {
15241
15549
  className: "str-chat__form__input-field__value",
15242
15550
  error: !!error,
15243
15551
  id: option.id,
15244
- leading: draggable ? /* @__PURE__ */ jsx(IconDotGrid2x3, { className: "str-chat__drag-handle" }) : void 0,
15552
+ leading: draggable ? /* @__PURE__ */ jsx(IconReorder, { className: "str-chat__drag-handle" }) : void 0,
15245
15553
  message: error ? /* @__PURE__ */ jsx("span", { "data-testid": "poll-option-input-field-error", children: knownValidationErrors[error] ?? t("Error") }) : void 0,
15246
15554
  onBlur: () => {
15247
15555
  pollComposer.handleFieldBlur("options");
@@ -15280,7 +15588,7 @@ const RemoveOptionButton = ({ className, ...props }) => /* @__PURE__ */ jsx(
15280
15588
  size: "sm",
15281
15589
  variant: "secondary",
15282
15590
  ...props,
15283
- children: /* @__PURE__ */ jsx(IconCircleMinus, {})
15591
+ children: /* @__PURE__ */ jsx(IconMinusCircle, {})
15284
15592
  }
15285
15593
  );
15286
15594
  const PollCreationDialogControls = ({
@@ -15316,7 +15624,7 @@ const PollCreationDialogControls = ({
15316
15624
  },
15317
15625
  type: "submit",
15318
15626
  children: [
15319
- /* @__PURE__ */ jsx(IconPaperPlane, {}),
15627
+ /* @__PURE__ */ jsx(IconSend, {}),
15320
15628
  t("Send poll")
15321
15629
  ]
15322
15630
  }
@@ -15398,12 +15706,12 @@ const AttachmentSelectorContextProvider = ({
15398
15706
  }) => /* @__PURE__ */ jsx(AttachmentSelectorContext.Provider, { value, children });
15399
15707
  const useAttachmentSelectorContext = () => useContext(AttachmentSelectorContext);
15400
15708
  const icons = {
15401
- ban: IconPeopleRemove,
15402
- flag: IconFlag2,
15709
+ ban: IconUserRemove,
15710
+ flag: IconFlag,
15403
15711
  giphy: IconGiphy,
15404
15712
  mute: IconMute,
15405
- unban: IconPeopleAdd,
15406
- unmute: IconVolumeFull
15713
+ unban: IconUserAdd,
15714
+ unmute: IconAudio
15407
15715
  };
15408
15716
  const CommandsMenuClassName = "str-chat__context-menu--commands";
15409
15717
  const CommandsSubmenuHeader = () => {
@@ -15495,7 +15803,7 @@ const AttachmentSelectorMenuInitButtonIcon = ({ className }) => {
15495
15803
  return /* @__PURE__ */ jsx("span", { className, children: /* @__PURE__ */ jsx(AttachmentSelectorInitiationButtonContents, {}) });
15496
15804
  }
15497
15805
  return /* @__PURE__ */ jsx(
15498
- IconPlusLarge,
15806
+ IconPlus,
15499
15807
  {
15500
15808
  className: clsx("str-chat__attachment-selector__menu-button__icon", className)
15501
15809
  }
@@ -15558,7 +15866,7 @@ const DefaultAttachmentSelectorComponents = {
15558
15866
  {
15559
15867
  className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__create-poll-button",
15560
15868
  hasSubMenu: hasSubmenu,
15561
- Icon: IconRunShortcut,
15869
+ Icon: IconCommand,
15562
15870
  onClick: () => {
15563
15871
  if (!hasSubmenu) return;
15564
15872
  openSubmenu({
@@ -15579,7 +15887,7 @@ const DefaultAttachmentSelectorComponents = {
15579
15887
  ContextMenuButton,
15580
15888
  {
15581
15889
  className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__upload-file-button",
15582
- Icon: IconPaperclip,
15890
+ Icon: IconAttachment,
15583
15891
  onClick: () => {
15584
15892
  fileInput?.click();
15585
15893
  closeMenu();
@@ -15595,7 +15903,7 @@ const DefaultAttachmentSelectorComponents = {
15595
15903
  ContextMenuButton,
15596
15904
  {
15597
15905
  className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__add-location-button",
15598
- Icon: IconMapPin,
15906
+ Icon: IconLocation,
15599
15907
  onClick: () => {
15600
15908
  openModalForAction("addLocation");
15601
15909
  closeMenu();
@@ -15611,7 +15919,7 @@ const DefaultAttachmentSelectorComponents = {
15611
15919
  ContextMenuButton,
15612
15920
  {
15613
15921
  className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__create-poll-button",
15614
- Icon: IconChart5,
15922
+ Icon: IconPoll,
15615
15923
  onClick: () => {
15616
15924
  openModalForAction("createPoll");
15617
15925
  closeMenu();
@@ -15688,7 +15996,7 @@ const AttachmentSelector = ({
15688
15996
  getModalPortalDestination
15689
15997
  }) => {
15690
15998
  const { t } = useTranslationContext();
15691
- const { Modal = GlobalModal } = useComponentContext();
15999
+ const { ContextMenu: ContextMenuComponent = ContextMenu, Modal = GlobalModal } = useComponentContext();
15692
16000
  const { channelCapabilities } = useChannelStateContext();
15693
16001
  const messageComposer = useMessageComposerController();
15694
16002
  const isCooldownActive = useIsCooldownActive();
@@ -15748,7 +16056,7 @@ const AttachmentSelector = ({
15748
16056
  }
15749
16057
  ),
15750
16058
  /* @__PURE__ */ jsx(
15751
- ContextMenu,
16059
+ ContextMenuComponent,
15752
16060
  {
15753
16061
  allowFlip: true,
15754
16062
  backLabel: t("Back"),
@@ -15944,7 +16252,7 @@ const FileAttachmentPreview = ({
15944
16252
  uploadState === "uploading" && /* @__PURE__ */ jsx(LoadingIndicatorIcon, {}),
15945
16253
  !hasError && /* @__PURE__ */ jsx(FileSizeIndicator, { fileSize: attachment.file_size }),
15946
16254
  hasFatalError && /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__fatal-error", children: [
15947
- /* @__PURE__ */ jsx(IconExclamationCircle, {}),
16255
+ /* @__PURE__ */ jsx(IconExclamationMark, {}),
15948
16256
  /* @__PURE__ */ jsx("span", { children: hasSizeLimitError ? t("File too large") : uploadState === "blocked" ? t("Upload blocked") : t("Upload failed") })
15949
16257
  ] }),
15950
16258
  hasRetriableError && /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__retriable-error", children: [
@@ -16500,7 +16808,7 @@ const AudioAttachmentPreview = ({
16500
16808
  }
16501
16809
  )
16502
16810
  ] }) : hasFatalError ? /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__fatal-error", children: [
16503
- /* @__PURE__ */ jsx(IconExclamationCircle, {}),
16811
+ /* @__PURE__ */ jsx(IconExclamationMark, {}),
16504
16812
  /* @__PURE__ */ jsx("span", { children: hasSizeLimitError ? t("File too large") : uploadState === "blocked" ? t("Upload blocked") : t("Upload failed") })
16505
16813
  ] }) : /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__retriable-error", children: [
16506
16814
  /* @__PURE__ */ jsx(IconExclamationTriangle, {}),
@@ -16599,10 +16907,10 @@ const MediaAttachmentPreview = ({
16599
16907
  /* @__PURE__ */ jsxs("div", { className: clsx("str-chat__attachment-preview-media__overlay"), children: [
16600
16908
  isUploading && /* @__PURE__ */ jsx(LoadingIndicator2, {}),
16601
16909
  isVideoAttachment(attachment) && !hasUploadError && uploadState !== "uploading" && /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-media__video-indicator", children: [
16602
- /* @__PURE__ */ jsx(IconVideoSolid, {}),
16910
+ /* @__PURE__ */ jsx(IconVideoFill, {}),
16603
16911
  attachment.duration && /* @__PURE__ */ jsx("div", { children: attachment.duration })
16604
16912
  ] }),
16605
- hasFatalError && /* @__PURE__ */ jsx(IconExclamationCircle, {}),
16913
+ hasFatalError && /* @__PURE__ */ jsx(IconExclamationMark, {}),
16606
16914
  hasRetriableError && /* @__PURE__ */ jsx(
16607
16915
  Button,
16608
16916
  {
@@ -16614,7 +16922,7 @@ const MediaAttachmentPreview = ({
16614
16922
  onClick: retry,
16615
16923
  size: "sm",
16616
16924
  variant: "danger",
16617
- children: /* @__PURE__ */ jsx(IconArrowRotateClockwise, {})
16925
+ children: /* @__PURE__ */ jsx(IconRetry, {})
16618
16926
  }
16619
16927
  )
16620
16928
  ] })
@@ -16685,7 +16993,7 @@ const GalleryHeader = ({ currentItem }) => {
16685
16993
  className: "str-chat__gallery__action-button str-chat__gallery__action-button--close",
16686
16994
  onClick: modalContext.close,
16687
16995
  title: t("Close"),
16688
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
16996
+ children: /* @__PURE__ */ jsx(IconXmark, {})
16689
16997
  }
16690
16998
  ) : null
16691
16999
  ] })
@@ -16732,9 +17040,9 @@ const VideoThumbnail = ({
16732
17040
  onClick: onPlay,
16733
17041
  size: "lg",
16734
17042
  variant: "secondary",
16735
- children: /* @__PURE__ */ jsx(IconPlaySolid, {})
17043
+ children: /* @__PURE__ */ jsx(IconPlayFill, {})
16736
17044
  }
16737
- ) : /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__video-thumbnail__play-indicator", children: /* @__PURE__ */ jsx(IconPlaySolid, {}) })
17045
+ ) : /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__video-thumbnail__play-indicator", children: /* @__PURE__ */ jsx(IconPlayFill, {}) })
16738
17046
  ] });
16739
17047
  };
16740
17048
  const SWIPE_THRESHOLD = 50;
@@ -17158,7 +17466,7 @@ const CommandChip = ({ command }) => {
17158
17466
  textComposer.setCommand(null);
17159
17467
  textareaRef.current?.focus();
17160
17468
  },
17161
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
17469
+ children: /* @__PURE__ */ jsx(IconXmark, {})
17162
17470
  }
17163
17471
  )
17164
17472
  ] });
@@ -17223,7 +17531,7 @@ const LinkPreviewCard = ({ linkPreview }) => {
17223
17531
  /* @__PURE__ */ jsx("div", { className: "str-chat__link-preview-card__content-title", children: linkPreview.title }),
17224
17532
  /* @__PURE__ */ jsx("div", { className: "str-chat__link-preview-card__content-description", children: linkPreview.text }),
17225
17533
  /* @__PURE__ */ jsxs("div", { className: "str-chat__link-preview-card__content__url", children: [
17226
- /* @__PURE__ */ jsx(IconChainLink, {}),
17534
+ /* @__PURE__ */ jsx(IconLink, {}),
17227
17535
  /* @__PURE__ */ jsx("span", { children: linkPreview.og_scrape_url })
17228
17536
  ] })
17229
17537
  ] }),
@@ -17301,7 +17609,7 @@ const AudioRecordingPlayback = ({
17301
17609
  onClick: audioPlayer.togglePlay,
17302
17610
  size: "sm",
17303
17611
  variant: "secondary",
17304
- children: isPlaying ? /* @__PURE__ */ jsx(IconPause, {}) : /* @__PURE__ */ jsx(IconPlaySolid, {})
17612
+ children: isPlaying ? /* @__PURE__ */ jsx(IconPauseFill, {}) : /* @__PURE__ */ jsx(IconPlayFill, {})
17305
17613
  }
17306
17614
  ),
17307
17615
  /* @__PURE__ */ jsx(
@@ -17419,7 +17727,7 @@ const AudioRecordingPreview = () => {
17419
17727
  };
17420
17728
  }, [recorder, startCounter, stopCounter]);
17421
17729
  return /* @__PURE__ */ jsxs("div", { className: "str-chat__audio-recorder__recording-preview", children: [
17422
- /* @__PURE__ */ jsx(IconMicrophone, {}),
17730
+ /* @__PURE__ */ jsx(IconVoice, {}),
17423
17731
  /* @__PURE__ */ jsx(RecordingTimer, { durationSeconds: secondsElapsed }),
17424
17732
  /* @__PURE__ */ jsx(AudioRecordingWaveform, {})
17425
17733
  ] });
@@ -17439,7 +17747,7 @@ const ToggleRecordingButton = () => {
17439
17747
  onClick: () => isRecording(recordingState) ? recorder?.pause() : recorder?.resume(),
17440
17748
  size: "sm",
17441
17749
  variant: "secondary",
17442
- children: isRecording(recordingState) ? /* @__PURE__ */ jsx(IconPause, {}) : /* @__PURE__ */ jsx(IconMicrophone, {})
17750
+ children: isRecording(recordingState) ? /* @__PURE__ */ jsx(IconPauseFill, {}) : /* @__PURE__ */ jsx(IconVoice, {})
17443
17751
  }
17444
17752
  );
17445
17753
  };
@@ -17474,7 +17782,7 @@ const AudioRecorderRecordingControls = () => {
17474
17782
  },
17475
17783
  size: "sm",
17476
17784
  variant: "secondary",
17477
- children: /* @__PURE__ */ jsx(IconTrashBin, {})
17785
+ children: /* @__PURE__ */ jsx(IconDelete, {})
17478
17786
  }
17479
17787
  ),
17480
17788
  /* @__PURE__ */ jsx(ToggleRecordingButton, {}),
@@ -17571,7 +17879,7 @@ const DefaultStartRecordingAudioButton = forwardRef(function StartRecordingAudio
17571
17879
  variant: "secondary",
17572
17880
  ...props,
17573
17881
  ref,
17574
- children: /* @__PURE__ */ jsx(IconMicrophone, {})
17882
+ children: /* @__PURE__ */ jsx(IconVoice, {})
17575
17883
  }
17576
17884
  );
17577
17885
  });
@@ -17612,7 +17920,7 @@ const SendToChannelCheckbox = () => {
17612
17920
  type: "checkbox"
17613
17921
  }
17614
17922
  ),
17615
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__send-to-channel-checkbox__visual", children: /* @__PURE__ */ jsx("span", { className: "str-chat__send-to-channel-checkbox__checkmark", children: /* @__PURE__ */ jsx(IconCheckmark2, {}) }) }),
17923
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__send-to-channel-checkbox__visual", children: /* @__PURE__ */ jsx("span", { className: "str-chat__send-to-channel-checkbox__checkmark", children: /* @__PURE__ */ jsx(IconCheckmark, {}) }) }),
17616
17924
  /* @__PURE__ */ jsx("span", { className: "str-chat__send-to-channel-checkbox__label", children: labelText })
17617
17925
  ]
17618
17926
  }
@@ -17778,7 +18086,10 @@ const SuggestionList = ({
17778
18086
  setFocusedItemIndex,
17779
18087
  suggestionItemComponents = defaultComponents
17780
18088
  }) => {
17781
- const { AutocompleteSuggestionItem = SuggestionListItem } = useComponentContext();
18089
+ const {
18090
+ AutocompleteSuggestionItem = SuggestionListItem,
18091
+ ContextMenu: ContextMenuComponent = ContextMenu
18092
+ } = useComponentContext();
17782
18093
  const { textareaRef } = useMessageComposerContext();
17783
18094
  const messageComposer = useMessageComposerController();
17784
18095
  const { textComposer } = messageComposer;
@@ -17896,7 +18207,7 @@ const SuggestionList = ({
17896
18207
  zIndex: 1e3
17897
18208
  },
17898
18209
  children: /* @__PURE__ */ jsx(
17899
- ContextMenu,
18210
+ ContextMenuComponent,
17900
18211
  {
17901
18212
  className: clsx("str-chat__suggestion-list", className),
17902
18213
  Header: suggestions.searchSource.type === "commands" ? CommandsMenuHeader : void 0,
@@ -18122,12 +18433,6 @@ const TextareaComposer = ({
18122
18433
  if (!textareaRef.current || textareaIsFocused || !focus) return;
18123
18434
  textareaRef.current.focus();
18124
18435
  }, [attachments, focus, quotedMessage, textareaRef]);
18125
- useEffect(
18126
- () => () => {
18127
- messageComposer.clear();
18128
- },
18129
- [messageComposer]
18130
- );
18131
18436
  useLayoutEffect(() => {
18132
18437
  const textarea = textareaRef.current;
18133
18438
  if (!textarea || isComposing) return;
@@ -18275,7 +18580,7 @@ const FileDragAndDropContent = ({
18275
18580
  }) => {
18276
18581
  const { t } = useTranslationContext();
18277
18582
  return /* @__PURE__ */ jsx("div", { className: "str-chat__dropzone-container__content", children: isDragRejected ? /* @__PURE__ */ jsx("p", { children: t("Some of the files will not be accepted") }) : /* @__PURE__ */ jsxs(Fragment, { children: [
18278
- /* @__PURE__ */ jsx(IconFileArrowLeftIn, {}),
18583
+ /* @__PURE__ */ jsx(IconUpload, {}),
18279
18584
  /* @__PURE__ */ jsx("p", { children: t("Drag your files here") })
18280
18585
  ] }) });
18281
18586
  };
@@ -18311,7 +18616,7 @@ const SendButton = ({ children, sendMessage, ...rest }) => {
18311
18616
  size: "sm",
18312
18617
  variant: "primary",
18313
18618
  ...rest,
18314
- children: children ?? /* @__PURE__ */ jsx(IconPaperPlane, {})
18619
+ children: children ?? /* @__PURE__ */ jsx(IconSend, {})
18315
18620
  }
18316
18621
  );
18317
18622
  };
@@ -18347,7 +18652,7 @@ const MessageComposerActions = () => {
18347
18652
  const stopGenerating = useCallback(() => channel?.stopAIResponse(), [channel]);
18348
18653
  const shouldDisplayStopAIGeneration = [AIStates.Thinking, AIStates.Generating].includes(aiState) && !!StopAIGenerationButton$1;
18349
18654
  const recordingEnabled = !!(recordingController.recorder && navigator.mediaDevices);
18350
- let content = SendButton$1 ? /* @__PURE__ */ jsx(SendButton$1, { sendMessage: handleSubmit }) : /* @__PURE__ */ jsx(SendButton, { sendMessage: handleSubmit, children: editedMessage || command ? /* @__PURE__ */ jsx(IconCheckmark2, {}) : /* @__PURE__ */ jsx(IconPaperPlane, {}) });
18655
+ let content = SendButton$1 ? /* @__PURE__ */ jsx(SendButton$1, { sendMessage: handleSubmit }) : /* @__PURE__ */ jsx(SendButton, { sendMessage: handleSubmit, children: editedMessage || command ? /* @__PURE__ */ jsx(IconCheckmark, {}) : /* @__PURE__ */ jsx(IconSend, {}) });
18351
18656
  if (shouldDisplayStopAIGeneration) {
18352
18657
  content = /* @__PURE__ */ jsx(StopAIGenerationButton$1, { onClick: stopGenerating });
18353
18658
  } else if (hideSendButton) return null;
@@ -18363,7 +18668,7 @@ const AdditionalMessageComposerActions = () => {
18363
18668
  const isCooldownActive = useIsCooldownActive();
18364
18669
  return /* @__PURE__ */ jsx("div", { className: "str-chat__message-composer__additional-actions", children: !isCooldownActive && EmojiPicker ? /* @__PURE__ */ jsx(EmojiPicker, {}) : null });
18365
18670
  };
18366
- const GeolocationPreviewImage = () => /* @__PURE__ */ jsx("div", { className: "str-chat__location-preview-image", children: /* @__PURE__ */ jsx(IconMapPin, {}) });
18671
+ const GeolocationPreviewImage = () => /* @__PURE__ */ jsx("div", { className: "str-chat__location-preview-image", children: /* @__PURE__ */ jsx(IconLocation, {}) });
18367
18672
  const GeolocationPreview = ({
18368
18673
  location,
18369
18674
  PreviewImage = GeolocationPreviewImage,
@@ -18581,7 +18886,7 @@ const MessageComposerProvider = (props) => {
18581
18886
  const messageComposer = useMessageComposerController();
18582
18887
  useEffect(
18583
18888
  () => () => {
18584
- messageComposer.createDraft();
18889
+ messageComposer.createDraft().finally(() => messageComposer.clear());
18585
18890
  },
18586
18891
  [messageComposer]
18587
18892
  );
@@ -18899,7 +19204,7 @@ const useChat = ({
18899
19204
  };
18900
19205
  useEffect(() => {
18901
19206
  if (!client) return;
18902
- const version = "14.0.0-beta.2";
19207
+ const version = "14.0.0-beta.4";
18903
19208
  const userAgent = client.getUserAgent();
18904
19209
  if (!userAgent.includes("stream-chat-react")) {
18905
19210
  client.setUserAgent(`stream-chat-react-${version}-${userAgent}`);
@@ -19066,7 +19371,7 @@ const ThreadHeader = (props) => {
19066
19371
  onClick: closeThread,
19067
19372
  size: "md",
19068
19373
  variant: "secondary",
19069
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
19374
+ children: /* @__PURE__ */ jsx(IconXmark, {})
19070
19375
  }
19071
19376
  )
19072
19377
  ] });
@@ -19374,7 +19679,7 @@ const ReactionSelector = (props) => {
19374
19679
  onClick: () => setExtendedListOpen(true),
19375
19680
  size: "sm",
19376
19681
  variant: "secondary",
19377
- children: /* @__PURE__ */ jsx(IconPlusLarge, {})
19682
+ children: /* @__PURE__ */ jsx(IconPlus, {})
19378
19683
  }
19379
19684
  )
19380
19685
  ] }),
@@ -19400,10 +19705,10 @@ const ReactionSelector = (props) => {
19400
19705
  ) })
19401
19706
  ] });
19402
19707
  };
19403
- ReactionSelector.getDialogId = (({ messageId, threadList }) => {
19708
+ ReactionSelector.getDialogId = ({ messageId, threadList }) => {
19404
19709
  const dialogIdNamespace = threadList ? "-thread" : "";
19405
- return `reaction-selector${dialogIdNamespace}--${messageId}`;
19406
- });
19710
+ return `reaction-selector${dialogIdNamespace}-${messageId}`;
19711
+ };
19407
19712
  ReactionSelector.displayName = "ReactionSelector";
19408
19713
  const ReactionSelectorWithButton = ({
19409
19714
  ReactionIcon
@@ -19488,6 +19793,7 @@ const QuickMessageActionsButton = ({ className, ...props }) => /* @__PURE__ */ j
19488
19793
  appearance: "ghost",
19489
19794
  circular: true,
19490
19795
  className: clsx("str-chat__message-actions-box-button", className),
19796
+ size: "sm",
19491
19797
  variant: "secondary",
19492
19798
  ...props
19493
19799
  }
@@ -19554,7 +19860,7 @@ const DefaultMessageActionComponents = {
19554
19860
  "aria-label": t("aria/Open Thread"),
19555
19861
  className: msgActionsBoxButtonClassName,
19556
19862
  "data-testid": "thread-action",
19557
- Icon: IconBubbleText6ChatMessage,
19863
+ Icon: IconThread,
19558
19864
  onClick: (e) => {
19559
19865
  handleOpenThread(e);
19560
19866
  closeMenu();
@@ -19581,7 +19887,7 @@ const DefaultMessageActionComponents = {
19581
19887
  {
19582
19888
  "aria-label": t("aria/Quote Message"),
19583
19889
  className: msgActionsBoxButtonClassName,
19584
- Icon: IconCloseQuote2,
19890
+ Icon: IconQuote,
19585
19891
  onClick: () => {
19586
19892
  handleQuote();
19587
19893
  closeMenu();
@@ -19618,7 +19924,7 @@ const DefaultMessageActionComponents = {
19618
19924
  {
19619
19925
  "aria-label": t("aria/Copy Message Text"),
19620
19926
  className: msgActionsBoxButtonClassName,
19621
- Icon: IconSquareBehindSquare2_Copy,
19927
+ Icon: IconCopy,
19622
19928
  onClick: () => {
19623
19929
  if (message.text) navigator.clipboard.writeText(message.text);
19624
19930
  closeMenu();
@@ -19636,7 +19942,7 @@ const DefaultMessageActionComponents = {
19636
19942
  {
19637
19943
  "aria-label": t("aria/Resend Message"),
19638
19944
  className: msgActionsBoxButtonClassName,
19639
- Icon: IconArrowRotateClockwise,
19945
+ Icon: IconRetry,
19640
19946
  onClick: () => {
19641
19947
  handleRetry(message);
19642
19948
  closeMenu();
@@ -19655,7 +19961,7 @@ const DefaultMessageActionComponents = {
19655
19961
  {
19656
19962
  "aria-label": t("aria/Edit Message"),
19657
19963
  className: msgActionsBoxButtonClassName,
19658
- Icon: IconEditBig,
19964
+ Icon: IconEdit,
19659
19965
  onClick: () => {
19660
19966
  messageComposer.initState({ composition: message });
19661
19967
  closeMenu();
@@ -19673,7 +19979,7 @@ const DefaultMessageActionComponents = {
19673
19979
  {
19674
19980
  "aria-label": t("aria/Mark Message Unread"),
19675
19981
  className: msgActionsBoxButtonClassName,
19676
- Icon: IconBubbleWideNotificationChatMessage,
19982
+ Icon: IconNotification,
19677
19983
  onClick: (event) => {
19678
19984
  handleMarkUnread(event);
19679
19985
  closeMenu();
@@ -19696,7 +20002,7 @@ const DefaultMessageActionComponents = {
19696
20002
  "aria-label": reminder ? t("aria/Remind Me Message") : t("aria/Remove Reminder"),
19697
20003
  className: msgActionsBoxButtonClassName,
19698
20004
  hasSubMenu: !reminder,
19699
- Icon: reminder ? IconBellOff : IconBellNotification,
20005
+ Icon: reminder ? IconBellOff : IconBell,
19700
20006
  onClick: () => {
19701
20007
  if (reminder) {
19702
20008
  client.reminders.deleteReminder(reminder.id);
@@ -19725,7 +20031,7 @@ const DefaultMessageActionComponents = {
19725
20031
  {
19726
20032
  "aria-label": reminder ? t("aria/Remove Save For Later") : t("aria/Bookmark Message"),
19727
20033
  className: msgActionsBoxButtonClassName,
19728
- Icon: reminder ? IconBookmarkRemove : IconBookmark,
20034
+ Icon: reminder ? IconUnsave : IconSave,
19729
20035
  onClick: () => {
19730
20036
  if (reminder) client.reminders.deleteReminder(reminder.id);
19731
20037
  else client.reminders.createReminder({ messageId: message.id });
@@ -19744,7 +20050,7 @@ const DefaultMessageActionComponents = {
19744
20050
  {
19745
20051
  "aria-label": t("aria/Flag Message"),
19746
20052
  className: msgActionsBoxButtonClassName,
19747
- Icon: IconFlag2,
20053
+ Icon: IconFlag,
19748
20054
  onClick: (event) => {
19749
20055
  handleFlag(event);
19750
20056
  closeMenu();
@@ -19764,7 +20070,7 @@ const DefaultMessageActionComponents = {
19764
20070
  {
19765
20071
  "aria-label": isMuted ? t("aria/Unmute User") : t("aria/Mute User"),
19766
20072
  className: msgActionsBoxButtonClassName,
19767
- Icon: isMuted ? IconVolumeFull : IconMute,
20073
+ Icon: isMuted ? IconAudio : IconMute,
19768
20074
  onClick: (event) => {
19769
20075
  handleMute(event);
19770
20076
  closeMenu();
@@ -19787,7 +20093,7 @@ const DefaultMessageActionComponents = {
19787
20093
  {
19788
20094
  "aria-label": t("aria/Delete Message"),
19789
20095
  className: msgActionsBoxButtonClassName,
19790
- Icon: IconTrashBin,
20096
+ Icon: IconDelete,
19791
20097
  onClick: () => {
19792
20098
  setOpenModal(true);
19793
20099
  },
@@ -19833,7 +20139,7 @@ const DefaultMessageActionComponents = {
19833
20139
  {
19834
20140
  "aria-label": isBlocked ? t("aria/Unblock User") : t("aria/Block User"),
19835
20141
  className: clsx(msgActionsBoxButtonClassName),
19836
- Icon: isBlocked ? IconPeopleAdded : IconCircleBanSign,
20142
+ Icon: isBlocked ? IconUserCheck : IconNoSign,
19837
20143
  onClick: () => {
19838
20144
  const targetId = message.user?.id;
19839
20145
  if (targetId) {
@@ -19848,8 +20154,34 @@ const DefaultMessageActionComponents = {
19848
20154
  }
19849
20155
  },
19850
20156
  quick: {
20157
+ // eslint-disable-next-line react/display-name
20158
+ DropdownToggle: forwardRef((_, ref) => {
20159
+ const { t } = useTranslationContext();
20160
+ const { message } = useMessageContext();
20161
+ const dropdownDialogIsOpen = useDialogIsOpen(
20162
+ MessageActions.getDialogId({ messageId: message.id })
20163
+ );
20164
+ const { dialog } = useDialogOnNearestManager({
20165
+ id: MessageActions.getDialogId({ messageId: message.id })
20166
+ });
20167
+ return /* @__PURE__ */ jsx(
20168
+ QuickMessageActionsButton,
20169
+ {
20170
+ "aria-expanded": dropdownDialogIsOpen,
20171
+ "aria-haspopup": "true",
20172
+ "aria-label": t("aria/Open Message Actions Menu"),
20173
+ className: "str-chat__message-actions-box-button",
20174
+ "data-testid": "message-actions-toggle-button",
20175
+ onClick: () => {
20176
+ dialog?.toggle();
20177
+ },
20178
+ ref,
20179
+ children: /* @__PURE__ */ jsx(IconMore, { className: "str-chat__message-action-icon" })
20180
+ }
20181
+ );
20182
+ }),
19851
20183
  React() {
19852
- return /* @__PURE__ */ jsx(ReactionSelectorWithButton, { ReactionIcon: IconEmojiSmile });
20184
+ return /* @__PURE__ */ jsx(ReactionSelectorWithButton, { ReactionIcon: IconEmoji });
19853
20185
  },
19854
20186
  Reply() {
19855
20187
  const { handleOpenThread } = useMessageContext();
@@ -19861,14 +20193,17 @@ const DefaultMessageActionComponents = {
19861
20193
  className: "str-chat__message-reply-in-thread-button",
19862
20194
  "data-testid": "thread-action",
19863
20195
  onClick: handleOpenThread,
19864
- children: /* @__PURE__ */ jsx(IconArrowShareLeft, { className: "str-chat__message-action-icon" })
20196
+ children: /* @__PURE__ */ jsx(IconReply, { className: "str-chat__message-action-icon" })
19865
20197
  }
19866
20198
  );
19867
20199
  }
19868
20200
  }
19869
20201
  };
19870
20202
  const defaultMessageActionSet = [
19871
- // { placement: 'dropdown', type: 'block' },
20203
+ {
20204
+ Component: DefaultMessageActionComponents.quick.DropdownToggle,
20205
+ placement: "quick-dropdown-toggle"
20206
+ },
19872
20207
  {
19873
20208
  Component: DefaultMessageActionComponents.quick.Reply,
19874
20209
  placement: "quick",
@@ -19958,14 +20293,14 @@ function useFetchReactions(options) {
19958
20293
  const handleFetchReactions = propHandleFetchReactions ?? contextHandleFetchReactions;
19959
20294
  const [refetchNonce, setRefetchNonce] = useState(null);
19960
20295
  useEffect(() => {
19961
- if (!shouldFetch || !reactionType) {
20296
+ if (!shouldFetch) {
19962
20297
  return;
19963
20298
  }
19964
20299
  let cancel = false;
19965
20300
  (async () => {
19966
20301
  try {
19967
20302
  setIsLoading(true);
19968
- const reactions2 = await handleFetchReactions(reactionType, sort);
20303
+ const reactions2 = await handleFetchReactions(reactionType ?? void 0, sort);
19969
20304
  if (!cancel) {
19970
20305
  setReactions(reactions2);
19971
20306
  }
@@ -19989,6 +20324,16 @@ function useFetchReactions(options) {
19989
20324
  return { isLoading, reactions, refetch };
19990
20325
  }
19991
20326
  const defaultReactionDetailsSort = { created_at: -1 };
20327
+ const MessageReactionsDetailLoadingIndicator = () => {
20328
+ const elements = useMemo(
20329
+ () => Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ jsxs("div", { className: "str-chat__message-reactions-detail__skeleton-item", children: [
20330
+ /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
20331
+ /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
20332
+ ] }, index)),
20333
+ []
20334
+ );
20335
+ return /* @__PURE__ */ jsx(Fragment, { children: elements });
20336
+ };
19992
20337
  function MessageReactionsDetail({
19993
20338
  handleFetchReactions,
19994
20339
  onSelectedReactionTypeChange,
@@ -19999,7 +20344,11 @@ function MessageReactionsDetail({
19999
20344
  totalReactionCount
20000
20345
  }) {
20001
20346
  const { client } = useChatContext();
20002
- const { Avatar: Avatar$1 = Avatar } = useComponentContext(MessageReactionsDetail.name);
20347
+ const {
20348
+ Avatar: Avatar$1 = Avatar,
20349
+ LoadingIndicator: LoadingIndicator2 = MessageReactionsDetailLoadingIndicator,
20350
+ reactionOptions = defaultReactionOptions
20351
+ } = useComponentContext(MessageReactionsDetail.name);
20003
20352
  const { t } = useTranslationContext();
20004
20353
  const {
20005
20354
  handleReaction: contextHandleReaction,
@@ -20026,7 +20375,7 @@ function MessageReactionsDetail({
20026
20375
  "div",
20027
20376
  {
20028
20377
  className: "str-chat__message-reactions-detail",
20029
- "data-testid": "reactions-list-modal",
20378
+ "data-testid": "message-reactions-detail",
20030
20379
  children: [
20031
20380
  typeof totalReactionCount === "number" && /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__total-count", children: t("{{ count }} reactions", { count: totalReactionCount }) }),
20032
20381
  /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__reaction-type-list-container", children: /* @__PURE__ */ jsx("ul", { className: "str-chat__message-reactions-detail__reaction-type-list", children: reactions.map(
@@ -20039,7 +20388,9 @@ function MessageReactionsDetail({
20039
20388
  {
20040
20389
  "aria-pressed": reactionType === selectedReactionType,
20041
20390
  className: "str-chat__message-reactions-detail__reaction-type-list-item-button",
20042
- onClick: () => onSelectedReactionTypeChange?.(reactionType),
20391
+ onClick: () => onSelectedReactionTypeChange?.(
20392
+ selectedReactionType === reactionType ? null : reactionType
20393
+ ),
20043
20394
  children: [
20044
20395
  /* @__PURE__ */ jsx("span", { className: "str-chat__message-reactions-detail__reaction-type-list-item-icon", children: /* @__PURE__ */ jsx(EmojiComponent, {}) }),
20045
20396
  reactionCount > 1 && /* @__PURE__ */ jsx(
@@ -20063,22 +20414,10 @@ function MessageReactionsDetail({
20063
20414
  className: "str-chat__message-reactions-detail__user-list",
20064
20415
  "data-testid": "all-reacting-users",
20065
20416
  children: [
20066
- areReactionsLoading && /* @__PURE__ */ jsxs(Fragment, { children: [
20067
- /* @__PURE__ */ jsxs("div", { className: "str-chat__message-reactions-detail__skeleton-item", children: [
20068
- /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
20069
- /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
20070
- ] }),
20071
- /* @__PURE__ */ jsxs("div", { className: "str-chat__message-reactions-detail__skeleton-item", children: [
20072
- /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
20073
- /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
20074
- ] }),
20075
- /* @__PURE__ */ jsxs("div", { className: "str-chat__message-reactions-detail__skeleton-item", children: [
20076
- /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
20077
- /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
20078
- ] })
20079
- ] }),
20080
- !areReactionsLoading && /* @__PURE__ */ jsx(Fragment, { children: reactionDetailsWithLegacyFallback.map(({ user }) => {
20417
+ areReactionsLoading && /* @__PURE__ */ jsx(LoadingIndicator2, {}),
20418
+ !areReactionsLoading && /* @__PURE__ */ jsx(Fragment, { children: reactionDetailsWithLegacyFallback.map(({ type, user }) => {
20081
20419
  const belongsToCurrentUser = client.user?.id === user?.id;
20420
+ const EmojiComponent = Array.isArray(reactionOptions) ? void 0 : reactionOptions.quick[type]?.Component ?? reactionOptions.extended?.[type]?.Component;
20082
20421
  return /* @__PURE__ */ jsxs(
20083
20422
  "div",
20084
20423
  {
@@ -20103,23 +20442,23 @@ function MessageReactionsDetail({
20103
20442
  children: belongsToCurrentUser ? t("You") : user?.name || user?.id
20104
20443
  }
20105
20444
  ),
20106
- belongsToCurrentUser && selectedReactionType && /* @__PURE__ */ jsx(
20445
+ belongsToCurrentUser && /* @__PURE__ */ jsx(
20107
20446
  "button",
20108
20447
  {
20109
20448
  className: "str-chat__message-reactions-detail__user-list-item-button",
20110
20449
  "data-testid": "remove-reaction-button",
20111
- onClick: (e) => {
20112
- contextHandleReaction(selectedReactionType, e).then(() => {
20113
- refetch();
20114
- });
20450
+ onClick: async (e) => {
20451
+ await contextHandleReaction(type, e);
20452
+ refetch();
20115
20453
  },
20116
20454
  children: t("Tap to remove")
20117
20455
  }
20118
20456
  )
20119
- ] })
20457
+ ] }),
20458
+ /* @__PURE__ */ jsx("span", { className: "str-chat__message-reactions-detail__user-list-item-icon", children: EmojiComponent && !selectedReactionType && /* @__PURE__ */ jsx(EmojiComponent, {}) })
20120
20459
  ]
20121
20460
  },
20122
- user?.id
20461
+ `${user?.id}-${type}`
20123
20462
  );
20124
20463
  }) })
20125
20464
  ]
@@ -20268,6 +20607,7 @@ const UnMemoizedMessageReactions = (props) => {
20268
20607
  const divRef = useRef(null);
20269
20608
  const dialogId2 = `message-reactions-detail-${message.id}`;
20270
20609
  const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
20610
+ const isDialogOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
20271
20611
  const handleReactionButtonClick = (reactionType) => {
20272
20612
  if (totalReactionCount > MAX_MESSAGE_REACTIONS_TO_FETCH) {
20273
20613
  return;
@@ -20302,6 +20642,8 @@ const UnMemoizedMessageReactions = (props) => {
20302
20642
  children: /* @__PURE__ */ jsxs(
20303
20643
  FragmentOrButton,
20304
20644
  {
20645
+ "aria-expanded": isDialogOpen,
20646
+ "aria-pressed": isDialogOpen,
20305
20647
  buttonIf: visualStyle === "clustered",
20306
20648
  className: "str-chat__message-reactions__list-button",
20307
20649
  onClick: () => handleReactionButtonClick(existingReactions[0]?.reactionType ?? null),
@@ -20339,9 +20681,7 @@ const UnMemoizedMessageReactions = (props) => {
20339
20681
  "button",
20340
20682
  {
20341
20683
  className: "str-chat__message-reactions__list-item-button",
20342
- onClick: () => handleReactionButtonClick(
20343
- existingReactions.at(-1)?.reactionType ?? null
20344
- ),
20684
+ onClick: () => handleReactionButtonClick(null),
20345
20685
  children: /* @__PURE__ */ jsxs("span", { className: "str-chat__message-reactions__overflow-count", children: [
20346
20686
  "+",
20347
20687
  totalReactionCount - cappedExistingReactions.reactionCountToDisplay
@@ -20466,91 +20806,74 @@ const StreamEmoji = ({
20466
20806
  const useSplitActionSet = (actionSet) => useMemo(() => {
20467
20807
  const quickActionSet = [];
20468
20808
  const dropdownActionSet = [];
20809
+ let quickDropdownToggleAction;
20469
20810
  for (const action of actionSet) {
20470
20811
  if (action.placement === "quick")
20471
20812
  quickActionSet.push(action);
20472
20813
  if (action.placement === "dropdown")
20473
20814
  dropdownActionSet.push(action);
20815
+ if (action.placement === "quick-dropdown-toggle") {
20816
+ quickDropdownToggleAction ?? (quickDropdownToggleAction = action);
20817
+ }
20474
20818
  }
20475
- return { dropdownActionSet, quickActionSet };
20819
+ return { dropdownActionSet, quickActionSet, quickDropdownToggleAction };
20476
20820
  }, [actionSet]);
20477
20821
  const MessageActions = ({
20478
20822
  disableBaseMessageActionSetFilter = false,
20479
20823
  messageActionSet = defaultMessageActionSet
20480
20824
  }) => {
20481
- const { theme } = useChatContext();
20482
20825
  const { isMyMessage, message, threadList } = useMessageContext();
20826
+ const { ContextMenu: ContextMenuComponent = ContextMenu } = useComponentContext();
20483
20827
  const { t } = useTranslationContext();
20484
20828
  const [actionsBoxButtonElement, setActionsBoxButtonElement] = useState(null);
20485
20829
  const filteredMessageActionSet = useBaseMessageActionSetFilter(
20486
20830
  messageActionSet,
20487
20831
  disableBaseMessageActionSetFilter
20488
20832
  );
20489
- const { dropdownActionSet, quickActionSet } = useSplitActionSet(
20490
- filteredMessageActionSet
20491
- );
20492
- const dropdownDialogId = `message-actions--${message.id}`;
20833
+ const { dropdownActionSet, quickActionSet, quickDropdownToggleAction } = useSplitActionSet(filteredMessageActionSet);
20834
+ const messageActionsDialogId = MessageActions.getDialogId({ messageId: message.id });
20493
20835
  const reactionSelectorDialogId = ReactionSelector.getDialogId({
20494
20836
  messageId: message.id,
20495
20837
  threadList
20496
20838
  });
20497
- const { dialog, dialogManager } = useDialogOnNearestManager({ id: dropdownDialogId });
20498
- const dropdownDialogIsOpen = useDialogIsOpen(dropdownDialogId, dialogManager?.id);
20839
+ const { dialog, dialogManager } = useDialogOnNearestManager({
20840
+ id: messageActionsDialogId
20841
+ });
20842
+ const messageActionsDialogIsOpen = useDialogIsOpen(
20843
+ messageActionsDialogId,
20844
+ dialogManager?.id
20845
+ );
20499
20846
  const reactionSelectorDialogIsOpen = useDialogIsOpen(
20500
20847
  reactionSelectorDialogId,
20501
20848
  dialogManager?.id
20502
20849
  );
20503
- const contextMenuItems = useMemo(
20504
- () => dropdownActionSet.map(({ Component: Component2 }) => {
20505
- const ActionItem = (menuProps) => /* @__PURE__ */ jsx(Component2, { ...menuProps });
20506
- return ActionItem;
20507
- }),
20508
- [dropdownActionSet]
20509
- );
20510
20850
  if (dropdownActionSet.length + quickActionSet.length === 0) {
20511
20851
  return null;
20512
20852
  }
20513
20853
  return /* @__PURE__ */ jsxs(
20514
20854
  "div",
20515
20855
  {
20516
- className: clsx(`str-chat__message-${theme}__actions str-chat__message-options`, {
20517
- "str-chat__message-options--active": dropdownDialogIsOpen || reactionSelectorDialogIsOpen
20856
+ className: clsx("str-chat__message-options", {
20857
+ "str-chat__message-options--active": messageActionsDialogIsOpen || reactionSelectorDialogIsOpen
20518
20858
  }),
20519
20859
  children: [
20520
- dropdownActionSet.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
20521
- /* @__PURE__ */ jsx(
20522
- Button,
20523
- {
20524
- appearance: "ghost",
20525
- "aria-expanded": dropdownDialogIsOpen,
20526
- "aria-haspopup": "true",
20527
- "aria-label": t("aria/Open Message Actions Menu"),
20528
- circular: true,
20529
- className: "str-chat__message-actions-box-button",
20530
- "data-testid": "message-actions-toggle-button",
20531
- onClick: () => {
20532
- dialog?.toggle();
20533
- },
20534
- ref: setActionsBoxButtonElement,
20535
- variant: "secondary",
20536
- children: /* @__PURE__ */ jsx(IconDotGrid1x3Horizontal, { className: "str-chat__message-action-icon" })
20537
- }
20538
- ),
20860
+ quickDropdownToggleAction && dropdownActionSet.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
20861
+ /* @__PURE__ */ jsx(quickDropdownToggleAction.Component, { ref: setActionsBoxButtonElement }),
20539
20862
  /* @__PURE__ */ jsx(
20540
- ContextMenu,
20863
+ ContextMenuComponent,
20541
20864
  {
20542
20865
  backLabel: t("Back"),
20543
20866
  className: clsx("str-chat__message-actions-box", {
20544
- "str-chat__message-actions-box--open": dropdownDialogIsOpen
20867
+ "str-chat__message-actions-box--open": messageActionsDialogIsOpen
20545
20868
  }),
20546
20869
  dialogManagerId: dialogManager?.id,
20547
- id: dropdownDialogId,
20548
- items: contextMenuItems,
20870
+ id: messageActionsDialogId,
20549
20871
  onClose: dialog?.close,
20550
20872
  placement: isMyMessage() ? "top-end" : "top-start",
20551
20873
  referenceElement: actionsBoxButtonElement,
20552
20874
  tabIndex: -1,
20553
- trapFocus: true
20875
+ trapFocus: true,
20876
+ children: dropdownActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type))
20554
20877
  }
20555
20878
  )
20556
20879
  ] }),
@@ -20559,6 +20882,8 @@ const MessageActions = ({
20559
20882
  }
20560
20883
  );
20561
20884
  };
20885
+ MessageActions.getDialogId = ({ messageId }) => `message-actions-${messageId}`;
20886
+ MessageActions.displayName = "MessageActions";
20562
20887
  const MessageUIWithContext = ({
20563
20888
  endOfGroup,
20564
20889
  firstOfGroup,
@@ -21385,6 +21710,7 @@ const useScrollLocationLogic = (params) => {
21385
21710
  const closeToBottom = useRef(false);
21386
21711
  const closeToTop = useRef(false);
21387
21712
  const previousScrollTopRef = useRef(0);
21713
+ const previousMessagesLengthRef = useRef(messages.length);
21388
21714
  const anchorRestoreCleanupRef = useRef(null);
21389
21715
  const captureAnchor = useCallback(() => {
21390
21716
  if (!listElement) return null;
@@ -21536,6 +21862,60 @@ const useScrollLocationLogic = (params) => {
21536
21862
  scrollToBottom();
21537
21863
  }
21538
21864
  }, [disableAutoScrollToBottom, justReachedLatestMessageSet, listElement, hasMoreNewer]);
21865
+ useLayoutEffect(() => {
21866
+ if (!listElement || disableAutoScrollToBottom || hasMoreNewer || suppressAutoscroll || justReachedLatestMessageSet || isRestoringOlderAnchorRef.current) {
21867
+ return;
21868
+ }
21869
+ const initialDistanceToBottom = listElement.scrollHeight - (listElement.scrollTop + listElement.clientHeight);
21870
+ const messagesHydrated = previousMessagesLengthRef.current === 0 && messages.length > 0;
21871
+ if (initialDistanceToBottom > scrolledUpThreshold && !messagesHydrated) {
21872
+ return;
21873
+ }
21874
+ let keepPinnedToBottom = true;
21875
+ const maybeScrollToBottom = () => {
21876
+ if (keepPinnedToBottom) {
21877
+ scrollToBottom();
21878
+ }
21879
+ };
21880
+ maybeScrollToBottom();
21881
+ const settleDelays = [80, messagesHydrated ? 260 : 420, 900, 1700];
21882
+ const settleTimeoutIds = settleDelays.map(
21883
+ (delay) => setTimeout(maybeScrollToBottom, delay)
21884
+ );
21885
+ const stopKeepingPinnedToBottom = () => {
21886
+ keepPinnedToBottom = false;
21887
+ };
21888
+ listElement.addEventListener("pointerdown", stopKeepingPinnedToBottom, {
21889
+ passive: true
21890
+ });
21891
+ listElement.addEventListener("touchstart", stopKeepingPinnedToBottom, {
21892
+ passive: true
21893
+ });
21894
+ listElement.addEventListener("wheel", stopKeepingPinnedToBottom, {
21895
+ passive: true
21896
+ });
21897
+ listElement.addEventListener("keydown", stopKeepingPinnedToBottom);
21898
+ const pinWindowTimeoutId = setTimeout(() => {
21899
+ stopKeepingPinnedToBottom();
21900
+ }, 2200);
21901
+ return () => {
21902
+ settleTimeoutIds.forEach(clearTimeout);
21903
+ clearTimeout(pinWindowTimeoutId);
21904
+ listElement.removeEventListener("pointerdown", stopKeepingPinnedToBottom);
21905
+ listElement.removeEventListener("touchstart", stopKeepingPinnedToBottom);
21906
+ listElement.removeEventListener("wheel", stopKeepingPinnedToBottom);
21907
+ listElement.removeEventListener("keydown", stopKeepingPinnedToBottom);
21908
+ };
21909
+ }, [
21910
+ disableAutoScrollToBottom,
21911
+ hasMoreNewer,
21912
+ justReachedLatestMessageSet,
21913
+ listElement,
21914
+ messages.length,
21915
+ scrollToBottom,
21916
+ scrolledUpThreshold,
21917
+ suppressAutoscroll
21918
+ ]);
21539
21919
  const updateScrollTop = useMessageListScrollManager({
21540
21920
  captureAnchor,
21541
21921
  disableScrollManagement: disableScrollManagement || isRestoringOlderAnchorRef.current,
@@ -21562,6 +21942,9 @@ const useScrollLocationLogic = (params) => {
21562
21942
  useLayoutEffect(() => {
21563
21943
  previousHasMoreNewerRef.current = hasMoreNewer;
21564
21944
  }, [hasMoreNewer]);
21945
+ useLayoutEffect(() => {
21946
+ previousMessagesLengthRef.current = messages.length;
21947
+ }, [messages.length]);
21565
21948
  const onScroll = useCallback(
21566
21949
  (event) => {
21567
21950
  const element = event.target;
@@ -21570,8 +21953,10 @@ const useScrollLocationLogic = (params) => {
21570
21953
  updateScrollTop(scrollTop, captureAnchor);
21571
21954
  const offsetHeight = element.offsetHeight;
21572
21955
  const scrollHeight = element.scrollHeight;
21956
+ const distanceToBottom = scrollHeight - (scrollTop + offsetHeight);
21957
+ const bottomEnterThreshold = Math.max(Math.floor(scrolledUpThreshold * 0.6), 24);
21573
21958
  const prevCloseToBottom = closeToBottom.current;
21574
- closeToBottom.current = scrollHeight - (scrollTop + offsetHeight) < scrolledUpThreshold;
21959
+ closeToBottom.current = prevCloseToBottom ? distanceToBottom < scrolledUpThreshold : distanceToBottom < bottomEnterThreshold;
21575
21960
  closeToTop.current = scrollTop < scrolledUpThreshold;
21576
21961
  if (closeToBottom.current) {
21577
21962
  setHasNewMessages(false);
@@ -21616,7 +22001,7 @@ const UnreadMessagesSeparator = ({
21616
22001
  onClick: () => markRead(),
21617
22002
  size: "sm",
21618
22003
  variant: "secondary",
21619
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
22004
+ children: /* @__PURE__ */ jsx(IconXmark, {})
21620
22005
  }
21621
22006
  )
21622
22007
  ]
@@ -21836,7 +22221,7 @@ const UnreadMessagesNotification = ({
21836
22221
  ]
21837
22222
  }
21838
22223
  ),
21839
- /* @__PURE__ */ jsx(Button, { appearance: "outline", onClick: () => markRead(), variant: "secondary", children: /* @__PURE__ */ jsx(IconCrossMedium, {}) })
22224
+ /* @__PURE__ */ jsx(Button, { appearance: "outline", onClick: () => markRead(), variant: "secondary", children: /* @__PURE__ */ jsx(IconXmark, {}) })
21840
22225
  ]
21841
22226
  }
21842
22227
  );
@@ -23506,11 +23891,17 @@ const useConnectionRecoveredListener = (forceUpdate) => {
23506
23891
  const MOBILE_NAV_BREAKPOINT = 768;
23507
23892
  const useMobileNavigation = (channelListRef, navOpen, closeMobileNav) => {
23508
23893
  useEffect(() => {
23894
+ const isClickInsideChannelList = (event) => {
23895
+ const channelListElement = channelListRef.current;
23896
+ if (!channelListElement) return false;
23897
+ const eventPath = event.composedPath();
23898
+ return eventPath.includes(channelListElement);
23899
+ };
23509
23900
  const handleClickOutside = (event) => {
23510
23901
  if (typeof window !== "undefined" && window.innerWidth >= MOBILE_NAV_BREAKPOINT) {
23511
23902
  return;
23512
23903
  }
23513
- if (closeMobileNav && channelListRef.current && !channelListRef.current.contains(event.target) && navOpen) {
23904
+ if (closeMobileNav && channelListRef.current && !isClickInsideChannelList(event) && navOpen) {
23514
23905
  closeMobileNav();
23515
23906
  }
23516
23907
  };
@@ -24203,7 +24594,7 @@ const SearchBar = () => {
24203
24594
  "str-chat__search-bar__input-wrapper--active": isActive
24204
24595
  }),
24205
24596
  children: [
24206
- /* @__PURE__ */ jsx(IconMagnifyingGlassSearch, {}),
24597
+ /* @__PURE__ */ jsx(IconSearch, {}),
24207
24598
  /* @__PURE__ */ jsx(
24208
24599
  "input",
24209
24600
  {
@@ -24247,7 +24638,7 @@ const SearchBar = () => {
24247
24638
  ref: clearButtonRef,
24248
24639
  size: "xs",
24249
24640
  variant: "secondary",
24250
- children: /* @__PURE__ */ jsx(IconCircleX, {})
24641
+ children: /* @__PURE__ */ jsx(IconXCircle, {})
24251
24642
  }
24252
24643
  )
24253
24644
  ]
@@ -24640,7 +25031,7 @@ const UnMemoizedLoadMoreButton = ({
24640
25031
  return /* @__PURE__ */ jsx("div", { className: "str-chat__load-more-button", children: /* @__PURE__ */ jsx(
24641
25032
  Button,
24642
25033
  {
24643
- appearance: "outline",
25034
+ appearance: "ghost",
24644
25035
  "aria-label": t("aria/Load More Channels"),
24645
25036
  "data-testid": "load-more-button",
24646
25037
  disabled: loading,
@@ -25248,6 +25639,36 @@ const useArchiveActionButtonBehavior = () => {
25248
25639
  };
25249
25640
  };
25250
25641
  const defaultChannelActionSet = [
25642
+ {
25643
+ // eslint-disable-next-line react/display-name
25644
+ Component: forwardRef((_, ref) => {
25645
+ const { channel } = useChannelListItemContext();
25646
+ const dialogId2 = ChannelListItemActionButtons.getDialogId({
25647
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
25648
+ channelId: channel.id
25649
+ });
25650
+ const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
25651
+ const dialogIsOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
25652
+ return /* @__PURE__ */ jsx(
25653
+ Button,
25654
+ {
25655
+ appearance: "ghost",
25656
+ "aria-expanded": dialogIsOpen,
25657
+ "aria-pressed": dialogIsOpen,
25658
+ circular: true,
25659
+ onClick: (e) => {
25660
+ e.stopPropagation();
25661
+ dialog.toggle();
25662
+ },
25663
+ ref,
25664
+ size: "sm",
25665
+ variant: "secondary",
25666
+ children: /* @__PURE__ */ jsx(IconMore, {})
25667
+ }
25668
+ );
25669
+ }),
25670
+ placement: "quick-dropdown-toggle"
25671
+ },
25251
25672
  {
25252
25673
  Component() {
25253
25674
  const behaviorProps = useArchiveActionButtonBehavior();
@@ -25335,7 +25756,7 @@ const defaultChannelActionSet = [
25335
25756
  {
25336
25757
  "aria-label": title,
25337
25758
  disabled: inProgress,
25338
- Icon: IconCircleBanSign,
25759
+ Icon: IconNoSign,
25339
25760
  onClick: async () => {
25340
25761
  try {
25341
25762
  setInProgress(true);
@@ -25380,7 +25801,7 @@ const defaultChannelActionSet = [
25380
25801
  const membership = useChannelMembershipState(channel);
25381
25802
  const dialogId2 = ChannelListItemActionButtons.getDialogId(
25382
25803
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
25383
- channel.id
25804
+ { channelId: channel.id }
25384
25805
  );
25385
25806
  const { dialog } = useDialogOnNearestManager({ id: dialogId2 });
25386
25807
  const [inProgress, setInProgress] = useState(false);
@@ -25441,7 +25862,7 @@ const defaultChannelActionSet = [
25441
25862
  {
25442
25863
  "aria-label": title,
25443
25864
  disabled: inProgress,
25444
- Icon: IconArrowBoxLeft,
25865
+ Icon: IconLeave,
25445
25866
  onClick: async (e) => {
25446
25867
  e.stopPropagation();
25447
25868
  try {
@@ -25482,59 +25903,23 @@ const useBaseChannelActionSetFilter = (channelActionSet) => {
25482
25903
  const connectedUserIsMember = typeof membership.user !== "undefined";
25483
25904
  const ownCapabilities = channel.data?.own_capabilities;
25484
25905
  return useMemo(() => {
25485
- const filtered = channelActionSet.filter(
25486
- (action) => match({
25487
- action,
25488
- connectedUserIsMember,
25489
- isDirectMessageChannel,
25490
- memberCount,
25491
- ownCapabilities
25492
- }).returnType().with(
25493
- {
25494
- action: { connectedUserIsMember: true, placement: "quick", type: "archive" },
25495
- isDirectMessageChannel: true
25496
- },
25497
- {
25498
- action: {
25499
- connectedUserIsMember: true,
25500
- placement: "dropdown",
25501
- type: "archive"
25502
- },
25503
- isDirectMessageChannel: false
25504
- },
25505
- {
25506
- action: { placement: "dropdown", type: "mute" },
25507
- isDirectMessageChannel: true,
25508
- ownCapabilities: P.when(
25509
- (capabilities) => capabilities?.includes("mute-channel")
25510
- )
25511
- },
25512
- {
25513
- action: { placement: "quick", type: "mute" },
25514
- isDirectMessageChannel: false,
25515
- ownCapabilities: P.when(
25516
- (capabilities) => capabilities?.includes("mute-channel")
25517
- )
25518
- },
25519
- {
25520
- action: { type: "ban" },
25521
- memberCount: P.number.gt(0).and(P.number.lte(2)),
25522
- ownCapabilities: P.when(
25523
- (capabilities) => capabilities?.includes("ban-channel-members")
25524
- )
25525
- },
25526
- {
25527
- action: { type: "leave" },
25528
- ownCapabilities: P.when(
25529
- (capabilities) => capabilities?.includes("leave-channel")
25530
- )
25531
- },
25532
- {
25533
- action: { connectedUserIsMember: true, type: "pin" }
25534
- },
25535
- () => true
25536
- ).otherwise(() => false)
25537
- );
25906
+ const filtered = channelActionSet.filter((action) => {
25907
+ if (action.placement === "quick-dropdown-toggle") return true;
25908
+ switch (action.type) {
25909
+ case "archive":
25910
+ return connectedUserIsMember && (action.placement === "quick" && isDirectMessageChannel || action.placement === "dropdown" && !isDirectMessageChannel);
25911
+ case "mute":
25912
+ return ownCapabilities?.includes("mute-channel") && (action.placement === "dropdown" && isDirectMessageChannel || action.placement === "quick" && !isDirectMessageChannel);
25913
+ case "ban":
25914
+ return memberCount > 0 && memberCount <= 2 && ownCapabilities?.includes("ban-channel-members");
25915
+ case "leave":
25916
+ return ownCapabilities?.includes("leave-channel");
25917
+ case "pin":
25918
+ return connectedUserIsMember;
25919
+ default:
25920
+ return true;
25921
+ }
25922
+ });
25538
25923
  return filtered;
25539
25924
  }, [
25540
25925
  channelActionSet,
@@ -25545,17 +25930,18 @@ const useBaseChannelActionSetFilter = (channelActionSet) => {
25545
25930
  ]);
25546
25931
  };
25547
25932
  const ChannelListItemActionButtons = () => {
25933
+ const { ContextMenu: ContextMenuComponent = ContextMenu } = useComponentContext();
25548
25934
  const { channel } = useChannelListItemContext();
25549
25935
  const [referenceElement, setReferenceElement] = React.useState(null);
25550
- const dialogId2 = ChannelListItemActionButtons.getDialogId(
25936
+ const dialogId2 = ChannelListItemActionButtons.getDialogId({
25551
25937
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
25552
- channel.id
25553
- );
25938
+ channelId: channel.id
25939
+ });
25554
25940
  const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
25555
25941
  const dialogIsOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
25556
25942
  const filteredActionSet = useBaseChannelActionSetFilter(defaultChannelActionSet);
25557
- const splitActionSet = useSplitActionSet(filteredActionSet);
25558
- if (splitActionSet.quickActionSet.length + splitActionSet.dropdownActionSet.length === 0) {
25943
+ const { dropdownActionSet, quickActionSet, quickDropdownToggleAction } = useSplitActionSet(filteredActionSet);
25944
+ if (quickActionSet.length + dropdownActionSet.length === 0) {
25559
25945
  return null;
25560
25946
  }
25561
25947
  return /* @__PURE__ */ jsxs(
@@ -25565,26 +25951,10 @@ const ChannelListItemActionButtons = () => {
25565
25951
  "str-chat__channel-list-item__action-buttons--active": dialogIsOpen
25566
25952
  }),
25567
25953
  children: [
25568
- splitActionSet.dropdownActionSet.length > 0 && /* @__PURE__ */ jsx(
25569
- Button,
25570
- {
25571
- appearance: "ghost",
25572
- "aria-expanded": dialogIsOpen,
25573
- "aria-pressed": dialogIsOpen,
25574
- circular: true,
25575
- onClick: (e) => {
25576
- e.stopPropagation();
25577
- dialog.toggle();
25578
- },
25579
- ref: setReferenceElement,
25580
- size: "sm",
25581
- variant: "secondary",
25582
- children: /* @__PURE__ */ jsx(IconDotGrid1x3Horizontal, {})
25583
- }
25584
- ),
25585
- splitActionSet.quickActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type)),
25954
+ quickDropdownToggleAction && dropdownActionSet.length > 0 && /* @__PURE__ */ jsx(quickDropdownToggleAction.Component, { ref: setReferenceElement }),
25955
+ quickActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type)),
25586
25956
  /* @__PURE__ */ jsx(
25587
- ContextMenu,
25957
+ ContextMenuComponent,
25588
25958
  {
25589
25959
  className: "str-chat__channel-list-item__action-buttons-context-menu",
25590
25960
  dialogManagerId: dialogManager?.id,
@@ -25594,14 +25964,14 @@ const ChannelListItemActionButtons = () => {
25594
25964
  referenceElement,
25595
25965
  tabIndex: -1,
25596
25966
  trapFocus: true,
25597
- children: splitActionSet.dropdownActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type))
25967
+ children: dropdownActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type))
25598
25968
  }
25599
25969
  )
25600
25970
  ]
25601
25971
  }
25602
25972
  );
25603
25973
  };
25604
- ChannelListItemActionButtons.getDialogId = (channelId) => `channel-action-buttons-${channelId}`;
25974
+ ChannelListItemActionButtons.getDialogId = ({ channelId }) => `channel-action-buttons-${channelId}`;
25605
25975
  ChannelListItemActionButtons.displayName = "ChannelListItemActionButtons";
25606
25976
  function ChannelListItemTimestamp({ lastMessage }) {
25607
25977
  const { t, tDateTimeParser } = useTranslationContext("ChannelListItemTimestamp");
@@ -25751,21 +26121,21 @@ const useLatestMessagePreview = ({
25751
26121
  ]);
25752
26122
  };
25753
26123
  const deliveryStatusIconMap = {
25754
- delivered: IconDoubleCheckmark1Small,
25755
- read: IconDoubleCheckmark1Small,
26124
+ delivered: IconChecks,
26125
+ read: IconChecks,
25756
26126
  sending: IconClock,
25757
26127
  sent: IconCheckmark1Small
25758
26128
  };
25759
26129
  const contentTypeIconMap = {
25760
- deleted: IconCircleBanSign,
25761
- error: IconExclamationCircle1,
25762
- file: IconFileBend,
25763
- giphy: IconFileBend,
25764
- image: IconCamera1,
25765
- link: IconChainLink,
25766
- location: IconMapPin,
26130
+ deleted: IconNoSign,
26131
+ error: IconExclamationCircleFill,
26132
+ file: IconFile,
26133
+ giphy: IconFile,
26134
+ image: IconCamera,
26135
+ link: IconLink,
26136
+ location: IconLocation,
25767
26137
  video: IconVideo,
25768
- voice: IconMicrophone
26138
+ voice: IconVoice
25769
26139
  };
25770
26140
  const SummarizedMessagePreview = ({
25771
26141
  latestMessage,
@@ -26361,7 +26731,7 @@ const ThreadListItem = ({
26361
26731
  const ThreadListEmptyPlaceholder = () => {
26362
26732
  const { t } = useTranslationContext("ThreadListEmptyPlaceholder");
26363
26733
  return /* @__PURE__ */ jsxs("div", { className: "str-chat__thread-list-empty-placeholder", children: [
26364
- /* @__PURE__ */ jsx(IconBubbles, {}),
26734
+ /* @__PURE__ */ jsx(IconMessageBubbles, {}),
26365
26735
  /* @__PURE__ */ jsx("p", { children: t("Reply to a message to start a thread") })
26366
26736
  ] });
26367
26737
  };
@@ -26384,7 +26754,7 @@ const ThreadListUnseenThreadsBanner = () => {
26384
26754
  onClick: () => client.threads.reload(),
26385
26755
  children: [
26386
26756
  !isLoading && /* @__PURE__ */ jsxs(Fragment, { children: [
26387
- /* @__PURE__ */ jsx(IconArrowRotateRightLeftRepeatRefresh, {}),
26757
+ /* @__PURE__ */ jsx(IconRefresh, {}),
26388
26758
  /* @__PURE__ */ jsx("span", { children: t("ThreadListUnseenThreadsBanner/unreadThreads", {
26389
26759
  count: unseenThreadIds.length
26390
26760
  }) })
@@ -26539,11 +26909,11 @@ const ThreadList = ({ virtuosoProps }) => {
26539
26909
  );
26540
26910
  };
26541
26911
  const IconsBySeverity = {
26542
- error: IconExclamationCircle,
26912
+ error: IconExclamationMark,
26543
26913
  info: null,
26544
- // IconCircleInfoTooltip,
26545
- loading: IconArrowRotateRightLeftRepeatRefresh,
26546
- success: IconCheckmark2,
26914
+ // IconInfo,
26915
+ loading: IconRefresh,
26916
+ success: IconCheckmark,
26547
26917
  warning: IconExclamationTriangle
26548
26918
  };
26549
26919
  const DefaultNotificationIcon = ({ notification }) => {
@@ -26622,7 +26992,7 @@ const Notification = forwardRef(
26622
26992
  onClick: handleDismiss,
26623
26993
  size: "sm",
26624
26994
  variant: "secondary",
26625
- children: /* @__PURE__ */ jsx(IconCrossMedium, {})
26995
+ children: /* @__PURE__ */ jsx(IconXmark, {})
26626
26996
  }
26627
26997
  )
26628
26998
  ]
@@ -26927,7 +27297,7 @@ const VoiceRecordingPlayerUI = ({ audioPlayer }) => {
26927
27297
  secondsElapsed
26928
27298
  } = useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};
26929
27299
  return /* @__PURE__ */ jsxs("div", { className: rootClassName, "data-testid": "voice-recording-widget", children: [
26930
- /* @__PURE__ */ jsx(PlayButton, { isPlaying: !!isPlaying, onClick: audioPlayer.togglePlay }),
27300
+ /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__voice-recording-widget__play-button-container", children: /* @__PURE__ */ jsx(PlayButton, { isPlaying: !!isPlaying, onClick: audioPlayer.togglePlay }) }),
26931
27301
  /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__voice-recording-widget__metadata", children: /* @__PURE__ */ jsxs("div", { className: "str-chat__message-attachment__voice-recording-widget__audio-state", children: [
26932
27302
  /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__voice-recording-widget__timer", children: durationSeconds ? /* @__PURE__ */ jsx(
26933
27303
  DurationDisplay,
@@ -27184,7 +27554,7 @@ const ThumbnailButton = ({
27184
27554
  "aria-hidden": "true",
27185
27555
  className: "str-chat__modal-gallery__image-load-failed-overlay",
27186
27556
  "data-testid": "str-chat__modal-gallery__image-load-failed-overlay",
27187
- children: /* @__PURE__ */ jsx("div", { className: "str-chat__modal-gallery__image-retry-indicator", children: /* @__PURE__ */ jsx(IconArrowRotateClockwise, {}) })
27557
+ children: /* @__PURE__ */ jsx("div", { className: "str-chat__modal-gallery__image-retry-indicator", children: /* @__PURE__ */ jsx(IconRetry, {}) })
27188
27558
  }
27189
27559
  ),
27190
27560
  showOverlay && /* @__PURE__ */ jsxs("div", { className: "str-chat__modal-gallery__placeholder", children: [
@@ -27275,7 +27645,7 @@ const CardContent = (props) => {
27275
27645
  className: "str-chat__message-attachment-card--source-link",
27276
27646
  "data-testid": "card-source-link",
27277
27647
  children: [
27278
- /* @__PURE__ */ jsx(IconChainLink, {}),
27648
+ /* @__PURE__ */ jsx(IconLink, {}),
27279
27649
  /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment-card--url", children: url })
27280
27650
  ]
27281
27651
  }
@@ -27336,23 +27706,44 @@ const FileAttachment = ({ attachment }) => {
27336
27706
  );
27337
27707
  };
27338
27708
  const Giphy = ({ attachment }) => {
27339
- const { giphyVersion: giphyVersionName } = useChannelStateContext();
27709
+ const { giphyVersion: giphyVersionName, imageAttachmentSizeHandler } = useChannelStateContext();
27340
27710
  const { BaseImage: BaseImage$1 = BaseImage } = useComponentContext();
27341
27711
  const { t } = useTranslationContext();
27342
27712
  const usesDefaultBaseImage = BaseImage$1 === BaseImage;
27713
+ const imageElement = useRef(null);
27714
+ const [attachmentConfiguration, setAttachmentConfiguration] = useState(void 0);
27343
27715
  const imageDescriptors = useMemo(
27344
27716
  () => toGalleryItemDescriptors(attachment, { giphyVersionName }),
27345
27717
  [attachment, giphyVersionName]
27346
27718
  );
27347
- if (!imageDescriptors?.imageUrl) return null;
27348
- const { alt, dimensions, imageUrl, title } = imageDescriptors;
27719
+ const alt = imageDescriptors && imageDescriptors.alt;
27720
+ const dimensions = imageDescriptors && imageDescriptors.dimensions;
27721
+ const imageUrl = imageDescriptors && imageDescriptors.imageUrl;
27722
+ const title = imageDescriptors && imageDescriptors.title;
27723
+ const resolvedImageUrl = attachmentConfiguration?.url || imageUrl;
27724
+ const imageStyleVariables = useMemo(() => {
27725
+ const originalHeight = Number(dimensions?.height);
27726
+ const originalWidth = Number(dimensions?.width);
27727
+ return {
27728
+ "--original-height": String(originalHeight > 1 ? originalHeight : 1e6),
27729
+ "--original-width": String(originalWidth > 1 ? originalWidth : 1e6)
27730
+ };
27731
+ }, [dimensions?.height, dimensions?.width]);
27732
+ useLayoutEffect(() => {
27733
+ if (!imageElement.current || !imageAttachmentSizeHandler) return;
27734
+ const config = imageAttachmentSizeHandler(attachment, imageElement.current);
27735
+ setAttachmentConfiguration(config);
27736
+ }, [attachment, imageAttachmentSizeHandler]);
27737
+ if (!imageUrl) return null;
27349
27738
  return /* @__PURE__ */ jsxs("div", { className: clsx(`str-chat__message-attachment-giphy`), children: [
27350
27739
  /* @__PURE__ */ jsx(
27351
27740
  BaseImage$1,
27352
27741
  {
27353
27742
  alt: alt ?? title ?? t("User uploaded content"),
27354
27743
  height: dimensions?.height,
27355
- src: imageUrl,
27744
+ ref: imageElement,
27745
+ src: resolvedImageUrl,
27746
+ style: imageStyleVariables,
27356
27747
  width: dimensions?.width,
27357
27748
  ...usesDefaultBaseImage ? { showDownloadButtonOnError: false } : {}
27358
27749
  }
@@ -27425,7 +27816,7 @@ const DefaultGeolocationAttachmentMapPlaceholder = ({
27425
27816
  className: "str-chat__message-attachment-geolocation__placeholder",
27426
27817
  "data-testid": "geolocation-attachment-map-placeholder",
27427
27818
  children: [
27428
- /* @__PURE__ */ jsx(IconMapPin, {}),
27819
+ /* @__PURE__ */ jsx(IconLocation, {}),
27429
27820
  /* @__PURE__ */ jsx(
27430
27821
  "a",
27431
27822
  {
@@ -27977,12 +28368,12 @@ export {
27977
28368
  Card,
27978
28369
  CardContainer,
27979
28370
  bx as Channel,
27980
- dc as ChannelActionContext,
27981
- dd as ChannelActionProvider,
28371
+ c5 as ChannelActionContext,
28372
+ c6 as ChannelActionProvider,
27982
28373
  ChannelAvatar,
27983
28374
  ChannelHeader,
27984
28375
  ChannelList,
27985
- de as ChannelListContext,
28376
+ c7 as ChannelListContext,
27986
28377
  ChannelListContextProvider,
27987
28378
  ChannelListItem,
27988
28379
  ChannelListItemActionButtons,
@@ -27990,10 +28381,10 @@ export {
27990
28381
  ChannelListItemUI,
27991
28382
  ChannelListUI,
27992
28383
  ChannelSearchResultItem,
27993
- df as ChannelStateContext,
27994
- dg as ChannelStateProvider,
28384
+ c8 as ChannelStateContext,
28385
+ c9 as ChannelStateProvider,
27995
28386
  Chat,
27996
- dh as ChatContext,
28387
+ ca as ChatContext,
27997
28388
  ChatProvider,
27998
28389
  bz as ChatView,
27999
28390
  bC as ChatViewChannelsSelectorButton,
@@ -28005,12 +28396,13 @@ export {
28005
28396
  CommandChip,
28006
28397
  CommandItem,
28007
28398
  ComponentContext,
28008
- di as ComponentProvider,
28399
+ cb as ComponentProvider,
28009
28400
  ConnectionStatus,
28010
28401
  ContextMenu,
28011
28402
  ContextMenuBackButton,
28012
28403
  ContextMenuBody,
28013
28404
  ContextMenuButton,
28405
+ ContextMenuContent,
28014
28406
  ContextMenuHeader,
28015
28407
  ContextMenuRoot,
28016
28408
  CooldownTimer,
@@ -28050,163 +28442,92 @@ export {
28050
28442
  GlobalModal,
28051
28443
  GroupAvatar,
28052
28444
  Header$1 as Header,
28053
- bG as IconApiAggregate,
28054
- bH as IconApples,
28055
28445
  IconArchive,
28056
- IconArrowBoxLeft,
28057
28446
  IconArrowDown,
28058
28447
  IconArrowDownCircle,
28059
28448
  IconArrowLeft,
28060
- bI as IconArrowRight,
28061
- IconArrowRightUp,
28062
- IconArrowRotateClockwise,
28063
- IconArrowRotateRightLeftRepeatRefresh,
28064
- IconArrowShareLeft,
28449
+ bG as IconArrowRight,
28065
28450
  IconArrowUp,
28066
- bJ as IconArrowsRepeatLeftRight,
28067
- bK as IconAt,
28068
- bL as IconAtSolid,
28069
- IconBellNotification,
28451
+ IconArrowUpRight,
28452
+ IconAttachment,
28453
+ IconAudio,
28454
+ IconBell,
28070
28455
  IconBellOff,
28071
- IconBookmark,
28072
- IconBookmarkRemove,
28073
- bM as IconBrowserAISparkle,
28074
- bN as IconBubble2ChatMessage,
28075
- bO as IconBubble2Solid,
28076
- bP as IconBubble3ChatMessage,
28077
- bQ as IconBubble3Solid,
28078
- bR as IconBubbleAnnotation2ChatMessage,
28079
- IconBubbleText6ChatMessage,
28080
- bT as IconBubbleText6Solid,
28081
- bS as IconBubbleText6SolidChatMessage,
28082
- IconBubbleWideNotificationChatMessage,
28083
- bU as IconBubbleWideSparkleChatMessage,
28084
- IconBubbles,
28085
- bV as IconCalendar1,
28086
- bW as IconCallCancel,
28087
- IconCamera1,
28088
- bX as IconCar1,
28089
- bY as IconCat,
28090
- IconChainLink,
28091
- IconChart5,
28456
+ bJ as IconBubble3ChatMessage,
28457
+ bK as IconBubbleText6SolidChatMessage,
28458
+ IconCamera,
28459
+ IconCheckmark,
28092
28460
  IconCheckmark1Small,
28093
- IconCheckmark2,
28094
- bZ as IconCheckmark2Small,
28461
+ IconChecks,
28095
28462
  IconChevronDown,
28096
- b_ as IconChevronGrabberVerticalSelector,
28097
28463
  IconChevronLeft,
28098
28464
  IconChevronRight,
28099
- b$ as IconChevronTop,
28100
- IconCircleBanSign,
28101
- c0 as IconCircleCheck,
28102
- c1 as IconCircleInfoTooltip,
28103
- IconCircleMinus,
28104
- c2 as IconCircleQuestionmark,
28105
- c3 as IconCircleQuestionmarkFilled,
28106
- IconCircleX,
28107
28465
  IconClock,
28108
- c4 as IconClockSolid,
28109
- IconCloseQuote2,
28110
- c5 as IconCode,
28111
- c6 as IconCodeBrackets,
28112
- c7 as IconCodeEditorInsert,
28113
- c8 as IconCompass,
28114
- c9 as IconCreditCard2Billing,
28115
- IconCrossMedium,
28466
+ IconCommand,
28467
+ IconCopy,
28116
28468
  IconCrossSmall,
28117
- IconDotGrid1x3Horizontal,
28118
- IconDotGrid2x3,
28119
- ca as IconDotsGrid1x3Vertical,
28120
- IconDoubleCheckmark1Small,
28121
- IconEditBig,
28122
- cb as IconEditBigSolid,
28123
- cc as IconEmojiAddReaction,
28124
- cd as IconEmojiSad,
28125
- IconEmojiSmile,
28126
- IconExclamation,
28127
- IconExclamationCircle,
28128
- IconExclamationCircle1,
28469
+ IconDelete,
28470
+ IconEdit,
28471
+ IconEmoji,
28472
+ IconExclamationCircleFill,
28473
+ IconExclamationMark,
28474
+ IconExclamationMarkFill,
28129
28475
  IconExclamationTriangle,
28130
- ce as IconExclamationTriangle1,
28131
28476
  IconEyeOpen,
28132
- IconFileArrowLeftIn,
28133
- IconFileBend,
28134
- cf as IconFilledCircleInfoTooltip,
28135
- cg as IconFilter1,
28136
- IconFlag2,
28137
- ch as IconGauge,
28477
+ IconFile,
28478
+ IconFlag,
28138
28479
  IconGiphy,
28139
- ci as IconGoogle,
28140
- cj as IconHashtagChannel,
28141
- ck as IconHeart2,
28142
- cl as IconHistory,
28143
- IconImages1Alt,
28144
- cm as IconInvite,
28145
- cn as IconLayersBehind,
28480
+ IconImage,
28481
+ bM as IconInfo,
28146
28482
  IconLayoutAlignLeft,
28147
- co as IconLayoutGrid1,
28148
- cp as IconLightBulbSimple,
28149
- cq as IconLimits,
28150
- cr as IconLineChart3,
28151
- IconLoadingCircle,
28152
- cs as IconLock,
28153
- IconMagnifyingGlassSearch,
28154
- IconMapPin,
28155
- IconMicrophone,
28156
- ct as IconMicrophoneSolid,
28157
- cu as IconMinusLarge,
28158
- cv as IconMinusSmall,
28483
+ IconLeave,
28484
+ bN as IconLightBulbSimple,
28485
+ IconLink,
28486
+ IconLoading,
28487
+ IconLocation,
28488
+ bH as IconMessageBubble,
28489
+ bI as IconMessageBubbleFill,
28490
+ IconMessageBubbles,
28491
+ bP as IconMinus,
28492
+ IconMinusCircle,
28493
+ bQ as IconMinusSmall,
28494
+ IconMore,
28159
28495
  IconMute,
28160
- cw as IconNewspaper2,
28161
- cx as IconOrganization,
28162
- IconPaperPlane,
28163
- cy as IconPaperPlaneTopRight,
28164
- IconPaperclip,
28165
- cz as IconParagraphsText,
28166
- IconPause,
28167
- cA as IconPencil,
28168
- IconPeople,
28169
- cB as IconPeople2,
28170
- IconPeopleAdd,
28171
- IconPeopleAdded,
28172
- cC as IconPeopleCircle,
28173
- cD as IconPeopleCopy,
28174
- cE as IconPeopleEditUserRights,
28175
- IconPeopleRemove,
28176
- cF as IconPersona,
28496
+ IconNoSign,
28497
+ IconNotification,
28498
+ IconPauseFill,
28177
28499
  IconPin,
28178
- IconPlaySolid,
28179
- IconPlusLarge,
28500
+ IconPlayFill,
28501
+ IconPlus,
28180
28502
  IconPlusSmall,
28181
- IconRunShortcut,
28182
- cG as IconSearchText,
28183
- cH as IconSettingsGear2,
28184
- cI as IconSettingsSliderVer,
28185
- cJ as IconShapesPlusCloseSquareCircle,
28186
- cK as IconShapesTriangleSquareCircle,
28187
- cL as IconShareRedirectLink,
28188
- cM as IconShield,
28189
- IconSquareBehindSquare2_Copy,
28190
- cN as IconSquareCircleTopRightFeeds,
28191
- cO as IconStop,
28192
- cP as IconTable,
28193
- cQ as IconTeam,
28194
- cR as IconTennis,
28195
- cS as IconTextToImageURLEnrichment,
28503
+ IconPoll,
28504
+ IconQuote,
28505
+ IconRefresh,
28506
+ IconReorder,
28507
+ IconReply,
28508
+ IconRetry,
28509
+ IconSave,
28510
+ IconSearch,
28511
+ IconSend,
28512
+ bR as IconSettingsGear2,
28513
+ IconThread,
28514
+ bL as IconThreadFill,
28196
28515
  IconThunder,
28197
28516
  IconTranslate,
28198
- IconTrashBin,
28199
- cT as IconTrending4,
28200
28517
  IconTrophy,
28201
- cU as IconUnlocked,
28202
28518
  IconUnpin,
28203
- cV as IconUsers,
28519
+ IconUnsave,
28520
+ IconUpload,
28521
+ IconUser,
28522
+ IconUserAdd,
28523
+ IconUserCheck,
28524
+ IconUserRemove,
28204
28525
  IconVideo,
28205
- IconVideoSolid,
28206
- cW as IconVoiceAndVideo,
28207
- cX as IconVoiceHigh,
28208
- IconVolumeFull,
28209
- cY as IconWebhook,
28526
+ IconVideoFill,
28527
+ IconVoice,
28528
+ bO as IconVoiceFill,
28529
+ IconXCircle,
28530
+ IconXmark,
28210
28531
  ImageComponent,
28211
28532
  ImageContainer,
28212
28533
  ImagePlaceholder,
@@ -28215,9 +28536,9 @@ export {
28215
28536
  LinkPreviewList,
28216
28537
  LoadMoreButton,
28217
28538
  LoadMorePaginator,
28218
- cZ as LoadingChannel,
28539
+ bS as LoadingChannel,
28219
28540
  LoadingChannels,
28220
- c_ as LoadingErrorIndicator,
28541
+ bT as LoadingErrorIndicator,
28221
28542
  LoadingIndicator,
28222
28543
  LoadingIndicatorIcon,
28223
28544
  MAX_MESSAGE_REACTIONS_TO_FETCH,
@@ -28232,7 +28553,7 @@ export {
28232
28553
  MessageBouncePrompt,
28233
28554
  MessageBounceProvider,
28234
28555
  MessageComposer,
28235
- dj as MessageComposerContext,
28556
+ cc as MessageComposerContext,
28236
28557
  MessageComposerContextProvider,
28237
28558
  MessageComposerUI,
28238
28559
  MessageContext,
@@ -28245,6 +28566,7 @@ export {
28245
28566
  MessageProvider,
28246
28567
  MessageReactions,
28247
28568
  MessageReactionsDetail,
28569
+ MessageReactionsDetailLoadingIndicator,
28248
28570
  MessageRepliesCountButton,
28249
28571
  MessageSearchResultItem,
28250
28572
  MessageStatus,
@@ -28264,7 +28586,7 @@ export {
28264
28586
  NotificationList,
28265
28587
  NotificationTranslationTopic,
28266
28588
  NumericInput,
28267
- c$ as OPTIONAL_MESSAGE_ACTIONS,
28589
+ bU as OPTIONAL_MESSAGE_ACTIONS,
28268
28590
  OtherFilesContainer,
28269
28591
  PauseIcon,
28270
28592
  PinIndicator,
@@ -28331,22 +28653,22 @@ export {
28331
28653
  TextInputFieldSet,
28332
28654
  TextareaComposer,
28333
28655
  Thread,
28334
- da as ThreadContext,
28656
+ c3 as ThreadContext,
28335
28657
  ThreadHeader,
28336
28658
  ThreadList,
28337
28659
  ThreadListItem,
28338
28660
  ThreadListItemUI,
28339
- db as ThreadProvider,
28661
+ c4 as ThreadProvider,
28340
28662
  ThreadStart,
28341
28663
  Tooltip,
28342
28664
  TranslationBuilder,
28343
- dk as TranslationContext,
28665
+ cd as TranslationContext,
28344
28666
  TranslationProvider,
28345
28667
  TranslationTopic,
28346
- dl as TypingContext,
28668
+ ce as TypingContext,
28347
28669
  TypingIndicator,
28348
28670
  TypingIndicatorHeader,
28349
- dm as TypingProvider,
28671
+ cf as TypingProvider,
28350
28672
  UNREAD_MESSAGE_SEPARATOR_CLASS,
28351
28673
  UnMemoizedLoadMorePaginator,
28352
28674
  UnreadMessagesNotification,
@@ -28404,21 +28726,21 @@ export {
28404
28726
  getCssDimensionsVariables,
28405
28727
  getGroupChannelDisplayInfo,
28406
28728
  getGroupStyles,
28407
- d0 as getImages,
28729
+ bV as getImages,
28408
28730
  getIsFirstUnreadMessage,
28409
28731
  getLastReceived,
28410
28732
  getLatestMessagePreview,
28411
28733
  getMessageActions,
28412
- d1 as getNonImageAttachments,
28413
- d7 as getNotificationTargetPanel,
28414
- d8 as getNotificationTargetTag,
28734
+ bW as getNonImageAttachments,
28735
+ c0 as getNotificationTargetPanel,
28736
+ c1 as getNotificationTargetTag,
28415
28737
  getReadByTooltipText,
28416
28738
  getTextareaCaretRect,
28417
28739
  getTranslatedMessageText,
28418
28740
  getWholeChar,
28419
28741
  handleActionWarning,
28420
- d4 as hasMoreMessagesProbably,
28421
- d5 as hasNotMoreMessages,
28742
+ bZ as hasMoreMessagesProbably,
28743
+ b_ as hasNotMoreMessages,
28422
28744
  hiTranslations,
28423
28745
  htmlToTextPlugin,
28424
28746
  imageToLink,
@@ -28428,7 +28750,7 @@ export {
28428
28750
  isChrome,
28429
28751
  isDate,
28430
28752
  isDateSeparatorMessage,
28431
- dn as isDayOrMoment,
28753
+ cg as isDayOrMoment,
28432
28754
  isFirefox,
28433
28755
  isGalleryAttachmentType,
28434
28756
  isIntroMessage,
@@ -28440,8 +28762,8 @@ export {
28440
28762
  isMessageErrorRetryable,
28441
28763
  isNetworkSendFailure,
28442
28764
  isNotificationForPanel,
28443
- d6 as isNotificationTargetPanel,
28444
- dp as isNumberOrString,
28765
+ b$ as isNotificationTargetPanel,
28766
+ ch as isNumberOrString,
28445
28767
  isSafari,
28446
28768
  isSvgAttachment,
28447
28769
  isUserMuted,
@@ -28449,8 +28771,8 @@ export {
28449
28771
  jaTranslations,
28450
28772
  keepLineBreaksPlugin,
28451
28773
  koTranslations,
28452
- d3 as makeDateMessageId,
28453
- d2 as makeIntroMessage,
28774
+ bY as makeDateMessageId,
28775
+ bX as makeIntroMessage,
28454
28776
  mapEmojiMartData,
28455
28777
  mapToUserNameOrId,
28456
28778
  markDownRenderers,
@@ -28528,7 +28850,7 @@ export {
28528
28850
  useFlagHandler,
28529
28851
  useGalleryContext,
28530
28852
  useLastReadData,
28531
- d9 as useLegacyThreadContext,
28853
+ c2 as useLegacyThreadContext,
28532
28854
  useLiveLocationSharingManager,
28533
28855
  useMarkUnreadHandler,
28534
28856
  useMentionsHandler,