stream-chat-react-native-core 9.4.0-beta.1 → 9.4.0-beta.11

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 (483) hide show
  1. package/lib/commonjs/components/Attachment/Attachment.js +10 -5
  2. package/lib/commonjs/components/Attachment/Attachment.js.map +1 -1
  3. package/lib/commonjs/components/Attachment/Audio/AudioAttachment.js +2 -4
  4. package/lib/commonjs/components/Attachment/Audio/AudioAttachment.js.map +1 -1
  5. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js +7 -0
  6. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  7. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js +2 -0
  8. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js.map +1 -1
  9. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionItem.js +41 -55
  10. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionItem.js.map +1 -1
  11. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionList.js +27 -7
  12. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionList.js.map +1 -1
  13. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js +55 -0
  14. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js.map +1 -0
  15. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js +47 -0
  16. package/lib/commonjs/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js.map +1 -0
  17. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js +39 -0
  18. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js.map +1 -0
  19. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionItem.js +45 -0
  20. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionItem.js.map +1 -0
  21. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionRoleItem.js +33 -0
  22. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionRoleItem.js.map +1 -0
  23. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js +26 -0
  24. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js.map +1 -0
  25. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserItem.js +53 -0
  26. package/lib/commonjs/components/AutoCompleteInput/mentionItems/MentionUserItem.js.map +1 -0
  27. package/lib/commonjs/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js +38 -0
  28. package/lib/commonjs/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js.map +1 -0
  29. package/lib/commonjs/components/AutoCompleteInput/mentionItems/index.js +60 -0
  30. package/lib/commonjs/components/AutoCompleteInput/mentionItems/index.js.map +1 -0
  31. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsActionItems.js +2 -1
  32. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsActionItems.js.map +1 -1
  33. package/lib/commonjs/components/ChannelList/ChannelList.js +4 -1
  34. package/lib/commonjs/components/ChannelList/ChannelList.js.map +1 -1
  35. package/lib/commonjs/components/ChannelList/hooks/useCreateChannelsContext.js +5 -3
  36. package/lib/commonjs/components/ChannelList/hooks/useCreateChannelsContext.js.map +1 -1
  37. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +5 -3
  38. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  39. package/lib/commonjs/components/ChannelPreview/ChannelPreview.js +3 -0
  40. package/lib/commonjs/components/ChannelPreview/ChannelPreview.js.map +1 -1
  41. package/lib/commonjs/components/ChannelPreview/ChannelPreviewPinnedStatus.js +30 -0
  42. package/lib/commonjs/components/ChannelPreview/ChannelPreviewPinnedStatus.js.map +1 -0
  43. package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js +8 -3
  44. package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
  45. package/lib/commonjs/components/ChannelPreview/ChannelSwipableWrapper.js +2 -1
  46. package/lib/commonjs/components/ChannelPreview/ChannelSwipableWrapper.js.map +1 -1
  47. package/lib/commonjs/components/ChannelPreview/hooks/index.js +11 -0
  48. package/lib/commonjs/components/ChannelPreview/hooks/index.js.map +1 -1
  49. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js +3 -0
  50. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
  51. package/lib/commonjs/components/ChannelPreview/hooks/useIsChannelPinned.js +11 -0
  52. package/lib/commonjs/components/ChannelPreview/hooks/useIsChannelPinned.js.map +1 -0
  53. package/lib/commonjs/components/Message/Message.js +53 -16
  54. package/lib/commonjs/components/Message/Message.js.map +1 -1
  55. package/lib/commonjs/components/Message/MessageItemView/MessageItemView.js +6 -84
  56. package/lib/commonjs/components/Message/MessageItemView/MessageItemView.js.map +1 -1
  57. package/lib/commonjs/components/Message/MessageItemView/MessageTextContainer.js +14 -0
  58. package/lib/commonjs/components/Message/MessageItemView/MessageTextContainer.js.map +1 -1
  59. package/lib/commonjs/components/Message/MessageItemView/utils/renderText.js +69 -11
  60. package/lib/commonjs/components/Message/MessageItemView/utils/renderText.js.map +1 -1
  61. package/lib/commonjs/components/MessageInput/MessageComposer.js +13 -41
  62. package/lib/commonjs/components/MessageInput/MessageComposer.js.map +1 -1
  63. package/lib/commonjs/components/MessageList/MessageFlashList.js +22 -3
  64. package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
  65. package/lib/commonjs/components/MessageList/MessageList.js +23 -4
  66. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  67. package/lib/commonjs/components/MessageMenu/MessageActionList.js +1 -1
  68. package/lib/commonjs/components/Poll/components/CreatePollHeader.js +5 -5
  69. package/lib/commonjs/components/Poll/components/CreatePollHeader.js.map +1 -1
  70. package/lib/commonjs/components/Poll/components/PollButtons.js +25 -56
  71. package/lib/commonjs/components/Poll/components/PollButtons.js.map +1 -1
  72. package/lib/commonjs/components/Poll/components/PollInputDialog.js +9 -11
  73. package/lib/commonjs/components/Poll/components/PollInputDialog.js.map +1 -1
  74. package/lib/commonjs/components/Poll/components/PollModal.js +50 -0
  75. package/lib/commonjs/components/Poll/components/PollModal.js.map +1 -0
  76. package/lib/commonjs/components/Poll/components/PollModalHeader.js +4 -5
  77. package/lib/commonjs/components/Poll/components/PollModalHeader.js.map +1 -1
  78. package/lib/commonjs/components/Poll/components/PollResults/PollResultItem.js +10 -24
  79. package/lib/commonjs/components/Poll/components/PollResults/PollResultItem.js.map +1 -1
  80. package/lib/commonjs/components/Poll/components/index.js +11 -0
  81. package/lib/commonjs/components/Poll/components/index.js.map +1 -1
  82. package/lib/commonjs/components/UIComponents/BottomSheetModal.js +4 -17
  83. package/lib/commonjs/components/UIComponents/BottomSheetModal.js.map +1 -1
  84. package/lib/commonjs/components/UIComponents/ClippingFadeBottom.js +56 -0
  85. package/lib/commonjs/components/UIComponents/ClippingFadeBottom.js.map +1 -0
  86. package/lib/commonjs/components/UIComponents/PortalWhileClosingView.js +0 -3
  87. package/lib/commonjs/components/UIComponents/PortalWhileClosingView.js.map +1 -1
  88. package/lib/commonjs/components/UIComponents/index.js +11 -0
  89. package/lib/commonjs/components/UIComponents/index.js.map +1 -1
  90. package/lib/commonjs/components/index.js +22 -0
  91. package/lib/commonjs/components/index.js.map +1 -1
  92. package/lib/commonjs/contexts/channelsContext/ChannelsContext.js.map +1 -1
  93. package/lib/commonjs/contexts/componentsContext/defaultComponents.js +3 -0
  94. package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
  95. package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageComposer.js +2 -2
  96. package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageComposer.js.map +1 -1
  97. package/lib/commonjs/contexts/themeContext/utils/theme.js +9 -2
  98. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  99. package/lib/commonjs/hooks/actions/useChannelActionItems.js +20 -1
  100. package/lib/commonjs/hooks/actions/useChannelActionItems.js.map +1 -1
  101. package/lib/commonjs/hooks/actions/useChannelActionItemsById.js +3 -1
  102. package/lib/commonjs/hooks/actions/useChannelActionItemsById.js.map +1 -1
  103. package/lib/commonjs/i18n/ar.json +12 -1
  104. package/lib/commonjs/i18n/en.json +12 -1
  105. package/lib/commonjs/i18n/es.json +12 -1
  106. package/lib/commonjs/i18n/fr.json +12 -1
  107. package/lib/commonjs/i18n/he.json +12 -1
  108. package/lib/commonjs/i18n/hi.json +12 -1
  109. package/lib/commonjs/i18n/it.json +12 -1
  110. package/lib/commonjs/i18n/ja.json +12 -1
  111. package/lib/commonjs/i18n/ko.json +12 -1
  112. package/lib/commonjs/i18n/nl.json +12 -1
  113. package/lib/commonjs/i18n/pt-br.json +12 -1
  114. package/lib/commonjs/i18n/ru.json +12 -1
  115. package/lib/commonjs/i18n/tr.json +12 -1
  116. package/lib/commonjs/icons/index.js +12 -0
  117. package/lib/commonjs/icons/index.js.map +1 -1
  118. package/lib/commonjs/icons/megaphone.js +36 -0
  119. package/lib/commonjs/icons/megaphone.js.map +1 -0
  120. package/lib/commonjs/icons/shield.js +36 -0
  121. package/lib/commonjs/icons/shield.js.map +1 -0
  122. package/lib/commonjs/store/SqliteClient.js +1 -1
  123. package/lib/commonjs/store/mappers/mapDraftMessageToStorable.js +8 -0
  124. package/lib/commonjs/store/mappers/mapDraftMessageToStorable.js.map +1 -1
  125. package/lib/commonjs/store/mappers/mapStorableToDraftMessage.js +8 -0
  126. package/lib/commonjs/store/mappers/mapStorableToDraftMessage.js.map +1 -1
  127. package/lib/commonjs/store/schema.js +4 -0
  128. package/lib/commonjs/store/schema.js.map +1 -1
  129. package/lib/commonjs/theme/generated/dark/StreamTokens.android.js +10 -1
  130. package/lib/commonjs/theme/generated/dark/StreamTokens.android.js.map +1 -1
  131. package/lib/commonjs/theme/generated/dark/StreamTokens.ios.js +10 -1
  132. package/lib/commonjs/theme/generated/dark/StreamTokens.ios.js.map +1 -1
  133. package/lib/commonjs/theme/generated/dark/StreamTokens.web.js +10 -1
  134. package/lib/commonjs/theme/generated/dark/StreamTokens.web.js.map +1 -1
  135. package/lib/commonjs/theme/generated/light/StreamTokens.android.js +10 -1
  136. package/lib/commonjs/theme/generated/light/StreamTokens.android.js.map +1 -1
  137. package/lib/commonjs/theme/generated/light/StreamTokens.ios.js +10 -1
  138. package/lib/commonjs/theme/generated/light/StreamTokens.ios.js.map +1 -1
  139. package/lib/commonjs/theme/generated/light/StreamTokens.web.js +10 -1
  140. package/lib/commonjs/theme/generated/light/StreamTokens.web.js.map +1 -1
  141. package/lib/commonjs/version.json +1 -1
  142. package/lib/module/components/Attachment/Attachment.js +10 -5
  143. package/lib/module/components/Attachment/Attachment.js.map +1 -1
  144. package/lib/module/components/Attachment/Audio/AudioAttachment.js +2 -4
  145. package/lib/module/components/Attachment/Audio/AudioAttachment.js.map +1 -1
  146. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js +7 -0
  147. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  148. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js +2 -0
  149. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionHeader.js.map +1 -1
  150. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionItem.js +41 -55
  151. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionItem.js.map +1 -1
  152. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionList.js +27 -7
  153. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionList.js.map +1 -1
  154. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js +55 -0
  155. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.js.map +1 -0
  156. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js +47 -0
  157. package/lib/module/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.js.map +1 -0
  158. package/lib/module/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js +39 -0
  159. package/lib/module/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.js.map +1 -0
  160. package/lib/module/components/AutoCompleteInput/mentionItems/MentionItem.js +45 -0
  161. package/lib/module/components/AutoCompleteInput/mentionItems/MentionItem.js.map +1 -0
  162. package/lib/module/components/AutoCompleteInput/mentionItems/MentionRoleItem.js +33 -0
  163. package/lib/module/components/AutoCompleteInput/mentionItems/MentionRoleItem.js.map +1 -0
  164. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js +26 -0
  165. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.js.map +1 -0
  166. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserItem.js +53 -0
  167. package/lib/module/components/AutoCompleteInput/mentionItems/MentionUserItem.js.map +1 -0
  168. package/lib/module/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js +38 -0
  169. package/lib/module/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.js.map +1 -0
  170. package/lib/module/components/AutoCompleteInput/mentionItems/index.js +60 -0
  171. package/lib/module/components/AutoCompleteInput/mentionItems/index.js.map +1 -0
  172. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsActionItems.js +2 -1
  173. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsActionItems.js.map +1 -1
  174. package/lib/module/components/ChannelList/ChannelList.js +4 -1
  175. package/lib/module/components/ChannelList/ChannelList.js.map +1 -1
  176. package/lib/module/components/ChannelList/hooks/useCreateChannelsContext.js +5 -3
  177. package/lib/module/components/ChannelList/hooks/useCreateChannelsContext.js.map +1 -1
  178. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +5 -3
  179. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  180. package/lib/module/components/ChannelPreview/ChannelPreview.js +3 -0
  181. package/lib/module/components/ChannelPreview/ChannelPreview.js.map +1 -1
  182. package/lib/module/components/ChannelPreview/ChannelPreviewPinnedStatus.js +30 -0
  183. package/lib/module/components/ChannelPreview/ChannelPreviewPinnedStatus.js.map +1 -0
  184. package/lib/module/components/ChannelPreview/ChannelPreviewView.js +8 -3
  185. package/lib/module/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
  186. package/lib/module/components/ChannelPreview/ChannelSwipableWrapper.js +2 -1
  187. package/lib/module/components/ChannelPreview/ChannelSwipableWrapper.js.map +1 -1
  188. package/lib/module/components/ChannelPreview/hooks/index.js +11 -0
  189. package/lib/module/components/ChannelPreview/hooks/index.js.map +1 -1
  190. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js +3 -0
  191. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
  192. package/lib/module/components/ChannelPreview/hooks/useIsChannelPinned.js +11 -0
  193. package/lib/module/components/ChannelPreview/hooks/useIsChannelPinned.js.map +1 -0
  194. package/lib/module/components/Message/Message.js +53 -16
  195. package/lib/module/components/Message/Message.js.map +1 -1
  196. package/lib/module/components/Message/MessageItemView/MessageItemView.js +6 -84
  197. package/lib/module/components/Message/MessageItemView/MessageItemView.js.map +1 -1
  198. package/lib/module/components/Message/MessageItemView/MessageTextContainer.js +14 -0
  199. package/lib/module/components/Message/MessageItemView/MessageTextContainer.js.map +1 -1
  200. package/lib/module/components/Message/MessageItemView/utils/renderText.js +69 -11
  201. package/lib/module/components/Message/MessageItemView/utils/renderText.js.map +1 -1
  202. package/lib/module/components/MessageInput/MessageComposer.js +13 -41
  203. package/lib/module/components/MessageInput/MessageComposer.js.map +1 -1
  204. package/lib/module/components/MessageList/MessageFlashList.js +22 -3
  205. package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
  206. package/lib/module/components/MessageList/MessageList.js +23 -4
  207. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  208. package/lib/module/components/MessageMenu/MessageActionList.js +1 -1
  209. package/lib/module/components/Poll/components/CreatePollHeader.js +5 -5
  210. package/lib/module/components/Poll/components/CreatePollHeader.js.map +1 -1
  211. package/lib/module/components/Poll/components/PollButtons.js +25 -56
  212. package/lib/module/components/Poll/components/PollButtons.js.map +1 -1
  213. package/lib/module/components/Poll/components/PollInputDialog.js +9 -11
  214. package/lib/module/components/Poll/components/PollInputDialog.js.map +1 -1
  215. package/lib/module/components/Poll/components/PollModal.js +50 -0
  216. package/lib/module/components/Poll/components/PollModal.js.map +1 -0
  217. package/lib/module/components/Poll/components/PollModalHeader.js +4 -5
  218. package/lib/module/components/Poll/components/PollModalHeader.js.map +1 -1
  219. package/lib/module/components/Poll/components/PollResults/PollResultItem.js +10 -24
  220. package/lib/module/components/Poll/components/PollResults/PollResultItem.js.map +1 -1
  221. package/lib/module/components/Poll/components/index.js +11 -0
  222. package/lib/module/components/Poll/components/index.js.map +1 -1
  223. package/lib/module/components/UIComponents/BottomSheetModal.js +4 -17
  224. package/lib/module/components/UIComponents/BottomSheetModal.js.map +1 -1
  225. package/lib/module/components/UIComponents/ClippingFadeBottom.js +56 -0
  226. package/lib/module/components/UIComponents/ClippingFadeBottom.js.map +1 -0
  227. package/lib/module/components/UIComponents/PortalWhileClosingView.js +0 -3
  228. package/lib/module/components/UIComponents/PortalWhileClosingView.js.map +1 -1
  229. package/lib/module/components/UIComponents/index.js +11 -0
  230. package/lib/module/components/UIComponents/index.js.map +1 -1
  231. package/lib/module/components/index.js +22 -0
  232. package/lib/module/components/index.js.map +1 -1
  233. package/lib/module/contexts/channelsContext/ChannelsContext.js.map +1 -1
  234. package/lib/module/contexts/componentsContext/defaultComponents.js +3 -0
  235. package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
  236. package/lib/module/contexts/messageInputContext/hooks/useCreateMessageComposer.js +2 -2
  237. package/lib/module/contexts/messageInputContext/hooks/useCreateMessageComposer.js.map +1 -1
  238. package/lib/module/contexts/themeContext/utils/theme.js +9 -2
  239. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  240. package/lib/module/hooks/actions/useChannelActionItems.js +20 -1
  241. package/lib/module/hooks/actions/useChannelActionItems.js.map +1 -1
  242. package/lib/module/hooks/actions/useChannelActionItemsById.js +3 -1
  243. package/lib/module/hooks/actions/useChannelActionItemsById.js.map +1 -1
  244. package/lib/module/i18n/ar.json +12 -1
  245. package/lib/module/i18n/en.json +12 -1
  246. package/lib/module/i18n/es.json +12 -1
  247. package/lib/module/i18n/fr.json +12 -1
  248. package/lib/module/i18n/he.json +12 -1
  249. package/lib/module/i18n/hi.json +12 -1
  250. package/lib/module/i18n/it.json +12 -1
  251. package/lib/module/i18n/ja.json +12 -1
  252. package/lib/module/i18n/ko.json +12 -1
  253. package/lib/module/i18n/nl.json +12 -1
  254. package/lib/module/i18n/pt-br.json +12 -1
  255. package/lib/module/i18n/ru.json +12 -1
  256. package/lib/module/i18n/tr.json +12 -1
  257. package/lib/module/icons/index.js +12 -0
  258. package/lib/module/icons/index.js.map +1 -1
  259. package/lib/module/icons/megaphone.js +36 -0
  260. package/lib/module/icons/megaphone.js.map +1 -0
  261. package/lib/module/icons/shield.js +36 -0
  262. package/lib/module/icons/shield.js.map +1 -0
  263. package/lib/module/store/SqliteClient.js +1 -1
  264. package/lib/module/store/mappers/mapDraftMessageToStorable.js +8 -0
  265. package/lib/module/store/mappers/mapDraftMessageToStorable.js.map +1 -1
  266. package/lib/module/store/mappers/mapStorableToDraftMessage.js +8 -0
  267. package/lib/module/store/mappers/mapStorableToDraftMessage.js.map +1 -1
  268. package/lib/module/store/schema.js +4 -0
  269. package/lib/module/store/schema.js.map +1 -1
  270. package/lib/module/theme/generated/dark/StreamTokens.android.js +10 -1
  271. package/lib/module/theme/generated/dark/StreamTokens.android.js.map +1 -1
  272. package/lib/module/theme/generated/dark/StreamTokens.ios.js +10 -1
  273. package/lib/module/theme/generated/dark/StreamTokens.ios.js.map +1 -1
  274. package/lib/module/theme/generated/dark/StreamTokens.web.js +10 -1
  275. package/lib/module/theme/generated/dark/StreamTokens.web.js.map +1 -1
  276. package/lib/module/theme/generated/light/StreamTokens.android.js +10 -1
  277. package/lib/module/theme/generated/light/StreamTokens.android.js.map +1 -1
  278. package/lib/module/theme/generated/light/StreamTokens.ios.js +10 -1
  279. package/lib/module/theme/generated/light/StreamTokens.ios.js.map +1 -1
  280. package/lib/module/theme/generated/light/StreamTokens.web.js +10 -1
  281. package/lib/module/theme/generated/light/StreamTokens.web.js.map +1 -1
  282. package/lib/module/version.json +1 -1
  283. package/lib/typescript/components/Attachment/Audio/AudioAttachment.d.ts +1 -0
  284. package/lib/typescript/components/Attachment/Audio/AudioAttachment.d.ts.map +1 -1
  285. package/lib/typescript/components/AutoCompleteInput/AutoCompleteInput.d.ts.map +1 -1
  286. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionHeader.d.ts.map +1 -1
  287. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionItem.d.ts +8 -2
  288. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionItem.d.ts.map +1 -1
  289. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionList.d.ts +1 -1
  290. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionList.d.ts.map +1 -1
  291. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.d.ts +13 -0
  292. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.d.ts.map +1 -0
  293. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.d.ts +26 -0
  294. package/lib/typescript/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.d.ts.map +1 -0
  295. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.d.ts +7 -0
  296. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.d.ts.map +1 -0
  297. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionItem.d.ts +17 -0
  298. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionItem.d.ts.map +1 -0
  299. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionRoleItem.d.ts +7 -0
  300. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionRoleItem.d.ts.map +1 -0
  301. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.d.ts +7 -0
  302. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.d.ts.map +1 -0
  303. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserItem.d.ts +7 -0
  304. package/lib/typescript/components/AutoCompleteInput/mentionItems/MentionUserItem.d.ts.map +1 -0
  305. package/lib/typescript/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.d.ts +21 -0
  306. package/lib/typescript/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.d.ts.map +1 -0
  307. package/lib/typescript/components/AutoCompleteInput/mentionItems/index.d.ts +17 -0
  308. package/lib/typescript/components/AutoCompleteInput/mentionItems/index.d.ts.map +1 -0
  309. package/lib/typescript/components/ChannelList/ChannelList.d.ts +1 -1
  310. package/lib/typescript/components/ChannelList/ChannelList.d.ts.map +1 -1
  311. package/lib/typescript/components/ChannelList/hooks/useCreateChannelsContext.d.ts +1 -1
  312. package/lib/typescript/components/ChannelList/hooks/useCreateChannelsContext.d.ts.map +1 -1
  313. package/lib/typescript/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  314. package/lib/typescript/components/ChannelPreview/ChannelPreviewPinnedStatus.d.ts +6 -0
  315. package/lib/typescript/components/ChannelPreview/ChannelPreviewPinnedStatus.d.ts.map +1 -0
  316. package/lib/typescript/components/ChannelPreview/ChannelPreviewView.d.ts +3 -1
  317. package/lib/typescript/components/ChannelPreview/ChannelPreviewView.d.ts.map +1 -1
  318. package/lib/typescript/components/ChannelPreview/ChannelSwipableWrapper.d.ts.map +1 -1
  319. package/lib/typescript/components/ChannelPreview/hooks/index.d.ts +1 -0
  320. package/lib/typescript/components/ChannelPreview/hooks/index.d.ts.map +1 -1
  321. package/lib/typescript/components/ChannelPreview/hooks/useChannelPreviewData.d.ts +1 -0
  322. package/lib/typescript/components/ChannelPreview/hooks/useChannelPreviewData.d.ts.map +1 -1
  323. package/lib/typescript/components/ChannelPreview/hooks/useIsChannelPinned.d.ts +3 -0
  324. package/lib/typescript/components/ChannelPreview/hooks/useIsChannelPinned.d.ts.map +1 -0
  325. package/lib/typescript/components/Message/Message.d.ts +11 -1
  326. package/lib/typescript/components/Message/Message.d.ts.map +1 -1
  327. package/lib/typescript/components/Message/MessageItemView/MessageItemView.d.ts.map +1 -1
  328. package/lib/typescript/components/Message/MessageItemView/MessageTextContainer.d.ts.map +1 -1
  329. package/lib/typescript/components/Message/MessageItemView/utils/renderText.d.ts.map +1 -1
  330. package/lib/typescript/components/MessageInput/MessageComposer.d.ts.map +1 -1
  331. package/lib/typescript/components/MessageList/MessageFlashList.d.ts.map +1 -1
  332. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  333. package/lib/typescript/components/Poll/components/CreatePollHeader.d.ts.map +1 -1
  334. package/lib/typescript/components/Poll/components/PollButtons.d.ts.map +1 -1
  335. package/lib/typescript/components/Poll/components/PollModal.d.ts +9 -0
  336. package/lib/typescript/components/Poll/components/PollModal.d.ts.map +1 -0
  337. package/lib/typescript/components/Poll/components/PollResults/PollResultItem.d.ts.map +1 -1
  338. package/lib/typescript/components/Poll/components/index.d.ts +1 -0
  339. package/lib/typescript/components/Poll/components/index.d.ts.map +1 -1
  340. package/lib/typescript/components/UIComponents/BottomSheetModal.d.ts.map +1 -1
  341. package/lib/typescript/components/UIComponents/ClippingFadeBottom.d.ts +18 -0
  342. package/lib/typescript/components/UIComponents/ClippingFadeBottom.d.ts.map +1 -0
  343. package/lib/typescript/components/UIComponents/index.d.ts +1 -0
  344. package/lib/typescript/components/UIComponents/index.d.ts.map +1 -1
  345. package/lib/typescript/components/index.d.ts +2 -0
  346. package/lib/typescript/components/index.d.ts.map +1 -1
  347. package/lib/typescript/contexts/channelsContext/ChannelsContext.d.ts +1 -0
  348. package/lib/typescript/contexts/channelsContext/ChannelsContext.d.ts.map +1 -1
  349. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +2 -0
  350. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
  351. package/lib/typescript/contexts/messageInputContext/hooks/useCreateMessageComposer.d.ts.map +1 -1
  352. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +7 -0
  353. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
  354. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +7 -0
  355. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  356. package/lib/typescript/hooks/actions/useChannelActionItems.d.ts +35 -2
  357. package/lib/typescript/hooks/actions/useChannelActionItems.d.ts.map +1 -1
  358. package/lib/typescript/hooks/actions/useChannelActionItemsById.d.ts +3 -2
  359. package/lib/typescript/hooks/actions/useChannelActionItemsById.d.ts.map +1 -1
  360. package/lib/typescript/i18n/ar.json +12 -1
  361. package/lib/typescript/i18n/en.json +12 -1
  362. package/lib/typescript/i18n/es.json +12 -1
  363. package/lib/typescript/i18n/fr.json +12 -1
  364. package/lib/typescript/i18n/he.json +12 -1
  365. package/lib/typescript/i18n/hi.json +12 -1
  366. package/lib/typescript/i18n/it.json +12 -1
  367. package/lib/typescript/i18n/ja.json +12 -1
  368. package/lib/typescript/i18n/ko.json +12 -1
  369. package/lib/typescript/i18n/nl.json +12 -1
  370. package/lib/typescript/i18n/pt-br.json +12 -1
  371. package/lib/typescript/i18n/ru.json +12 -1
  372. package/lib/typescript/i18n/tr.json +12 -1
  373. package/lib/typescript/icons/index.d.ts +1 -0
  374. package/lib/typescript/icons/index.d.ts.map +1 -1
  375. package/lib/typescript/icons/megaphone.d.ts +4 -0
  376. package/lib/typescript/icons/megaphone.d.ts.map +1 -0
  377. package/lib/typescript/icons/shield.d.ts +4 -0
  378. package/lib/typescript/icons/shield.d.ts.map +1 -0
  379. package/lib/typescript/store/mappers/mapDraftMessageToStorable.d.ts.map +1 -1
  380. package/lib/typescript/store/mappers/mapStorableToDraftMessage.d.ts.map +1 -1
  381. package/lib/typescript/store/schema.d.ts +4 -0
  382. package/lib/typescript/store/schema.d.ts.map +1 -1
  383. package/lib/typescript/theme/generated/StreamTokens.types.d.ts +9 -0
  384. package/lib/typescript/theme/generated/StreamTokens.types.d.ts.map +1 -1
  385. package/lib/typescript/theme/generated/dark/StreamTokens.android.d.ts.map +1 -1
  386. package/lib/typescript/theme/generated/dark/StreamTokens.ios.d.ts.map +1 -1
  387. package/lib/typescript/theme/generated/dark/StreamTokens.web.d.ts.map +1 -1
  388. package/lib/typescript/theme/generated/light/StreamTokens.android.d.ts.map +1 -1
  389. package/lib/typescript/theme/generated/light/StreamTokens.ios.d.ts.map +1 -1
  390. package/lib/typescript/theme/generated/light/StreamTokens.web.d.ts.map +1 -1
  391. package/lib/typescript/utils/i18n/Streami18n.d.ts +11 -0
  392. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  393. package/package.json +2 -2
  394. package/src/components/Attachment/Attachment.tsx +15 -6
  395. package/src/components/Attachment/Audio/AudioAttachment.tsx +3 -4
  396. package/src/components/AutoCompleteInput/AutoCompleteInput.tsx +13 -0
  397. package/src/components/AutoCompleteInput/AutoCompleteSuggestionHeader.tsx +2 -1
  398. package/src/components/AutoCompleteInput/AutoCompleteSuggestionItem.tsx +35 -43
  399. package/src/components/AutoCompleteInput/AutoCompleteSuggestionList.tsx +28 -3
  400. package/src/components/AutoCompleteInput/mentionItems/EnhancedMentionContent.tsx +71 -0
  401. package/src/components/AutoCompleteInput/mentionItems/EnhancedMentionIcon.tsx +71 -0
  402. package/src/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.tsx +36 -0
  403. package/src/components/AutoCompleteInput/mentionItems/MentionItem.tsx +59 -0
  404. package/src/components/AutoCompleteInput/mentionItems/MentionRoleItem.tsx +27 -0
  405. package/src/components/AutoCompleteInput/mentionItems/MentionUserGroupItem.tsx +23 -0
  406. package/src/components/AutoCompleteInput/mentionItems/MentionUserItem.tsx +55 -0
  407. package/src/components/AutoCompleteInput/mentionItems/TokenizedSuggestionParts.tsx +56 -0
  408. package/src/components/AutoCompleteInput/mentionItems/__tests__/MentionItems.test.tsx +129 -0
  409. package/src/components/AutoCompleteInput/mentionItems/__tests__/TokenizedSuggestionParts.test.tsx +63 -0
  410. package/src/components/AutoCompleteInput/mentionItems/index.ts +16 -0
  411. package/src/components/ChannelDetails/__tests__/useChannelDetailsActionItems.test.tsx +6 -2
  412. package/src/components/ChannelDetails/hooks/useChannelDetailsActionItems.ts +1 -1
  413. package/src/components/ChannelList/ChannelList.tsx +3 -0
  414. package/src/components/ChannelList/hooks/useCreateChannelsContext.ts +3 -0
  415. package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +3 -2
  416. package/src/components/ChannelPreview/ChannelPreview.tsx +21 -3
  417. package/src/components/ChannelPreview/ChannelPreviewPinnedStatus.tsx +25 -0
  418. package/src/components/ChannelPreview/ChannelPreviewView.tsx +18 -2
  419. package/src/components/ChannelPreview/ChannelSwipableWrapper.tsx +5 -1
  420. package/src/components/ChannelPreview/hooks/__tests__/useIsChannelPinned.test.tsx +35 -0
  421. package/src/components/ChannelPreview/hooks/index.ts +1 -0
  422. package/src/components/ChannelPreview/hooks/useChannelPreviewData.ts +3 -1
  423. package/src/components/ChannelPreview/hooks/useIsChannelPinned.ts +8 -0
  424. package/src/components/Message/Message.tsx +82 -24
  425. package/src/components/Message/MessageItemView/MessageItemView.tsx +5 -116
  426. package/src/components/Message/MessageItemView/MessageTextContainer.tsx +25 -0
  427. package/src/components/Message/MessageItemView/__tests__/MessageItemView.test.tsx +22 -13
  428. package/src/components/Message/MessageItemView/utils/renderText.tsx +97 -18
  429. package/src/components/MessageInput/MessageComposer.tsx +16 -39
  430. package/src/components/MessageList/MessageFlashList.tsx +28 -0
  431. package/src/components/MessageList/MessageList.tsx +28 -0
  432. package/src/components/MessageMenu/MessageActionList.tsx +1 -1
  433. package/src/components/Poll/components/CreatePollHeader.tsx +12 -5
  434. package/src/components/Poll/components/PollButtons.tsx +14 -38
  435. package/src/components/Poll/components/PollInputDialog.tsx +12 -12
  436. package/src/components/Poll/components/PollModal.tsx +55 -0
  437. package/src/components/Poll/components/PollModalHeader.tsx +4 -5
  438. package/src/components/Poll/components/PollResults/PollResultItem.tsx +6 -18
  439. package/src/components/Poll/components/__tests__/CreatePollHeader.test.tsx +4 -36
  440. package/src/components/Poll/components/__tests__/PollModalHeader.test.tsx +8 -45
  441. package/src/components/Poll/components/index.ts +1 -0
  442. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +29 -20
  443. package/src/components/UIComponents/BottomSheetModal.tsx +2 -17
  444. package/src/components/UIComponents/ClippingFadeBottom.tsx +47 -0
  445. package/src/components/UIComponents/PortalWhileClosingView.tsx +0 -4
  446. package/src/components/UIComponents/index.ts +1 -0
  447. package/src/components/index.ts +2 -0
  448. package/src/contexts/channelsContext/ChannelsContext.tsx +1 -0
  449. package/src/contexts/componentsContext/defaultComponents.ts +7 -1
  450. package/src/contexts/messageInputContext/hooks/useCreateMessageComposer.ts +10 -4
  451. package/src/contexts/themeContext/utils/theme.ts +14 -0
  452. package/src/hooks/actions/__tests__/useChannelActionItems.test.tsx +137 -14
  453. package/src/hooks/actions/__tests__/useChannelActionItemsById.test.tsx +3 -1
  454. package/src/hooks/actions/useChannelActionItems.tsx +60 -2
  455. package/src/hooks/actions/useChannelActionItemsById.ts +8 -1
  456. package/src/i18n/ar.json +12 -1
  457. package/src/i18n/en.json +12 -1
  458. package/src/i18n/es.json +12 -1
  459. package/src/i18n/fr.json +12 -1
  460. package/src/i18n/he.json +12 -1
  461. package/src/i18n/hi.json +12 -1
  462. package/src/i18n/it.json +12 -1
  463. package/src/i18n/ja.json +12 -1
  464. package/src/i18n/ko.json +12 -1
  465. package/src/i18n/nl.json +12 -1
  466. package/src/i18n/pt-br.json +12 -1
  467. package/src/i18n/ru.json +12 -1
  468. package/src/i18n/tr.json +12 -1
  469. package/src/icons/index.ts +1 -0
  470. package/src/icons/megaphone.tsx +21 -0
  471. package/src/icons/shield.tsx +21 -0
  472. package/src/store/SqliteClient.ts +1 -1
  473. package/src/store/mappers/mapDraftMessageToStorable.ts +8 -0
  474. package/src/store/mappers/mapStorableToDraftMessage.ts +8 -0
  475. package/src/store/schema.ts +8 -0
  476. package/src/theme/generated/StreamTokens.types.ts +9 -0
  477. package/src/theme/generated/dark/StreamTokens.android.ts +10 -1
  478. package/src/theme/generated/dark/StreamTokens.ios.ts +10 -1
  479. package/src/theme/generated/dark/StreamTokens.web.ts +10 -1
  480. package/src/theme/generated/light/StreamTokens.android.ts +10 -1
  481. package/src/theme/generated/light/StreamTokens.ios.ts +10 -1
  482. package/src/theme/generated/light/StreamTokens.web.ts +10 -1
  483. package/src/version.json +1 -1
