stream-chat-react-native-core 9.4.0-beta.9 → 9.4.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 (620) hide show
  1. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js +7 -0
  2. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  3. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js +2 -0
  4. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js.map +1 -1
  5. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionItem.js +41 -55
  6. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionItem.js.map +1 -1
  7. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionList.js +27 -7
  8. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionList.js.map +1 -1
  9. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js +55 -0
  10. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js.map +1 -0
  11. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js +47 -0
  12. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js.map +1 -0
  13. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js +39 -0
  14. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js.map +1 -0
  15. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionItem.js +45 -0
  16. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionItem.js.map +1 -0
  17. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionRoleItem.js +33 -0
  18. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionRoleItem.js.map +1 -0
  19. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js +26 -0
  20. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js.map +1 -0
  21. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserItem.js +53 -0
  22. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserItem.js.map +1 -0
  23. package/lib/commonjs/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js +38 -0
  24. package/lib/commonjs/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js.map +1 -0
  25. package/lib/commonjs/components/AutoCompleteInput/mentionItems/index.js +60 -0
  26. package/lib/commonjs/components/AutoCompleteInput/mentionItems/index.js.map +1 -0
  27. package/lib/commonjs/components/ChannelDetails/ChannelDetails.js +8 -3
  28. package/lib/commonjs/components/ChannelDetails/ChannelDetails.js.map +1 -1
  29. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsActionItem.js +2 -1
  30. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsActionItem.js.map +1 -1
  31. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsEditButton.js +57 -0
  32. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsEditButton.js.map +1 -0
  33. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavHeader.js +3 -32
  34. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavHeader.js.map +1 -1
  35. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavigationSection.js +64 -25
  36. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavigationSection.js.map +1 -1
  37. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsProfile.js +3 -2
  38. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsProfile.js.map +1 -1
  39. package/lib/commonjs/components/ChannelDetails/components/ChannelEditImageSheet.js +2 -2
  40. package/lib/commonjs/components/ChannelDetails/components/ChannelEditImageSheet.js.map +1 -1
  41. package/lib/commonjs/components/ChannelDetails/components/index.js +22 -0
  42. package/lib/commonjs/components/ChannelDetails/components/index.js.map +1 -1
  43. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js +2 -1
  44. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
  45. package/lib/commonjs/components/ChannelDetails/components/modal/Modal.js +22 -23
  46. package/lib/commonjs/components/ChannelDetails/components/modal/Modal.js.map +1 -1
  47. package/lib/commonjs/components/ChannelDetails/components/modal/ModalHeader.js +6 -4
  48. package/lib/commonjs/components/ChannelDetails/components/modal/ModalHeader.js.map +1 -1
  49. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentItem.js +65 -0
  50. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentItem.js.map +1 -0
  51. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentList.js +174 -0
  52. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentList.js.map +1 -0
  53. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.js +21 -0
  54. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.js.map +1 -0
  55. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.js +45 -0
  56. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.js.map +1 -0
  57. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaItem.js +120 -0
  58. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaItem.js.map +1 -0
  59. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaList.js +206 -0
  60. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaList.js.map +1 -0
  61. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.js +63 -0
  62. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.js.map +1 -0
  63. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js +84 -0
  64. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js.map +1 -0
  65. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageList.js +177 -0
  66. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageList.js.map +1 -0
  67. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.js +21 -0
  68. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.js.map +1 -0
  69. package/lib/commonjs/components/ChannelDetails/components/navigation-section/index.js +114 -0
  70. package/lib/commonjs/components/ChannelDetails/components/navigation-section/index.js.map +1 -0
  71. package/lib/commonjs/components/ChannelDetails/hooks/index.js +33 -0
  72. package/lib/commonjs/components/ChannelDetails/hooks/index.js.map +1 -1
  73. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js +55 -0
  74. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js.map +1 -0
  75. package/lib/commonjs/components/ChannelDetails/hooks/useFileAttachmentListSections.js +52 -0
  76. package/lib/commonjs/components/ChannelDetails/hooks/useFileAttachmentListSections.js.map +1 -0
  77. package/lib/commonjs/components/ChannelDetails/hooks/useMediaList.js +30 -0
  78. package/lib/commonjs/components/ChannelDetails/hooks/useMediaList.js.map +1 -0
  79. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +5 -3
  80. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  81. package/lib/commonjs/components/ImageGallery/ImageGallery.js +21 -76
  82. package/lib/commonjs/components/ImageGallery/ImageGallery.js.map +1 -1
  83. package/lib/commonjs/components/ImageGallery/components/AnimatedGalleryImage.js +6 -10
  84. package/lib/commonjs/components/ImageGallery/components/AnimatedGalleryImage.js.map +1 -1
  85. package/lib/commonjs/components/ImageGallery/components/AnimatedGalleryVideo.js +16 -14
  86. package/lib/commonjs/components/ImageGallery/components/AnimatedGalleryVideo.js.map +1 -1
  87. package/lib/commonjs/components/ImageGallery/components/ImageGalleryA11yProbe.js +67 -0
  88. package/lib/commonjs/components/ImageGallery/components/ImageGalleryA11yProbe.js.map +1 -0
  89. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js +23 -15
  90. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  91. package/lib/commonjs/components/ImageGallery/hooks/useAnimatedGalleryStyle.js +4 -3
  92. package/lib/commonjs/components/ImageGallery/hooks/useAnimatedGalleryStyle.js.map +1 -1
  93. package/lib/commonjs/components/ImageGallery/hooks/useCurrentImageHeight.js +53 -0
  94. package/lib/commonjs/components/ImageGallery/hooks/useCurrentImageHeight.js.map +1 -0
  95. package/lib/commonjs/components/ImageGallery/hooks/useImageGalleryGestures.js +25 -31
  96. package/lib/commonjs/components/ImageGallery/hooks/useImageGalleryGestures.js.map +1 -1
  97. package/lib/commonjs/components/Message/Message.js.map +1 -1
  98. package/lib/commonjs/components/Message/MessageItemView/MessageTextContainer.js +14 -0
  99. package/lib/commonjs/components/Message/MessageItemView/MessageTextContainer.js.map +1 -1
  100. package/lib/commonjs/components/Message/MessageItemView/utils/renderText.js +69 -11
  101. package/lib/commonjs/components/Message/MessageItemView/utils/renderText.js.map +1 -1
  102. package/lib/commonjs/components/MessageInput/MessageComposer.js +5 -12
  103. package/lib/commonjs/components/MessageInput/MessageComposer.js.map +1 -1
  104. package/lib/commonjs/components/MessageList/MessageFlashList.js +22 -3
  105. package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
  106. package/lib/commonjs/components/MessageList/MessageList.js +23 -4
  107. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  108. package/lib/commonjs/components/UIComponents/BottomSheetModal.js +4 -17
  109. package/lib/commonjs/components/UIComponents/BottomSheetModal.js.map +1 -1
  110. package/lib/commonjs/components/UIComponents/ClippingFadeBottom.js +56 -0
  111. package/lib/commonjs/components/UIComponents/ClippingFadeBottom.js.map +1 -0
  112. package/lib/commonjs/components/UIComponents/EmptyList.js +78 -0
  113. package/lib/commonjs/components/UIComponents/EmptyList.js.map +1 -0
  114. package/lib/commonjs/components/UIComponents/PortalWhileClosingView.js +0 -3
  115. package/lib/commonjs/components/UIComponents/PortalWhileClosingView.js.map +1 -1
  116. package/lib/commonjs/components/UIComponents/index.js +22 -0
  117. package/lib/commonjs/components/UIComponents/index.js.map +1 -1
  118. package/lib/commonjs/components/index.js +11 -0
  119. package/lib/commonjs/components/index.js.map +1 -1
  120. package/lib/commonjs/components/ui/Avatar/AvatarGroup.js +3 -3
  121. package/lib/commonjs/components/ui/Avatar/constants.js +2 -2
  122. package/lib/commonjs/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js +64 -0
  123. package/lib/commonjs/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js.map +1 -0
  124. package/lib/commonjs/contexts/channelMediaListContext/ChannelMediaListContext.js +63 -0
  125. package/lib/commonjs/contexts/channelMediaListContext/ChannelMediaListContext.js.map +1 -0
  126. package/lib/commonjs/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js +73 -0
  127. package/lib/commonjs/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js.map +1 -0
  128. package/lib/commonjs/contexts/componentsContext/defaultComponents.js +9 -0
  129. package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
  130. package/lib/commonjs/contexts/index.js +33 -0
  131. package/lib/commonjs/contexts/index.js.map +1 -1
  132. package/lib/commonjs/contexts/themeContext/utils/theme.js +65 -4
  133. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  134. package/lib/commonjs/i18n/ar.json +17 -0
  135. package/lib/commonjs/i18n/en.json +18 -1
  136. package/lib/commonjs/i18n/es.json +17 -0
  137. package/lib/commonjs/i18n/fr.json +17 -0
  138. package/lib/commonjs/i18n/he.json +17 -0
  139. package/lib/commonjs/i18n/hi.json +17 -0
  140. package/lib/commonjs/i18n/it.json +17 -0
  141. package/lib/commonjs/i18n/ja.json +17 -0
  142. package/lib/commonjs/i18n/ko.json +17 -0
  143. package/lib/commonjs/i18n/nl.json +17 -0
  144. package/lib/commonjs/i18n/pt-br.json +17 -0
  145. package/lib/commonjs/i18n/ru.json +17 -0
  146. package/lib/commonjs/i18n/tr.json +17 -0
  147. package/lib/commonjs/icons/folder.js +37 -0
  148. package/lib/commonjs/icons/folder.js.map +1 -0
  149. package/lib/commonjs/icons/index.js +12 -0
  150. package/lib/commonjs/icons/index.js.map +1 -1
  151. package/lib/commonjs/icons/megaphone.js +36 -0
  152. package/lib/commonjs/icons/megaphone.js.map +1 -0
  153. package/lib/commonjs/icons/shield.js +36 -0
  154. package/lib/commonjs/icons/shield.js.map +1 -0
  155. package/lib/commonjs/state-store/image-gallery-state-store.js +12 -3
  156. package/lib/commonjs/state-store/image-gallery-state-store.js.map +1 -1
  157. package/lib/commonjs/store/SqliteClient.js +1 -1
  158. package/lib/commonjs/store/mappers/mapDraftMessageToStorable.js +8 -0
  159. package/lib/commonjs/store/mappers/mapDraftMessageToStorable.js.map +1 -1
  160. package/lib/commonjs/store/mappers/mapStorableToDraftMessage.js +8 -0
  161. package/lib/commonjs/store/mappers/mapStorableToDraftMessage.js.map +1 -1
  162. package/lib/commonjs/store/schema.js +4 -0
  163. package/lib/commonjs/store/schema.js.map +1 -1
  164. package/lib/commonjs/theme/generated/dark/StreamTokens.android.js +10 -1
  165. package/lib/commonjs/theme/generated/dark/StreamTokens.android.js.map +1 -1
  166. package/lib/commonjs/theme/generated/dark/StreamTokens.ios.js +10 -1
  167. package/lib/commonjs/theme/generated/dark/StreamTokens.ios.js.map +1 -1
  168. package/lib/commonjs/theme/generated/dark/StreamTokens.web.js +10 -1
  169. package/lib/commonjs/theme/generated/dark/StreamTokens.web.js.map +1 -1
  170. package/lib/commonjs/theme/generated/light/StreamTokens.android.js +10 -1
  171. package/lib/commonjs/theme/generated/light/StreamTokens.android.js.map +1 -1
  172. package/lib/commonjs/theme/generated/light/StreamTokens.ios.js +10 -1
  173. package/lib/commonjs/theme/generated/light/StreamTokens.ios.js.map +1 -1
  174. package/lib/commonjs/theme/generated/light/StreamTokens.web.js +10 -1
  175. package/lib/commonjs/theme/generated/light/StreamTokens.web.js.map +1 -1
  176. package/lib/commonjs/version.json +1 -1
  177. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js +7 -0
  178. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  179. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js +2 -0
  180. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js.map +1 -1
  181. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionItem.js +41 -55
  182. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionItem.js.map +1 -1
  183. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionList.js +27 -7
  184. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionList.js.map +1 -1
  185. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js +55 -0
  186. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js.map +1 -0
  187. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js +47 -0
  188. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js.map +1 -0
  189. package/lib/module/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js +39 -0
  190. package/lib/module/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js.map +1 -0
  191. package/lib/module/components/AutoCompleteInput/mentionItems/MentionItem.js +45 -0
  192. package/lib/module/components/AutoCompleteInput/mentionItems/MentionItem.js.map +1 -0
  193. package/lib/module/components/AutoCompleteInput/mentionItems/MentionRoleItem.js +33 -0
  194. package/lib/module/components/AutoCompleteInput/mentionItems/MentionRoleItem.js.map +1 -0
  195. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js +26 -0
  196. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js.map +1 -0
  197. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserItem.js +53 -0
  198. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserItem.js.map +1 -0
  199. package/lib/module/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js +38 -0
  200. package/lib/module/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js.map +1 -0
  201. package/lib/module/components/AutoCompleteInput/mentionItems/index.js +60 -0
  202. package/lib/module/components/AutoCompleteInput/mentionItems/index.js.map +1 -0
  203. package/lib/module/components/ChannelDetails/ChannelDetails.js +8 -3
  204. package/lib/module/components/ChannelDetails/ChannelDetails.js.map +1 -1
  205. package/lib/module/components/ChannelDetails/components/ChannelDetailsActionItem.js +2 -1
  206. package/lib/module/components/ChannelDetails/components/ChannelDetailsActionItem.js.map +1 -1
  207. package/lib/module/components/ChannelDetails/components/ChannelDetailsEditButton.js +57 -0
  208. package/lib/module/components/ChannelDetails/components/ChannelDetailsEditButton.js.map +1 -0
  209. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavHeader.js +3 -32
  210. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavHeader.js.map +1 -1
  211. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavigationSection.js +64 -25
  212. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavigationSection.js.map +1 -1
  213. package/lib/module/components/ChannelDetails/components/ChannelDetailsProfile.js +3 -2
  214. package/lib/module/components/ChannelDetails/components/ChannelDetailsProfile.js.map +1 -1
  215. package/lib/module/components/ChannelDetails/components/ChannelEditImageSheet.js +2 -2
  216. package/lib/module/components/ChannelDetails/components/ChannelEditImageSheet.js.map +1 -1
  217. package/lib/module/components/ChannelDetails/components/index.js +22 -0
  218. package/lib/module/components/ChannelDetails/components/index.js.map +1 -1
  219. package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js +2 -1
  220. package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
  221. package/lib/module/components/ChannelDetails/components/modal/Modal.js +22 -23
  222. package/lib/module/components/ChannelDetails/components/modal/Modal.js.map +1 -1
  223. package/lib/module/components/ChannelDetails/components/modal/ModalHeader.js +6 -4
  224. package/lib/module/components/ChannelDetails/components/modal/ModalHeader.js.map +1 -1
  225. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentItem.js +65 -0
  226. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentItem.js.map +1 -0
  227. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentList.js +174 -0
  228. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentList.js.map +1 -0
  229. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.js +21 -0
  230. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.js.map +1 -0
  231. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.js +45 -0
  232. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.js.map +1 -0
  233. package/lib/module/components/ChannelDetails/components/navigation-section/MediaItem.js +120 -0
  234. package/lib/module/components/ChannelDetails/components/navigation-section/MediaItem.js.map +1 -0
  235. package/lib/module/components/ChannelDetails/components/navigation-section/MediaList.js +206 -0
  236. package/lib/module/components/ChannelDetails/components/navigation-section/MediaList.js.map +1 -0
  237. package/lib/module/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.js +63 -0
  238. package/lib/module/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.js.map +1 -0
  239. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js +84 -0
  240. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js.map +1 -0
  241. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageList.js +177 -0
  242. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageList.js.map +1 -0
  243. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.js +21 -0
  244. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.js.map +1 -0
  245. package/lib/module/components/ChannelDetails/components/navigation-section/index.js +114 -0
  246. package/lib/module/components/ChannelDetails/components/navigation-section/index.js.map +1 -0
  247. package/lib/module/components/ChannelDetails/hooks/index.js +33 -0
  248. package/lib/module/components/ChannelDetails/hooks/index.js.map +1 -1
  249. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js +55 -0
  250. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js.map +1 -0
  251. package/lib/module/components/ChannelDetails/hooks/useFileAttachmentListSections.js +52 -0
  252. package/lib/module/components/ChannelDetails/hooks/useFileAttachmentListSections.js.map +1 -0
  253. package/lib/module/components/ChannelDetails/hooks/useMediaList.js +30 -0
  254. package/lib/module/components/ChannelDetails/hooks/useMediaList.js.map +1 -0
  255. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +5 -3
  256. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  257. package/lib/module/components/ImageGallery/ImageGallery.js +21 -76
  258. package/lib/module/components/ImageGallery/ImageGallery.js.map +1 -1
  259. package/lib/module/components/ImageGallery/components/AnimatedGalleryImage.js +6 -10
  260. package/lib/module/components/ImageGallery/components/AnimatedGalleryImage.js.map +1 -1
  261. package/lib/module/components/ImageGallery/components/AnimatedGalleryVideo.js +16 -14
  262. package/lib/module/components/ImageGallery/components/AnimatedGalleryVideo.js.map +1 -1
  263. package/lib/module/components/ImageGallery/components/ImageGalleryA11yProbe.js +67 -0
  264. package/lib/module/components/ImageGallery/components/ImageGalleryA11yProbe.js.map +1 -0
  265. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js +23 -15
  266. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  267. package/lib/module/components/ImageGallery/hooks/useAnimatedGalleryStyle.js +4 -3
  268. package/lib/module/components/ImageGallery/hooks/useAnimatedGalleryStyle.js.map +1 -1
  269. package/lib/module/components/ImageGallery/hooks/useCurrentImageHeight.js +53 -0
  270. package/lib/module/components/ImageGallery/hooks/useCurrentImageHeight.js.map +1 -0
  271. package/lib/module/components/ImageGallery/hooks/useImageGalleryGestures.js +25 -31
  272. package/lib/module/components/ImageGallery/hooks/useImageGalleryGestures.js.map +1 -1
  273. package/lib/module/components/Message/Message.js.map +1 -1
  274. package/lib/module/components/Message/MessageItemView/MessageTextContainer.js +14 -0
  275. package/lib/module/components/Message/MessageItemView/MessageTextContainer.js.map +1 -1
  276. package/lib/module/components/Message/MessageItemView/utils/renderText.js +69 -11
  277. package/lib/module/components/Message/MessageItemView/utils/renderText.js.map +1 -1
  278. package/lib/module/components/MessageInput/MessageComposer.js +5 -12
  279. package/lib/module/components/MessageInput/MessageComposer.js.map +1 -1
  280. package/lib/module/components/MessageList/MessageFlashList.js +22 -3
  281. package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
  282. package/lib/module/components/MessageList/MessageList.js +23 -4
  283. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  284. package/lib/module/components/UIComponents/BottomSheetModal.js +4 -17
  285. package/lib/module/components/UIComponents/BottomSheetModal.js.map +1 -1
  286. package/lib/module/components/UIComponents/ClippingFadeBottom.js +56 -0
  287. package/lib/module/components/UIComponents/ClippingFadeBottom.js.map +1 -0
  288. package/lib/module/components/UIComponents/EmptyList.js +78 -0
  289. package/lib/module/components/UIComponents/EmptyList.js.map +1 -0
  290. package/lib/module/components/UIComponents/PortalWhileClosingView.js +0 -3
  291. package/lib/module/components/UIComponents/PortalWhileClosingView.js.map +1 -1
  292. package/lib/module/components/UIComponents/index.js +22 -0
  293. package/lib/module/components/UIComponents/index.js.map +1 -1
  294. package/lib/module/components/index.js +11 -0
  295. package/lib/module/components/index.js.map +1 -1
  296. package/lib/module/components/ui/Avatar/AvatarGroup.js +3 -3
  297. package/lib/module/components/ui/Avatar/constants.js +2 -2
  298. package/lib/module/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js +64 -0
  299. package/lib/module/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js.map +1 -0
  300. package/lib/module/contexts/channelMediaListContext/ChannelMediaListContext.js +63 -0
  301. package/lib/module/contexts/channelMediaListContext/ChannelMediaListContext.js.map +1 -0
  302. package/lib/module/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js +73 -0
  303. package/lib/module/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js.map +1 -0
  304. package/lib/module/contexts/componentsContext/defaultComponents.js +9 -0
  305. package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
  306. package/lib/module/contexts/index.js +33 -0
  307. package/lib/module/contexts/index.js.map +1 -1
  308. package/lib/module/contexts/themeContext/utils/theme.js +65 -4
  309. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  310. package/lib/module/i18n/ar.json +17 -0
  311. package/lib/module/i18n/en.json +18 -1
  312. package/lib/module/i18n/es.json +17 -0
  313. package/lib/module/i18n/fr.json +17 -0
  314. package/lib/module/i18n/he.json +17 -0
  315. package/lib/module/i18n/hi.json +17 -0
  316. package/lib/module/i18n/it.json +17 -0
  317. package/lib/module/i18n/ja.json +17 -0
  318. package/lib/module/i18n/ko.json +17 -0
  319. package/lib/module/i18n/nl.json +17 -0
  320. package/lib/module/i18n/pt-br.json +17 -0
  321. package/lib/module/i18n/ru.json +17 -0
  322. package/lib/module/i18n/tr.json +17 -0
  323. package/lib/module/icons/folder.js +37 -0
  324. package/lib/module/icons/folder.js.map +1 -0
  325. package/lib/module/icons/index.js +12 -0
  326. package/lib/module/icons/index.js.map +1 -1
  327. package/lib/module/icons/megaphone.js +36 -0
  328. package/lib/module/icons/megaphone.js.map +1 -0
  329. package/lib/module/icons/shield.js +36 -0
  330. package/lib/module/icons/shield.js.map +1 -0
  331. package/lib/module/state-store/image-gallery-state-store.js +12 -3
  332. package/lib/module/state-store/image-gallery-state-store.js.map +1 -1
  333. package/lib/module/store/SqliteClient.js +1 -1
  334. package/lib/module/store/mappers/mapDraftMessageToStorable.js +8 -0
  335. package/lib/module/store/mappers/mapDraftMessageToStorable.js.map +1 -1
  336. package/lib/module/store/mappers/mapStorableToDraftMessage.js +8 -0
  337. package/lib/module/store/mappers/mapStorableToDraftMessage.js.map +1 -1
  338. package/lib/module/store/schema.js +4 -0
  339. package/lib/module/store/schema.js.map +1 -1
  340. package/lib/module/theme/generated/dark/StreamTokens.android.js +10 -1
  341. package/lib/module/theme/generated/dark/StreamTokens.android.js.map +1 -1
  342. package/lib/module/theme/generated/dark/StreamTokens.ios.js +10 -1
  343. package/lib/module/theme/generated/dark/StreamTokens.ios.js.map +1 -1
  344. package/lib/module/theme/generated/dark/StreamTokens.web.js +10 -1
  345. package/lib/module/theme/generated/dark/StreamTokens.web.js.map +1 -1
  346. package/lib/module/theme/generated/light/StreamTokens.android.js +10 -1
  347. package/lib/module/theme/generated/light/StreamTokens.android.js.map +1 -1
  348. package/lib/module/theme/generated/light/StreamTokens.ios.js +10 -1
  349. package/lib/module/theme/generated/light/StreamTokens.ios.js.map +1 -1
  350. package/lib/module/theme/generated/light/StreamTokens.web.js +10 -1
  351. package/lib/module/theme/generated/light/StreamTokens.web.js.map +1 -1
  352. package/lib/module/version.json +1 -1
  353. package/lib/typescript/components/AutoCompleteInput/AutoCompleteInput.d.ts.map +1 -1
  354. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionHeader.d.ts.map +1 -1
  355. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionItem.d.ts +8 -2
  356. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionItem.d.ts.map +1 -1
  357. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionList.d.ts +1 -1
  358. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionList.d.ts.map +1 -1
  359. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.d.ts +13 -0
  360. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.d.ts.map +1 -0
  361. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.d.ts +26 -0
  362. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.d.ts.map +1 -0
  363. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.d.ts +7 -0
  364. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.d.ts.map +1 -0
  365. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionItem.d.ts +17 -0
  366. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionItem.d.ts.map +1 -0
  367. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionRoleItem.d.ts +7 -0
  368. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionRoleItem.d.ts.map +1 -0
  369. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.d.ts +7 -0
  370. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.d.ts.map +1 -0
  371. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserItem.d.ts +7 -0
  372. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserItem.d.ts.map +1 -0
  373. package/lib/typescript/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.d.ts +21 -0
  374. package/lib/typescript/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.d.ts.map +1 -0
  375. package/lib/typescript/components/AutoCompleteInput/mentionItems/index.d.ts +17 -0
  376. package/lib/typescript/components/AutoCompleteInput/mentionItems/index.d.ts.map +1 -0
  377. package/lib/typescript/components/ChannelDetails/ChannelDetails.d.ts +11 -1
  378. package/lib/typescript/components/ChannelDetails/ChannelDetails.d.ts.map +1 -1
  379. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsActionItem.d.ts.map +1 -1
  380. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsEditButton.d.ts +6 -0
  381. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsEditButton.d.ts.map +1 -0
  382. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsNavHeader.d.ts +3 -1
  383. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsNavHeader.d.ts.map +1 -1
  384. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsNavigationSection.d.ts.map +1 -1
  385. package/lib/typescript/components/ChannelDetails/components/index.d.ts +3 -0
  386. package/lib/typescript/components/ChannelDetails/components/index.d.ts.map +1 -1
  387. package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberItem.d.ts.map +1 -1
  388. package/lib/typescript/components/ChannelDetails/components/modal/Modal.d.ts +2 -1
  389. package/lib/typescript/components/ChannelDetails/components/modal/Modal.d.ts.map +1 -1
  390. package/lib/typescript/components/ChannelDetails/components/modal/ModalHeader.d.ts +3 -1
  391. package/lib/typescript/components/ChannelDetails/components/modal/ModalHeader.d.ts.map +1 -1
  392. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentItem.d.ts +31 -0
  393. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentItem.d.ts.map +1 -0
  394. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentList.d.ts +17 -0
  395. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentList.d.ts.map +1 -0
  396. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.d.ts +9 -0
  397. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.d.ts.map +1 -0
  398. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.d.ts +13 -0
  399. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.d.ts.map +1 -0
  400. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaItem.d.ts +35 -0
  401. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaItem.d.ts.map +1 -0
  402. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaList.d.ts +17 -0
  403. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaList.d.ts.map +1 -0
  404. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.d.ts +11 -0
  405. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.d.ts.map +1 -0
  406. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageItem.d.ts +19 -0
  407. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageItem.d.ts.map +1 -0
  408. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageList.d.ts +19 -0
  409. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageList.d.ts.map +1 -0
  410. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.d.ts +9 -0
  411. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.d.ts.map +1 -0
  412. package/lib/typescript/components/ChannelDetails/components/navigation-section/index.d.ts +11 -0
  413. package/lib/typescript/components/ChannelDetails/components/navigation-section/index.d.ts.map +1 -0
  414. package/lib/typescript/components/ChannelDetails/hooks/index.d.ts +3 -0
  415. package/lib/typescript/components/ChannelDetails/hooks/index.d.ts.map +1 -1
  416. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.d.ts +56 -0
  417. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.d.ts.map +1 -0
  418. package/lib/typescript/components/ChannelDetails/hooks/useFileAttachmentListSections.d.ts +28 -0
  419. package/lib/typescript/components/ChannelDetails/hooks/useFileAttachmentListSections.d.ts.map +1 -0
  420. package/lib/typescript/components/ChannelDetails/hooks/useMediaList.d.ts +20 -0
  421. package/lib/typescript/components/ChannelDetails/hooks/useMediaList.d.ts.map +1 -0
  422. package/lib/typescript/components/ImageGallery/ImageGallery.d.ts.map +1 -1
  423. package/lib/typescript/components/ImageGallery/components/AnimatedGalleryImage.d.ts.map +1 -1
  424. package/lib/typescript/components/ImageGallery/components/AnimatedGalleryVideo.d.ts +1 -4
  425. package/lib/typescript/components/ImageGallery/components/AnimatedGalleryVideo.d.ts.map +1 -1
  426. package/lib/typescript/components/ImageGallery/components/ImageGalleryA11yProbe.d.ts +20 -0
  427. package/lib/typescript/components/ImageGallery/components/ImageGalleryA11yProbe.d.ts.map +1 -0
  428. package/lib/typescript/components/ImageGallery/components/ImageGalleryHeader.d.ts.map +1 -1
  429. package/lib/typescript/components/ImageGallery/hooks/useAnimatedGalleryStyle.d.ts +2 -3
  430. package/lib/typescript/components/ImageGallery/hooks/useAnimatedGalleryStyle.d.ts.map +1 -1
  431. package/lib/typescript/components/ImageGallery/hooks/useCurrentImageHeight.d.ts +24 -0
  432. package/lib/typescript/components/ImageGallery/hooks/useCurrentImageHeight.d.ts.map +1 -0
  433. package/lib/typescript/components/ImageGallery/hooks/useImageGalleryGestures.d.ts +1 -1
  434. package/lib/typescript/components/ImageGallery/hooks/useImageGalleryGestures.d.ts.map +1 -1
  435. package/lib/typescript/components/Message/Message.d.ts +11 -1
  436. package/lib/typescript/components/Message/Message.d.ts.map +1 -1
  437. package/lib/typescript/components/Message/MessageItemView/MessageTextContainer.d.ts.map +1 -1
  438. package/lib/typescript/components/Message/MessageItemView/utils/renderText.d.ts.map +1 -1
  439. package/lib/typescript/components/MessageInput/MessageComposer.d.ts.map +1 -1
  440. package/lib/typescript/components/MessageList/MessageFlashList.d.ts.map +1 -1
  441. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  442. package/lib/typescript/components/UIComponents/BottomSheetModal.d.ts.map +1 -1
  443. package/lib/typescript/components/UIComponents/ClippingFadeBottom.d.ts +18 -0
  444. package/lib/typescript/components/UIComponents/ClippingFadeBottom.d.ts.map +1 -0
  445. package/lib/typescript/components/UIComponents/EmptyList.d.ts +24 -0
  446. package/lib/typescript/components/UIComponents/EmptyList.d.ts.map +1 -0
  447. package/lib/typescript/components/UIComponents/index.d.ts +2 -0
  448. package/lib/typescript/components/UIComponents/index.d.ts.map +1 -1
  449. package/lib/typescript/components/index.d.ts +1 -0
  450. package/lib/typescript/components/index.d.ts.map +1 -1
  451. package/lib/typescript/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.d.ts +21 -0
  452. package/lib/typescript/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.d.ts.map +1 -0
  453. package/lib/typescript/contexts/channelMediaListContext/ChannelMediaListContext.d.ts +21 -0
  454. package/lib/typescript/contexts/channelMediaListContext/ChannelMediaListContext.d.ts.map +1 -0
  455. package/lib/typescript/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.d.ts +21 -0
  456. package/lib/typescript/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.d.ts.map +1 -0
  457. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +19 -2
  458. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
  459. package/lib/typescript/contexts/index.d.ts +3 -0
  460. package/lib/typescript/contexts/index.d.ts.map +1 -1
  461. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +62 -1
  462. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
  463. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +62 -1
  464. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  465. package/lib/typescript/i18n/ar.json +17 -0
  466. package/lib/typescript/i18n/en.json +18 -1
  467. package/lib/typescript/i18n/es.json +17 -0
  468. package/lib/typescript/i18n/fr.json +17 -0
  469. package/lib/typescript/i18n/he.json +17 -0
  470. package/lib/typescript/i18n/hi.json +17 -0
  471. package/lib/typescript/i18n/it.json +17 -0
  472. package/lib/typescript/i18n/ja.json +17 -0
  473. package/lib/typescript/i18n/ko.json +17 -0
  474. package/lib/typescript/i18n/nl.json +17 -0
  475. package/lib/typescript/i18n/pt-br.json +17 -0
  476. package/lib/typescript/i18n/ru.json +17 -0
  477. package/lib/typescript/i18n/tr.json +17 -0
  478. package/lib/typescript/icons/folder.d.ts +4 -0
  479. package/lib/typescript/icons/folder.d.ts.map +1 -0
  480. package/lib/typescript/icons/index.d.ts +1 -0
  481. package/lib/typescript/icons/index.d.ts.map +1 -1
  482. package/lib/typescript/icons/megaphone.d.ts +4 -0
  483. package/lib/typescript/icons/megaphone.d.ts.map +1 -0
  484. package/lib/typescript/icons/shield.d.ts +4 -0
  485. package/lib/typescript/icons/shield.d.ts.map +1 -0
  486. package/lib/typescript/state-store/image-gallery-state-store.d.ts +8 -0
  487. package/lib/typescript/state-store/image-gallery-state-store.d.ts.map +1 -1
  488. package/lib/typescript/store/mappers/mapDraftMessageToStorable.d.ts.map +1 -1
  489. package/lib/typescript/store/mappers/mapStorableToDraftMessage.d.ts.map +1 -1
  490. package/lib/typescript/store/schema.d.ts +4 -0
  491. package/lib/typescript/store/schema.d.ts.map +1 -1
  492. package/lib/typescript/theme/generated/StreamTokens.types.d.ts +9 -0
  493. package/lib/typescript/theme/generated/StreamTokens.types.d.ts.map +1 -1
  494. package/lib/typescript/theme/generated/dark/StreamTokens.android.d.ts.map +1 -1
  495. package/lib/typescript/theme/generated/dark/StreamTokens.ios.d.ts.map +1 -1
  496. package/lib/typescript/theme/generated/dark/StreamTokens.web.d.ts.map +1 -1
  497. package/lib/typescript/theme/generated/light/StreamTokens.android.d.ts.map +1 -1
  498. package/lib/typescript/theme/generated/light/StreamTokens.ios.d.ts.map +1 -1
  499. package/lib/typescript/theme/generated/light/StreamTokens.web.d.ts.map +1 -1
  500. package/lib/typescript/utils/i18n/Streami18n.d.ts +17 -0
  501. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  502. package/package.json +2 -2
  503. package/src/components/AutoCompleteInput/AutoCompleteInput.tsx +13 -0
  504. package/src/components/AutoCompleteInput/AutoCompleteSuggestionHeader.tsx +2 -1
  505. package/src/components/AutoCompleteInput/AutoCompleteSuggestionItem.tsx +35 -43
  506. package/src/components/AutoCompleteInput/AutoCompleteSuggestionList.tsx +28 -3
  507. package/src/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.tsx +71 -0
  508. package/src/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.tsx +71 -0
  509. package/src/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.tsx +36 -0
  510. package/src/components/AutoCompleteInput/mentionItems/MentionItem.tsx +59 -0
  511. package/src/components/AutoCompleteInput/mentionItems/MentionRoleItem.tsx +27 -0
  512. package/src/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.tsx +23 -0
  513. package/src/components/AutoCompleteInput/mentionItems/MentionUserItem.tsx +55 -0
  514. package/src/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.tsx +56 -0
  515. package/src/components/AutoCompleteInput/mentionItems/__tests__/MentionItems.test.tsx +129 -0
  516. package/src/components/AutoCompleteInput/mentionItems/__tests__/TokenizedSuggestionParts.test.tsx +63 -0
  517. package/src/components/AutoCompleteInput/mentionItems/index.ts +16 -0
  518. package/src/components/ChannelDetails/ChannelDetails.tsx +17 -2
  519. package/src/components/ChannelDetails/__tests__/ChannelDetails.test.tsx +29 -0
  520. package/src/components/ChannelDetails/__tests__/ChannelDetailsEditButton.test.tsx +127 -0
  521. package/src/components/ChannelDetails/__tests__/ChannelDetailsNavHeader.test.tsx +21 -56
  522. package/src/components/ChannelDetails/__tests__/ChannelDetailsNavigationSection.test.tsx +225 -6
  523. package/src/components/ChannelDetails/__tests__/useFileAttachmentListSections.test.tsx +159 -0
  524. package/src/components/ChannelDetails/__tests__/useMediaList.test.tsx +53 -0
  525. package/src/components/ChannelDetails/components/ChannelDetailsActionItem.tsx +6 -1
  526. package/src/components/ChannelDetails/components/ChannelDetailsEditButton.tsx +50 -0
  527. package/src/components/ChannelDetails/components/ChannelDetailsNavHeader.tsx +6 -33
  528. package/src/components/ChannelDetails/components/ChannelDetailsNavigationSection.tsx +80 -32
  529. package/src/components/ChannelDetails/components/ChannelDetailsProfile.tsx +2 -1
  530. package/src/components/ChannelDetails/components/ChannelEditImageSheet.tsx +2 -2
  531. package/src/components/ChannelDetails/components/__tests__/navigation-section/FileAttachmentItem.test.tsx +80 -0
  532. package/src/components/ChannelDetails/components/__tests__/navigation-section/FileAttachmentList.test.tsx +334 -0
  533. package/src/components/ChannelDetails/components/__tests__/navigation-section/FileAttachmentListSectionHeader.test.tsx +19 -0
  534. package/src/components/ChannelDetails/components/__tests__/navigation-section/MediaItem.test.tsx +97 -0
  535. package/src/components/ChannelDetails/components/__tests__/navigation-section/MediaList.test.tsx +351 -0
  536. package/src/components/ChannelDetails/components/__tests__/navigation-section/PinnedMessageItem.test.tsx +112 -0
  537. package/src/components/ChannelDetails/components/__tests__/navigation-section/PinnedMessageList.test.tsx +324 -0
  538. package/src/components/ChannelDetails/components/index.ts +3 -0
  539. package/src/components/ChannelDetails/components/members/ChannelMemberItem.tsx +6 -1
  540. package/src/components/ChannelDetails/components/modal/Modal.tsx +37 -24
  541. package/src/components/ChannelDetails/components/modal/ModalHeader.tsx +11 -4
  542. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentItem.tsx +92 -0
  543. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentList.tsx +204 -0
  544. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.tsx +23 -0
  545. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.tsx +56 -0
  546. package/src/components/ChannelDetails/components/navigation-section/MediaItem.tsx +160 -0
  547. package/src/components/ChannelDetails/components/navigation-section/MediaList.tsx +244 -0
  548. package/src/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.tsx +66 -0
  549. package/src/components/ChannelDetails/components/navigation-section/PinnedMessageItem.tsx +94 -0
  550. package/src/components/ChannelDetails/components/navigation-section/PinnedMessageList.tsx +198 -0
  551. package/src/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.tsx +23 -0
  552. package/src/components/ChannelDetails/components/navigation-section/index.ts +10 -0
  553. package/src/components/ChannelDetails/hooks/index.ts +3 -0
  554. package/src/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.ts +108 -0
  555. package/src/components/ChannelDetails/hooks/useFileAttachmentListSections.ts +79 -0
  556. package/src/components/ChannelDetails/hooks/useMediaList.ts +51 -0
  557. package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +3 -2
  558. package/src/components/ImageGallery/ImageGallery.tsx +41 -120
  559. package/src/components/ImageGallery/__tests__/ImageGallery.test.tsx +4 -1
  560. package/src/components/ImageGallery/__tests__/ImageGalleryAdjustable.test.tsx +5 -4
  561. package/src/components/ImageGallery/components/AnimatedGalleryImage.tsx +9 -11
  562. package/src/components/ImageGallery/components/AnimatedGalleryVideo.tsx +28 -15
  563. package/src/components/ImageGallery/components/ImageGalleryA11yProbe.tsx +82 -0
  564. package/src/components/ImageGallery/components/ImageGalleryHeader.tsx +21 -18
  565. package/src/components/ImageGallery/hooks/useAnimatedGalleryStyle.tsx +5 -5
  566. package/src/components/ImageGallery/hooks/useCurrentImageHeight.ts +86 -0
  567. package/src/components/ImageGallery/hooks/useImageGalleryGestures.tsx +42 -51
  568. package/src/components/Message/Message.tsx +14 -2
  569. package/src/components/Message/MessageItemView/MessageTextContainer.tsx +25 -0
  570. package/src/components/Message/MessageItemView/utils/renderText.tsx +97 -18
  571. package/src/components/MessageInput/MessageComposer.tsx +7 -9
  572. package/src/components/MessageList/MessageFlashList.tsx +28 -0
  573. package/src/components/MessageList/MessageList.tsx +28 -0
  574. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +24 -15
  575. package/src/components/UIComponents/BottomSheetModal.tsx +2 -17
  576. package/src/components/UIComponents/ClippingFadeBottom.tsx +47 -0
  577. package/src/components/UIComponents/EmptyList.tsx +80 -0
  578. package/src/components/UIComponents/PortalWhileClosingView.tsx +0 -4
  579. package/src/components/UIComponents/__tests__/EmptyList.test.tsx +90 -0
  580. package/src/components/UIComponents/index.ts +2 -0
  581. package/src/components/index.ts +1 -0
  582. package/src/components/ui/Avatar/AvatarGroup.tsx +3 -3
  583. package/src/components/ui/Avatar/constants.ts +2 -2
  584. package/src/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.tsx +67 -0
  585. package/src/contexts/channelMediaListContext/ChannelMediaListContext.tsx +68 -0
  586. package/src/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.tsx +72 -0
  587. package/src/contexts/componentsContext/defaultComponents.ts +21 -2
  588. package/src/contexts/index.ts +3 -0
  589. package/src/contexts/themeContext/utils/theme.ts +124 -2
  590. package/src/i18n/ar.json +17 -0
  591. package/src/i18n/en.json +18 -1
  592. package/src/i18n/es.json +17 -0
  593. package/src/i18n/fr.json +17 -0
  594. package/src/i18n/he.json +17 -0
  595. package/src/i18n/hi.json +17 -0
  596. package/src/i18n/it.json +17 -0
  597. package/src/i18n/ja.json +17 -0
  598. package/src/i18n/ko.json +17 -0
  599. package/src/i18n/nl.json +17 -0
  600. package/src/i18n/pt-br.json +17 -0
  601. package/src/i18n/ru.json +17 -0
  602. package/src/i18n/tr.json +17 -0
  603. package/src/icons/folder.tsx +28 -0
  604. package/src/icons/index.ts +1 -0
  605. package/src/icons/megaphone.tsx +21 -0
  606. package/src/icons/shield.tsx +21 -0
  607. package/src/state-store/__tests__/image-gallery-state-store.test.ts +81 -0
  608. package/src/state-store/image-gallery-state-store.ts +27 -1
  609. package/src/store/SqliteClient.ts +1 -1
  610. package/src/store/mappers/mapDraftMessageToStorable.ts +8 -0
  611. package/src/store/mappers/mapStorableToDraftMessage.ts +8 -0
  612. package/src/store/schema.ts +8 -0
  613. package/src/theme/generated/StreamTokens.types.ts +9 -0
  614. package/src/theme/generated/dark/StreamTokens.android.ts +10 -1
  615. package/src/theme/generated/dark/StreamTokens.ios.ts +10 -1
  616. package/src/theme/generated/dark/StreamTokens.web.ts +10 -1
  617. package/src/theme/generated/light/StreamTokens.android.ts +10 -1
  618. package/src/theme/generated/light/StreamTokens.ios.ts +10 -1
  619. package/src/theme/generated/light/StreamTokens.web.ts +10 -1
  620. package/src/version.json +1 -1
