stream-chat-react 12.9.0 → 12.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/dist/components/Attachment/Attachment.js +2 -1
  2. package/dist/components/Attachment/AttachmentContainer.d.ts +1 -1
  3. package/dist/components/Attachment/AttachmentContainer.js +2 -2
  4. package/dist/components/Attachment/Card.js +3 -3
  5. package/dist/components/Attachment/VoiceRecording.d.ts +1 -1
  6. package/dist/components/Attachment/VoiceRecording.js +2 -2
  7. package/dist/components/Attachment/attachment-sizing.js +2 -1
  8. package/dist/components/Attachment/components/FileSizeIndicator.d.ts +1 -1
  9. package/dist/components/Attachment/components/FileSizeIndicator.js +1 -1
  10. package/dist/components/Attachment/components/WaveProgressBar.js +1 -1
  11. package/dist/components/Attachment/hooks/useAudioController.d.ts +1 -1
  12. package/dist/components/Attachment/hooks/useAudioController.js +4 -2
  13. package/dist/components/Attachment/utils.d.ts +1 -1
  14. package/dist/components/Attachment/utils.js +12 -3
  15. package/dist/components/AutoCompleteTextarea/List.js +3 -2
  16. package/dist/components/AutoCompleteTextarea/Textarea.js +3 -7
  17. package/dist/components/AutoCompleteTextarea/utils.js +3 -7
  18. package/dist/components/Avatar/ChannelAvatar.js +1 -1
  19. package/dist/components/Channel/Channel.d.ts +1 -1
  20. package/dist/components/Channel/Channel.js +30 -14
  21. package/dist/components/Channel/channelState.d.ts +1 -3
  22. package/dist/components/Channel/channelState.js +10 -4
  23. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +5 -3
  24. package/dist/components/Channel/hooks/useIsMounted.d.ts +1 -1
  25. package/dist/components/Channel/hooks/useMentionsHandlers.js +5 -2
  26. package/dist/components/Channel/utils.js +2 -1
  27. package/dist/components/ChannelHeader/ChannelHeader.js +1 -1
  28. package/dist/components/ChannelList/ChannelList.js +13 -8
  29. package/dist/components/ChannelList/hooks/useChannelListShape.d.ts +2 -2
  30. package/dist/components/ChannelList/hooks/useChannelListShape.js +46 -19
  31. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.js +2 -1
  32. package/dist/components/ChannelList/hooks/useMessageNewListener.js +3 -1
  33. package/dist/components/ChannelList/hooks/useMobileNavigation.d.ts +1 -1
  34. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +5 -3
  35. package/dist/components/ChannelList/hooks/useSelectedChannelState.js +1 -1
  36. package/dist/components/ChannelPreview/ChannelPreview.js +2 -2
  37. package/dist/components/ChannelPreview/ChannelPreviewMessenger.js +1 -1
  38. package/dist/components/ChannelPreview/icons.js +0 -1
  39. package/dist/components/ChannelPreview/utils.js +3 -3
  40. package/dist/components/ChannelSearch/ChannelSearch.js +5 -3
  41. package/dist/components/ChannelSearch/SearchBar.d.ts +1 -1
  42. package/dist/components/ChannelSearch/SearchInput.d.ts +1 -1
  43. package/dist/components/ChannelSearch/SearchResults.js +1 -1
  44. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +4 -2
  45. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +61 -36
  46. package/dist/components/ChannelSearch/index.d.ts +1 -1
  47. package/dist/components/Chat/hooks/useChat.js +4 -2
  48. package/dist/components/Chat/hooks/useCreateChatClient.js +3 -1
  49. package/dist/components/ChatAutoComplete/ChatAutoComplete.js +1 -1
  50. package/dist/components/ChatView/ChatView.js +0 -1
  51. package/dist/components/Dialog/PromptDialog.d.ts +1 -1
  52. package/dist/components/Dialog/PromptDialog.js +1 -1
  53. package/dist/components/EventComponent/EventComponent.js +1 -1
  54. package/dist/components/Gallery/BaseImage.d.ts +1 -3
  55. package/dist/components/Gallery/Gallery.js +10 -2
  56. package/dist/components/Gallery/Image.js +1 -1
  57. package/dist/components/Gallery/ModalGallery.js +4 -4
  58. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.js +9 -6
  59. package/dist/components/InfiniteScrollPaginator/InfiniteScrollPaginator.js +1 -1
  60. package/dist/components/LoadMore/LoadMorePaginator.js +1 -1
  61. package/dist/components/MML/MML.js +1 -0
  62. package/dist/components/MediaRecorder/transcode/wav.js +6 -3
  63. package/dist/components/Message/FixedHeightMessage.js +6 -8
  64. package/dist/components/Message/Message.js +2 -1
  65. package/dist/components/Message/MessageEditedTimestamp.js +1 -1
  66. package/dist/components/Message/MessageSimple.js +2 -5
  67. package/dist/components/Message/MessageStatus.js +1 -1
  68. package/dist/components/Message/MessageText.js +7 -7
  69. package/dist/components/Message/QuotedMessage.js +2 -2
  70. package/dist/components/Message/Timestamp.js +9 -1
  71. package/dist/components/Message/hooks/useActionHandler.js +1 -1
  72. package/dist/components/Message/hooks/useFlagHandler.js +2 -1
  73. package/dist/components/Message/hooks/useMarkUnreadHandler.js +2 -1
  74. package/dist/components/Message/hooks/useMessageTextStreaming.d.ts +1 -1
  75. package/dist/components/Message/hooks/useMessageTextStreaming.js +1 -1
  76. package/dist/components/Message/hooks/useMuteHandler.js +7 -4
  77. package/dist/components/Message/hooks/usePinHandler.js +1 -1
  78. package/dist/components/Message/hooks/useReactionHandler.js +10 -5
  79. package/dist/components/Message/hooks/useRetryHandler.js +1 -1
  80. package/dist/components/Message/hooks/useUserRole.js +1 -1
  81. package/dist/components/Message/renderText/renderText.js +2 -2
  82. package/dist/components/Message/utils.js +3 -3
  83. package/dist/components/MessageActions/MessageActionsBox.js +7 -3
  84. package/dist/components/MessageActions/hooks/useMessageActionsBoxPopper.d.ts +1 -1
  85. package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.js +1 -1
  86. package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.js +4 -2
  87. package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.js +4 -2
  88. package/dist/components/MessageInput/AttachmentSelector.js +1 -1
  89. package/dist/components/MessageInput/DefaultTriggerProvider.js +1 -1
  90. package/dist/components/MessageInput/DropzoneProvider.js +1 -1
  91. package/dist/components/MessageInput/MessageInput.js +1 -1
  92. package/dist/components/MessageInput/MessageInputFlat.js +4 -3
  93. package/dist/components/MessageInput/QuotedMessagePreview.js +1 -1
  94. package/dist/components/MessageInput/hooks/useAttachments.js +12 -4
  95. package/dist/components/MessageInput/hooks/useLinkPreviews.js +3 -1
  96. package/dist/components/MessageInput/hooks/useMessageInputState.js +4 -3
  97. package/dist/components/MessageInput/hooks/useMessageInputText.d.ts +1 -1
  98. package/dist/components/MessageInput/hooks/useMessageInputText.js +5 -3
  99. package/dist/components/MessageInput/hooks/useSubmitHandler.js +5 -3
  100. package/dist/components/MessageInput/hooks/useTimeElapsed.js +1 -1
  101. package/dist/components/MessageInput/hooks/useUserTrigger.js +2 -2
  102. package/dist/components/MessageInput/hooks/utils.js +6 -2
  103. package/dist/components/MessageList/ConnectionStatus.js +1 -1
  104. package/dist/components/MessageList/MessageList.js +5 -6
  105. package/dist/components/MessageList/MessageListNotifications.js +3 -1
  106. package/dist/components/MessageList/VirtualizedMessageList.d.ts +1 -1
  107. package/dist/components/MessageList/VirtualizedMessageList.js +19 -12
  108. package/dist/components/MessageList/VirtualizedMessageListComponents.js +2 -2
  109. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.js +1 -3
  110. package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.js +3 -2
  111. package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.js +3 -2
  112. package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.js +6 -2
  113. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.js +1 -1
  114. package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +1 -1
  115. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.js +4 -3
  116. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.js +1 -1
  117. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.js +7 -3
  118. package/dist/components/MessageList/hooks/useMarkRead.d.ts +2 -4
  119. package/dist/components/MessageList/hooks/useMarkRead.js +14 -16
  120. package/dist/components/MessageList/utils.js +28 -11
  121. package/dist/components/Modal/Modal.d.ts +1 -1
  122. package/dist/components/Modal/Modal.js +1 -1
  123. package/dist/components/Modal/ModalHeader.js +1 -1
  124. package/dist/components/Poll/Poll.js +1 -1
  125. package/dist/components/Poll/PollActions/PollActions.js +6 -4
  126. package/dist/components/Poll/PollActions/PollAnswerList.js +1 -1
  127. package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.js +1 -1
  128. package/dist/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.js +4 -2
  129. package/dist/components/Poll/PollActions/PollResults/PollResults.js +2 -1
  130. package/dist/components/Poll/PollContent.js +1 -1
  131. package/dist/components/Poll/PollCreationDialog/OptionFieldSet.d.ts +1 -1
  132. package/dist/components/Poll/PollCreationDialog/OptionFieldSet.js +11 -4
  133. package/dist/components/Poll/PollCreationDialog/PollCreationDialog.js +13 -4
  134. package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.js +6 -3
  135. package/dist/components/Poll/PollOptionList.js +1 -1
  136. package/dist/components/Poll/PollOptionSelector.js +12 -5
  137. package/dist/components/Poll/hooks/useManagePollVotesRealtime.js +9 -4
  138. package/dist/components/Poll/hooks/usePollAnswerPagination.js +8 -2
  139. package/dist/components/Poll/hooks/usePollOptionVotesPagination.js +8 -2
  140. package/dist/components/ReactFileUtilities/FileIcon/mimeTypes.d.ts +1 -1
  141. package/dist/components/ReactFileUtilities/ImageDropzone.js +3 -1
  142. package/dist/components/ReactFileUtilities/UploadButton.js +1 -1
  143. package/dist/components/ReactFileUtilities/utils.js +3 -1
  144. package/dist/components/Reactions/ReactionSelector.js +3 -1
  145. package/dist/components/Reactions/ReactionSelectorWithButton.js +1 -1
  146. package/dist/components/Reactions/ReactionsList.d.ts +2 -2
  147. package/dist/components/Reactions/ReactionsList.js +7 -4
  148. package/dist/components/Reactions/ReactionsListModal.d.ts +1 -2
  149. package/dist/components/Reactions/ReactionsListModal.js +1 -1
  150. package/dist/components/Reactions/SpriteImage.js +6 -2
  151. package/dist/components/Reactions/hooks/useFetchReactions.js +1 -1
  152. package/dist/components/Reactions/hooks/useProcessReactions.js +1 -1
  153. package/dist/components/Reactions/index.d.ts +1 -0
  154. package/dist/components/Reactions/index.js +1 -0
  155. package/dist/components/Reactions/reactionOptions.js +20 -5
  156. package/dist/components/Thread/Thread.js +4 -3
  157. package/dist/components/Threads/ThreadContext.d.ts +1 -1
  158. package/dist/components/Threads/ThreadContext.js +1 -1
  159. package/dist/components/Threads/ThreadList/ThreadList.js +1 -1
  160. package/dist/components/Threads/ThreadList/ThreadListItem.d.ts +1 -1
  161. package/dist/components/Threads/ThreadList/ThreadListItem.js +1 -1
  162. package/dist/components/Threads/ThreadList/ThreadListItemUI.js +5 -3
  163. package/dist/components/Threads/icons.js +0 -1
  164. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  165. package/dist/components/Tooltip/Tooltip.js +1 -1
  166. package/dist/context/ComponentContext.d.ts +3 -1
  167. package/dist/context/ComponentContext.js +1 -1
  168. package/dist/context/DialogManagerContext.d.ts +1 -1
  169. package/dist/context/DialogManagerContext.js +1 -1
  170. package/dist/context/MessageBounceContext.js +2 -2
  171. package/dist/context/MessageContext.js +1 -1
  172. package/dist/context/VirtualizedMessageListContext.d.ts +13 -0
  173. package/dist/context/VirtualizedMessageListContext.js +7 -0
  174. package/dist/context/WithComponents.js +1 -1
  175. package/dist/css/v2/index.css +2 -2
  176. package/dist/css/v2/index.layout.css +2 -2
  177. package/dist/experimental/MessageActions/MessageActions.js +0 -1
  178. package/dist/experimental/MessageActions/defaults.js +31 -7
  179. package/dist/experimental/index.browser.cjs +103 -37
  180. package/dist/experimental/index.browser.cjs.map +2 -2
  181. package/dist/experimental/index.node.cjs +103 -37
  182. package/dist/experimental/index.node.cjs.map +2 -2
  183. package/dist/i18n/Streami18n.js +11 -2
  184. package/dist/i18n/utils.js +14 -1
  185. package/dist/index.browser.cjs +2329 -1145
  186. package/dist/index.browser.cjs.map +4 -4
  187. package/dist/index.node.cjs +2594 -1164
  188. package/dist/index.node.cjs.map +4 -4
  189. package/dist/plugins/Emojis/EmojiPicker.js +0 -1
  190. package/dist/plugins/Emojis/index.browser.cjs +3 -1
  191. package/dist/plugins/Emojis/index.browser.cjs.map +2 -2
  192. package/dist/plugins/Emojis/index.node.cjs +3 -1
  193. package/dist/plugins/Emojis/index.node.cjs.map +2 -2
  194. package/dist/plugins/encoders/mp3.browser.cjs +7 -4
  195. package/dist/plugins/encoders/mp3.browser.cjs.map +2 -2
  196. package/dist/plugins/encoders/mp3.node.cjs +7 -4
  197. package/dist/plugins/encoders/mp3.node.cjs.map +2 -2
  198. package/dist/scss/v2/ChannelSearch/ChannelSearch-layout.scss +1 -0
  199. package/dist/scss/v2/Message/Message-layout.scss +12 -5
  200. package/dist/scss/v2/Poll/Poll-layout.scss +1 -1
  201. package/dist/scss/v2/Search/Search-layout.scss +148 -0
  202. package/dist/scss/v2/Search/Search-theme.scss +222 -0
  203. package/dist/scss/v2/_icons.scss +2 -0
  204. package/dist/scss/v2/index.layout.scss +1 -0
  205. package/dist/scss/v2/index.scss +1 -0
  206. package/dist/store/hooks/useStateStore.js +35 -11
  207. package/package.json +32 -47
