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
@@ -0,0 +1,71 @@
1
+ import React, { ReactNode, useMemo } from 'react';
2
+ import { StyleSheet, Text, View } from 'react-native';
3
+
4
+ import { useTheme } from '../../../contexts/themeContext/ThemeContext';
5
+ import { primitives } from '../../../theme';
6
+
7
+ export type EnhancedMentionContentProps = {
8
+ title: ReactNode;
9
+ subtitle?: ReactNode;
10
+ testID?: string;
11
+ };
12
+
13
+ /**
14
+ * Title + optional subtitle pair used by every non-user mention row
15
+ * (channel / here / role / user_group). Override styling via
16
+ * `theme.messageComposer.suggestions.mention.enhancedMention{Container,Title,Subtitle}`.
17
+ */
18
+ export const EnhancedMentionContent = ({
19
+ subtitle,
20
+ testID,
21
+ title,
22
+ }: EnhancedMentionContentProps) => {
23
+ const {
24
+ theme: {
25
+ semantics,
26
+ messageComposer: {
27
+ suggestions: {
28
+ mention: { enhancedMentionContainer, enhancedMentionSubtitle, enhancedMentionTitle },
29
+ },
30
+ },
31
+ },
32
+ } = useTheme();
33
+ const styles = useStyles();
34
+
35
+ return (
36
+ <View style={[styles.container, enhancedMentionContainer]}>
37
+ <Text
38
+ style={[styles.title, { color: semantics.textPrimary }, enhancedMentionTitle]}
39
+ testID={testID}
40
+ >
41
+ {title}
42
+ </Text>
43
+ {subtitle ? (
44
+ <Text
45
+ style={[styles.subtitle, { color: semantics.textSecondary }, enhancedMentionSubtitle]}
46
+ >
47
+ {subtitle}
48
+ </Text>
49
+ ) : null}
50
+ </View>
51
+ );
52
+ };
53
+
54
+ const useStyles = () =>
55
+ useMemo(
56
+ () =>
57
+ StyleSheet.create({
58
+ container: {
59
+ gap: primitives.spacingXxxs,
60
+ },
61
+ subtitle: {
62
+ fontSize: primitives.typographyFontSizeXs,
63
+ lineHeight: primitives.typographyLineHeightTight,
64
+ },
65
+ title: {
66
+ fontSize: primitives.typographyFontSizeMd,
67
+ lineHeight: primitives.typographyLineHeightNormal,
68
+ },
69
+ }),
70
+ [],
71
+ );
@@ -0,0 +1,71 @@
1
+ import React, { useMemo } from 'react';
2
+ import { StyleSheet, View } from 'react-native';
3
+
4
+ import { useTheme } from '../../../contexts/themeContext/ThemeContext';
5
+ import type { IconProps } from '../../../icons/utils/base';
6
+ import { primitives } from '../../../theme';
7
+
8
+ export type EnhancedMentionIconProps = {
9
+ /**
10
+ * Any icon component from `package/src/icons` (or a custom one matching the
11
+ * same `IconProps` shape). The wrapper standardizes size + color and wraps
12
+ * the icon in a circular chip — per-type mention items don't have to know
13
+ * about any of that.
14
+ */
15
+ Icon: React.ComponentType<IconProps>;
16
+ /**
17
+ * Icon size in px. Defaults to 16. The surrounding chip scales with this.
18
+ */
19
+ size?: IconProps['size'];
20
+ /**
21
+ * Stroke / fill color. Defaults to `semantics.textSecondary`.
22
+ */
23
+ color?: IconProps['pathFill'];
24
+ };
25
+
26
+ /**
27
+ * Universal wrapper for non-user mention-row icons. Renders the supplied
28
+ * `Icon` inside a circular chip. Override chip styling via
29
+ * `theme.messageComposer.suggestions.mention.enhancedMentionIcon`.
30
+ */
31
+ export const EnhancedMentionIcon = ({ color, Icon, size = 32 }: EnhancedMentionIconProps) => {
32
+ const {
33
+ theme: {
34
+ semantics,
35
+ messageComposer: {
36
+ suggestions: {
37
+ mention: { enhancedMentionIcon },
38
+ },
39
+ },
40
+ },
41
+ } = useTheme();
42
+ const styles = useStyles(size);
43
+
44
+ return (
45
+ <View style={[styles.chip, enhancedMentionIcon]}>
46
+ <Icon pathFill={color ?? semantics.textPrimary} size={size / 2} />
47
+ </View>
48
+ );
49
+ };
50
+
51
+ const useStyles = (chipSize: number) => {
52
+ const {
53
+ theme: { semantics },
54
+ } = useTheme();
55
+ return useMemo(
56
+ () =>
57
+ StyleSheet.create({
58
+ chip: {
59
+ alignItems: 'center',
60
+ backgroundColor: semantics.backgroundCoreSurfaceSubtle,
61
+ borderColor: semantics.borderCoreSubtle,
62
+ borderRadius: primitives.radiusMax,
63
+ borderWidth: 1,
64
+ height: chipSize,
65
+ justifyContent: 'center',
66
+ width: chipSize,
67
+ },
68
+ }),
69
+ [chipSize, semantics.backgroundCoreSurfaceSubtle, semantics.borderCoreSubtle],
70
+ );
71
+ };
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+
3
+ import type { ChannelMentionSuggestion, HereMentionSuggestion } from 'stream-chat';
4
+
5
+ import { EnhancedMentionContent } from './EnhancedMentionContent';
6
+ import { EnhancedMentionIcon } from './EnhancedMentionIcon';
7
+ import { MentionItem } from './MentionItem';
8
+
9
+ import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
10
+ import { Megaphone } from '../../../icons/megaphone';
11
+
12
+ export type MentionBroadcastItemProps = {
13
+ entity: ChannelMentionSuggestion | HereMentionSuggestion;
14
+ };
15
+
16
+ // @channel and @here are literal SDK command keywords (matching mentioned_channel
17
+ // and mentioned_here on the wire). The title is not localized; only the
18
+ // description below it is.
19
+ const TITLE = { channel: '@channel', here: '@here' } as const;
20
+ const SUBTITLE_KEY = {
21
+ channel: 'mention/Channel Description',
22
+ here: 'mention/Here Description',
23
+ } as const;
24
+
25
+ export const MentionBroadcastItem = ({ entity }: MentionBroadcastItemProps) => {
26
+ const { t } = useTranslationContext();
27
+ return (
28
+ <MentionItem leading={<EnhancedMentionIcon Icon={Megaphone} />}>
29
+ <EnhancedMentionContent
30
+ subtitle={t(SUBTITLE_KEY[entity.mentionType])}
31
+ testID='mentions-item-name'
32
+ title={TITLE[entity.mentionType]}
33
+ />
34
+ </MentionItem>
35
+ );
36
+ };
@@ -0,0 +1,59 @@
1
+ import React, { PropsWithChildren, ReactNode, useMemo } from 'react';
2
+ import { StyleSheet, View } from 'react-native';
3
+
4
+ import { useTheme } from '../../../contexts/themeContext/ThemeContext';
5
+ import { primitives } from '../../../theme';
6
+
7
+ export type MentionItemProps = PropsWithChildren<{
8
+ /**
9
+ * Leading visual rendered to the left of the row. UserAvatar for user
10
+ * mentions, an `EnhancedMentionIcon` for the rest.
11
+ */
12
+ leading?: ReactNode;
13
+ testID?: string;
14
+ }>;
15
+
16
+ /**
17
+ * Layout primitive for every mention-suggestion row: `[leading | content]`.
18
+ * The per-type content (tokenized user name, or `EnhancedMentionContent` for
19
+ * channel/here/role/user_group) is passed as children. Container and column
20
+ * styles come from `theme.messageComposer.suggestions.mention`.
21
+ */
22
+ export const MentionItem = ({ children, leading, testID }: MentionItemProps) => {
23
+ const {
24
+ theme: {
25
+ messageComposer: {
26
+ suggestions: {
27
+ mention: { column, container },
28
+ },
29
+ },
30
+ },
31
+ } = useTheme();
32
+ const styles = useStyles();
33
+
34
+ return (
35
+ <View style={[styles.container, container]} testID={testID}>
36
+ {leading}
37
+ <View style={[styles.column, column]}>{children}</View>
38
+ </View>
39
+ );
40
+ };
41
+
42
+ const useStyles = () =>
43
+ useMemo(
44
+ () =>
45
+ StyleSheet.create({
46
+ column: {
47
+ flex: 1,
48
+ justifyContent: 'space-evenly',
49
+ },
50
+ container: {
51
+ alignItems: 'center',
52
+ flexDirection: 'row',
53
+ paddingHorizontal: primitives.spacingXs,
54
+ paddingVertical: primitives.spacingXs,
55
+ gap: primitives.spacingSm,
56
+ },
57
+ }),
58
+ [],
59
+ );
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+
3
+ import type { RoleMentionSuggestion } from 'stream-chat';
4
+
5
+ import { EnhancedMentionContent } from './EnhancedMentionContent';
6
+ import { EnhancedMentionIcon } from './EnhancedMentionIcon';
7
+ import { MentionItem } from './MentionItem';
8
+
9
+ import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
10
+ import { Shield } from '../../../icons/shield';
11
+
12
+ export type MentionRoleItemProps = {
13
+ entity: RoleMentionSuggestion;
14
+ };
15
+
16
+ export const MentionRoleItem = ({ entity }: MentionRoleItemProps) => {
17
+ const { t } = useTranslationContext();
18
+ return (
19
+ <MentionItem leading={<EnhancedMentionIcon Icon={Shield} />}>
20
+ <EnhancedMentionContent
21
+ subtitle={t('Notify all {{ role }} members', { role: entity.name })}
22
+ testID='mentions-item-name'
23
+ title={`@${entity.name}`}
24
+ />
25
+ </MentionItem>
26
+ );
27
+ };
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+
3
+ import type { UserGroupMentionSuggestion } from 'stream-chat';
4
+
5
+ import { EnhancedMentionContent } from './EnhancedMentionContent';
6
+ import { EnhancedMentionIcon } from './EnhancedMentionIcon';
7
+ import { MentionItem } from './MentionItem';
8
+
9
+ import { PeopleIcon } from '../../../icons/users';
10
+
11
+ export type MentionUserGroupItemProps = {
12
+ entity: UserGroupMentionSuggestion;
13
+ };
14
+
15
+ export const MentionUserGroupItem = ({ entity }: MentionUserGroupItemProps) => (
16
+ <MentionItem leading={<EnhancedMentionIcon Icon={PeopleIcon} />}>
17
+ <EnhancedMentionContent
18
+ subtitle={entity.description}
19
+ testID='mentions-item-name'
20
+ title={`@${entity.name}`}
21
+ />
22
+ </MentionItem>
23
+ );
@@ -0,0 +1,55 @@
1
+ import React, { useMemo } from 'react';
2
+ import { View } from 'react-native';
3
+
4
+ import type { UserSuggestion } from 'stream-chat';
5
+
6
+ import { MentionItem } from './MentionItem';
7
+ import { TokenizedSuggestionParts } from './TokenizedSuggestionParts';
8
+
9
+ import { useTheme } from '../../../contexts/themeContext/ThemeContext';
10
+ import { primitives } from '../../../theme';
11
+ import { UserAvatar } from '../../ui/Avatar/UserAvatar';
12
+
13
+ export type MentionUserItemProps = {
14
+ entity: UserSuggestion;
15
+ };
16
+
17
+ export const MentionUserItem = ({ entity }: MentionUserItemProps) => {
18
+ const styles = useStyles();
19
+
20
+ return (
21
+ <MentionItem
22
+ leading={
23
+ <View importantForAccessibility='no-hide-descendants'>
24
+ <UserAvatar showOnlineIndicator={!!entity.online} size='md' user={entity} />
25
+ </View>
26
+ }
27
+ >
28
+ <TokenizedSuggestionParts
29
+ fallback={entity.name || entity.id}
30
+ matchStyle={styles.match}
31
+ style={styles.name}
32
+ testID='mentions-item-name'
33
+ tokenizedDisplayName={entity.tokenizedDisplayName}
34
+ />
35
+ </MentionItem>
36
+ );
37
+ };
38
+
39
+ const useStyles = () => {
40
+ const {
41
+ theme: { semantics },
42
+ } = useTheme();
43
+ return useMemo(
44
+ () => ({
45
+ match: { fontWeight: primitives.typographyFontWeightBold },
46
+ name: {
47
+ color: semantics.textPrimary,
48
+ fontSize: primitives.typographyFontSizeMd,
49
+ lineHeight: primitives.typographyLineHeightNormal,
50
+ paddingBottom: 2,
51
+ },
52
+ }),
53
+ [semantics.textPrimary],
54
+ );
55
+ };
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { StyleProp, Text, TextStyle } from 'react-native';
3
+
4
+ import type { TokenizationPayload } from 'stream-chat';
5
+
6
+ export type TokenizedSuggestionPartsProps = {
7
+ /**
8
+ * Token + parts payload produced by the stream-chat-js text composer search
9
+ * source. When the consumer matches against a display name the source splits
10
+ * the name into substrings around the matched token; we render each part and
11
+ * bold whichever part case-insensitively equals the token.
12
+ */
13
+ tokenizedDisplayName?: TokenizationPayload['tokenizedDisplayName'];
14
+ /**
15
+ * Fallback string rendered when the tokenized payload is absent (or empty).
16
+ */
17
+ fallback?: string;
18
+ style?: StyleProp<TextStyle>;
19
+ matchStyle?: StyleProp<TextStyle>;
20
+ testID?: string;
21
+ };
22
+
23
+ const partMatchesToken = (part: string, token: string) =>
24
+ token.length > 0 && part.toLowerCase() === token.toLowerCase();
25
+
26
+ export const TokenizedSuggestionParts = ({
27
+ fallback,
28
+ matchStyle,
29
+ style,
30
+ tokenizedDisplayName,
31
+ testID,
32
+ }: TokenizedSuggestionPartsProps) => {
33
+ if (!tokenizedDisplayName || tokenizedDisplayName.parts.length === 0) {
34
+ if (!fallback) return null;
35
+ return (
36
+ <Text style={style} testID={testID}>
37
+ {fallback}
38
+ </Text>
39
+ );
40
+ }
41
+
42
+ const { parts, token } = tokenizedDisplayName;
43
+ return (
44
+ <Text style={style} testID={testID}>
45
+ {parts.map((part, index) =>
46
+ partMatchesToken(part, token) ? (
47
+ <Text key={index} style={matchStyle}>
48
+ {part}
49
+ </Text>
50
+ ) : (
51
+ part
52
+ ),
53
+ )}
54
+ </Text>
55
+ );
56
+ };
@@ -0,0 +1,129 @@
1
+ import React from 'react';
2
+
3
+ import { cleanup, render } from '@testing-library/react-native';
4
+
5
+ // UserAvatar pulls in ComponentsContext defaults which transitively load
6
+ // stream-chat-js's CJS dist; that fails to resolve @babel/runtime when the
7
+ // SDK is consumed from a workspace symlink during tests. The avatar itself
8
+ // isn't what we assert on here, so substitute a no-op.
9
+ jest.mock('../../../ui/Avatar/UserAvatar', () => ({
10
+ UserAvatar: () => null,
11
+ }));
12
+
13
+ // Same reason — useMessageComposer (used by AutoCompleteSuggestionItem) pulls
14
+ // stream-chat-js's CJS dist at module load. The dispatcher we're testing
15
+ // doesn't use these hooks itself, so stub them.
16
+ jest.mock('../../../../contexts/messageInputContext/hooks/useMessageComposer', () => ({
17
+ useMessageComposer: () => ({ textComposer: { handleSelect: () => {} } }),
18
+ }));
19
+ jest.mock('../../../../contexts/messageInputContext/hooks/useIsCommandDisabled', () => ({
20
+ useIsCommandDisabled: () => false,
21
+ }));
22
+
23
+ import type {
24
+ ChannelMentionSuggestion,
25
+ HereMentionSuggestion,
26
+ RoleMentionSuggestion,
27
+ UserGroupMentionSuggestion,
28
+ UserSuggestion,
29
+ } from 'stream-chat';
30
+
31
+ import { ThemeProvider } from '../../../../contexts/themeContext/ThemeContext';
32
+ import { defaultTheme } from '../../../../contexts/themeContext/utils/theme';
33
+ import { MentionSuggestionItem } from '../../AutoCompleteSuggestionItem';
34
+
35
+ const wrap = (ui: React.ReactElement) =>
36
+ render(<ThemeProvider theme={defaultTheme}>{ui}</ThemeProvider>);
37
+
38
+ const userEntity: UserSuggestion = {
39
+ id: 'u1',
40
+ mentionType: 'user',
41
+ name: 'Alice',
42
+ tokenizedDisplayName: { parts: ['Alice'], token: '' },
43
+ } as unknown as UserSuggestion;
44
+
45
+ const channelEntity: ChannelMentionSuggestion = {
46
+ id: 'channel',
47
+ mentionType: 'channel',
48
+ name: 'channel',
49
+ tokenizedDisplayName: { parts: ['channel'], token: '' },
50
+ } as unknown as ChannelMentionSuggestion;
51
+
52
+ const hereEntity: HereMentionSuggestion = {
53
+ id: 'here',
54
+ mentionType: 'here',
55
+ name: 'here',
56
+ tokenizedDisplayName: { parts: ['here'], token: '' },
57
+ } as unknown as HereMentionSuggestion;
58
+
59
+ const roleEntity: RoleMentionSuggestion = {
60
+ id: 'admin',
61
+ mentionType: 'role',
62
+ name: 'admin',
63
+ tokenizedDisplayName: { parts: ['admin'], token: '' },
64
+ } as unknown as RoleMentionSuggestion;
65
+
66
+ const groupEntity: UserGroupMentionSuggestion = {
67
+ description: 'Engineering org',
68
+ id: 'eng',
69
+ memberCount: 42,
70
+ mentionType: 'user_group',
71
+ name: 'engineering',
72
+ tokenizedDisplayName: { parts: ['engineering'], token: '' },
73
+ } as unknown as UserGroupMentionSuggestion;
74
+
75
+ describe('MentionSuggestionItem', () => {
76
+ afterEach(() => {
77
+ cleanup();
78
+ });
79
+
80
+ it('renders a user row with the display name', () => {
81
+ const { getByText } = wrap(<MentionSuggestionItem {...userEntity} />);
82
+ expect(getByText('Alice')).toBeTruthy();
83
+ });
84
+
85
+ it('renders a broadcast row for @channel with description subtitle', () => {
86
+ const { getByText } = wrap(<MentionSuggestionItem {...channelEntity} />);
87
+ expect(getByText('@channel')).toBeTruthy();
88
+ expect(getByText('mention/Channel Description')).toBeTruthy();
89
+ });
90
+
91
+ it('renders a broadcast row for @here with description subtitle', () => {
92
+ const { getByText } = wrap(<MentionSuggestionItem {...hereEntity} />);
93
+ expect(getByText('@here')).toBeTruthy();
94
+ expect(getByText('mention/Here Description')).toBeTruthy();
95
+ });
96
+
97
+ it('renders a role row with the role name and the notify subtitle', () => {
98
+ const { getByText } = wrap(<MentionSuggestionItem {...roleEntity} />);
99
+ expect(getByText('@admin')).toBeTruthy();
100
+ // The test translation context echoes the i18n key; the {{ role }}
101
+ // interpolation is left as-is, which is enough to assert the right key
102
+ // was selected with the right argument.
103
+ expect(getByText(/Notify all .* members/)).toBeTruthy();
104
+ });
105
+
106
+ it('renders a user group row with name + description', () => {
107
+ const { getByText } = wrap(<MentionSuggestionItem {...groupEntity} />);
108
+ expect(getByText('@engineering')).toBeTruthy();
109
+ expect(getByText('Engineering org')).toBeTruthy();
110
+ });
111
+
112
+ it('omits the subtitle slot when a user group has no description', () => {
113
+ const { queryByText } = wrap(
114
+ <MentionSuggestionItem
115
+ {...({ ...groupEntity, description: undefined } as UserGroupMentionSuggestion)}
116
+ />,
117
+ );
118
+ expect(queryByText('Engineering org')).toBeNull();
119
+ });
120
+
121
+ it('renders nothing for an unknown mention type', () => {
122
+ const { toJSON } = wrap(
123
+ <MentionSuggestionItem
124
+ {...({ id: 'x', mentionType: 'unknown' } as unknown as ChannelMentionSuggestion)}
125
+ />,
126
+ );
127
+ expect(toJSON()).toBeNull();
128
+ });
129
+ });
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+
3
+ import { cleanup, render } from '@testing-library/react-native';
4
+
5
+ import { TokenizedSuggestionParts } from '../TokenizedSuggestionParts';
6
+
7
+ describe('TokenizedSuggestionParts', () => {
8
+ afterEach(() => {
9
+ cleanup();
10
+ });
11
+
12
+ it('renders the fallback when no tokenized payload is provided', () => {
13
+ const { getByText } = render(<TokenizedSuggestionParts fallback='Jane Doe' />);
14
+ expect(getByText('Jane Doe')).toBeTruthy();
15
+ });
16
+
17
+ it('renders nothing when neither tokenized payload nor fallback is provided', () => {
18
+ const { toJSON } = render(<TokenizedSuggestionParts />);
19
+ expect(toJSON()).toBeNull();
20
+ });
21
+
22
+ it('renders all parts when the tokenized payload is present', () => {
23
+ const { queryByText } = render(
24
+ <TokenizedSuggestionParts tokenizedDisplayName={{ parts: ['Al', 'i', 'ce'], token: 'i' }} />,
25
+ );
26
+ // The full name still reads through because RN concatenates nested Text children.
27
+ expect(queryByText('Alice')).toBeTruthy();
28
+ });
29
+
30
+ it('wraps the matched part in a separate Text node so it can be styled', () => {
31
+ const matchStyle = { fontWeight: 'bold' as const };
32
+ const { UNSAFE_root } = render(
33
+ <TokenizedSuggestionParts
34
+ matchStyle={matchStyle}
35
+ tokenizedDisplayName={{ parts: ['Al', 'ice', 'son'], token: 'ice' }}
36
+ />,
37
+ );
38
+ // The matched substring is rendered inside a nested Text — the only one
39
+ // carrying our matchStyle — so the count of styled descendants equals the
40
+ // number of matching parts (case-insensitive).
41
+ const matchedNodes = UNSAFE_root.findAll(
42
+ (node) =>
43
+ typeof node.type !== 'string' &&
44
+ Array.isArray(node.props?.style) === false &&
45
+ node.props?.style === matchStyle,
46
+ );
47
+ expect(matchedNodes.length).toBe(1);
48
+ });
49
+
50
+ it('matches case-insensitively', () => {
51
+ const matchStyle = { fontWeight: 'bold' as const };
52
+ const { UNSAFE_root } = render(
53
+ <TokenizedSuggestionParts
54
+ matchStyle={matchStyle}
55
+ tokenizedDisplayName={{ parts: ['Channel'], token: 'channel' }}
56
+ />,
57
+ );
58
+ const matchedNodes = UNSAFE_root.findAll(
59
+ (node) => typeof node.type !== 'string' && node.props?.style === matchStyle,
60
+ );
61
+ expect(matchedNodes.length).toBe(1);
62
+ });
63
+ });
@@ -0,0 +1,16 @@
1
+ export { EnhancedMentionContent } from './EnhancedMentionContent';
2
+ export type { EnhancedMentionContentProps } from './EnhancedMentionContent';
3
+ export { EnhancedMentionIcon } from './EnhancedMentionIcon';
4
+ export type { EnhancedMentionIconProps } from './EnhancedMentionIcon';
5
+ export { MentionBroadcastItem } from './MentionBroadcastItem';
6
+ export type { MentionBroadcastItemProps } from './MentionBroadcastItem';
7
+ export { MentionItem } from './MentionItem';
8
+ export type { MentionItemProps } from './MentionItem';
9
+ export { MentionRoleItem } from './MentionRoleItem';
10
+ export type { MentionRoleItemProps } from './MentionRoleItem';
11
+ export { MentionUserGroupItem } from './MentionUserGroupItem';
12
+ export type { MentionUserGroupItemProps } from './MentionUserGroupItem';
13
+ export { MentionUserItem } from './MentionUserItem';
14
+ export type { MentionUserItemProps } from './MentionUserItem';
15
+ export { TokenizedSuggestionParts } from './TokenizedSuggestionParts';
16
+ export type { TokenizedSuggestionPartsProps } from './TokenizedSuggestionParts';
@@ -51,7 +51,11 @@ describe('useChannelDetailsActionItems', () => {
51
51
  renderHook(() => useChannelDetailsActionItems());
52
52
 
53
53
  expect(spy).toHaveBeenCalledTimes(1);
54
- expect(spy).toHaveBeenCalledWith({ channel, getChannelActionItems: undefined });
54
+ expect(spy).toHaveBeenCalledWith({
55
+ channel,
56
+ getChannelActionItems: undefined,
57
+ surface: 'details',
58
+ });
55
59
  });