@@ -23,6 +23,7 @@ export const useCreateChannelsContext = ({
23
23
  reloadList,
24
24
  setFlatListRef,
25
25
  mutedStatusPosition,
26
+ pinnedStatusPosition,
26
27
  }: ChannelsContextValue) => {
27
28
  const channelValueString = channels
28
29
  ?.map(
@@ -56,6 +57,7 @@ export const useCreateChannelsContext = ({
56
57
  reloadList,
57
58
  setFlatListRef,
58
59
  mutedStatusPosition,
60
+ pinnedStatusPosition,
59
61
  }),
60
62
  // eslint-disable-next-line react-hooks/exhaustive-deps
61
63
  [
@@ -69,6 +71,7 @@ export const useCreateChannelsContext = ({
69
71
  swipeActionsEnabled,
70
72
  refreshing,
71
73
  mutedStatusPosition,
74
+ pinnedStatusPosition,
72
75
  ],
73
76
  );
74
77
 
@@ -107,7 +107,7 @@ const useStyles = () => {
107
107
  theme: {
108
108
  semantics,
109
109
  channelPreview: {
110
- messageDeliveryStatus: { container, text },
110
+ messageDeliveryStatus: { container, text, username },
111
111
  },
112
112
  },
113
113
  } = useTheme();
@@ -132,7 +132,8 @@ const useStyles = () => {
132
132
  fontSize: primitives.typographyFontSizeSm,
133
133
  fontWeight: primitives.typographyFontWeightSemiBold,
134
134
  lineHeight: primitives.typographyLineHeightNormal,
135
+ ...username,
135
136
  },
136
137
  });
137
- }, [semantics, text, container]);
138
+ }, [semantics, text, username, container]);
138
139
  };