@@ -0,0 +1,86 @@
1
+ import { useEffect } from 'react';
2
+ import { Image } from 'react-native';
3
+ import { SharedValue, useSharedValue } from 'react-native-reanimated';
4
+
5
+ import type {
6
+ ImageGalleryAsset,
7
+ ImageGalleryStateStore,
8
+ } from '../../../state-store/image-gallery-state-store';
9
+ import { FileTypes } from '../../../types/types';
10
+
11
+ /**
12
+ * Owns a SharedValue tracking the visible height of the currently selected
13
+ * gallery asset and keeps it in lockstep with the gallery store's
14
+ * currentIndex. Worklet consumers read `.value` on the UI thread.
15
+ *
16
+ * The store is subscribed via `subscribeWithSelector` (not `useStateStore`),
17
+ * so currentIndex changes never go through React state so no rerender is
18
+ * triggered in the calling component. The callback writes directly into the
19
+ * SharedValue.
20
+ *
21
+ * Sync path uses the attachment's intrinsic `original_height`/`original_width`
22
+ * when present. Async fallback via `Image.getSize` handles assets that don't
23
+ * carry dimensions; a token guards against the closure-race where the user
24
+ * swipes past a slide before its dimensions resolve.
25
+ */
26
+ export const useCurrentImageHeight = ({
27
+ assets,
28
+ fullWindowHeight,
29
+ fullWindowWidth,
30
+ imageGalleryStateStore,
31
+ }: {
32
+ assets: ImageGalleryAsset[];
33
+ fullWindowHeight: number;
34
+ fullWindowWidth: number;
35
+ imageGalleryStateStore: ImageGalleryStateStore;
36
+ }): SharedValue<number> => {
37
+ const currentImageHeight = useSharedValue(fullWindowHeight);
38
+
39
+ useEffect(() => {
40
+ let latestToken = 0;
41
+
42
+ const compute = (index: number) => {
43
+ const currentToken = ++latestToken;
44
+ const photo = assets[index];
45
+
46
+ if (photo?.original_height && photo?.original_width) {
47
+ const h = Math.floor(photo.original_height * (fullWindowWidth / photo.original_width));
48
+ currentImageHeight.value = h > fullWindowHeight ? fullWindowHeight : h;
49
+ return;
50
+ }
51
+
52
+ if (photo?.uri && photo.type === FileTypes.Image) {
53
+ Image.getSize(
54
+ photo.uri,
55
+ (width, height) => {
56
+ // Stale result, currentIndex moved on before getSize resolved.
57
+ if (currentToken !== latestToken) return;
58
+ if (!width || !height) {
59
+ currentImageHeight.value = fullWindowHeight;
60
+ return;
61
+ }
62
+ const imageHeight = Math.floor(height * (fullWindowWidth / width));
63
+ currentImageHeight.value =
64
+ imageHeight > fullWindowHeight ? fullWindowHeight : imageHeight;
65
+ },
66
+ () => {
67
+ if (currentToken !== latestToken) return;
68
+ currentImageHeight.value = fullWindowHeight;
69
+ },
70
+ );
71
+ return;
72
+ }
73
+
74
+ currentImageHeight.value = fullWindowHeight;
75
+ };
76
+
77
+ compute(imageGalleryStateStore.state.getLatestValue().currentIndex);
78
+
79
+ return imageGalleryStateStore.state.subscribeWithSelector(
80
+ (state) => ({ currentIndex: state.currentIndex }),
81
+ ({ currentIndex }) => compute(currentIndex),
82
+ );
83
+ }, [assets, fullWindowHeight, fullWindowWidth, currentImageHeight, imageGalleryStateStore]);
84
+
85
+ return currentImageHeight;
86
+ };
@@ -1,4 +1,4 @@
1
- import { useRef, useState } from 'react';
1
+ import { useRef } from 'react';
2
2
  import { Platform } from 'react-native';
