@sendbird/uikit-react-native 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +42 -17
  2. package/lib/commonjs/components/ChatFlatList.js +2 -1
  3. package/lib/commonjs/components/ChatFlatList.js.map +1 -1
  4. package/lib/commonjs/components/FileViewer.js +2 -5
  5. package/lib/commonjs/components/FileViewer.js.map +1 -1
  6. package/lib/commonjs/components/MessageRenderer/FileMessage/BaseFileMessage.js +11 -6
  7. package/lib/commonjs/components/MessageRenderer/FileMessage/BaseFileMessage.js.map +1 -1
  8. package/lib/commonjs/components/MessageRenderer/FileMessage/ImageFileMessage.js +12 -2
  9. package/lib/commonjs/components/MessageRenderer/FileMessage/ImageFileMessage.js.map +1 -1
  10. package/lib/commonjs/components/MessageRenderer/FileMessage/VideoFileMessage.js +26 -11
  11. package/lib/commonjs/components/MessageRenderer/FileMessage/VideoFileMessage.js.map +1 -1
  12. package/lib/commonjs/components/MessageRenderer/FileMessage/index.js +1 -6
  13. package/lib/commonjs/components/MessageRenderer/FileMessage/index.js.map +1 -1
  14. package/lib/commonjs/components/MessageRenderer/UserMessage/BaseUserMessage.js +86 -10
  15. package/lib/commonjs/components/MessageRenderer/UserMessage/BaseUserMessage.js.map +1 -1
  16. package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +102 -15
  17. package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
  18. package/lib/commonjs/components/MessageRenderer/UserMessage/index.js.map +1 -1
  19. package/lib/commonjs/components/MessageRenderer/index.js +22 -3
  20. package/lib/commonjs/components/MessageRenderer/index.js.map +1 -1
  21. package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js +150 -0
  22. package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -0
  23. package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js +135 -0
  24. package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js.map +1 -0
  25. package/lib/commonjs/components/ReactionAddons/ReactionRoundedButton.js +87 -0
  26. package/lib/commonjs/components/ReactionAddons/ReactionRoundedButton.js.map +1 -0
  27. package/lib/commonjs/components/ReactionAddons/index.js +19 -0
  28. package/lib/commonjs/components/ReactionAddons/index.js.map +1 -0
  29. package/lib/commonjs/components/ReactionBottomSheets/ReactionListBottomSheet.js +150 -0
  30. package/lib/commonjs/components/ReactionBottomSheets/ReactionListBottomSheet.js.map +1 -0
  31. package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +276 -0
  32. package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -0
  33. package/lib/commonjs/components/ReactionBottomSheets/index.js +19 -0
  34. package/lib/commonjs/components/ReactionBottomSheets/index.js.map +1 -0
  35. package/lib/commonjs/constants.js +3 -1
  36. package/lib/commonjs/constants.js.map +1 -1
  37. package/lib/commonjs/containers/GroupChannelPreviewContainer.js +4 -1
  38. package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -1
  39. package/lib/commonjs/containers/SendbirdUIKitContainer.js +130 -79
  40. package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
  41. package/lib/commonjs/contexts/PlatformServiceCtx.js.map +1 -1
  42. package/lib/commonjs/contexts/ReactionCtx.js +107 -0
  43. package/lib/commonjs/contexts/ReactionCtx.js.map +1 -0
  44. package/lib/commonjs/contexts/SendbirdChatCtx.js +26 -18
  45. package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
  46. package/lib/commonjs/contexts/UserProfileCtx.js +9 -0
  47. package/lib/commonjs/contexts/UserProfileCtx.js.map +1 -1
  48. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/EditInput.js +33 -37
  49. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/EditInput.js.map +1 -1
  50. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js +95 -23
  51. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -1
  52. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js +121 -31
  53. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
  54. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +34 -13
  55. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  56. package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +210 -0
  57. package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -0
  58. package/lib/commonjs/domain/groupChannel/index.js +8 -0
  59. package/lib/commonjs/domain/groupChannel/index.js.map +1 -1
  60. package/lib/commonjs/domain/groupChannel/module/createGroupChannelModule.js +4 -0
  61. package/lib/commonjs/domain/groupChannel/module/createGroupChannelModule.js.map +1 -1
  62. package/lib/commonjs/domain/groupChannel/module/moduleContext.js +4 -4
  63. package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
  64. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  65. package/lib/commonjs/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js +3 -2
  66. package/lib/commonjs/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js.map +1 -1
  67. package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js +2 -1
  68. package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
  69. package/lib/commonjs/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js +2 -1
  70. package/lib/commonjs/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js.map +1 -1
  71. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js +39 -0
  72. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js.map +1 -0
  73. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js +140 -0
  74. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js.map +1 -0
  75. package/lib/commonjs/domain/groupChannelNotifications/index.js +46 -0
  76. package/lib/commonjs/domain/groupChannelNotifications/index.js.map +1 -0
  77. package/lib/commonjs/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js +33 -0
  78. package/lib/commonjs/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js.map +1 -0
  79. package/lib/commonjs/domain/groupChannelNotifications/module/moduleContext.js +45 -0
  80. package/lib/commonjs/domain/groupChannelNotifications/module/moduleContext.js.map +1 -0
  81. package/lib/commonjs/domain/groupChannelNotifications/types.js +6 -0
  82. package/lib/commonjs/domain/groupChannelNotifications/types.js.map +1 -0
  83. package/lib/commonjs/domain/groupChannelOperators/component/GroupChannelOperatorsList.js +2 -1
  84. package/lib/commonjs/domain/groupChannelOperators/component/GroupChannelOperatorsList.js.map +1 -1
  85. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +49 -6
  86. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  87. package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js +11 -16
  88. package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
  89. package/lib/commonjs/domain/groupChannelSettings/types.js.map +1 -1
  90. package/lib/commonjs/domain/groupChannelUserList/types.js.map +1 -1
  91. package/lib/commonjs/domain/userList/component/UserListList.js +4 -1
  92. package/lib/commonjs/domain/userList/component/UserListList.js.map +1 -1
  93. package/lib/commonjs/domain/userList/module/createUserListModule.js.map +1 -1
  94. package/lib/commonjs/fragments/createGroupChannelCreateFragment.js.map +1 -1
  95. package/lib/commonjs/fragments/createGroupChannelFragment.js +11 -4
  96. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  97. package/lib/commonjs/fragments/createGroupChannelInviteFragment.js.map +1 -1
  98. package/lib/commonjs/fragments/createGroupChannelListFragment.js +4 -14
  99. package/lib/commonjs/fragments/createGroupChannelListFragment.js.map +1 -1
  100. package/lib/commonjs/fragments/createGroupChannelNotificationsFragment.js +34 -0
  101. package/lib/commonjs/fragments/createGroupChannelNotificationsFragment.js.map +1 -0
  102. package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js +3 -1
  103. package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js.map +1 -1
  104. package/lib/commonjs/hooks/useConnection.js +3 -0
  105. package/lib/commonjs/hooks/useConnection.js.map +1 -1
  106. package/lib/commonjs/hooks/useContext.js +11 -1
  107. package/lib/commonjs/hooks/useContext.js.map +1 -1
  108. package/lib/commonjs/hooks/useKeyboardStatus.js +97 -0
  109. package/lib/commonjs/hooks/useKeyboardStatus.js.map +1 -0
  110. package/lib/commonjs/hooks/useMentionSuggestion.js +110 -0
  111. package/lib/commonjs/hooks/useMentionSuggestion.js.map +1 -0
  112. package/lib/commonjs/hooks/useMentionTextInput.js +139 -0
  113. package/lib/commonjs/hooks/useMentionTextInput.js.map +1 -0
  114. package/lib/commonjs/index.js +95 -40
  115. package/lib/commonjs/index.js.map +1 -1
  116. package/lib/commonjs/libs/EmojiManager.js +100 -0
  117. package/lib/commonjs/libs/EmojiManager.js.map +1 -0
  118. package/lib/commonjs/libs/ImageCompressionConfig.js +38 -0
  119. package/lib/commonjs/libs/ImageCompressionConfig.js.map +1 -0
  120. package/lib/commonjs/libs/MentionConfig.js +47 -0
  121. package/lib/commonjs/libs/MentionConfig.js.map +1 -0
  122. package/lib/commonjs/libs/MentionManager.js +235 -0
  123. package/lib/commonjs/libs/MentionManager.js.map +1 -0
  124. package/lib/commonjs/libs/SBUUtils.js +27 -0
  125. package/lib/commonjs/libs/SBUUtils.js.map +1 -1
  126. package/lib/commonjs/localization/StringSet.type.js +20 -5
  127. package/lib/commonjs/localization/StringSet.type.js.map +1 -1
  128. package/lib/commonjs/platform/createMediaService.expo.js +35 -1
  129. package/lib/commonjs/platform/createMediaService.expo.js.map +1 -1
  130. package/lib/commonjs/platform/createMediaService.native.js +41 -6
  131. package/lib/commonjs/platform/createMediaService.native.js.map +1 -1
  132. package/lib/commonjs/platform/dynamicModule.js +9 -57
  133. package/lib/commonjs/platform/dynamicModule.js.map +1 -1
  134. package/lib/commonjs/platform/types.js.map +1 -1
  135. package/lib/commonjs/types.js.map +1 -1
  136. package/lib/commonjs/version.js +1 -1
  137. package/lib/commonjs/version.js.map +1 -1
  138. package/lib/module/components/ChatFlatList.js +3 -2
  139. package/lib/module/components/ChatFlatList.js.map +1 -1
  140. package/lib/module/components/FileViewer.js +2 -5
  141. package/lib/module/components/FileViewer.js.map +1 -1
  142. package/lib/module/components/MessageRenderer/FileMessage/BaseFileMessage.js +11 -6
  143. package/lib/module/components/MessageRenderer/FileMessage/BaseFileMessage.js.map +1 -1
  144. package/lib/module/components/MessageRenderer/FileMessage/ImageFileMessage.js +12 -2
  145. package/lib/module/components/MessageRenderer/FileMessage/ImageFileMessage.js.map +1 -1
  146. package/lib/module/components/MessageRenderer/FileMessage/VideoFileMessage.js +26 -11
  147. package/lib/module/components/MessageRenderer/FileMessage/VideoFileMessage.js.map +1 -1
  148. package/lib/module/components/MessageRenderer/FileMessage/index.js +1 -5
  149. package/lib/module/components/MessageRenderer/FileMessage/index.js.map +1 -1
  150. package/lib/module/components/MessageRenderer/UserMessage/BaseUserMessage.js +86 -12
  151. package/lib/module/components/MessageRenderer/UserMessage/BaseUserMessage.js.map +1 -1
  152. package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +103 -19
  153. package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
  154. package/lib/module/components/MessageRenderer/UserMessage/index.js.map +1 -1
  155. package/lib/module/components/MessageRenderer/index.js +21 -4
  156. package/lib/module/components/MessageRenderer/index.js.map +1 -1
  157. package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js +132 -0
  158. package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -0
  159. package/lib/module/components/ReactionAddons/MessageReactionAddon.js +118 -0
  160. package/lib/module/components/ReactionAddons/MessageReactionAddon.js.map +1 -0
  161. package/lib/module/components/ReactionAddons/ReactionRoundedButton.js +74 -0
  162. package/lib/module/components/ReactionAddons/ReactionRoundedButton.js.map +1 -0
  163. package/lib/module/components/ReactionAddons/index.js +7 -0
  164. package/lib/module/components/ReactionAddons/index.js.map +1 -0
  165. package/lib/module/components/ReactionBottomSheets/ReactionListBottomSheet.js +135 -0
  166. package/lib/module/components/ReactionBottomSheets/ReactionListBottomSheet.js.map +1 -0
  167. package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +259 -0
  168. package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -0
  169. package/lib/module/components/ReactionBottomSheets/index.js +7 -0
  170. package/lib/module/components/ReactionBottomSheets/index.js.map +1 -0
  171. package/lib/module/constants.js +1 -0
  172. package/lib/module/constants.js.map +1 -1
  173. package/lib/module/containers/GroupChannelPreviewContainer.js +4 -1
  174. package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -1
  175. package/lib/module/containers/SendbirdUIKitContainer.js +127 -81
  176. package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
  177. package/lib/module/contexts/PlatformServiceCtx.js.map +1 -1
  178. package/lib/module/contexts/ReactionCtx.js +85 -0
  179. package/lib/module/contexts/ReactionCtx.js.map +1 -0
  180. package/lib/module/contexts/SendbirdChatCtx.js +28 -18
  181. package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
  182. package/lib/module/contexts/UserProfileCtx.js +7 -0
  183. package/lib/module/contexts/UserProfileCtx.js.map +1 -1
  184. package/lib/module/domain/groupChannel/component/GroupChannelInput/EditInput.js +34 -39
  185. package/lib/module/domain/groupChannel/component/GroupChannelInput/EditInput.js.map +1 -1
  186. package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js +92 -26
  187. package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -1
  188. package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js +118 -33
  189. package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
  190. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +35 -16
  191. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  192. package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +188 -0
  193. package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -0
  194. package/lib/module/domain/groupChannel/index.js +1 -0
  195. package/lib/module/domain/groupChannel/index.js.map +1 -1
  196. package/lib/module/domain/groupChannel/module/createGroupChannelModule.js +3 -0
  197. package/lib/module/domain/groupChannel/module/createGroupChannelModule.js.map +1 -1
  198. package/lib/module/domain/groupChannel/module/moduleContext.js +4 -4
  199. package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
  200. package/lib/module/domain/groupChannel/types.js.map +1 -1
  201. package/lib/module/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js +4 -3
  202. package/lib/module/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js.map +1 -1
  203. package/lib/module/domain/groupChannelList/component/GroupChannelListList.js +3 -2
  204. package/lib/module/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
  205. package/lib/module/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js +3 -2
  206. package/lib/module/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js.map +1 -1
  207. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js +25 -0
  208. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js.map +1 -0
  209. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js +122 -0
  210. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js.map +1 -0
  211. package/lib/module/domain/groupChannelNotifications/index.js +5 -0
  212. package/lib/module/domain/groupChannelNotifications/index.js.map +1 -0
  213. package/lib/module/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js +21 -0
  214. package/lib/module/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js.map +1 -0
  215. package/lib/module/domain/groupChannelNotifications/module/moduleContext.js +25 -0
  216. package/lib/module/domain/groupChannelNotifications/module/moduleContext.js.map +1 -0
  217. package/lib/module/domain/groupChannelNotifications/types.js +2 -0
  218. package/lib/module/domain/groupChannelNotifications/types.js.map +1 -0
  219. package/lib/module/domain/groupChannelOperators/component/GroupChannelOperatorsList.js +3 -2
  220. package/lib/module/domain/groupChannelOperators/component/GroupChannelOperatorsList.js.map +1 -1
  221. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +46 -6
  222. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  223. package/lib/module/domain/groupChannelSettings/module/moduleContext.js +12 -17
  224. package/lib/module/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
  225. package/lib/module/domain/groupChannelSettings/types.js.map +1 -1
  226. package/lib/module/domain/groupChannelUserList/types.js.map +1 -1
  227. package/lib/module/domain/userList/component/UserListList.js +3 -1
  228. package/lib/module/domain/userList/component/UserListList.js.map +1 -1
  229. package/lib/module/domain/userList/module/createUserListModule.js.map +1 -1
  230. package/lib/module/fragments/createGroupChannelCreateFragment.js.map +1 -1
  231. package/lib/module/fragments/createGroupChannelFragment.js +11 -4
  232. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  233. package/lib/module/fragments/createGroupChannelInviteFragment.js.map +1 -1
  234. package/lib/module/fragments/createGroupChannelListFragment.js +5 -9
  235. package/lib/module/fragments/createGroupChannelListFragment.js.map +1 -1
  236. package/lib/module/fragments/createGroupChannelNotificationsFragment.js +22 -0
  237. package/lib/module/fragments/createGroupChannelNotificationsFragment.js.map +1 -0
  238. package/lib/module/fragments/createGroupChannelSettingsFragment.js +3 -1
  239. package/lib/module/fragments/createGroupChannelSettingsFragment.js.map +1 -1
  240. package/lib/module/hooks/useConnection.js +3 -0
  241. package/lib/module/hooks/useConnection.js.map +1 -1
  242. package/lib/module/hooks/useContext.js +6 -0
  243. package/lib/module/hooks/useContext.js.map +1 -1
  244. package/lib/module/hooks/useKeyboardStatus.js +78 -0
  245. package/lib/module/hooks/useKeyboardStatus.js.map +1 -0
  246. package/lib/module/hooks/useMentionSuggestion.js +100 -0
  247. package/lib/module/hooks/useMentionSuggestion.js.map +1 -0
  248. package/lib/module/hooks/useMentionTextInput.js +128 -0
  249. package/lib/module/hooks/useMentionTextInput.js.map +1 -0
  250. package/lib/module/index.js +8 -3
  251. package/lib/module/index.js.map +1 -1
  252. package/lib/module/libs/EmojiManager.js +90 -0
  253. package/lib/module/libs/EmojiManager.js.map +1 -0
  254. package/lib/module/libs/ImageCompressionConfig.js +30 -0
  255. package/lib/module/libs/ImageCompressionConfig.js.map +1 -0
  256. package/lib/module/libs/MentionConfig.js +39 -0
  257. package/lib/module/libs/MentionConfig.js.map +1 -0
  258. package/lib/module/libs/MentionManager.js +223 -0
  259. package/lib/module/libs/MentionManager.js.map +1 -0
  260. package/lib/module/libs/SBUUtils.js +26 -1
  261. package/lib/module/libs/SBUUtils.js.map +1 -1
  262. package/lib/module/localization/StringSet.type.js +21 -6
  263. package/lib/module/localization/StringSet.type.js.map +1 -1
  264. package/lib/module/platform/createMediaService.expo.js +33 -1
  265. package/lib/module/platform/createMediaService.expo.js.map +1 -1
  266. package/lib/module/platform/createMediaService.native.js +38 -5
  267. package/lib/module/platform/createMediaService.native.js.map +1 -1
  268. package/lib/module/platform/dynamicModule.js +10 -56
  269. package/lib/module/platform/dynamicModule.js.map +1 -1
  270. package/lib/module/platform/types.js.map +1 -1
  271. package/lib/module/types.js.map +1 -1
  272. package/lib/module/version.js +1 -1
  273. package/lib/module/version.js.map +1 -1
  274. package/lib/typescript/__template__/types.d.ts +3 -3
  275. package/lib/typescript/src/components/ChannelCover.d.ts +1 -1
  276. package/lib/typescript/src/components/ChatFlatList.d.ts +1 -1
  277. package/lib/typescript/src/components/FileViewer.d.ts +1 -1
  278. package/lib/typescript/src/components/MessageRenderer/AdminMessage/index.d.ts +1 -1
  279. package/lib/typescript/src/components/MessageRenderer/FileMessage/BaseFileMessage.d.ts +2 -2
  280. package/lib/typescript/src/components/MessageRenderer/FileMessage/ImageFileMessage.d.ts +1 -1
  281. package/lib/typescript/src/components/MessageRenderer/FileMessage/VideoFileMessage.d.ts +1 -1
  282. package/lib/typescript/src/components/MessageRenderer/FileMessage/index.d.ts +11 -2
  283. package/lib/typescript/src/components/MessageRenderer/MessageDateSeparator.d.ts +1 -1
  284. package/lib/typescript/src/components/MessageRenderer/MessageIncomingAvatar.d.ts +1 -1
  285. package/lib/typescript/src/components/MessageRenderer/MessageIncomingSenderName.d.ts +1 -1
  286. package/lib/typescript/src/components/MessageRenderer/MessageOutgoingStatus.d.ts +1 -1
  287. package/lib/typescript/src/components/MessageRenderer/MessageTime.d.ts +1 -1
  288. package/lib/typescript/src/components/MessageRenderer/UnknownMessage/index.d.ts +1 -1
  289. package/lib/typescript/src/components/MessageRenderer/UserMessage/BaseUserMessage.d.ts +1 -1
  290. package/lib/typescript/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.d.ts +2 -2
  291. package/lib/typescript/src/components/MessageRenderer/UserMessage/index.d.ts +4 -1
  292. package/lib/typescript/src/components/MessageRenderer/index.d.ts +4 -3
  293. package/lib/typescript/src/components/NewMessagesButton.d.ts +1 -1
  294. package/lib/typescript/src/components/ReactionAddons/BottomSheetReactionAddon.d.ts +8 -0
  295. package/lib/typescript/src/components/ReactionAddons/MessageReactionAddon.d.ts +6 -0
  296. package/lib/typescript/src/components/ReactionAddons/ReactionRoundedButton.d.ts +14 -0
  297. package/lib/typescript/src/components/ReactionAddons/index.d.ts +11 -0
  298. package/lib/typescript/src/components/ReactionBottomSheets/ReactionListBottomSheet.d.ts +3 -0
  299. package/lib/typescript/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.d.ts +3 -0
  300. package/lib/typescript/src/components/ReactionBottomSheets/index.d.ts +20 -0
  301. package/lib/typescript/src/components/ScrollToBottomButton.d.ts +1 -1
  302. package/lib/typescript/src/components/StatusComposition.d.ts +1 -1
  303. package/lib/typescript/src/components/TypedPlaceholder.d.ts +1 -1
  304. package/lib/typescript/src/components/UserActionBar.d.ts +1 -1
  305. package/lib/typescript/src/components/UserSelectableBar.d.ts +1 -1
  306. package/lib/typescript/src/constants.d.ts +1 -0
  307. package/lib/typescript/src/containers/GroupChannelPreviewContainer.d.ts +1 -1
  308. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +20 -8
  309. package/lib/typescript/src/contexts/LocalizationCtx.d.ts +2 -2
  310. package/lib/typescript/src/contexts/PlatformServiceCtx.d.ts +9 -3
  311. package/lib/typescript/src/contexts/ReactionCtx.d.ts +18 -0
  312. package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +16 -3
  313. package/lib/typescript/src/contexts/UserProfileCtx.d.ts +4 -4
  314. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/EditInput.d.ts +35 -7
  315. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/SendInput.d.ts +32 -5
  316. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/index.d.ts +19 -2
  317. package/lib/typescript/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.d.ts +3 -0
  318. package/lib/typescript/src/domain/groupChannel/index.d.ts +1 -0
  319. package/lib/typescript/src/domain/groupChannel/module/createGroupChannelModule.d.ts +1 -1
  320. package/lib/typescript/src/domain/groupChannel/types.d.ts +24 -7
  321. package/lib/typescript/src/domain/groupChannelBannedUsers/types.d.ts +3 -3
  322. package/lib/typescript/src/domain/groupChannelList/types.d.ts +2 -2
  323. package/lib/typescript/src/domain/groupChannelModeration/types.d.ts +3 -3
  324. package/lib/typescript/src/domain/groupChannelMutedMembers/types.d.ts +3 -3
  325. package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.d.ts +3 -0
  326. package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsView.d.ts +2 -0
  327. package/lib/typescript/src/domain/groupChannelNotifications/index.d.ts +4 -0
  328. package/lib/typescript/src/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.d.ts +3 -0
  329. package/lib/typescript/src/domain/groupChannelNotifications/module/moduleContext.d.ts +3 -0
  330. package/lib/typescript/src/domain/groupChannelNotifications/types.d.ts +33 -0
  331. package/lib/typescript/src/domain/groupChannelOperators/types.d.ts +3 -3
  332. package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.d.ts +1 -1
  333. package/lib/typescript/src/domain/groupChannelSettings/types.d.ts +3 -1
  334. package/lib/typescript/src/domain/groupChannelUserList/types.d.ts +6 -6
  335. package/lib/typescript/src/domain/userList/component/UserListList.d.ts +2 -1
  336. package/lib/typescript/src/domain/userList/module/createUserListModule.d.ts +2 -1
  337. package/lib/typescript/src/fragments/createGroupChannelCreateFragment.d.ts +1 -1
  338. package/lib/typescript/src/fragments/createGroupChannelInviteFragment.d.ts +1 -1
  339. package/lib/typescript/src/fragments/createGroupChannelNotificationsFragment.d.ts +3 -0
  340. package/lib/typescript/src/hooks/useConnection.d.ts +1 -1
  341. package/lib/typescript/src/hooks/useContext.d.ts +3 -26
  342. package/lib/typescript/src/hooks/useKeyboardStatus.d.ts +6 -0
  343. package/lib/typescript/src/hooks/useMentionSuggestion.d.ts +17 -0
  344. package/lib/typescript/src/hooks/useMentionTextInput.d.ts +18 -0
  345. package/lib/typescript/src/index.d.ts +8 -3
  346. package/lib/typescript/src/libs/EmojiManager.d.ts +16 -0
  347. package/lib/typescript/src/libs/ImageCompressionConfig.d.ts +16 -0
  348. package/lib/typescript/src/libs/MentionConfig.d.ts +24 -0
  349. package/lib/typescript/src/libs/MentionManager.d.ts +61 -0
  350. package/lib/typescript/src/libs/SBUUtils.d.ts +6 -0
  351. package/lib/typescript/src/localization/StringSet.type.d.ts +19 -2
  352. package/lib/typescript/src/platform/createMediaService.expo.d.ts +6 -2
  353. package/lib/typescript/src/platform/createMediaService.native.d.ts +8 -6
  354. package/lib/typescript/src/platform/dynamicModule.d.ts +8 -13
  355. package/lib/typescript/src/platform/types.d.ts +33 -8
  356. package/lib/typescript/src/types.d.ts +13 -4
  357. package/lib/typescript/src/version.d.ts +1 -1
  358. package/package.json +16 -6
  359. package/src/components/ChatFlatList.tsx +2 -1
  360. package/src/components/FileViewer.tsx +2 -5
  361. package/src/components/MessageRenderer/FileMessage/BaseFileMessage.tsx +17 -12
  362. package/src/components/MessageRenderer/FileMessage/ImageFileMessage.tsx +30 -18
  363. package/src/components/MessageRenderer/FileMessage/VideoFileMessage.tsx +21 -11
  364. package/src/components/MessageRenderer/FileMessage/index.tsx +1 -4
  365. package/src/components/MessageRenderer/UserMessage/BaseUserMessage.tsx +82 -14
  366. package/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.tsx +136 -62
  367. package/src/components/MessageRenderer/UserMessage/index.tsx +8 -1
  368. package/src/components/MessageRenderer/index.tsx +39 -7
  369. package/src/components/ReactionAddons/BottomSheetReactionAddon.tsx +106 -0
  370. package/src/components/ReactionAddons/MessageReactionAddon.tsx +123 -0
  371. package/src/components/ReactionAddons/ReactionRoundedButton.tsx +71 -0
  372. package/src/components/ReactionAddons/index.tsx +7 -0
  373. package/src/components/ReactionBottomSheets/ReactionListBottomSheet.tsx +113 -0
  374. package/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.tsx +249 -0
  375. package/src/components/ReactionBottomSheets/index.tsx +24 -0
  376. package/src/constants.ts +2 -0
  377. package/src/containers/GroupChannelPreviewContainer.tsx +3 -1
  378. package/src/containers/SendbirdUIKitContainer.tsx +165 -88
  379. package/src/contexts/PlatformServiceCtx.tsx +9 -2
  380. package/src/contexts/ReactionCtx.tsx +102 -0
  381. package/src/contexts/SendbirdChatCtx.tsx +46 -21
  382. package/src/contexts/UserProfileCtx.tsx +9 -0
  383. package/src/domain/groupChannel/component/GroupChannelInput/EditInput.tsx +56 -30
  384. package/src/domain/groupChannel/component/GroupChannelInput/SendInput.tsx +129 -32
  385. package/src/domain/groupChannel/component/GroupChannelInput/index.tsx +138 -43
  386. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +30 -12
  387. package/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.tsx +173 -0
  388. package/src/domain/groupChannel/index.ts +1 -0
  389. package/src/domain/groupChannel/module/createGroupChannelModule.tsx +12 -1
  390. package/src/domain/groupChannel/module/moduleContext.tsx +4 -4
  391. package/src/domain/groupChannel/types.ts +28 -5
  392. package/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.tsx +3 -2
  393. package/src/domain/groupChannelList/component/GroupChannelListList.tsx +2 -1
  394. package/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.tsx +2 -1
  395. package/src/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.tsx +14 -0
  396. package/src/domain/groupChannelNotifications/component/GroupChannelNotificationsView.tsx +128 -0
  397. package/src/domain/groupChannelNotifications/index.ts +4 -0
  398. package/src/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.tsx +15 -0
  399. package/src/domain/groupChannelNotifications/module/moduleContext.tsx +31 -0
  400. package/src/domain/groupChannelNotifications/types.ts +38 -0
  401. package/src/domain/groupChannelOperators/component/GroupChannelOperatorsList.tsx +2 -1
  402. package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +42 -3
  403. package/src/domain/groupChannelSettings/module/moduleContext.tsx +17 -14
  404. package/src/domain/groupChannelSettings/types.ts +2 -0
  405. package/src/domain/groupChannelUserList/types.ts +7 -2
  406. package/src/domain/userList/component/UserListList.tsx +5 -1
  407. package/src/domain/userList/module/createUserListModule.tsx +3 -1
  408. package/src/fragments/createGroupChannelCreateFragment.tsx +8 -2
  409. package/src/fragments/createGroupChannelFragment.tsx +19 -6
  410. package/src/fragments/createGroupChannelInviteFragment.tsx +2 -2
  411. package/src/fragments/createGroupChannelListFragment.tsx +5 -9
  412. package/src/fragments/createGroupChannelNotificationsFragment.tsx +27 -0
  413. package/src/fragments/createGroupChannelSettingsFragment.tsx +2 -0
  414. package/src/hooks/useConnection.ts +3 -1
  415. package/src/hooks/useContext.ts +7 -0
  416. package/src/hooks/useKeyboardStatus.ts +59 -0
  417. package/src/hooks/useMentionSuggestion.ts +106 -0
  418. package/src/hooks/useMentionTextInput.ts +139 -0
  419. package/src/index.ts +14 -2
  420. package/src/libs/EmojiManager.ts +80 -0
  421. package/src/libs/ImageCompressionConfig.ts +31 -0
  422. package/src/libs/MentionConfig.ts +40 -0
  423. package/src/libs/MentionManager.tsx +240 -0
  424. package/src/libs/SBUUtils.ts +28 -1
  425. package/src/localization/StringSet.type.ts +45 -8
  426. package/src/platform/createMediaService.expo.tsx +24 -1
  427. package/src/platform/createMediaService.native.tsx +31 -9
  428. package/src/platform/dynamicModule.ts +17 -59
  429. package/src/platform/types.ts +29 -7
  430. package/src/types.ts +12 -0
  431. package/src/version.ts +1 -1