@@ -30,19 +30,37 @@ export const ChannelPreview = (props: ChannelPreviewProps) => {
30
30
 
31
31
  const client = propClient || contextClient;
32
32
 
33
- const { muted, unread, lastMessage } = useChannelPreviewData(channel, client, propForceUpdate);
33
+ const { muted, pinned, unread, lastMessage } = useChannelPreviewData(
34
+ channel,
35
+ client,
36
+ propForceUpdate,
37
+ );
34
38
 
35
39
  const translatedLastMessage = useTranslatedMessage(lastMessage);
36
40
 
37
41
  const message = translatedLastMessage ? translatedLastMessage : lastMessage;
38
42
 
39
43
  if (!swipeActionsEnabled) {
40
- return <ChannelPreview channel={channel} muted={muted} unread={unread} lastMessage={message} />;
44
+ return (
45
+ <ChannelPreview
46
+ channel={channel}
47
+ muted={muted}
48
+ pinned={pinned}
49
+ unread={unread}
50
+ lastMessage={message}
51
+ />
52
+ );
41
53
  }
42
54
 
43
55
  return (
44
56
  <ChannelSwipableWrapper channel={channel} getChannelActionItems={getChannelActionItems}>
45
- <ChannelPreview channel={channel} muted={muted} unread={unread} lastMessage={message} />
57
+ <ChannelPreview
58
+ channel={channel}
59
+ muted={muted}
60
+ pinned={pinned}
61
+ unread={unread}
62
+ lastMessage={message}
63
+ />
46
64
  </ChannelSwipableWrapper>
47
65
  );
48
66
  };
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+
3
+ import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
4
+ import { useTheme } from '../../contexts/themeContext/ThemeContext';
5
+ import { Pin } from '../../icons';
6
+ import { CompositeAccessibilityProbe } from '../Accessibility/CompositeAccessibilityProbe';
7
+
8
+ /**
9
+ * This UI component displays a pinned indicator for a particular channel.
10
+ */
11
+ export const ChannelPreviewPinnedStatus = () => {
12
+ const {
13
+ theme: {
14
+ channelPreview: { pinnedStatus },
15
+ semantics,
16
+ },
17
+ } = useTheme();
18
+ const accessibilityLabel = useA11yLabel('a11y/Pinned');
19
+
20
+ return (
21
+ <CompositeAccessibilityProbe label={accessibilityLabel}>
22
+ <Pin height={20} stroke={semantics.textTertiary} width={20} {...pinnedStatus} />
23
+ </CompositeAccessibilityProbe>
24
+ );
25
+ };
@@ -17,7 +17,10 @@ import { useStableCallback } from '../../hooks';
17
17
  import { primitives } from '../../theme';