3
3
  import { Gesture, GestureType } from 'react-native-gesture-handler';
4
4
  import {
@@ -14,9 +14,7 @@ import {
14
14
 
15
15
  import { useImageGalleryContext } from '../../../contexts/imageGalleryContext/ImageGalleryContext';
16
16
  import { useOverlayContext } from '../../../contexts/overlayContext/OverlayContext';
17
- import { useStateStore } from '../../../hooks';
18
17
  import { NativeHandlers } from '../../../native';
19
- import { ImageGalleryState } from '../../../state-store/image-gallery-state-store';
20
18
 
21
19
  export enum HasPinched {
22
20
  FALSE = 0,
@@ -31,10 +29,6 @@ export enum IsSwiping {
31
29
 
32
30
  const MARGIN = 32;
33
31
 
34
- const imageGallerySelector = (state: ImageGalleryState) => ({
35
- currentIndex: state.currentIndex,
36
- });
37
-
38
32
  export const useImageGalleryGestures = ({
39
33
  currentImageHeight,
40
34
  halfScreenHeight,
@@ -49,7 +43,7 @@ export const useImageGalleryGestures = ({
49
43
  translateY,
50
44
  translationX,
51
45
  }: {
52
- currentImageHeight: number;
46
+ currentImageHeight: SharedValue<number>;
53
47
  halfScreenHeight: number;
54
48
  halfScreenWidth: number;
55
49
  headerFooterVisible: SharedValue<number>;
@@ -62,20 +56,8 @@ export const useImageGalleryGestures = ({
62
56
  translateY: SharedValue<number>;
63
57
  translationX: SharedValue<number>;
64
58
  }) => {
65
- /**
66
- * if a specific image index > 0 has been passed in
67
- * while creating the hook, set the value of the index
68
- * reference to its value.
69
- *
70
- * This makes it possible to seelct an image in the list,
71
- * and scroll/pan as normal. Prior to this,
72
- * it was always assumed that one started at index 0 in the
73
- * gallery.
74
- * */
75
59
  const { imageGalleryStateStore } = useImageGalleryContext();
76
- const { currentIndex } = useStateStore(imageGalleryStateStore.state, imageGallerySelector);
77
-
78
- const [index, setIndex] = useState(currentIndex);
60
+ const currentIndexShared = imageGalleryStateStore.currentIndexShared;
79
61
 
80
62
  /**
81
63
  * Gesture handler refs
@@ -163,13 +145,16 @@ export const useImageGalleryGestures = ({
163
145
  };
164
146
 
165
147
  const moveToNextImage = () => {
166
- runOnJS(setIndex)(index + 1);
167
- imageGalleryStateStore.currentIndex = index + 1;
148
+ // Read fresh — both moveToNext/Previous are invoked via runOnJS from a
149
+ // worklet, so we'd otherwise be using a value captured at hook-creation
150
+ // time. The setter mirrors into currentIndexShared.
151
+ const currentIndex = imageGalleryStateStore.state.getLatestValue().currentIndex;
152
+ imageGalleryStateStore.currentIndex = currentIndex + 1;
168
153
  };
169
154
 
170
155
  const moveToPreviousImage = () => {
171
- runOnJS(setIndex)(index - 1);
172
- imageGalleryStateStore.currentIndex = index - 1;
156
+ const currentIndex = imageGalleryStateStore.state.getLatestValue().currentIndex;
157
+ imageGalleryStateStore.currentIndex = currentIndex - 1;
173
158
  };
174
159
 
175
160
  /**
@@ -221,7 +206,7 @@ export const useImageGalleryGestures = ({
221
206
  * true, or false and is reset on releasing the touch
222
207
  */
223
208
  if (isSwiping.value === IsSwiping.UNDETERMINED) {
224
- const maxXYRatio = isAndroid ? 1 : 0.25;
209
+ const maxXYRatio = 0.25;
225
210
  if (
226
211
  Math.abs(event.translationX / event.translationY) > maxXYRatio &&
227
212
  (Math.abs(-halfScreenWidth * (scale.value - 1) - offsetX.value) < 3 ||
@@ -261,16 +246,17 @@ export const useImageGalleryGestures = ({
261
246
  * If swiping down start scaling down the image for swipe
262
247
  * away effect
263
248
  */
249
+ const imageHeight = currentImageHeight.value;
264
250
  scale.value =
265
- currentImageHeight * offsetScale.value < screenHeight && translateY.value > 0
251
+ imageHeight * offsetScale.value < screenHeight && translateY.value > 0
266
252
  ? offsetScale.value * (1 - (1 / 3) * (translateY.value / screenHeight))
267
- : currentImageHeight * offsetScale.value > screenHeight &&
268
- translateY.value > (currentImageHeight / 2) * offsetScale.value - halfScreenHeight
253
+ : imageHeight * offsetScale.value > screenHeight &&
254
+ translateY.value > (imageHeight / 2) * offsetScale.value - halfScreenHeight
269
255
  ? offsetScale.value *
270
256
  (1 -
271
257
  (1 / 3) *
272
258
  ((translateY.value -
273
- ((currentImageHeight / 2) * offsetScale.value - halfScreenHeight)) /
259
+ ((imageHeight / 2) * offsetScale.value - halfScreenHeight)) /
274
260
  screenHeight))
275
261
  : scale.value;
276
262
 
@@ -287,6 +273,8 @@ export const useImageGalleryGestures = ({
287
273
  const finalXPosition = event.translationX - event.velocityX * 0.3;
288
274
  const finalYPosition = event.translationY + event.velocityY * 0.1;
289
275
 
276
+ const currentIndex = currentIndexShared.value;
277
+
290
278
  /**
291
279
  * If there is a next photo, the image is lined up to the right
292
280
  * edge, the swipe is to the left, and the final position is more
@@ -295,7 +283,7 @@ export const useImageGalleryGestures = ({
295
283
  * As we move towards the left to move to next image, the translationX value will be negative on X axis.
296
284
  */
297
285
  if (
298
- index < assetsLength - 1 &&
286
+ currentIndex < assetsLength - 1 &&
299
287
  Math.abs(halfScreenWidth * (scale.value - 1) + offsetX.value) < 3 &&
300
288
  translateX.value < 0 &&
301
289
  finalXPosition > halfScreenWidth &&
@@ -303,7 +291,7 @@ export const useImageGalleryGestures = ({
303
291
  ) {
304
292
  cancelAnimation(translationX);
305
293
  translationX.value = withTiming(
306
- -(screenWidth + MARGIN) * (index + 1),
294
+ -(screenWidth + MARGIN) * (currentIndex + 1),
307
295
  {
308
296
  duration: 200,
309
297
  easing: Easing.out(Easing.ease),
@@ -322,7 +310,7 @@ export const useImageGalleryGestures = ({
322
310
  * As we move towards the right to move to previous image, the translationX value will be positive on X axis.
323
311
  */
324
312
  } else if (
325
- index > 0 &&
313
+ currentIndex > 0 &&
326
314
  Math.abs(-halfScreenWidth * (scale.value - 1) + offsetX.value) < 3 &&
327
315
  translateX.value > 0 &&
328
316
  finalXPosition < -halfScreenWidth &&
@@ -330,7 +318,7 @@ export const useImageGalleryGestures = ({
330
318
  ) {
331
319
  cancelAnimation(translationX);
332
320
  translationX.value = withTiming(
333
- -(screenWidth + MARGIN) * (index - 1),
321
+ -(screenWidth + MARGIN) * (currentIndex - 1),
334
322
  {
335
323
  duration: 200,
336
324
  easing: Easing.out(Easing.ease),
@@ -376,19 +364,20 @@ export const useImageGalleryGestures = ({
376
364
  * otherwise use decay with a clamping at the edges to give the effect
377
365
  * the image is sliding along using velocity and friction
378
366
  */
367
+ const imageHeight = currentImageHeight.value;
379
368
  translateY.value =
380
- currentImageHeight * scale.value < screenHeight
369
+ imageHeight * scale.value < screenHeight
381
370
  ? withTiming(0, { reduceMotion: ReduceMotion.Never })
382
- : translateY.value > (currentImageHeight / 2) * scale.value - halfScreenHeight
383
- ? withTiming((currentImageHeight / 2) * scale.value - halfScreenHeight, {
371
+ : translateY.value > (imageHeight / 2) * scale.value - halfScreenHeight
372
+ ? withTiming((imageHeight / 2) * scale.value - halfScreenHeight, {
384
373
  reduceMotion: ReduceMotion.Never,
385
374
  })
386
- : translateY.value < (-currentImageHeight / 2) * scale.value + halfScreenHeight
387
- ? withTiming((-currentImageHeight / 2) * scale.value + halfScreenHeight)
375
+ : translateY.value < (-imageHeight / 2) * scale.value + halfScreenHeight
376
+ ? withTiming((-imageHeight / 2) * scale.value + halfScreenHeight)
388
377
  : withDecay({
389
378
  clamp: [
390
- (-currentImageHeight / 2) * scale.value + halfScreenHeight,
391
- (currentImageHeight / 2) * scale.value - halfScreenHeight,
379
+ (-imageHeight / 2) * scale.value + halfScreenHeight,
380
+ (imageHeight / 2) * scale.value - halfScreenHeight,
392
381
  ],
393
382
  deceleration: 0.99,
394
383
  velocity: event.velocityY,
@@ -411,7 +400,7 @@ export const useImageGalleryGestures = ({
411
400
  */
412
401
  if (
413
402
  finalYPosition > halfScreenHeight &&
414
- offsetY.value + 8 >= (currentImageHeight / 2) * scale.value - halfScreenHeight &&
403
+ offsetY.value + 8 >= (imageHeight / 2) * scale.value - halfScreenHeight &&
415
404
  isSwiping.value !== IsSwiping.TRUE &&
416
405
  translateY.value !== 0 &&
417
406
  !(
@@ -448,7 +437,7 @@ export const useImageGalleryGestures = ({
448
437
  ? withDecay({
449
438
  velocity: event.velocityY,
450
439
  })
451
- : withTiming(halfScreenHeight + (currentImageHeight / 2) * scale.value, {
440
+ : withTiming(halfScreenHeight + (imageHeight / 2) * scale.value, {
452
441
  duration: 200,
453
442
  easing: Easing.out(Easing.ease),
454
443
  });
@@ -662,13 +651,14 @@ export const useImageGalleryGestures = ({
662
651
  * edges of the screen return the photo to line up with the edges,
663
652
  * otherwise leave the photo in its current position
664
653
  */
654
+ const imageHeight = currentImageHeight.value;
665
655
  translateY.value =
666
- currentImageHeight * scale.value < screenHeight
656
+ imageHeight * scale.value < screenHeight
667
657
  ? withTiming(0)
668
- : translateY.value > (currentImageHeight / 2) * scale.value - screenHeight / 2
669
- ? withTiming((currentImageHeight / 2) * scale.value - screenHeight / 2)
670
- : translateY.value < (-currentImageHeight / 2) * scale.value + screenHeight / 2
671
- ? withTiming((-currentImageHeight / 2) * scale.value + screenHeight / 2)
658
+ : translateY.value > (imageHeight / 2) * scale.value - screenHeight / 2
659
+ ? withTiming((imageHeight / 2) * scale.value - screenHeight / 2)
660
+ : translateY.value < (-imageHeight / 2) * scale.value + screenHeight / 2
661
+ ? withTiming((-imageHeight / 2) * scale.value + screenHeight / 2)
672
662
  : translateY.value;
673
663
 
674
664
  /**
@@ -724,11 +714,12 @@ export const useImageGalleryGestures = ({
724
714
  duration: 200,
725
715
  easing: Easing.out(Easing.ease),
726
716
  });
727
- if (currentImageHeight * 2 > screenHeight) {
717
+ const imageHeight = currentImageHeight.value;
718
+ if (imageHeight * 2 > screenHeight) {
728
719
  const translateYTopBottom =
729
720
  event.absoluteY > halfScreenHeight
730
- ? -(currentImageHeight * 2 - screenHeight) / 2
731
- : (currentImageHeight * 2 - screenHeight) / 2;
721
+ ? -(imageHeight * 2 - screenHeight) / 2
722
+ : (imageHeight * 2 - screenHeight) / 2;
732
723
  translateY.value = withTiming(translateYTopBottom, {
733
724
  duration: 200,
734
725
  easing: Easing.out(Easing.ease),
@@ -11,7 +11,7 @@ import {
11
11
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
12
12
  import { Portal } from 'react-native-teleport';
13
13
 
14
- import type { Attachment, LocalMessage, UserResponse } from 'stream-chat';
14
+ import type { Attachment, LocalMessage, MentionEntity, UserResponse } from 'stream-chat';
15
15
 
16
16
  import { useCreateMessageContext } from './hooks/useCreateMessageContext';
17
17
  import { useMessageActionHandlers } from './hooks/useMessageActionHandlers';
@@ -94,7 +94,19 @@ export type TouchableEmitter =
94
94
  | 'messageReplies'
95
95
  | 'reactionList';
96
96
 
97
- export type TextMentionTouchableHandlerAdditionalInfo = { user?: UserResponse };
97
+ export type TextMentionTouchableHandlerAdditionalInfo = {
98
+ /**
99
+ * The typed mention entity for the pressed mention (user / channel / here /
100
+ * role / user_group). Always populated by the default renderText pipeline;
101
+ * undefined only when a custom renderer doesn't resolve a match.
102
+ */
103
+ mentionedEntity?: MentionEntity;
104
+ /**
105
+ * Back-compat: still populated when the mention is a user, so existing
106
+ * integrators reading `additionalInfo.user` keep working.
107
+ */
108
+ user?: UserResponse;
109
+ };
98
110
 
99
111
  export type TextMentionTouchableHandlerPayload = {
100
112
  emitter: 'textMention';
@@ -166,6 +166,31 @@ const areEqual = (
166
166
  return false;
167
167
  }
168
168
 
169
+ // Enhanced mention sources (channel/here/roles/groups) — without these the
170
+ // renderText cache would refresh on a new entity but this comparator would
171
+ // short-circuit it away and the highlight would not appear until something
172
+ // else re-rendered the row.
173
+ const mentionedBroadcastEqual =
174
+ prevMessage.mentioned_channel === nextMessage.mentioned_channel &&
175
+ prevMessage.mentioned_here === nextMessage.mentioned_here;
176
+ if (!mentionedBroadcastEqual) {
177
+ return false;
178
+ }
179
+
180
+ const joinIds = (values?: string[]) => (values ?? []).join('|');
181
+ const mentionedRolesEqual =
182
+ joinIds(prevMessage.mentioned_roles) === joinIds(nextMessage.mentioned_roles);
183
+ if (!mentionedRolesEqual) {
184
+ return false;
185
+ }
186
+
187
+ const groupIds = (m: typeof prevMessage) =>
188
+ joinIds(m.mentioned_groups?.map((g) => g.id) ?? m.mentioned_group_ids);
189
+ const mentionedGroupsEqual = groupIds(prevMessage) === groupIds(nextMessage);
190
+ if (!mentionedGroupsEqual) {
191
+ return false;
192
+ }
193
+
169
194
  // stringify could be an expensive operation, so lets rule out the obvious
170
195
  // possibilities first such as different object reference or empty objects etc.
171
196
  // Also keeping markdown equality check at the last to make sure other less
@@ -27,7 +27,7 @@ import {
27
27
  State,
28
28
  } from 'simple-markdown';
29
29
 
30
- import type { LocalMessage, UserResponse } from 'stream-chat';
30
+ import type { LocalMessage, MentionEntity, UserResponse } from 'stream-chat';
31
31
 
32
32
  import { generateMarkdownText } from './generateMarkdownText';
33
33
 
@@ -152,7 +152,7 @@ const defaultMarkdownStyles: MarkdownStyle = {
152
152
  flexDirection: 'row',
153
153
  },
154
154
  mentions: {
155
- fontWeight: '700',
155
+ fontWeight: primitives.typographyFontWeightRegular,
156
156
  fontSize: primitives.typographyFontSizeMd,
157
157
  lineHeight: primitives.typographyLineHeightNormal,
158
158
  },
@@ -286,7 +286,7 @@ export const renderText = (params: RenderTextParams) => {
286
286
  },
287
287
  mentions: {
288
288
  ...defaultMarkdownStyles.mentions,
289
- color: semantics.accentPrimary,
289
+ color: semantics.chatTextMention,
290
290
  ...markdownStyles?.mentions,
291
291
  },
292
292
  table: {
@@ -404,26 +404,96 @@ export const renderText = (params: RenderTextParams) => {
404
404
  );
405
405
  };
406
406
 
407
- // take the @ mentions and turn them into markdown?
408
- // translate links
409
- const { mentioned_users } = message;
410
- const mentionedUsernames = (mentioned_users || [])
411
- .map((user) => user.name || user.id)
412
- .filter(Boolean)
407
+ // Collect every mention type the server sent us into a single typed list so
408
+ // the markdown rule, the lookup, and the press payload all see the same shape.
409
+ const {
410
+ mentioned_channel,
411
+ mentioned_group_ids,
412
+ mentioned_groups,
413
+ mentioned_here,
414
+ mentioned_roles,
415
+ mentioned_users,
416
+ } = message;
417
+
418
+ const mentionEntities: MentionEntity[] = [
419
+ ...((mentioned_users ?? []) as UserResponse[]).map(
420
+ (user) => ({ ...user, mentionType: 'user' }) as MentionEntity,
421
+ ),
422
+ ...(mentioned_channel
423
+ ? ([{ id: 'channel', mentionType: 'channel', name: 'channel' }] as MentionEntity[])
424
+ : []),
425
+ ...(mentioned_here
426
+ ? ([{ id: 'here', mentionType: 'here', name: 'here' }] as MentionEntity[])
427
+ : []),
428
+ ...((mentioned_roles ?? []) as string[]).map(
429
+ (role) => ({ id: role, mentionType: 'role', name: role }) as MentionEntity,
430
+ ),
431
+ ...(
432
+ (mentioned_groups ?? (mentioned_group_ids ?? []).map((id) => ({ id, name: id }))) as Array<{
433
+ id: string;
434
+ name?: string;
435
+ }>
436
+ ).map(
437
+ (group) =>
438
+ ({
439
+ id: group.id,
440
+ mentionType: 'user_group',
441
+ name: group.name ?? group.id,
442
+ }) as MentionEntity,
443
+ ),
444
+ ];
445
+
446
+ // Lookup keyed by the rendered mention text (sans `@`), lowercased so we
447
+ // resolve case-insensitively. First-write-wins: if a user shares a name with
448
+ // a role/group, the user entity is preferred — same precedence the React SDK
449
+ // applies via insertion order in its plugin.
450
+ const mentionLookup = new Map<string, MentionEntity>();
451
+ for (const entity of mentionEntities) {
452
+ const key = (entity.name ?? entity.id).toLowerCase();
453
+ if (!mentionLookup.has(key)) mentionLookup.set(key, entity);
454
+ }
455
+
456
+ const mentionTokens = mentionEntities
457
+ .map((entity) => entity.name ?? entity.id)
458
+ .filter((value): value is string => Boolean(value))
413
459
  .sort((a, b) => b.length - a.length)
414
- .map(escapeRegExp);
415
- const mentionedUsers = mentionedUsernames.map((username) => `@${username}`).join('|');
416
- const regEx = new RegExp(`^\\B(${mentionedUsers})`, 'g');
460
+ .map((value) => `@${escapeRegExp(value)}`)
461
+ .join('|');
462
+ const regEx = new RegExp(`^\\B(${mentionTokens})`, 'g');
417
463
  const mentionsMatchFunction: MatchFunction = (source) => regEx.exec(source);
418
464
 
465
+ const colorForMentionType = (mentionType: MentionEntity['mentionType']) => {
466
+ switch (mentionType) {
467
+ case 'user':
468
+ return semantics.chatTextMentionUser;
469
+ case 'channel':
470
+ case 'here':
471
+ return semantics.chatTextMentionBroadcast;
472
+ case 'role':
473
+ return semantics.chatTextMentionRole;
474
+ case 'user_group':
475
+ return semantics.chatTextMentionGroup;
476
+ default:
477
+ return semantics.chatTextMention;
478
+ }
479
+ };
480
+
419
481
  const mentionsReact: ReactNodeOutput = (node, output, { ...state }) => {
420
- /**removes the @ prefix of username */
421
- const userName = node.content[0]?.content?.substring(1);
482
+ const matchedText: string | undefined = node.content[0]?.content;
483
+ const matchedName = matchedText?.substring(1) ?? '';
484
+ const matchedEntity = mentionLookup.get(matchedName.toLowerCase());
485
+ const mentionedUser =
486
+ matchedEntity?.mentionType === 'user' ? (matchedEntity as UserResponse) : undefined;
487
+ const mentionColor = matchedEntity
488
+ ? colorForMentionType(matchedEntity.mentionType)
489
+ : semantics.chatTextMention;
490
+
422
491
  const onPress = (event: GestureResponderEvent) => {
423
492
  if (!preventPress && onPressParam) {
424
493
  onPressParam({
425
494
  additionalInfo: {
426
- user: mentioned_users?.find((user: UserResponse) => userName === user.name),
495
+ mentionedEntity: matchedEntity,
496
+ user: mentionedUser,
427
497
  },
428
498
  emitter: 'textMention',
429
499
  event,
@@ -434,6 +504,10 @@ export const renderText = (params: RenderTextParams) => {
434
504
  const onLongPress = (event: GestureResponderEvent) => {
435
505
  if (!preventPress && onLongPressParam) {
436
506
  onLongPressParam({
507
+ additionalInfo: {
508
+ mentionedEntity: matchedEntity,
509
+ user: mentionedUser,
510
+ },
437
511
  emitter: 'textMention',
438
512
  event,
439
513
  });
@@ -441,7 +515,12 @@ export const renderText = (params: RenderTextParams) => {
441
515
  };
442
516
 
443
517
  return (
444
- <Text key={state.key} onLongPress={onLongPress} onPress={onPress} style={styles.mentions}>
518
+ <Text
519
+ key={state.key}
520
+ onLongPress={onLongPress}
521
+ onPress={onPress}
522
+ style={[styles.mentions, { color: mentionColor }]}
523
+ >
445
524
  {Array.isArray(node.content)
446
525
  ? node.content.reduce((acc, current) => acc + current.content, '') || ''
447
526
  : output(node.content, state)}
@@ -492,7 +571,7 @@ export const renderText = (params: RenderTextParams) => {
492
571
  // we have no react rendering support for reflinks
493
572
  reflink: { match: () => null },
494
573
  sublist: { react: listReact },
495
- ...(mentionedUsers
574
+ ...(mentionTokens
496
575
  ? {
497
576
  mentions: {
498
577
  match: mentionsMatchFunction,
@@ -507,7 +586,7 @@ export const renderText = (params: RenderTextParams) => {
507
586
 
508
587
  return (
509
588
  <Markdown
510
- key={`${JSON.stringify(mentioned_users)}-${onlyEmojis}-${
589
+ key={`${JSON.stringify(mentionEntities)}-${onlyEmojis}-${
511
590
  messageOverlay ? JSON.stringify(markdownStyles) : undefined
512
591
  }-${JSON.stringify(semantics)}`}
513
592
  onLink={onLink}
@@ -118,7 +118,7 @@ const useStyles = () => {
118
118
  shadowRadius: 12,
119
119
  },
120
120
  suggestionsListContainer: {
121
- backgroundColor: semantics.backgroundCoreElevation1,
121
+ backgroundColor: 'transparent',
122
122
  position: 'absolute',
123
123
  width: '100%',
124
124
  },
@@ -200,7 +200,6 @@ const MessageComposerWithContext = (props: MessageComposerPropsWithContext) => {
200
200
  AudioRecordingInProgress,
201
201
  AudioRecordingLockIndicator,
202
202
  AudioRecordingPreview,
203
- AutoCompleteSuggestionList,
204
203
  Input,
205
204
  InputView,
206
205
  MessageComposerLeadingView,
@@ -227,7 +226,6 @@ const MessageComposerWithContext = (props: MessageComposerPropsWithContext) => {
227
226
  inputBoxWrapper,
228
227
  inputContainer,
229
228
  inputFloatingContainer,
230
- suggestionsListContainer: { container: suggestionListContainer },
231
229
  wrapper,
232
230
  },
233
231
  },
@@ -355,7 +353,12 @@ const MessageComposerWithContext = (props: MessageComposerPropsWithContext) => {
355
353
  layout: { height: newHeight },
356
354
  },
357
355
  }) => {
358
- messageInputHeightStore.setHeight(newHeight);
356
+ messageInputHeightStore.setHeight(
357
+ newHeight -
358
+ (selectedPicker && !isKeyboardVisible
359
+ ? attachmentPickerBottomSheetHeight - bottomInset
360
+ : 0),
361
+ );
359
362
  }}
360
363
  style={
361
364
  messageInputFloating
@@ -437,11 +440,6 @@ const MessageComposerWithContext = (props: MessageComposerPropsWithContext) => {
437
440
  <MessageComposerTrailingView />
438
441
  )}
439
442
  </View>
440
- <View
441
- style={[styles.suggestionsListContainer, { bottom: height }, suggestionListContainer]}
442
- >
443
- <AutoCompleteSuggestionList />
444
- </View>
445
443
  </PortalWhileClosingView>
446
444
  </Animated.View>
447
445
 
@@ -60,6 +60,7 @@ import { MessageInputHeightState } from '../../state-store/message-input-height-
60
60
  import { primitives } from '../../theme';
61
61
  import { transitions } from '../../utils/animations/transitions';
62
62
  import { MessageWrapper } from '../Message/MessageItemView/MessageWrapper';
63
+ import { PortalWhileClosingView } from '../UIComponents/PortalWhileClosingView';
63
64
 
64
65
  type FlashListContextApi = { getRef?: () => FlashListRef<LocalMessage> | null } | undefined;
65
66
 
@@ -297,6 +298,7 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
297
298
  threadList = false,
298
299
  } = props;
299
300
  const {
301
+ AutoCompleteSuggestionList,
300
302
  EmptyStateIndicator,
301
303
  MessageListLoadingIndicator: LoadingIndicator,
302
304
  NetworkDownIndicator,
@@ -1135,6 +1137,22 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
1135
1137
  />
1136
1138
  </View>
1137
1139
  ) : null}
1140
+ <Animated.View
1141
+ layout={transitions.layout200}
1142
+ style={[
1143
+ {
1144
+ bottom: messageInputFloating ? messageInputHeight + 16 : 0,
1145
+ },
1146
+ styles.suggestionsListContainer,
1147
+ ]}
1148
+ >
1149
+ <PortalWhileClosingView
1150
+ portalHostName='overlay-suggestion-list'
1151
+ portalName='autocomplete-suggestion-list'
1152
+ >
1153
+ <AutoCompleteSuggestionList />
1154
+ </PortalWhileClosingView>
1155
+ </Animated.View>
1138
1156
  <NotificationList bottomOffset={messageInputFloating ? messageInputHeight + 16 : undefined} />
1139
1157
  </View>
1140
1158
  );
@@ -1279,6 +1297,9 @@ const useStyles = () => {
1279
1297
  scrollToBottomButtonContainer,
1280
1298
  unreadMessagesNotificationContainer,
1281
1299
  },
1300
+ messageComposer: {
1301
+ suggestionsListContainer: { container: suggestionListContainer },
1302
+ },
1282
1303
  },
1283
1304
  } = useTheme();
1284
1305
 
@@ -1287,6 +1308,12 @@ const useStyles = () => {
1287
1308
  return useMemo(
1288
1309
  () =>
1289
1310
  StyleSheet.create({
1311
+ suggestionsListContainer: {
1312
+ backgroundColor: 'transparent',
1313
+ position: 'absolute',
1314
+ width: '100%',
1315
+ ...suggestionListContainer,
1316
+ },
1290
1317
  container: {
1291
1318
  flex: 1,
1292
1319
  width: '100%',
@@ -1338,6 +1365,7 @@ const useStyles = () => {
1338
1365
  scrollToBottomButtonContainer,
1339
1366
  stickyHeaderContainer,
1340
1367
  unreadMessagesNotificationContainer,
1368
+ suggestionListContainer,
1341
1369
  ],
1342
1370
  );
1343
1371
  };