@@ -5,4 +5,4 @@ export type ConfirmationDialogProps = {
5
5
  className?: string;
6
6
  title?: string;
7
7
  };
8
- export declare const PromptDialog: ({ actions, className, prompt, title }: ConfirmationDialogProps) => React.JSX.Element;
8
+ export declare const PromptDialog: ({ actions, className, prompt, title, }: ConfirmationDialogProps) => React.JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import clsx from 'clsx';
3
- export const PromptDialog = ({ actions, className, prompt, title }) => (React.createElement("div", { className: clsx('str-chat__dialog str-chat__dialog--prompt', className) },
3
+ export const PromptDialog = ({ actions, className, prompt, title, }) => (React.createElement("div", { className: clsx('str-chat__dialog str-chat__dialog--prompt', className) },
4
4
  React.createElement("div", { className: 'str-chat__dialog__body' },
5
5
  title && React.createElement("div", { className: 'str-chat__dialog__title' }, title),
6
6
  React.createElement("div", { className: 'str-chat__dialog__prompt' }, prompt)),
@@ -6,7 +6,7 @@ import { getDateString } from '../../i18n/utils';
6
6
  * Component to display system and channel event messages
7
7
  */
8
8
  const UnMemoizedEventComponent = (props) => {
9
- const { calendar, calendarFormats, format, Avatar = DefaultAvatar, message } = props;
9
+ const { Avatar = DefaultAvatar, calendar, calendarFormats, format, message } = props;
10
10
  const { t, tDateTimeParser } = useTranslationContext('EventComponent');
11
11
  const { created_at = '', event, text, type } = message;
12
12
  const getDateOptions = { messageCreatedAt: created_at.toString(), tDateTimeParser };
@@ -1,5 +1,3 @@
1
1
  import React from 'react';
2
2
  export type BaseImageProps = React.ComponentPropsWithRef<'img'>;
3
- export declare const BaseImage: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "ref"> & {
4
- ref?: ((instance: HTMLImageElement | null) => void) | React.RefObject<HTMLImageElement> | null | undefined;
5
- }, "ref"> & React.RefAttributes<HTMLImageElement>>;
3
+ export declare const BaseImage: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "ref"> & React.RefAttributes<HTMLImageElement>>;
@@ -29,11 +29,19 @@ const UnMemoizedGallery = (props) => {
29
29
  images[lastImageIndexInPreview].image_url ||
30
30
  images[lastImageIndexInPreview].thumb_url})`,
31
31
  ...image.style,
32
- }, ...(innerRefs?.current && { ref: (r) => (innerRefs.current[i] = r) }) },
32
+ }, ...(innerRefs?.current && {
33
+ ref: (r) => {
34
+ innerRefs.current[i] = r;
35
+ },
36
+ }) },
33
37
  React.createElement("p", null, t('{{ imageCount }} more', {
34
38
  imageCount: images.length - countImagesDisplayedInPreview,
35
39
  })))) : (React.createElement("button", { className: 'str-chat__gallery-image', "data-testid": 'gallery-image', key: `gallery-image-${i}`, onClick: () => toggleModal(i) },
36
- React.createElement(BaseImage, { alt: image?.fallback || imageFallbackTitle, src: sanitizeUrl(image.previewUrl || image.image_url || image.thumb_url), style: image.style, title: image?.fallback || imageFallbackTitle, ...(innerRefs?.current && { ref: (r) => (innerRefs.current[i] = r) }) }))));
40
+ React.createElement(BaseImage, { alt: image?.fallback || imageFallbackTitle, src: sanitizeUrl(image.previewUrl || image.image_url || image.thumb_url), style: image.style, title: image?.fallback || imageFallbackTitle, ...(innerRefs?.current && {
41
+ ref: (r) => {
42
+ innerRefs.current[i] = r;
43
+ },
44
+ }) }))));
37
45
  const className = clsx('str-chat__gallery', {
38
46
  'str-chat__gallery--square': images.length > lastImageIndexInPreview,
39
47
  'str-chat__gallery-two-rows': images.length > 2,
@@ -8,7 +8,7 @@ import { useComponentContext } from '../../context';
8
8
  * A simple component that displays an image.
9
9
  */
10
10
  export const ImageComponent = (props) => {
11
- const { dimensions = {}, fallback, image_url, thumb_url, innerRef, previewUrl, style } = props;
11
+ const { dimensions = {}, fallback, image_url, innerRef, previewUrl, style, thumb_url, } = props;
12
12
  const [modalIsOpen, setModalIsOpen] = useState(false);
13
13
  const { BaseImage = DefaultBaseImage, ModalGallery = DefaultModalGallery } = useComponentContext('ImageComponent');
14
14
  const imageSrc = sanitizeUrl(previewUrl || image_url || thumb_url);
@@ -18,8 +18,8 @@ export const ModalGallery = (props) => {
18
18
  originalAlt: t('User uploaded content'),
19
19
  source: imageSrc,
20
20
  };
21
- }),
22
- // eslint-disable-next-line react-hooks/exhaustive-deps
23
- [images]);
24
- return (React.createElement(ImageGallery, { items: formattedArray, renderItem: renderItem, showIndex: true, showPlayButton: false, showThumbnails: false, startIndex: index }));
21
+ }), [images, t]);
22
+ return (
23
+ // @ts-expect-error ignore the TS error as react-image-gallery was on @types/react@18 while stream-chat-react being upgraded to React 19 (https://github.com/xiaolin/react-image-gallery/issues/809)
24
+ React.createElement(ImageGallery, { items: formattedArray, renderItem: renderItem, showIndex: true, showPlayButton: false, showThumbnails: false, startIndex: index }));
25
25
  };
@@ -26,10 +26,10 @@ export const InfiniteScroll = (props) => {
26
26
  const loadPreviousPageFn = loadPreviousPage || loadMore;
27
27
  const hasNextPageFlag = hasNextPage || hasMoreNewer;
28
28
  const hasPreviousPageFlag = hasPreviousPage || hasMore;
29
- const scrollComponent = useRef();
30
- const previousOffset = useRef();
31
- const previousReverseOffset = useRef();
32
- const scrollListenerRef = useRef();
29
+ const scrollComponent = useRef(undefined);
30
+ const previousOffset = useRef(undefined);
31
+ const previousReverseOffset = useRef(undefined);
32
+ const scrollListenerRef = useRef(undefined);
33
33
  scrollListenerRef.current = () => {
34
34
  const element = scrollComponent.current;
35
35
  if (!element || element.offsetParent === null) {
@@ -44,7 +44,8 @@ export const InfiniteScroll = (props) => {
44
44
  }
45
45
  if (isLoading)
46
46
  return;
47
- if (previousOffset.current === offset && previousReverseOffset.current === reverseOffset)
47
+ if (previousOffset.current === offset &&
48
+ previousReverseOffset.current === reverseOffset)
48
49
  return;
49
50
  previousOffset.current = offset;
50
51
  previousReverseOffset.current = reverseOffset;
@@ -54,7 +55,9 @@ export const InfiniteScroll = (props) => {
54
55
  hasPreviousPageFlag) {
55
56
  loadPreviousPageFn();
56
57
  }
57
- if (offset < Number(threshold) && typeof loadNextPageFn === 'function' && hasNextPageFlag) {
58
+ if (offset < Number(threshold) &&
59
+ typeof loadNextPageFn === 'function' &&
60
+ hasNextPageFlag) {
58
61
  loadNextPageFn();
59
62
  }
60
63
  };
@@ -12,7 +12,7 @@ const mousewheelListener = (event) => {
12
12
  }
13
13
  };
14
14
  export const InfiniteScrollPaginator = (props) => {
15
- const { children, listenToScroll, loadNextOnScrollToBottom, loadNextOnScrollToTop, threshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD, useCapture = false, className, ...componentProps } = props;
15
+ const { children, className, listenToScroll, loadNextOnScrollToBottom, loadNextOnScrollToTop, threshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD, useCapture = false, ...componentProps } = props;
16
16
  const rootRef = useRef(null);
17
17
  const childRef = useRef(null);
18
18
  const scrollListener = useMemo(() => debounce(() => {
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect } from 'react';
2
- import { LoadMoreButton as DefaultLoadMoreButton } from './LoadMoreButton';
2
+ import { LoadMoreButton as DefaultLoadMoreButton, } from './LoadMoreButton';
3
3
  import { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';
4
4
  export const UnMemoizedLoadMorePaginator = (props) => {
5
5
  const { children, hasNextPage, isLoading, LoadMoreButton = DefaultLoadMoreButton, loadNextPage, refreshing, reverse, } = props;
@@ -1,6 +1,7 @@
1
1
  import React, { Suspense } from 'react';
2
2
  import { useChatContext } from '../../context/ChatContext';
3
3
  const MMLReact = React.lazy(async () => {
4
+ // eslint-disable-next-line import/no-extraneous-dependencies
4
5
  const mml = await import('mml-react');
5
6
  return { default: mml.MML };
6
7
  });
@@ -27,7 +27,7 @@ const WAV_HEADER_FLAGS = {
27
27
  RIFF: fourCharsToInt('RIFF'),
28
28
  WAVE: fourCharsToInt('WAVE'),
29
29
  };
30
- const writeWavHeader = ({ arrayBuffer, channelCount, sampleRate }) => {
30
+ const writeWavHeader = ({ arrayBuffer, channelCount, sampleRate, }) => {
31
31
  const byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec
32
32
  const blockAlign = channelCount * BYTES_PER_SAMPLE;
33
33
  const dataView = new DataView(arrayBuffer);
@@ -84,7 +84,9 @@ const writeWavAudioData = ({ arrayBuffer, dataByChannel }) => {
84
84
  dataByChannel.forEach((channelData, channelIndex) => {
85
85
  let writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;
86
86
  channelData.forEach((float32Value) => {
87
- dataView.setInt16(writeOffset, float32Value < 0 ? Math.max(-1, float32Value) * 32768 : Math.min(1, float32Value) * 32767, true);
87
+ dataView.setInt16(writeOffset, float32Value < 0
88
+ ? Math.max(-1, float32Value) * 32768
89
+ : Math.min(1, float32Value) * 32767, true);
88
90
  writeOffset += channelCount * BYTES_PER_SAMPLE;
89
91
  });
90
92
  });
@@ -92,7 +94,8 @@ const writeWavAudioData = ({ arrayBuffer, dataByChannel }) => {
92
94
  export const encodeToWaw = async (file, sampleRate) => {
93
95
  const audioBuffer = await renderAudio(await toAudioBuffer(file), sampleRate);
94
96
  const numberOfSamples = audioBuffer.duration * sampleRate;
95
- const fileSizeBytes = numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE + WAV_HEADER_LENGTH_BYTES;
97
+ const fileSizeBytes = numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE +
98
+ WAV_HEADER_LENGTH_BYTES;
96
99
  const arrayBuffer = new ArrayBuffer(fileSizeBytes);
97
100
  writeWavHeader({ arrayBuffer, channelCount: audioBuffer.numberOfChannels, sampleRate });
98
101
  writeWavAudioData({ arrayBuffer, dataByChannel: splitDataByChannel(audioBuffer) });
@@ -18,8 +18,8 @@ const selectColor = (number, dark) => {
18
18
  };
19
19
  const hashUserId = (userId) => {
20
20
  const hash = userId.split('').reduce((acc, c) => {
21
- acc = (acc << 5) - acc + c.charCodeAt(0); // eslint-disable-line
22
- return acc & acc; // eslint-disable-line no-bitwise
21
+ acc = (acc << 5) - acc + c.charCodeAt(0);
22
+ return acc & acc;
23
23
  }, 0);
24
24
  return Math.abs(hash) / 10 ** Math.ceil(Math.log10(Math.abs(hash) + 1));
25
25
  };
@@ -27,7 +27,7 @@ const getUserColor = (theme, userId) => selectColor(hashUserId(userId), theme.in
27
27
  const UnMemoizedFixedHeightMessage = (props) => {
28
28
  const { groupedByUser: propGroupedByUser, message: propMessage } = props;
29
29
  const { theme } = useChatContext('FixedHeightMessage');
30
- const { groupedByUser: contextGroupedByUser, message: contextMessage, } = useMessageContext('FixedHeightMessage');
30
+ const { groupedByUser: contextGroupedByUser, message: contextMessage } = useMessageContext('FixedHeightMessage');
31
31
  const { MessageDeleted = DefaultMessageDeleted } = useComponentContext('FixedHeightMessage');
32
32
  const { userLanguage } = useTranslationContext('FixedHeightMessage');
33
33
  const groupedByUser = propGroupedByUser !== undefined ? propGroupedByUser : contextGroupedByUser;
@@ -35,11 +35,9 @@ const UnMemoizedFixedHeightMessage = (props) => {
35
35
  const handleAction = useActionHandler(message);
36
36
  const handleDelete = useDeleteHandler(message);
37
37
  const role = useUserRole(message);
38
- const messageTextToRender = message?.i18n?.[`${userLanguage}_text`] || message?.text;
39
- const renderedText = useMemo(() => renderText(messageTextToRender, message.mentioned_users), [
40
- message.mentioned_users,
41
- messageTextToRender,
42
- ]);
38
+ const messageTextToRender = message?.i18n?.[`${userLanguage}_text`] ||
39
+ message?.text;
40
+ const renderedText = useMemo(() => renderText(messageTextToRender, message.mentioned_users), [message.mentioned_users, messageTextToRender]);
43
41
  const userId = message.user?.id || '';
44
42
  const userColor = useMemo(() => getUserColor(theme, userId), [userId, theme]);
45
43
  const messageActionsHandler = useCallback(() => getMessageActions(['delete'], { canDelete: role.canDelete }), [role]);
@@ -21,7 +21,8 @@ const MessageWithContext = (props) => {
21
21
  read &&
22
22
  (!read[client.user.id] ||
23
23
  (message?.created_at &&
24
- new Date(message.created_at).getTime() > read[client.user.id].last_read.getTime()))), [client, isMyMessage, message.created_at, read]);
24
+ new Date(message.created_at).getTime() >
25
+ read[client.user.id].last_read.getTime()))), [client, isMyMessage, message.created_at, read]);
25
26
  const messageActionsHandler = useCallback(() => getMessageActions(messageActions, {
26
27
  canDelete,
27
28
  canEdit,
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import clsx from 'clsx';
3
- import { useComponentContext, useMessageContext, useTranslationContext } from '../../context';
3
+ import { useComponentContext, useMessageContext, useTranslationContext, } from '../../context';
4
4
  import { Timestamp as DefaultTimestamp } from './Timestamp';
5
5
  import { isMessageEdited } from './utils';
6
6
  export function MessageEditedTimestamp({ message: propMessage, open, ...timestampProps }) {
@@ -35,10 +35,7 @@ const MessageSimpleWithContext = (props) => {
35
35
  MessageActions = MessageOptions, MessageDeleted = DefaultMessageDeleted, MessageBouncePrompt = DefaultMessageBouncePrompt, MessageRepliesCountButton = DefaultMessageRepliesCountButton, MessageStatus = DefaultMessageStatus, MessageTimestamp = DefaultMessageTimestamp, ReactionsList = DefaultReactionList, StreamedMessageText = DefaultStreamedMessageText, PinIndicator, } = useComponentContext('MessageSimple');
36
36
  const hasAttachment = messageHasAttachments(message);
37
37
  const hasReactions = messageHasReactions(message);
38
- const isAIGenerated = useMemo(() => isMessageAIGenerated?.(message), [
39
- isMessageAIGenerated,
40
- message,
41
- ]);
38
+ const isAIGenerated = useMemo(() => isMessageAIGenerated?.(message), [isMessageAIGenerated, message]);
42
39
  if (message.customType === CUSTOM_MESSAGE_TYPE.date) {
43
40
  return null;
44
41
  }
@@ -98,7 +95,7 @@ const MessageSimpleWithContext = (props) => {
98
95
  !isMyMessage() && !!message.user && (React.createElement("span", { className: 'str-chat__message-simple-name' }, message.user.name || message.user.id)),
99
96
  React.createElement(MessageTimestamp, { customClass: 'str-chat__message-simple-timestamp' }),
100
97
  isEdited && (React.createElement("span", { className: 'str-chat__mesage-simple-edited' }, t('Edited'))),
101
- isEdited && React.createElement(MessageEditedTimestamp, { calendar: true, open: isEditedTimestampOpen }))))));
98
+ isEdited && (React.createElement(MessageEditedTimestamp, { calendar: true, open: isEditedTimestampOpen })))))));
102
99
  };
103
100
  const MemoizedMessageSimple = React.memo(MessageSimpleWithContext, areMessageUIPropsEqual);
104
101
  /**
@@ -15,7 +15,7 @@ const UnMemoizedMessageStatus = (props) => {
15
15
  const { handleEnter, handleLeave, tooltipVisible } = useEnterLeaveHandlers();
16
16
  const { client } = useChatContext('MessageStatus');
17
17
  const { Avatar: contextAvatar } = useComponentContext('MessageStatus');
18
- const { isMyMessage, lastReceivedId, message, readBy, threadList, } = useMessageContext('MessageStatus');
18
+ const { isMyMessage, lastReceivedId, message, readBy, threadList } = useMessageContext('MessageStatus');
19
19
  const { t } = useTranslationContext('MessageStatus');
20
20
  const [referenceElement, setReferenceElement] = useState(null);
21
21
  const Avatar = propAvatar || contextAvatar || DefaultAvatar;
@@ -2,7 +2,7 @@ import clsx from 'clsx';
2
2
  import React, { useMemo } from 'react';
3
3
  import { QuotedMessage as DefaultQuotedMessage } from './QuotedMessage';
4
4
  import { isOnlyEmojis, messageHasAttachments } from './utils';
5
- import { useComponentContext, useMessageContext, useTranslationContext } from '../../context';
5
+ import { useComponentContext, useMessageContext, useTranslationContext, } from '../../context';
6
6
  import { renderText as defaultRenderText } from './renderText';
7
7
  import { MessageErrorText } from './MessageErrorText';
8
8
  const UnMemoizedMessageTextComponent = (props) => {
@@ -13,14 +13,14 @@ const UnMemoizedMessageTextComponent = (props) => {
13
13
  const { userLanguage } = useTranslationContext('MessageText');
14
14
  const message = propMessage || contextMessage;
15
15
  const hasAttachment = messageHasAttachments(message);
16
- const messageTextToRender = message.i18n?.[`${userLanguage}_text`] || message.text;
16
+ const messageTextToRender = message.i18n?.[`${userLanguage}_text`] ||
17
+ message.text;
18
+ const messageText = useMemo(() => renderText(messageTextToRender, message.mentioned_users),
17
19
  // eslint-disable-next-line react-hooks/exhaustive-deps
18
- const messageText = useMemo(() => renderText(messageTextToRender, message.mentioned_users), [
19
- message.mentioned_users,
20
- messageTextToRender,
21
- ]);
20
+ [message.mentioned_users, messageTextToRender]);
22
21
  const wrapperClass = customWrapperClass || 'str-chat__message-text';
23
- const innerClass = customInnerClass || `str-chat__message-text-inner str-chat__message-${theme}-text-inner`;
22
+ const innerClass = customInnerClass ||
23
+ `str-chat__message-text-inner str-chat__message-${theme}-text-inner`;
24
24
  if (!messageTextToRender && !message.quoted_message)
25
25
  return null;
26
26
  return (React.createElement("div", { className: wrapperClass, tabIndex: 0 },
@@ -9,7 +9,7 @@ import { useMessageContext } from '../../context/MessageContext';
9
9
  import { useTranslationContext } from '../../context/TranslationContext';
10
10
  import { useChannelActionContext } from '../../context/ChannelActionContext';
11
11
  export const QuotedMessage = () => {
12
- const { Attachment = DefaultAttachment, Avatar: ContextAvatar, } = useComponentContext('QuotedMessage');
12
+ const { Attachment = DefaultAttachment, Avatar: ContextAvatar } = useComponentContext('QuotedMessage');
13
13
  const { client } = useChatContext();
14
14
  const { isMyMessage, message } = useMessageContext('QuotedMessage');
15
15
  const { t, userLanguage } = useTranslationContext('QuotedMessage');
@@ -39,5 +39,5 @@ export const QuotedMessage = () => {
39
39
  React.createElement("div", { className: 'str-chat__quoted-message-bubble', "data-testid": 'quoted-message-contents' }, poll ? (React.createElement(Poll, { isQuoted: true, poll: poll })) : (React.createElement(React.Fragment, null,
40
40
  quotedMessageAttachment && (React.createElement(Attachment, { attachments: [quotedMessageAttachment], isQuoted: true })),
41
41
  React.createElement("div", { className: 'str-chat__quoted-message-bubble__text', "data-testid": 'quoted-message-text' }, quotedMessageText))))),
42
- message.attachments?.length ? React.createElement(Attachment, { attachments: message.attachments }) : null));
42
+ message.attachments?.length ? (React.createElement(Attachment, { attachments: message.attachments })) : null));
43
43
  };
@@ -16,7 +16,15 @@ export function Timestamp(props) {
16
16
  t,
17
17
  tDateTimeParser,
18
18
  timestampTranslationKey: 'timestamp/MessageTimestamp',
19
- }), [calendar, calendarFormats, format, formatDate, normalizedTimestamp, t, tDateTimeParser]);
19
+ }), [
20
+ calendar,
21
+ calendarFormats,
22
+ format,
23
+ formatDate,
24
+ normalizedTimestamp,
25
+ t,
26
+ tDateTimeParser,
27
+ ]);
20
28
  if (!when) {
21
29
  return null;
22
30
  }
@@ -1,5 +1,5 @@
1
1
  import { useChannelActionContext } from '../../../context/ChannelActionContext';
2
- import { useChannelStateContext } from '../../../context/ChannelStateContext';
2
+ import { useChannelStateContext, } from '../../../context/ChannelStateContext';
3
3
  export const handleActionWarning = `Action handler was called, but it is missing one of its required arguments.
4
4
  Make sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.`;
5
5
  export function useActionHandler(message) {
@@ -17,7 +17,8 @@ export const useFlagHandler = (message, notifications = {}) => {
17
17
  }
18
18
  try {
19
19
  await client.flagMessage(message.id);
20
- const successMessage = getSuccessNotification && validateAndGetMessage(getSuccessNotification, [message]);
20
+ const successMessage = getSuccessNotification &&
21
+ validateAndGetMessage(getSuccessNotification, [message]);
21
22
  notify(successMessage || t('Message has been successfully flagged'), 'success');
22
23
  }
23
24
  catch (e) {
@@ -14,7 +14,8 @@ export const useMarkUnreadHandler = (message, notifications = {}) => {
14
14
  await channel.markUnread({ message_id: message.id });
15
15
  if (!notify)
16
16
  return;
17
- const successMessage = getSuccessNotification && validateAndGetMessage(getSuccessNotification, [message]);
17
+ const successMessage = getSuccessNotification &&
18
+ validateAndGetMessage(getSuccessNotification, [message]);
18
19
  if (successMessage)
19
20
  notify(successMessage, 'success');
20
21
  }
@@ -11,6 +11,6 @@ export type UseMessageTextStreamingProps<StreamChatGenerics extends DefaultStrea
11
11
  * @param {string} text - The text that we want to render in a typewriter fashion.
12
12
  * @returns {{ streamedMessageText: string }} - A substring of the text property, up until we've finished rendering the typewriter animation.
13
13
  */
14
- export declare const useMessageTextStreaming: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ streamingLetterIntervalMs, renderingLetterCount, text, }: UseMessageTextStreamingProps<StreamChatGenerics>) => {
14
+ export declare const useMessageTextStreaming: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ renderingLetterCount, streamingLetterIntervalMs, text, }: UseMessageTextStreamingProps<StreamChatGenerics>) => {
15
15
  streamedMessageText: string;
16
16
  };
@@ -9,7 +9,7 @@ const DEFAULT_RENDERING_LETTER_COUNT = 2;
9
9
  * @param {string} text - The text that we want to render in a typewriter fashion.
10
10
  * @returns {{ streamedMessageText: string }} - A substring of the text property, up until we've finished rendering the typewriter animation.
11
11
  */
12
- export const useMessageTextStreaming = ({ streamingLetterIntervalMs = DEFAULT_LETTER_INTERVAL, renderingLetterCount = DEFAULT_RENDERING_LETTER_COUNT, text, }) => {
12
+ export const useMessageTextStreaming = ({ renderingLetterCount = DEFAULT_RENDERING_LETTER_COUNT, streamingLetterIntervalMs = DEFAULT_LETTER_INTERVAL, text, }) => {
13
13
  const [streamedMessageText, setStreamedMessageText] = useState(text);
14
14
  const textCursor = useRef(text.length);
15
15
  useEffect(() => {
@@ -1,5 +1,5 @@
1
1
  import { isUserMuted, validateAndGetMessage } from '../utils';
2
- import { useChannelStateContext } from '../../../context/ChannelStateContext';
2
+ import { useChannelStateContext, } from '../../../context/ChannelStateContext';
3
3
  import { useChatContext } from '../../../context/ChatContext';
4
4
  import { useTranslationContext } from '../../../context/TranslationContext';
5
5
  export const missingUseMuteHandlerParamsWarning = 'useMuteHandler was called but it is missing one or more necessary parameter.';
@@ -17,14 +17,16 @@ export const useMuteHandler = (message, notifications = {}) => {
17
17
  if (!isUserMuted(message, mutes)) {
18
18
  try {
19
19
  await client.muteUser(message.user.id);
20
- const successMessage = getSuccessNotification && validateAndGetMessage(getSuccessNotification, [message.user]);
20
+ const successMessage = getSuccessNotification &&
21
+ validateAndGetMessage(getSuccessNotification, [message.user]);
21
22
  notify(successMessage ||
22
23
  t(`{{ user }} has been muted`, {
23
24
  user: message.user.name || message.user.id,
24
25
  }), 'success');
25
26
  }
26
27
  catch (e) {
27
- const errorMessage = getErrorNotification && validateAndGetMessage(getErrorNotification, [message.user]);
28
+ const errorMessage = getErrorNotification &&
29
+ validateAndGetMessage(getErrorNotification, [message.user]);
28
30
  notify(errorMessage || t('Error muting a user ...'), 'error');
29
31
  }
30
32
  }
@@ -42,7 +44,8 @@ export const useMuteHandler = (message, notifications = {}) => {
42
44
  }
43
45
  }
44
46
  catch (e) {
45
- const errorMessage = (getErrorNotification && validateAndGetMessage(getErrorNotification, [message.user])) ||
47
+ const errorMessage = (getErrorNotification &&
48
+ validateAndGetMessage(getErrorNotification, [message.user])) ||
46
49
  t('Error unmuting a user ...');
47
50
  if (typeof errorMessage === 'string') {
48
51
  notify(errorMessage, 'error');
@@ -1,6 +1,6 @@
1
1
  import { defaultPinPermissions, validateAndGetMessage } from '../utils';
2
2
  import { useChannelActionContext } from '../../../context/ChannelActionContext';
3
- import { useChannelStateContext } from '../../../context/ChannelStateContext';
3
+ import { useChannelStateContext, } from '../../../context/ChannelStateContext';
4
4
  import { useChatContext } from '../../../context/ChatContext';
5
5
  import { useTranslationContext } from '../../../context/TranslationContext';
6
6
  export const usePinHandler = (message,
@@ -1,7 +1,7 @@
1
1
  import { useCallback } from 'react';
2
2
  import throttle from 'lodash.throttle';
3
3
  import { useChannelActionContext } from '../../../context/ChannelActionContext';
4
- import { useChannelStateContext } from '../../../context/ChannelStateContext';
4
+ import { useChannelStateContext, } from '../../../context/ChannelStateContext';
5
5
  import { useChatContext } from '../../../context/ChatContext';
6
6
  import { useThreadContext } from '../../Threads';
7
7
  export const reactionHandlerWarning = `Reaction handler was called, but it is missing one of its required arguments.
@@ -18,7 +18,10 @@ export const useReactionHandler = (message) => {
18
18
  if (add) {
19
19
  const timestamp = new Date().toISOString();
20
20
  newReactionGroups[reactionType] = hasReaction
21
- ? { ...newReactionGroups[reactionType], count: newReactionGroups[reactionType].count + 1 }
21
+ ? {
22
+ ...newReactionGroups[reactionType],
23
+ count: newReactionGroups[reactionType].count + 1,
24
+ }
22
25
  : {
23
26
  count: 1,
24
27
  first_reaction_at: timestamp,
@@ -66,7 +69,7 @@ export const useReactionHandler = (message) => {
66
69
  const tempMessage = createMessagePreview(add, newReaction, message);
67
70
  try {
68
71
  updateMessage(tempMessage);
69
- // @ts-expect-error
72
+ // @ts-expect-error message type mismatch
70
73
  thread?.upsertReplyLocally({ message: tempMessage });
71
74
  const messageResponse = add
72
75
  ? await channel.sendReaction(id, { type })
@@ -77,7 +80,7 @@ export const useReactionHandler = (message) => {
77
80
  catch (error) {
78
81
  // revert to the original message if the API call fails
79
82
  updateMessage(message);
80
- // @ts-expect-error
83
+ // @ts-expect-error message type mismatch
81
84
  thread?.upsertReplyLocally({ message });
82
85
  }
83
86
  }, 1000);
@@ -93,7 +96,9 @@ export const useReactionHandler = (message) => {
93
96
  message.own_reactions.forEach((reaction) => {
94
97
  // own user should only ever contain the current user id
95
98
  // just in case we check to prevent bugs with message updates from breaking reactions
96
- if (reaction.user && client.userID === reaction.user.id && reaction.type === reactionType) {
99
+ if (reaction.user &&
100
+ client.userID === reaction.user.id &&
101
+ reaction.type === reactionType) {
97
102
  userExistingReaction = reaction;
98
103
  }
99
104
  else if (reaction.user && client.userID !== reaction.user.id) {
@@ -1,4 +1,4 @@
1
- import { useChannelActionContext } from '../../../context/ChannelActionContext';
1
+ import { useChannelActionContext, } from '../../../context/ChannelActionContext';
2
2
  export const useRetryHandler = (customRetrySendMessage) => {
3
3
  const { retrySendMessage: contextRetrySendMessage } = useChannelActionContext('useRetryHandler');
4
4
  const retrySendMessage = customRetrySendMessage || contextRetrySendMessage;
@@ -1,4 +1,4 @@
1
- import { useChannelStateContext } from '../../../context/ChannelStateContext';
1
+ import { useChannelStateContext, } from '../../../context/ChannelStateContext';
2
2
  import { useChatContext } from '../../../context/ChatContext';
3
3
  export const useUserRole = (message, onlySenderCanEdit, disableQuotedMessages) => {
4
4
  const { channel, channelCapabilities = {} } = useChannelStateContext('useUserRole');
@@ -50,7 +50,7 @@ function encodeDecode(url) {
50
50
  return url;
51
51
  }
52
52
  }
53
- const urlTransform = (uri) => (uri.startsWith('app://') ? uri : uriTransformer(uri));
53
+ const urlTransform = (uri) => uri.startsWith('app://') ? uri : uriTransformer(uri);
54
54
  const getPluginsForward = (plugins) => plugins;
55
55
  export const markDownRenderers = {
56
56
  a: Anchor,
@@ -77,7 +77,7 @@ export const renderText = (text, mentionedUsers, { allowedTagNames = defaultAllo
77
77
  const strippedText = text?.replace(detectHttp, '');
78
78
  if (!strippedHref || !strippedText)
79
79
  return false;
80
- return strippedHref.includes(strippedText) || strippedText.includes(strippedHref);
80
+ return (strippedHref.includes(strippedText) || strippedText.includes(strippedHref));
81
81
  });
82
82
  if (noParsingNeeded.length > 0 || linkIsInBlock)
83
83
  return;
@@ -9,8 +9,7 @@ export const validateAndGetMessage = (func, args) => {
9
9
  return null;
10
10
  // below is due to tests passing a single argument
11
11
  // rather than an array.
12
- if (!(args instanceof Array)) {
13
- // @ts-expect-error
12
+ if (!Array.isArray(args)) {
14
13
  args = [args];
15
14
  }
16
15
  const returnValue = func(...args);
@@ -154,7 +153,8 @@ export const shouldRenderMessageActions = ({ customMessageActions, CustomMessage
154
153
  if (!messageActions.length)
155
154
  return false;
156
155
  if (inThread &&
157
- messageActions.filter((action) => !ACTIONS_NOT_WORKING_IN_THREAD.includes(action)).length === 0) {
156
+ messageActions.filter((action) => !ACTIONS_NOT_WORKING_IN_THREAD.includes(action))
157
+ .length === 0) {
158
158
  return false;
159
159
  }
160
160
  if (messageActions.length === 1 &&
@@ -4,8 +4,10 @@ import { MESSAGE_ACTIONS } from '../Message/utils';
4
4
  import { useChannelActionContext, useComponentContext, useMessageContext, useTranslationContext, } from '../../context';
5
5
  import { CustomMessageActionsList as DefaultCustomMessageActionsList } from './CustomMessageActionsList';
6
6
  const UnMemoizedMessageActionsBox = (props) => {
7
- const { className, getMessageActions, handleDelete, handleEdit, handleFlag, handleMarkUnread, handleMute, handlePin, isUserMuted, mine, open, ...restDivProps } = props;
8
- const { CustomMessageActionsList = DefaultCustomMessageActionsList, } = useComponentContext('MessageActionsBox');
7
+ const { className, getMessageActions, handleDelete, handleEdit, handleFlag, handleMarkUnread, handleMute, handlePin, isUserMuted,
8
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
9
+ mine, open, ...restDivProps } = props;
10
+ const { CustomMessageActionsList = DefaultCustomMessageActionsList } = useComponentContext('MessageActionsBox');
9
11
  const { setQuotedMessage } = useChannelActionContext('MessageActionsBox');
10
12
  const { customMessageActions, message, threadList } = useMessageContext('MessageActionsBox');
11
13
  const { t } = useTranslationContext('MessageActionsBox');
@@ -29,7 +31,9 @@ const UnMemoizedMessageActionsBox = (props) => {
29
31
  React.createElement(CustomMessageActionsList, { customMessageActions: customMessageActions, message: message }),
30
32
  messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 && (React.createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleQuote, role: 'option' }, t('Reply'))),
31
33
  messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1 && !message.parent_id && (React.createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handlePin, role: 'option' }, !message.pinned ? t('Pin') : t('Unpin'))),
32
- messageActions.indexOf(MESSAGE_ACTIONS.markUnread) > -1 && !threadList && !!message.id && (React.createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleMarkUnread, role: 'option' }, t('Mark as unread'))),
34
+ messageActions.indexOf(MESSAGE_ACTIONS.markUnread) > -1 &&
35
+ !threadList &&
36
+ !!message.id && (React.createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleMarkUnread, role: 'option' }, t('Mark as unread'))),
33
37
  messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1 && (React.createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleFlag, role: 'option' }, t('Flag'))),
34
38
  messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1 && (React.createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleMute, role: 'option' }, isUserMuted() ? t('Unmute') : t('Mute'))),
35
39
  messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1 && (React.createElement("button", { "aria-selected": 'false', className: buttonClassName, onClick: handleEdit, role: 'option' }, t('Edit Message'))),
@@ -11,7 +11,7 @@ export declare function useMessageActionsBoxPopper<T extends HTMLElement>({ open
11
11
  [key: string]: string;
12
12
  } | undefined;
13
13
  };
14
- popperElementRef: import("react").RefObject<T>;
14
+ popperElementRef: import("react").RefObject<T | null>;
15
15
  styles: {
16
16
  [key: string]: import("react").CSSProperties;
17
17
  };
@@ -6,7 +6,7 @@ import { ImageAttachmentPreview as DefaultImagePreview, } from './ImageAttachmen
6
6
  import { isLocalAttachment, isLocalAudioAttachment, isLocalFileAttachment, isLocalImageAttachment, isLocalMediaAttachment, isLocalVoiceRecordingAttachment, isScrapedContent, } from '../../Attachment';
7
7
  import { useMessageInputContext } from '../../../context';
8
8
  export const AttachmentPreviewList = ({ AudioAttachmentPreview = DefaultFilePreview, FileAttachmentPreview = DefaultFilePreview, ImageAttachmentPreview = DefaultImagePreview, UnsupportedAttachmentPreview = DefaultUnknownAttachmentPreview, VideoAttachmentPreview = DefaultFilePreview, VoiceRecordingPreview = DefaultVoiceRecordingPreview, }) => {
9
- const { attachments, removeAttachments, uploadAttachment, } = useMessageInputContext('AttachmentPreviewList');
9
+ const { attachments, removeAttachments, uploadAttachment } = useMessageInputContext('AttachmentPreviewList');
10
10
  return (React.createElement("div", { className: 'str-chat__attachment-preview-list' },
11
11
  React.createElement("div", { className: 'str-chat__attachment-list-scroll-container', "data-testid": 'attachment-list-scroll-container' }, attachments.map((attachment) => {
12
12
  if (isScrapedContent(attachment))
@@ -7,13 +7,15 @@ export const FileAttachmentPreview = ({ attachment, handleRetry, removeAttachmen
7
7
  return (React.createElement("div", { className: 'str-chat__attachment-preview-file', "data-testid": 'attachment-preview-file' },
8
8
  React.createElement("div", { className: 'str-chat__attachment-preview-file-icon' },
9
9
  React.createElement(FileIcon, { filename: attachment.title, mimeType: attachment.mime_type })),
10
- React.createElement("button", { "aria-label": t('aria/Remove attachment'), className: 'str-chat__attachment-preview-delete', "data-testid": 'file-preview-item-delete-button', disabled: attachment.localMetadata?.uploadState === 'uploading', onClick: () => attachment.localMetadata?.id && removeAttachments([attachment.localMetadata?.id]) },
10
+ React.createElement("button", { "aria-label": t('aria/Remove attachment'), className: 'str-chat__attachment-preview-delete', "data-testid": 'file-preview-item-delete-button', disabled: attachment.localMetadata?.uploadState === 'uploading', onClick: () => attachment.localMetadata?.id &&
11
+ removeAttachments([attachment.localMetadata?.id]) },
11
12
  React.createElement(CloseIcon, null)),
12
13
  attachment.localMetadata?.uploadState === 'failed' && !!handleRetry && (React.createElement("button", { className: 'str-chat__attachment-preview-error str-chat__attachment-preview-error-file', "data-testid": 'file-preview-item-retry-button', onClick: () => handleRetry(attachment) },
13
14
  React.createElement(RetryIcon, null))),
14
15
  React.createElement("div", { className: 'str-chat__attachment-preview-file-end' },
15
16
  React.createElement("div", { className: 'str-chat__attachment-preview-file-name', title: attachment.title }, attachment.title),
16
- attachment.localMetadata?.uploadState === 'finished' && !!attachment.asset_url && (React.createElement("a", { "aria-label": t('aria/Download attachment'), className: 'str-chat__attachment-preview-file-download', download: true, href: attachment.asset_url, rel: 'noreferrer', target: '_blank', title: t('Download attachment {{ name }}', { name: attachment.title }) },
17
+ attachment.localMetadata?.uploadState === 'finished' &&
18
+ !!attachment.asset_url && (React.createElement("a", { "aria-label": t('aria/Download attachment'), className: 'str-chat__attachment-preview-file-download', download: true, href: attachment.asset_url, rel: 'noreferrer', target: '_blank', title: t('Download attachment {{ name }}', { name: attachment.title }) },
17
19
  React.createElement(DownloadIcon, null))),
18
20
  attachment.localMetadata?.uploadState === 'uploading' && (React.createElement(LoadingIndicatorIcon, { size: 17 })))));
19
21
  };