18
18
 
19
19
  export type ChannelPreviewViewPropsWithContext = Pick<ChannelPreviewProps, 'channel'> &
20
- Pick<ChannelsContextValue, 'maxUnreadCount' | 'onSelect' | 'mutedStatusPosition'> & {
20
+ Pick<
21
+ ChannelsContextValue,
22
+ 'maxUnreadCount' | 'onSelect' | 'mutedStatusPosition' | 'pinnedStatusPosition'
23
+ > & {
21
24
  /**
22
25
  * Formatter function for date of latest message.
23
26
  * @param date Message date
@@ -30,6 +33,8 @@ export type ChannelPreviewViewPropsWithContext = Pick<ChannelPreviewProps, 'chan
30
33
  formatLatestMessageDate?: (date: Date) => string;
31
34
  /** If the channel is muted. */
32
35
  muted?: boolean;
36
+ /** If the channel is pinned for the current user. */
37
+ pinned?: boolean;
33
38
  /** Number of unread messages on the channel */
34
39
  unread?: number;
35
40
  lastMessage?: LastMessageType;
@@ -42,14 +47,17 @@ const ChannelPreviewViewWithContext = (props: ChannelPreviewViewPropsWithContext
42
47
  maxUnreadCount,
43
48
  muted,
44
49
  onSelect,
50
+ pinned,
45
51
  unread,
46
52
  mutedStatusPosition,
53
+ pinnedStatusPosition,
47
54
  lastMessage,
48
55
  } = props;
49
56
  const {
50
57
  ChannelPreviewAvatar,
51
58
  ChannelPreviewMessage,
52
59
  ChannelPreviewMutedStatus,
60
+ ChannelPreviewPinnedStatus,
53
61
  ChannelPreviewStatus,
54
62
  ChannelPreviewTitle,
55
63
  ChannelPreviewUnreadCount,
@@ -111,6 +119,9 @@ const ChannelPreviewViewWithContext = (props: ChannelPreviewViewPropsWithContext
111
119
  {muted && mutedStatusPosition === 'inlineTitle' ? (
112
120
  <ChannelPreviewMutedStatus />
113
121
  ) : null}
122
+ {pinned && pinnedStatusPosition === 'inlineTitle' ? (
123
+ <ChannelPreviewPinnedStatus />
124
+ ) : null}
114
125
  </View>
115
126
 
116
127
  <View style={[styles.statusContainer, statusContainer]}>
@@ -132,6 +143,9 @@ const ChannelPreviewViewWithContext = (props: ChannelPreviewViewPropsWithContext
132
143
  {muted && mutedStatusPosition === 'trailingBottom' ? (
133
144
  <ChannelPreviewMutedStatus />
134
145
  ) : null}
146
+ {pinned && pinnedStatusPosition === 'trailingBottom' ? (
147
+ <ChannelPreviewPinnedStatus />
148
+ ) : null}
135
149
  </View>
136
150
  </View>
137
151
  </Pressable>
@@ -151,7 +165,8 @@ const MemoizedChannelPreviewViewWithContext = React.memo(
151
165
  * from the ChannelPreview component.
152
166
  */
153
167
  export const ChannelPreviewView = (props: ChannelPreviewViewProps) => {
154
- const { forceUpdate, maxUnreadCount, onSelect, mutedStatusPosition } = useChannelsContext();
168
+ const { forceUpdate, maxUnreadCount, onSelect, mutedStatusPosition, pinnedStatusPosition } =
169
+ useChannelsContext();
155
170
  return (
156
171
  <MemoizedChannelPreviewViewWithContext
157
172
  {...{
@@ -159,6 +174,7 @@ export const ChannelPreviewView = (props: ChannelPreviewViewProps) => {
159
174
  maxUnreadCount,
160
175
  onSelect,
161
176
  mutedStatusPosition,
177
+ pinnedStatusPosition,
162
178
  }}
163
179
  {...props}
164
180
  />
@@ -41,7 +41,11 @@ export const ChannelSwipableWrapper = ({
41
41
  }>) => {
42
42
  const { ChannelDetailsBottomSheet: ChannelDetailsBottomSheetComponent } = useComponentsContext();
43
43
  const [channelDetailSheetOpen, setChannelDetailSheetOpen] = useState(false);
44
- const channelActionItems = useChannelActionItems({ channel, getChannelActionItems });
44
+ const channelActionItems = useChannelActionItems({
45
+ channel,
46
+ getChannelActionItems,
47
+ surface: 'list',
48
+ });
45
49
  const sheetItems = useMemo(
46
50
  () => channelActionItems.filter((item) => item.placement !== 'swipe'),
47
51
  [channelActionItems],
@@ -0,0 +1,35 @@
1
+ import { renderHook } from '@testing-library/react-native';
2
+ import { Channel } from 'stream-chat';
3
+
4
+ import { useIsChannelPinned } from '../useIsChannelPinned';
5
+
6
+ describe('useIsChannelPinned', () => {
7
+ afterEach(() => {
8
+ jest.clearAllMocks();
9
+ });
10
+
11
+ const buildMockChannel = (membership: Record<string, unknown> = {}) =>
12
+ ({
13
+ initialized: true,
14
+ on: jest.fn().mockReturnValue({ unsubscribe: jest.fn() }),
15
+ state: { membership },
16
+ }) as unknown as Channel;
17
+
18
+ it('returns false when membership has no pinned_at', () => {
19
+ const channel = buildMockChannel({ pinned_at: null });
20
+ const { result } = renderHook(() => useIsChannelPinned(channel));
21
+ expect(result.current).toBe(false);
22
+ });
23
+
24
+ it('returns true when membership has a pinned_at timestamp', () => {
25
+ const channel = buildMockChannel({ pinned_at: '2026-06-15T08:00:00.000Z' });
26
+ const { result } = renderHook(() => useIsChannelPinned(channel));
27
+ expect(result.current).toBe(true);
28
+ });
29
+
30
+ it('subscribes to member.updated events', () => {
31
+ const channel = buildMockChannel({ pinned_at: null });
32
+ renderHook(() => useIsChannelPinned(channel));
33
+ expect(channel.on).toHaveBeenCalledWith('member.updated', expect.any(Function));
34
+ });
35
+ });
@@ -4,4 +4,5 @@ export * from './useChannelPreviewPollLabel';
4
4
  export * from './useChannelPreviewDisplayName';
5
5
  export * from './useChannelPreviewDisplayPresence';
6
6
  export * from './useIsChannelMuted';
7
+ export * from './useIsChannelPinned';
7
8
  export * from './useChannelTypingState';
@@ -4,6 +4,7 @@ import throttle from 'lodash/throttle';
4
4
  import type { Channel, Event, LocalMessage, MessageResponse, StreamChat } from 'stream-chat';
5
5
 
6
6
  import { useIsChannelMuted } from './useIsChannelMuted';
7
+ import { useIsChannelPinned } from './useIsChannelPinned';
7
8
 
8
9
  import { useChannelsContext } from '../../../contexts';
9
10
  import { useStableCallback } from '../../../hooks';
@@ -39,6 +40,7 @@ export const useChannelPreviewData = (
39
40
  );
40
41
  const [unread, setUnread] = useState(channel.countUnread());
41
42
  const { muted } = useIsChannelMuted(channel);
43
+ const pinned = useIsChannelPinned(channel);
42
44
  const { forceUpdate: contextForceUpdate } = useChannelsContext();
43
45
  const channelListForceUpdate = forceUpdateOverride ?? contextForceUpdate;
44
46
 
@@ -170,5 +172,5 @@ export const useChannelPreviewData = (
170
172
  return () => listeners.forEach((l) => l.unsubscribe());
171
173
  }, [channel, refreshUnreadCount, forceUpdate, channelListForceUpdate, setLastMessage]);
172
174
 
173
- return { lastMessage, muted, unread };
175
+ return { lastMessage, muted, pinned, unread };
174
176
  };
@@ -0,0 +1,8 @@
1
+ import type { Channel } from 'stream-chat';
2
+
3
+ import { useChannelMembershipState } from '../../../hooks/useChannelMembershipState';
4
+
5
+ export const useIsChannelPinned = (channel: Channel) => {
6
+ const membership = useChannelMembershipState(channel);
7
+ return Boolean(membership?.pinned_at);
8
+ };
@@ -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';
@@ -67,6 +67,7 @@ import {
67
67
  setOverlayTopH,
68
68
  useIsOverlayActive,
69
69
  } from '../../state-store';
70
+ import { primitives } from '../../theme';
70
71
  import { FileTypes } from '../../types/types';
71
72
  import {
72
73
  checkMessageEquality,
@@ -93,7 +94,19 @@ export type TouchableEmitter =
93
94
  | 'messageReplies'
94
95
  | 'reactionList';
95
96
 
96
- 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
+ };
97
110
 
98
111
  export type TextMentionTouchableHandlerPayload = {
99
112
  emitter: 'textMention';
@@ -830,8 +843,20 @@ const MessageWithContext = (props: MessagePropsWithContext) => {
830
843
  }
831
844
  }, [overlayActive, message]);
832
845
 
846
+ const groupKey: 'single' | 'top' | 'middle' | 'bottom' | undefined =
847
+ groupStyles?.[0] === 'single' ||
848
+ groupStyles?.[0] === 'top' ||
849
+ groupStyles?.[0] === 'middle' ||
850
+ groupStyles?.[0] === 'bottom'
851
+ ? groupStyles[0]
852
+ : undefined;
853
+ const isVeryLastBubble =
854
+ messagesContext.enableMessageGroupingByUser &&
855
+ channel?.state.messages[channel.state.messages.length - 1]?.id === message.id;
833
856
  const styles = useStyles({
857
+ groupKey,
834
858
  highlightedMessage: (isTargetedMessage || message.pinned) && !isMessageTypeDeleted,
859
+ isVeryLastBubble,
835
860
  });
836
861
  const rect = rectRef.current;
837
862
  const overlayItemsAnchorRect = bubbleRect.current ?? rect;
@@ -1147,34 +1172,67 @@ export const Message = (props: MessageProps) => {
1147
1172
  );
1148
1173
  };
1149
1174
 
1150
- const useStyles = ({ highlightedMessage }: { highlightedMessage?: boolean }) => {
1175
+ const useStyles = ({
1176
+ groupKey,
1177
+ highlightedMessage,
1178
+ isVeryLastBubble,
1179
+ }: {
1180
+ groupKey: 'single' | 'top' | 'middle' | 'bottom' | undefined;
1181
+ highlightedMessage?: boolean;
1182
+ isVeryLastBubble: boolean;
1183
+ }) => {
1151
1184
  const {
1152
- theme: {
1153
- messageItemView: { wrapper, targetedMessageContainer, blockedMessageContainer },
1154
- screenPadding,
1155
- semantics,
1156
- },
1185
+ theme: { messageItemView, screenPadding, semantics },
1157
1186
  } = useTheme();
1187
+
1158
1188
  return useMemo(() => {
1159
- return StyleSheet.create({
1160
- wrapper: {
1161
- paddingHorizontal: screenPadding,
1162
- ...(highlightedMessage
1163
- ? { backgroundColor: semantics.backgroundCoreHighlight, ...targetedMessageContainer }
1164
- : {}),
1165
- ...wrapper,
1189
+ const groupStylesMap: Record<'single' | 'top' | 'middle' | 'bottom', ViewStyle> = {
1190
+ single: {
1191
+ paddingVertical: primitives.spacingXs,
1192
+ ...messageItemView.messageGroupedSingleStyles,
1193
+ },
1194
+ top: {
1195
+ paddingTop: primitives.spacingXs,
1196
+ paddingBottom: primitives.spacingXxs,
1197
+ ...messageItemView.messageGroupedTopStyles,
1166
1198
  },
1199
+ middle: {
1200
+ paddingBottom: primitives.spacingXxs,
1201
+ ...messageItemView.messageGroupedMiddleStyles,
1202
+ },
1203
+ bottom: {
1204
+ paddingBottom: primitives.spacingXs,
1205
+ ...messageItemView.messageGroupedBottomStyles,
1206
+ },
1207
+ };
1208
+
1209
+ let wrapper: ViewStyle = {
1210
+ paddingHorizontal: screenPadding,
1211
+ ...(highlightedMessage
1212
+ ? {
1213
+ backgroundColor: semantics.backgroundCoreHighlight,
1214
+ ...messageItemView.targetedMessageContainer,
1215
+ }
1216
+ : {}),
1217
+ ...messageItemView.wrapper,
1218
+ };
1219
+ if (groupKey) {
1220
+ wrapper = { ...wrapper, ...groupStylesMap[groupKey] };
1221
+ }
1222
+ if (isVeryLastBubble) {
1223
+ wrapper = {
1224
+ ...wrapper,
1225
+ marginBottom: primitives.spacingSm,
1226
+ ...messageItemView.lastMessageContainer,
1227
+ };
1228
+ }
1229
+
1230
+ return StyleSheet.create({
1231
+ wrapper,
1167
1232
  blockedMessageContainer: {
1168
1233
  alignItems: 'center',
1169
- ...blockedMessageContainer,
1234
+ ...messageItemView.blockedMessageContainer,
1170
1235
  },
1171
1236
  });
1172
- }, [
1173
- wrapper,
1174
- screenPadding,
1175
- highlightedMessage,
1176
- semantics,
1177
- targetedMessageContainer,
1178
- blockedMessageContainer,
1179
- ]);
1237
+ }, [messageItemView, screenPadding, semantics, highlightedMessage, groupKey, isVeryLastBubble]);
1180
1238
  };
@@ -1,5 +1,5 @@
1
1
  import React, { useMemo } from 'react';
2
- import { Dimensions, StyleSheet, View, ViewStyle } from 'react-native';
2
+ import { Dimensions, StyleSheet, View } from 'react-native';
3
3
 
4
4
  import { SwipableMessageWrapper } from './MessageBubble';
5
5
 
@@ -22,25 +22,7 @@ import { FileTypes } from '../../../types/types';
22
22
  import { checkMessageEquality, checkQuotedMessageEquality } from '../../../utils/utils';
23
23
  import { useMessageData } from '../hooks/useMessageData';
24
24
 
25
- type GroupType = 'single' | 'top' | 'middle' | 'bottom' | undefined;
26
-
27
- const useStyles = ({
28
- alignment,
29
- isVeryLastMessage,
30
- messageGroupedSingle,
31
- messageGroupedBottom,
32
- messageGroupedTop,
33
- messageGroupedMiddle,
34
- enableMessageGroupingByUser,
35
- }: {
36
- alignment: Alignment;
37
- isVeryLastMessage: boolean;
38
- messageGroupedSingle: boolean;
39
- messageGroupedBottom: boolean;
40
- messageGroupedTop: boolean;
41
- messageGroupedMiddle: boolean;
42
- enableMessageGroupingByUser: boolean;
43
- }) => {
25
+ const useStyles = ({ alignment }: { alignment: Alignment }) => {
44
26
  const {
45
27
  theme: {
46
28
  messageItemView: {
@@ -53,24 +35,11 @@ const useStyles = ({
53
35
  repliesContainer,
54
36
  leftAlignItems,
55
37
  rightAlignItems,
56
- messageGroupedSingleStyles,
57
- messageGroupedBottomStyles,
58
- messageGroupedTopStyles,
59
- messageGroupedMiddleStyles,
60
- lastMessageContainer,
61
38
  },
62
39
  },
63
40
  } = useTheme();
64
41
 
65
- const groupType: GroupType = useMemo(() => {
66
- if (messageGroupedSingle) return 'single';
67
- if (messageGroupedTop) return 'top';
68
- if (messageGroupedMiddle) return 'middle';
69
- if (messageGroupedBottom) return 'bottom';
70
- return undefined;
71
- }, [messageGroupedSingle, messageGroupedTop, messageGroupedMiddle, messageGroupedBottom]);
72
-
73
- const styles = useMemo(
42
+ return useMemo(
74
43
  () =>
75
44
  StyleSheet.create({
76
45
  baseContainer: {
@@ -129,73 +98,6 @@ const useStyles = ({
129
98
  rightAlignItems,
130
99
  ],
131
100
  );
132
-
133
- const groupStylesMap = useMemo(() => {
134
- return {
135
- single: {
136
- paddingVertical: primitives.spacingXs,
137
- ...messageGroupedSingleStyles,
138
- },
139
- top: {
140
- paddingTop: primitives.spacingXs,
141
- paddingBottom: primitives.spacingXxs,
142
- ...messageGroupedTopStyles,
143
- },
144
- middle: {
145
- paddingBottom: primitives.spacingXxs,
146
- ...messageGroupedMiddleStyles,
147
- },
148
- bottom: {
149
- paddingBottom: primitives.spacingXs,
150
- ...messageGroupedBottomStyles,
151
- },
152
- };
153
- }, [
154
- messageGroupedBottomStyles,
155
- messageGroupedMiddleStyles,
156
- messageGroupedSingleStyles,
157
- messageGroupedTopStyles,
158
- ]);
159
-
160
- const containerStyle = useMemo(() => {
161
- let results: ViewStyle = styles.baseContainer;
162
-
163
- if (groupType) {
164
- results = {
165
- ...results,
166
- ...groupStylesMap[groupType],
167
- };
168
- }
169
-
170
- if (isVeryLastMessage && enableMessageGroupingByUser) {
171
- results = {
172
- ...results,
173
- marginBottom: primitives.spacingSm,
174
- ...lastMessageContainer,
175
- };
176
- }
177
-
178
- return results;
179
- }, [
180
- styles.baseContainer,
181
- groupStylesMap,
182
- groupType,
183
- isVeryLastMessage,
184
- enableMessageGroupingByUser,
185
- lastMessageContainer,
186
- ]);
187
-
188
- return {
189
- container: containerStyle,
190
- bubbleContentContainer: styles.bubbleContentContainer,
191
- bubbleErrorContainer: styles.bubbleErrorContainer,
192
- bubbleReactionListTopContainer: styles.bubbleReactionListTopContainer,
193
- bubbleWrapper: styles.bubbleWrapper,
194
- contentContainer: styles.contentContainer,
195
- repliesContainer: styles.repliesContainer,
196
- leftAlignItems: styles.leftAlignItems,
197
- rightAlignItems: styles.rightAlignItems,
198
- };
199
101
  };
200
102
 
201
103
  export type MessageItemViewPropsWithContext = Pick<
@@ -232,7 +134,6 @@ const MessageItemViewWithContext = (props: MessageItemViewPropsWithContext) => {
232
134
  channel,
233
135
  contextMenuAnchorRef,
234
136
  customMessageSwipeAction,
235
- enableMessageGroupingByUser,
236
137
  enableSwipeToReply,
237
138
  groupStyles,
238
139
  hasAttachmentActions,
@@ -273,22 +174,10 @@ const MessageItemViewWithContext = (props: MessageItemViewPropsWithContext) => {
273
174
  isMessageReceivedOrErrorType,
274
175
  isMessageTypeDeleted,
275
176
  isVeryLastMessage,
276
- messageGroupedSingle,
277
- messageGroupedBottom,
278
- messageGroupedTop,
279
177
  messageGroupedSingleOrBottom,
280
- messageGroupedMiddle,
281
178
  } = useMessageData({});
282
179
 
283
- const styles = useStyles({
284
- alignment,
285
- isVeryLastMessage,
286
- messageGroupedSingle,
287
- messageGroupedBottom,
288
- messageGroupedTop,
289
- messageGroupedMiddle,
290
- enableMessageGroupingByUser,
291
- });
180
+ const styles = useStyles({ alignment });
292
181
 
293
182
  const groupStyle = `${alignment}_${groupStyles?.[0]?.toLowerCase?.()}`;
294
183
  const hasVisibleQuotedReply = !!message.quoted_message && !hasAttachmentActions;
@@ -324,7 +213,7 @@ const MessageItemViewWithContext = (props: MessageItemViewPropsWithContext) => {
324
213
  });
325
214
 
326
215
  const itemViewContent = (
327
- <View pointerEvents='box-none' style={styles.container} testID='message-item-view-wrapper'>
216
+ <View pointerEvents='box-none' style={styles.baseContainer} testID='message-item-view-wrapper'>
328
217
  {alignment === 'left' ? <MessageAuthor /> : null}
329
218
  {isMessageTypeDeleted ? (
330
219
  <MessageDeleted date={message.created_at} groupStyle={groupStyle} />
@@ -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