56
60
 
57
61
  it('forwards the getChannelActionItems prop from context unchanged', () => {
@@ -61,7 +65,7 @@ describe('useChannelDetailsActionItems', () => {
61
65
 
62
66
  renderHook(() => useChannelDetailsActionItems());
63
67
 
64
- expect(spy).toHaveBeenCalledWith({ channel, getChannelActionItems });
68
+ expect(spy).toHaveBeenCalledWith({ channel, getChannelActionItems, surface: 'details' });
65
69
  });
66
70
 
67
71
  it('returns non-leave/non-delete items referentially unchanged', () => {
@@ -12,7 +12,7 @@ import {
12
12
  export const useChannelDetailsActionItems = (): ChannelActionItem[] => {
13
13
  const { channel, getChannelActionItems, onChannelDismiss } = useChannelDetailsContext();
14
14
 
15
- const items = useChannelActionItems({ channel, getChannelActionItems });
15
+ const items = useChannelActionItems({ channel, getChannelActionItems, surface: 'details' });
16
16
 
17
17
  return useMemo(
18
18
  () =>
@@ -41,6 +41,7 @@ export type ChannelListProps = Partial<
41
41
  | 'maxUnreadCount'
42
42
  | 'numberOfSkeletons'
43
43
  | 'mutedStatusPosition'
44
+ | 'pinnedStatusPosition'
44
45
  >
45
46
  > & {
46
47
  /** Optional function to filter channels prior to rendering the list. Do not use any complex logic that would delay the loading of the ChannelList. We recommend using a pure function with array methods like filter/sort/reduce. */
@@ -252,6 +253,7 @@ export const ChannelList = (props: ChannelListProps) => {
252
253
  queryChannelsOverride,
253
254
  notificationHostId: notificationHostIdProp,
254
255
  mutedStatusPosition = 'inlineTitle',
256
+ pinnedStatusPosition = 'inlineTitle',
255
257
  swipeActionsEnabled = true,
256
258
  } = props;
257
259
 
@@ -375,6 +377,7 @@ export const ChannelList = (props: ChannelListProps) => {
375
377
  }
376
378
  },
377
379
  mutedStatusPosition,
380
+ pinnedStatusPosition,
378
381
  });
379
382
 
380
383
  return (