@@ -1,89 +1,157 @@
1
1
  import React, { useState } from 'react';
2
- import { Linking, TouchableOpacity, View } from 'react-native';
2
+ import { TouchableOpacity, View } from 'react-native';
3
3
 
4
4
  import type { OGMetaData } from '@sendbird/chat/message';
5
- import {
6
- Icon,
7
- Image,
8
- Text,
9
- URLParsedText,
10
- createStyleSheet,
11
- useUIKitTheme,
12
- } from '@sendbird/uikit-react-native-foundation';
13
- import { conditionChaining } from '@sendbird/uikit-utils';
5
+ import { Icon, Image, RegexText, Text, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
6
+ import { conditionChaining, urlRegexRough } from '@sendbird/uikit-utils';
14
7
 
15
- import { useLocalization } from '../../../hooks/useContext';
8
+ import { useLocalization, useSendbirdChat, useUserProfile } from '../../../hooks/useContext';
9
+ import SBUUtils from '../../../libs/SBUUtils';
16
10
  import type { UserMessageProps } from './index';
17
11
 
18
12
  type Props = UserMessageProps & {
19
13
  ogMetaData: OGMetaData;
20
14
  };
21
- const OpenGraphUserMessage = ({ message, variant, pressed, ogMetaData }: Props) => {
15
+
16
+ const OpenGraphUserMessage = ({
17
+ message,
18
+ variant,
19
+ pressed,
20
+ ogMetaData,
21
+ children,
22
+ onLongPressMentionedUser,
23
+ onLongPressURL,
24
+ }: Props) => {
25
+ const { mentionManager, currentUser } = useSendbirdChat();
22
26
  const { STRINGS } = useLocalization();
27
+ const { show } = useUserProfile();
23
28
  const { colors, select, palette } = useUIKitTheme();
24
- const color = colors.ui.message[variant][pressed ? 'pressed' : 'enabled'];
29
+
25
30
  const [imageNotFound, setImageNotFound] = useState(false);
31
+ const color = colors.ui.message[variant][pressed ? 'pressed' : 'enabled'];
32
+
33
+ const containerBackground = select({ dark: palette.background400, light: palette.background100 });
34
+
26
35
  return (
27
- <View style={[styles.container, { backgroundColor: color.background }]}>
28
- <View style={styles.messageContainer}>
29
- <URLParsedText body3 color={color.textMsg}>
30
- {message.message}
31
- {Boolean(message.updatedAt) && (
32
- <Text body3 color={color.textEdited}>
33
- {STRINGS.GROUP_CHANNEL.MESSAGE_BUBBLE_EDITED_POSTFIX}
34
- </Text>
35
- )}
36
- </URLParsedText>
37
- </View>
38
- <TouchableOpacity activeOpacity={0.7} onPress={() => Linking.openURL(ogMetaData.url).catch()}>
39
- <View
40
- style={[
41
- styles.ogImageContainer,
42
- { backgroundColor: select({ dark: palette.background500, light: palette.background200 }) },
43
- ]}
44
- >
45
- {conditionChaining(
46
- [imageNotFound],
47
- [
48
- <Icon containerStyle={styles.ogImage} icon={'thumbnail-none'} size={48} color={colors.onBackground02} />,
49
- <Image
50
- source={{ uri: ogMetaData.defaultImage?.url }}
51
- style={styles.ogImage}
52
- resizeMode={'cover'}
53
- onError={() => setImageNotFound(true)}
54
- />,
55
- ],
56
- )}
36
+ <View style={[styles.bubbleContainer, { backgroundColor: containerBackground }]}>
37
+ <View style={[styles.container, styles.bubbleContainer, { backgroundColor: color.background }]}>
38
+ <View style={styles.messageContainer}>
39
+ <Text body3 color={color.textMsg}>
40
+ <RegexText
41
+ body3
42
+ color={color.textMsg}
43
+ patterns={[
44
+ {
45
+ regex: mentionManager.templateRegex,
46
+ replacer({ match, groups, parentProps, keyPrefix, index }) {
47
+ const user = message.mentionedUsers?.find((it) => it.userId === groups[2]);
48
+ if (user) {
49
+ const isCurrentUser = user.userId === currentUser?.userId;
50
+ return (
51
+ <Text
52
+ {...parentProps}
53
+ key={`${keyPrefix}-${index}`}
54
+ onPress={() => show(user)}
55
+ onLongPress={onLongPressMentionedUser}
56
+ style={[
57
+ parentProps?.style,
58
+ styles.mentionedText,
59
+ isCurrentUser && { backgroundColor: palette.highlight },
60
+ ]}
61
+ >
62
+ {`${mentionManager.asMentionedMessageText(user)}`}
63
+ </Text>
64
+ );
65
+ }
66
+ return match;
67
+ },
68
+ },
69
+ {
70
+ regex: urlRegexRough,
71
+ replacer({ match, parentProps, keyPrefix, index }) {
72
+ return (
73
+ <Text
74
+ {...parentProps}
75
+ key={`${keyPrefix}-${index}`}
76
+ onPress={() => SBUUtils.openURL(match)}
77
+ onLongPress={onLongPressURL}
78
+ style={[parentProps?.style, styles.urlText]}
79
+ >
80
+ {match}
81
+ </Text>
82
+ );
83
+ },
84
+ },
85
+ ]}
86
+ >
87
+ {mentionManager.shouldUseMentionedMessageTemplate(message)
88
+ ? message.mentionedMessageTemplate
89
+ : message.message}
90
+ </RegexText>
91
+ {Boolean(message.updatedAt) && (
92
+ <Text body3 color={color.textEdited}>
93
+ {STRINGS.GROUP_CHANNEL.MESSAGE_BUBBLE_EDITED_POSTFIX}
94
+ </Text>
95
+ )}
96
+ </Text>
57
97
  </View>
58
- <View
59
- style={[
60
- styles.ogContainer,
61
- { backgroundColor: select({ dark: palette.background400, light: palette.background100 }) },
62
- ]}
98
+ <TouchableOpacity
99
+ style={{ backgroundColor: select({ dark: palette.background500, light: palette.background200 }) }}
100
+ activeOpacity={0.85}
101
+ onPress={() => SBUUtils.openURL(ogMetaData.url)}
63
102
  >
64
- <Text numberOfLines={3} body2 color={colors.onBackground01} style={styles.ogTitle}>
65
- {ogMetaData.title}
66
- </Text>
67
- {Boolean(ogMetaData.description) && (
68
- <Text numberOfLines={1} caption2 color={colors.onBackground01} style={styles.ogDesc}>
69
- {ogMetaData.description}
103
+ <View
104
+ style={[
105
+ styles.ogImageContainer,
106
+ { backgroundColor: select({ dark: palette.background500, light: palette.background200 }) },
107
+ ]}
108
+ >
109
+ {conditionChaining(
110
+ [imageNotFound],
111
+ [
112
+ <Icon
113
+ containerStyle={styles.ogImage}
114
+ icon={'thumbnail-none'}
115
+ size={48}
116
+ color={colors.onBackground02}
117
+ />,
118
+ <Image
119
+ source={{ uri: ogMetaData.defaultImage?.url }}
120
+ style={styles.ogImage}
121
+ resizeMode={'cover'}
122
+ onError={() => setImageNotFound(true)}
123
+ />,
124
+ ],
125
+ )}
126
+ </View>
127
+ <View style={[styles.ogContainer, { backgroundColor: containerBackground }]}>
128
+ <Text numberOfLines={3} body2 color={colors.onBackground01} style={styles.ogTitle}>
129
+ {ogMetaData.title}
70
130
  </Text>
71
- )}
72
- <Text numberOfLines={1} caption2 color={colors.onBackground02}>
73
- {ogMetaData.url}
74
- </Text>
75
- </View>
76
- </TouchableOpacity>
131
+ {Boolean(ogMetaData.description) && (
132
+ <Text numberOfLines={1} caption2 color={colors.onBackground01} style={styles.ogDesc}>
133
+ {ogMetaData.description}
134
+ </Text>
135
+ )}
136
+ <Text numberOfLines={1} caption2 color={colors.onBackground02}>
137
+ {ogMetaData.url}
138
+ </Text>
139
+ </View>
140
+ </TouchableOpacity>
141
+ </View>
142
+ {children}
77
143
  </View>
78
144
  );
79
145
  };
80
146
 
81
147
  const styles = createStyleSheet({
148
+ bubbleContainer: {
149
+ borderRadius: 16,
150
+ overflow: 'hidden',
151
+ },
82
152
  container: {
83
153
  width: 240,
84
154
  maxWidth: 240,
85
- borderRadius: 16,
86
- overflow: 'hidden',
87
155
  },
88
156
  messageContainer: {
89
157
  paddingVertical: 6,
@@ -109,6 +177,12 @@ const styles = createStyleSheet({
109
177
  lineHeight: 14,
110
178
  marginBottom: 8,
111
179
  },
180
+ mentionedText: {
181
+ fontWeight: 'bold',
182
+ },
183
+ urlText: {
184
+ textDecorationLine: 'underline',
185
+ },
112
186
  });
113
187
 
114
188
  export default OpenGraphUserMessage;
@@ -6,7 +6,14 @@ import type { MessageRendererInterface } from '../index';
6
6
  import BaseUserMessage from './BaseUserMessage';
7
7
  import OpenGraphUserMessage from './OpenGraphUserMessage';
8
8
 
9
- export type UserMessageProps = MessageRendererInterface<SendbirdUserMessage>;
9
+ export type UserMessageProps = MessageRendererInterface<
10
+ SendbirdUserMessage,
11
+ {
12
+ onLongPressMentionedUser?: () => void;
13
+ onLongPressURL?: () => void;
14
+ }
15
+ >;
16
+
10
17
  const UserMessage = (props: UserMessageProps) => {
11
18
  if (props.message.ogMetaData) {
12
19
  return <OpenGraphUserMessage {...props} ogMetaData={props.message.ogMetaData} />;
@@ -1,12 +1,20 @@
1
1
  import React from 'react';
2
- import { Pressable, View } from 'react-native';
2
+ import { Pressable, PressableProps, View } from 'react-native';
3
3
 
4
4
  import { createStyleSheet } from '@sendbird/uikit-react-native-foundation';
5
5
  import type { SendbirdMessage } from '@sendbird/uikit-utils';
6
- import { calcMessageGrouping, conditionChaining, isMyMessage, useIIFE } from '@sendbird/uikit-utils';
6
+ import {
7
+ calcMessageGrouping,
8
+ conditionChaining,
9
+ isMyMessage,
10
+ shouldRenderReaction,
11
+ useIIFE,
12
+ } from '@sendbird/uikit-utils';
7
13
 
8
14
  import { DEFAULT_LONG_PRESS_DELAY } from '../../constants';
9
15
  import type { GroupChannelProps } from '../../domain/groupChannel/types';
16
+ import { useSendbirdChat } from '../../hooks/useContext';
17
+ import { ReactionAddons } from '../ReactionAddons';
10
18
  import AdminMessage from './AdminMessage';
11
19
  import FileMessage from './FileMessage';
12
20
  import MessageContainer from './MessageContainer';
@@ -19,7 +27,7 @@ import UnknownMessage from './UnknownMessage';
19
27
  import UserMessage from './UserMessage';
20
28
 
21
29
  type MessageStyleVariant = 'outgoing' | 'incoming';
22
- export interface MessageRendererInterface<T = SendbirdMessage> {
30
+ export type MessageRendererInterface<T = SendbirdMessage, AdditionalProps = unknown> = {
23
31
  message: T;
24
32
  prevMessage?: SendbirdMessage;
25
33
  nextMessage?: SendbirdMessage;
@@ -27,7 +35,8 @@ export interface MessageRendererInterface<T = SendbirdMessage> {
27
35
  groupWithPrev: boolean;
28
36
  groupWithNext: boolean;
29
37
  pressed: boolean;
30
- }
38
+ children?: React.ReactElement | null;
39
+ } & AdditionalProps;
31
40
 
32
41
  const MessageRenderer: GroupChannelProps['Fragment']['renderMessage'] = ({
33
42
  currentUserId,
@@ -49,8 +58,17 @@ const MessageRenderer: GroupChannelProps['Fragment']['renderMessage'] = ({
49
58
  rest.nextMessage,
50
59
  );
51
60
 
61
+ const { features } = useSendbirdChat();
62
+
63
+ const reactionChildren = useIIFE(() => {
64
+ if (shouldRenderReaction(channel, features.reactionEnabled) && message.reactions && message.reactions.length > 0) {
65
+ return <ReactionAddons.Message channel={channel} message={message} />;
66
+ }
67
+ return null;
68
+ });
69
+
52
70
  const messageComponent = useIIFE(() => {
53
- const pressableProps = {
71
+ const pressableProps: PressableProps = {
54
72
  style: styles.msgContainer,
55
73
  disabled: !onPress && !onLongPress,
56
74
  onPress,
@@ -62,7 +80,17 @@ const MessageRenderer: GroupChannelProps['Fragment']['renderMessage'] = ({
62
80
  if (message.isUserMessage()) {
63
81
  return (
64
82
  <Pressable {...pressableProps}>
65
- {({ pressed }) => <UserMessage message={message} pressed={pressed} {...messageProps} />}
83
+ {({ pressed }) => (
84
+ <UserMessage
85
+ message={message}
86
+ pressed={pressed}
87
+ onLongPressURL={onLongPress}
88
+ onLongPressMentionedUser={onLongPress}
89
+ {...messageProps}
90
+ >
91
+ {reactionChildren}
92
+ </UserMessage>
93
+ )}
66
94
  </Pressable>
67
95
  );
68
96
  }
@@ -70,7 +98,11 @@ const MessageRenderer: GroupChannelProps['Fragment']['renderMessage'] = ({
70
98
  if (message.isFileMessage()) {
71
99
  return (
72
100
  <Pressable {...pressableProps}>
73
- {({ pressed }) => <FileMessage message={message} pressed={pressed} {...messageProps} />}
101
+ {({ pressed }) => (
102
+ <FileMessage message={message} pressed={pressed} {...messageProps}>
103
+ {reactionChildren}
104
+ </FileMessage>
105
+ )}
74
106
  </Pressable>
75
107
  );
76
108
  }
@@ -0,0 +1,106 @@
1
+ import React from 'react';
2
+ import { Pressable, View } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+
5
+ import { useChannelHandler } from '@sendbird/uikit-chat-hooks';
6
+ import { Icon, Image, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
7
+ import { SendbirdBaseChannel, SendbirdBaseMessage, useUniqId } from '@sendbird/uikit-utils';
8
+
9
+ import { UNKNOWN_USER_ID } from '../../constants';
10
+ import { useReaction, useSendbirdChat } from '../../hooks/useContext';
11
+
12
+ type Props = {
13
+ onClose: () => Promise<void>;
14
+ channel: SendbirdBaseChannel;
15
+ message: SendbirdBaseMessage;
16
+ };
17
+ const COMPONENT_NAME = 'BottomSheetReactionAddon';
18
+ const BottomSheetReactionAddon = ({ onClose, message, channel }: Props) => {
19
+ const { emojiManager, currentUser, sdk } = useSendbirdChat();
20
+ const { updateReactionFocusedItem, openReactionList } = useReaction();
21
+ const { colors } = useUIKitTheme();
22
+ const id = useUniqId(COMPONENT_NAME);
23
+ const { left, right } = useSafeAreaInsets();
24
+
25
+ useChannelHandler(sdk, COMPONENT_NAME + id, {
26
+ async onReactionUpdated(eventChannel, event) {
27
+ if (channel?.url === eventChannel.url && event.messageId === message?.messageId) {
28
+ updateReactionFocusedItem({
29
+ message: await sdk.message.getMessage({
30
+ includeReactions: true,
31
+ messageId: message.messageId,
32
+ channelUrl: message.channelUrl,
33
+ channelType: message.channelType,
34
+ }),
35
+ });
36
+ }
37
+ },
38
+ });
39
+
40
+ const emojiAll = emojiManager.allEmoji.slice(0, 5);
41
+ const color = colors.ui.reaction.default;
42
+
43
+ return (
44
+ <View style={[styles.container, { marginRight: right, marginLeft: left }]}>
45
+ {emojiAll.map(({ key, url }) => {
46
+ const reactionUserIds = message?.reactions?.find((it) => it.key === key)?.userIds ?? [];
47
+ const currentUserIdx = reactionUserIds.indexOf(currentUser?.userId ?? UNKNOWN_USER_ID);
48
+ const reacted = currentUserIdx > -1;
49
+
50
+ const onPress = () => {
51
+ if (reacted) channel.deleteReaction(message, key);
52
+ else channel.addReaction(message, key);
53
+ onClose();
54
+ };
55
+
56
+ return (
57
+ <Pressable
58
+ key={key}
59
+ onPress={onPress}
60
+ style={({ pressed }) => [
61
+ styles.button,
62
+ { backgroundColor: reacted || pressed ? color.selected.background : color.enabled.background },
63
+ ]}
64
+ >
65
+ <Image source={{ uri: url }} style={styles.emoji} />
66
+ </Pressable>
67
+ );
68
+ })}
69
+
70
+ <Pressable
71
+ onPress={async () => {
72
+ await onClose();
73
+ openReactionList({ channel, message });
74
+ }}
75
+ style={({ pressed }) => [
76
+ styles.button,
77
+ { backgroundColor: pressed ? color.selected.background : color.enabled.background },
78
+ ]}
79
+ >
80
+ <Icon icon={'emoji-more'} style={styles.emoji} color={colors.onBackground03} />
81
+ </Pressable>
82
+ </View>
83
+ );
84
+ };
85
+
86
+ const styles = createStyleSheet({
87
+ container: {
88
+ paddingTop: 12,
89
+ paddingBottom: 16,
90
+ paddingHorizontal: 18,
91
+ flexDirection: 'row',
92
+ justifyContent: 'space-between',
93
+ },
94
+ button: {
95
+ width: 44,
96
+ height: 44,
97
+ padding: 4,
98
+ borderRadius: 8,
99
+ },
100
+ emoji: {
101
+ width: '100%',
102
+ height: '100%',
103
+ },
104
+ });
105
+
106
+ export default BottomSheetReactionAddon;
@@ -0,0 +1,123 @@
1
+ import React from 'react';
2
+ import { Pressable } from 'react-native';
3
+
4
+ import type { Emoji } from '@sendbird/chat';
5
+ import { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
6
+ import type { SendbirdBaseChannel, SendbirdBaseMessage, SendbirdReaction } from '@sendbird/uikit-utils';
7
+ import { getReactionCount } from '@sendbird/uikit-utils';
8
+
9
+ import { DEFAULT_LONG_PRESS_DELAY, UNKNOWN_USER_ID } from '../../constants';
10
+ import { useReaction, useSendbirdChat } from '../../hooks/useContext';
11
+ import ReactionRoundedButton from './ReactionRoundedButton';
12
+
13
+ const NUM_COL = 4;
14
+ const REACTION_MORE_KEY = 'reaction-more-button';
15
+
16
+ const getUserReacted = (reaction: SendbirdReaction, userId = UNKNOWN_USER_ID) => {
17
+ return reaction.userIds.indexOf(userId) > -1;
18
+ };
19
+
20
+ const createOnPressReaction = (
21
+ reaction: SendbirdReaction,
22
+ channel: SendbirdBaseChannel,
23
+ message: SendbirdBaseMessage,
24
+ reacted: boolean,
25
+ ) => {
26
+ return () => {
27
+ if (reacted) {
28
+ return channel.deleteReaction(message, reaction.key);
29
+ } else {
30
+ return channel.addReaction(message, reaction.key);
31
+ }
32
+ };
33
+ };
34
+
35
+ const createReactionButtons = (
36
+ channel: SendbirdBaseChannel,
37
+ message: SendbirdBaseMessage,
38
+ getEmoji: (key: string) => Emoji,
39
+ emojiLimit: number,
40
+ onOpenReactionList: () => void,
41
+ onOpenReactionUserList: (focusIndex: number) => void,
42
+ currentUserId?: string,
43
+ ) => {
44
+ const reactions = message.reactions ?? [];
45
+ const buttons = reactions.map((reaction, index) => {
46
+ const isNotLastOfRow = index % NUM_COL !== NUM_COL - 1;
47
+ const isNotLastOfCol = index < NUM_COL && reactions.length >= NUM_COL;
48
+ return (
49
+ <Pressable
50
+ key={reaction.key}
51
+ onPress={createOnPressReaction(reaction, channel, message, getUserReacted(reaction, currentUserId))}
52
+ onLongPress={() => onOpenReactionUserList(index)}
53
+ delayLongPress={DEFAULT_LONG_PRESS_DELAY}
54
+ >
55
+ {({ pressed }) => (
56
+ <ReactionRoundedButton
57
+ url={getEmoji(reaction.key).url}
58
+ count={getReactionCount(reaction)}
59
+ reacted={pressed || getUserReacted(reaction, currentUserId)}
60
+ style={[isNotLastOfRow && styles.marginRight, isNotLastOfCol && styles.marginBottom]}
61
+ />
62
+ )}
63
+ </Pressable>
64
+ );
65
+ });
66
+ if (buttons.length < emojiLimit) {
67
+ buttons.push(
68
+ <Pressable key={REACTION_MORE_KEY} onPress={onOpenReactionList}>
69
+ {({ pressed }) => <ReactionRoundedButton.More pressed={pressed} />}
70
+ </Pressable>,
71
+ );
72
+ }
73
+
74
+ return buttons;
75
+ };
76
+
77
+ const MessageReactionAddon = ({ channel, message }: { channel: SendbirdBaseChannel; message: SendbirdBaseMessage }) => {
78
+ const { colors } = useUIKitTheme();
79
+ const { emojiManager, currentUser } = useSendbirdChat();
80
+ const { openReactionList, openReactionUserList } = useReaction();
81
+
82
+ if (!message.reactions?.length) return null;
83
+
84
+ const reactionButtons = createReactionButtons(
85
+ channel,
86
+ message,
87
+ (key) => emojiManager.allEmojiMap[key],
88
+ emojiManager.allEmoji.length,
89
+ () => openReactionList({ channel, message }),
90
+ (focusIndex) => openReactionUserList({ channel, message, focusIndex }),
91
+ currentUser?.userId,
92
+ );
93
+
94
+ return (
95
+ <Pressable
96
+ style={[
97
+ styles.reactionContainer,
98
+ { backgroundColor: colors.background, borderColor: colors.ui.reaction.rounded.enabled.background },
99
+ ]}
100
+ >
101
+ {reactionButtons}
102
+ </Pressable>
103
+ );
104
+ };
105
+
106
+ const styles = createStyleSheet({
107
+ reactionContainer: {
108
+ alignItems: 'stretch',
109
+ flexDirection: 'row',
110
+ flexWrap: 'wrap',
111
+ padding: 8,
112
+ borderRadius: 16,
113
+ borderWidth: 1,
114
+ },
115
+ marginRight: {
116
+ marginRight: 4.5,
117
+ },
118
+ marginBottom: {
119
+ marginBottom: 4,
120
+ },
121
+ });
122
+
123
+ export default MessageReactionAddon;
@@ -0,0 +1,71 @@
1
+ import React from 'react';
2
+ import { StyleProp, View, ViewStyle } from 'react-native';
3
+
4
+ import { Icon, Image, Text, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
5
+ import { truncatedCount } from '@sendbird/uikit-utils';
6
+
7
+ type Props = {
8
+ url: string;
9
+ count: number;
10
+ reacted: boolean;
11
+ style: StyleProp<ViewStyle>;
12
+ };
13
+
14
+ const ReactionRoundedButton = ({ url, count, reacted, style }: Props) => {
15
+ const { colors } = useUIKitTheme();
16
+ const color = colors.ui.reaction.rounded;
17
+
18
+ return (
19
+ <View
20
+ style={[
21
+ styles.reactionContainer,
22
+ { backgroundColor: reacted ? color.selected.background : color.enabled.background },
23
+ style,
24
+ ]}
25
+ >
26
+ <Image source={{ uri: url }} style={styles.emoji} />
27
+ <Text caption4 color={colors.onBackground01} numberOfLines={1} style={styles.count}>
28
+ {truncatedCount(count, 99, '')}
29
+ </Text>
30
+ </View>
31
+ );
32
+ };
33
+
34
+ ReactionRoundedButton.More = ({ pressed }: { pressed: boolean }) => {
35
+ const { colors } = useUIKitTheme();
36
+ const color = colors.ui.reaction.rounded;
37
+
38
+ return (
39
+ <View
40
+ style={[
41
+ styles.reactionContainer,
42
+ { backgroundColor: pressed ? color.selected.background : color.enabled.background },
43
+ ]}
44
+ >
45
+ <Icon icon={'emoji-more'} color={colors.onBackground03} size={20} />
46
+ </View>
47
+ );
48
+ };
49
+
50
+ const styles = createStyleSheet({
51
+ reactionContainer: {
52
+ flexDirection: 'row',
53
+ justifyContent: 'center',
54
+ alignItems: 'center',
55
+ width: 52,
56
+ borderRadius: 24,
57
+ paddingVertical: 5,
58
+ paddingHorizontal: 8,
59
+ },
60
+ emoji: {
61
+ width: 20,
62
+ height: 20,
63
+ marginRight: 4,
64
+ },
65
+ count: {
66
+ width: 13,
67
+ textAlign: 'left',
68
+ },
69
+ });
70
+
71
+ export default ReactionRoundedButton;
@@ -0,0 +1,7 @@
1
+ import BottomSheet from './BottomSheetReactionAddon';
2
+ import Message from './MessageReactionAddon';
3
+
4
+ export const ReactionAddons = {
5
+ BottomSheet,
6
+ Message,
7
+ };