@sendbird/uikit-react-native 2.1.0 → 2.2.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 (388) hide show
  1. package/lib/commonjs/components/ChatFlatList.js +2 -1
  2. package/lib/commonjs/components/ChatFlatList.js.map +1 -1
  3. package/lib/commonjs/components/MessageRenderer/FileMessage/BaseFileMessage.js +11 -6
  4. package/lib/commonjs/components/MessageRenderer/FileMessage/BaseFileMessage.js.map +1 -1
  5. package/lib/commonjs/components/MessageRenderer/FileMessage/ImageFileMessage.js +12 -2
  6. package/lib/commonjs/components/MessageRenderer/FileMessage/ImageFileMessage.js.map +1 -1
  7. package/lib/commonjs/components/MessageRenderer/FileMessage/VideoFileMessage.js +25 -10
  8. package/lib/commonjs/components/MessageRenderer/FileMessage/VideoFileMessage.js.map +1 -1
  9. package/lib/commonjs/components/MessageRenderer/UserMessage/BaseUserMessage.js +86 -10
  10. package/lib/commonjs/components/MessageRenderer/UserMessage/BaseUserMessage.js.map +1 -1
  11. package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +99 -14
  12. package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
  13. package/lib/commonjs/components/MessageRenderer/UserMessage/index.js.map +1 -1
  14. package/lib/commonjs/components/MessageRenderer/index.js +22 -3
  15. package/lib/commonjs/components/MessageRenderer/index.js.map +1 -1
  16. package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js +150 -0
  17. package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -0
  18. package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js +135 -0
  19. package/lib/commonjs/components/ReactionAddons/MessageReactionAddon.js.map +1 -0
  20. package/lib/commonjs/components/ReactionAddons/ReactionRoundedButton.js +87 -0
  21. package/lib/commonjs/components/ReactionAddons/ReactionRoundedButton.js.map +1 -0
  22. package/lib/commonjs/components/ReactionAddons/index.js +19 -0
  23. package/lib/commonjs/components/ReactionAddons/index.js.map +1 -0
  24. package/lib/commonjs/components/ReactionBottomSheets/ReactionListBottomSheet.js +150 -0
  25. package/lib/commonjs/components/ReactionBottomSheets/ReactionListBottomSheet.js.map +1 -0
  26. package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +276 -0
  27. package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -0
  28. package/lib/commonjs/components/ReactionBottomSheets/index.js +19 -0
  29. package/lib/commonjs/components/ReactionBottomSheets/index.js.map +1 -0
  30. package/lib/commonjs/constants.js +3 -1
  31. package/lib/commonjs/constants.js.map +1 -1
  32. package/lib/commonjs/containers/GroupChannelPreviewContainer.js +4 -1
  33. package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -1
  34. package/lib/commonjs/containers/SendbirdUIKitContainer.js +118 -78
  35. package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
  36. package/lib/commonjs/contexts/ReactionCtx.js +107 -0
  37. package/lib/commonjs/contexts/ReactionCtx.js.map +1 -0
  38. package/lib/commonjs/contexts/SendbirdChatCtx.js +18 -6
  39. package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
  40. package/lib/commonjs/contexts/UserProfileCtx.js +9 -0
  41. package/lib/commonjs/contexts/UserProfileCtx.js.map +1 -1
  42. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/EditInput.js +33 -37
  43. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/EditInput.js.map +1 -1
  44. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js +28 -11
  45. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -1
  46. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js +120 -31
  47. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
  48. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +31 -12
  49. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  50. package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +210 -0
  51. package/lib/commonjs/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -0
  52. package/lib/commonjs/domain/groupChannel/index.js +8 -0
  53. package/lib/commonjs/domain/groupChannel/index.js.map +1 -1
  54. package/lib/commonjs/domain/groupChannel/module/createGroupChannelModule.js +4 -0
  55. package/lib/commonjs/domain/groupChannel/module/createGroupChannelModule.js.map +1 -1
  56. package/lib/commonjs/domain/groupChannel/module/moduleContext.js +4 -4
  57. package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
  58. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  59. package/lib/commonjs/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js +3 -2
  60. package/lib/commonjs/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js.map +1 -1
  61. package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js +2 -1
  62. package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
  63. package/lib/commonjs/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js +2 -1
  64. package/lib/commonjs/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js.map +1 -1
  65. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js +39 -0
  66. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js.map +1 -0
  67. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js +140 -0
  68. package/lib/commonjs/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js.map +1 -0
  69. package/lib/commonjs/domain/groupChannelNotifications/index.js +46 -0
  70. package/lib/commonjs/domain/groupChannelNotifications/index.js.map +1 -0
  71. package/lib/commonjs/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js +33 -0
  72. package/lib/commonjs/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js.map +1 -0
  73. package/lib/commonjs/domain/groupChannelNotifications/module/moduleContext.js +45 -0
  74. package/lib/commonjs/domain/groupChannelNotifications/module/moduleContext.js.map +1 -0
  75. package/lib/commonjs/domain/groupChannelNotifications/types.js +6 -0
  76. package/lib/commonjs/domain/groupChannelNotifications/types.js.map +1 -0
  77. package/lib/commonjs/domain/groupChannelOperators/component/GroupChannelOperatorsList.js +2 -1
  78. package/lib/commonjs/domain/groupChannelOperators/component/GroupChannelOperatorsList.js.map +1 -1
  79. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +49 -6
  80. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  81. package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js +9 -14
  82. package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
  83. package/lib/commonjs/domain/groupChannelSettings/types.js.map +1 -1
  84. package/lib/commonjs/domain/groupChannelUserList/types.js.map +1 -1
  85. package/lib/commonjs/domain/userList/component/UserListList.js +4 -1
  86. package/lib/commonjs/domain/userList/component/UserListList.js.map +1 -1
  87. package/lib/commonjs/domain/userList/module/createUserListModule.js.map +1 -1
  88. package/lib/commonjs/fragments/createGroupChannelCreateFragment.js.map +1 -1
  89. package/lib/commonjs/fragments/createGroupChannelFragment.js +11 -4
  90. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  91. package/lib/commonjs/fragments/createGroupChannelInviteFragment.js.map +1 -1
  92. package/lib/commonjs/fragments/createGroupChannelNotificationsFragment.js +34 -0
  93. package/lib/commonjs/fragments/createGroupChannelNotificationsFragment.js.map +1 -0
  94. package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js +3 -1
  95. package/lib/commonjs/fragments/createGroupChannelSettingsFragment.js.map +1 -1
  96. package/lib/commonjs/hooks/useConnection.js +3 -0
  97. package/lib/commonjs/hooks/useConnection.js.map +1 -1
  98. package/lib/commonjs/hooks/useContext.js +11 -1
  99. package/lib/commonjs/hooks/useContext.js.map +1 -1
  100. package/lib/commonjs/hooks/useKeyboardStatus.js +93 -0
  101. package/lib/commonjs/hooks/useKeyboardStatus.js.map +1 -0
  102. package/lib/commonjs/hooks/useMentionSuggestion.js +110 -0
  103. package/lib/commonjs/hooks/useMentionSuggestion.js.map +1 -0
  104. package/lib/commonjs/hooks/useMentionTextInput.js +139 -0
  105. package/lib/commonjs/hooks/useMentionTextInput.js.map +1 -0
  106. package/lib/commonjs/index.js +95 -40
  107. package/lib/commonjs/index.js.map +1 -1
  108. package/lib/commonjs/libs/EmojiManager.js +100 -0
  109. package/lib/commonjs/libs/EmojiManager.js.map +1 -0
  110. package/lib/commonjs/libs/MentionConfig.js +47 -0
  111. package/lib/commonjs/libs/MentionConfig.js.map +1 -0
  112. package/lib/commonjs/libs/MentionManager.js +235 -0
  113. package/lib/commonjs/libs/MentionManager.js.map +1 -0
  114. package/lib/commonjs/localization/StringSet.type.js +17 -5
  115. package/lib/commonjs/localization/StringSet.type.js.map +1 -1
  116. package/lib/commonjs/types.js.map +1 -1
  117. package/lib/commonjs/utils/common.js +19 -0
  118. package/lib/commonjs/utils/common.js.map +1 -0
  119. package/lib/commonjs/version.js +1 -1
  120. package/lib/commonjs/version.js.map +1 -1
  121. package/lib/module/components/ChatFlatList.js +3 -2
  122. package/lib/module/components/ChatFlatList.js.map +1 -1
  123. package/lib/module/components/MessageRenderer/FileMessage/BaseFileMessage.js +11 -6
  124. package/lib/module/components/MessageRenderer/FileMessage/BaseFileMessage.js.map +1 -1
  125. package/lib/module/components/MessageRenderer/FileMessage/ImageFileMessage.js +12 -2
  126. package/lib/module/components/MessageRenderer/FileMessage/ImageFileMessage.js.map +1 -1
  127. package/lib/module/components/MessageRenderer/FileMessage/VideoFileMessage.js +25 -10
  128. package/lib/module/components/MessageRenderer/FileMessage/VideoFileMessage.js.map +1 -1
  129. package/lib/module/components/MessageRenderer/UserMessage/BaseUserMessage.js +86 -12
  130. package/lib/module/components/MessageRenderer/UserMessage/BaseUserMessage.js.map +1 -1
  131. package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +101 -17
  132. package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
  133. package/lib/module/components/MessageRenderer/UserMessage/index.js.map +1 -1
  134. package/lib/module/components/MessageRenderer/index.js +21 -4
  135. package/lib/module/components/MessageRenderer/index.js.map +1 -1
  136. package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js +132 -0
  137. package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -0
  138. package/lib/module/components/ReactionAddons/MessageReactionAddon.js +118 -0
  139. package/lib/module/components/ReactionAddons/MessageReactionAddon.js.map +1 -0
  140. package/lib/module/components/ReactionAddons/ReactionRoundedButton.js +74 -0
  141. package/lib/module/components/ReactionAddons/ReactionRoundedButton.js.map +1 -0
  142. package/lib/module/components/ReactionAddons/index.js +7 -0
  143. package/lib/module/components/ReactionAddons/index.js.map +1 -0
  144. package/lib/module/components/ReactionBottomSheets/ReactionListBottomSheet.js +135 -0
  145. package/lib/module/components/ReactionBottomSheets/ReactionListBottomSheet.js.map +1 -0
  146. package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +259 -0
  147. package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -0
  148. package/lib/module/components/ReactionBottomSheets/index.js +7 -0
  149. package/lib/module/components/ReactionBottomSheets/index.js.map +1 -0
  150. package/lib/module/constants.js +1 -0
  151. package/lib/module/constants.js.map +1 -1
  152. package/lib/module/containers/GroupChannelPreviewContainer.js +4 -1
  153. package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -1
  154. package/lib/module/containers/SendbirdUIKitContainer.js +116 -80
  155. package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
  156. package/lib/module/contexts/ReactionCtx.js +85 -0
  157. package/lib/module/contexts/ReactionCtx.js.map +1 -0
  158. package/lib/module/contexts/SendbirdChatCtx.js +18 -6
  159. package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
  160. package/lib/module/contexts/UserProfileCtx.js +7 -0
  161. package/lib/module/contexts/UserProfileCtx.js.map +1 -1
  162. package/lib/module/domain/groupChannel/component/GroupChannelInput/EditInput.js +34 -39
  163. package/lib/module/domain/groupChannel/component/GroupChannelInput/EditInput.js.map +1 -1
  164. package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js +24 -13
  165. package/lib/module/domain/groupChannel/component/GroupChannelInput/SendInput.js.map +1 -1
  166. package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js +117 -33
  167. package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
  168. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +32 -14
  169. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  170. package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js +188 -0
  171. package/lib/module/domain/groupChannel/component/GroupChannelSuggestedMentionList.js.map +1 -0
  172. package/lib/module/domain/groupChannel/index.js +1 -0
  173. package/lib/module/domain/groupChannel/index.js.map +1 -1
  174. package/lib/module/domain/groupChannel/module/createGroupChannelModule.js +3 -0
  175. package/lib/module/domain/groupChannel/module/createGroupChannelModule.js.map +1 -1
  176. package/lib/module/domain/groupChannel/module/moduleContext.js +4 -4
  177. package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
  178. package/lib/module/domain/groupChannel/types.js.map +1 -1
  179. package/lib/module/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js +4 -3
  180. package/lib/module/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.js.map +1 -1
  181. package/lib/module/domain/groupChannelList/component/GroupChannelListList.js +3 -2
  182. package/lib/module/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
  183. package/lib/module/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js +3 -2
  184. package/lib/module/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.js.map +1 -1
  185. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js +25 -0
  186. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.js.map +1 -0
  187. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js +122 -0
  188. package/lib/module/domain/groupChannelNotifications/component/GroupChannelNotificationsView.js.map +1 -0
  189. package/lib/module/domain/groupChannelNotifications/index.js +5 -0
  190. package/lib/module/domain/groupChannelNotifications/index.js.map +1 -0
  191. package/lib/module/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js +21 -0
  192. package/lib/module/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.js.map +1 -0
  193. package/lib/module/domain/groupChannelNotifications/module/moduleContext.js +25 -0
  194. package/lib/module/domain/groupChannelNotifications/module/moduleContext.js.map +1 -0
  195. package/lib/module/domain/groupChannelNotifications/types.js +2 -0
  196. package/lib/module/domain/groupChannelNotifications/types.js.map +1 -0
  197. package/lib/module/domain/groupChannelOperators/component/GroupChannelOperatorsList.js +3 -2
  198. package/lib/module/domain/groupChannelOperators/component/GroupChannelOperatorsList.js.map +1 -1
  199. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +46 -6
  200. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  201. package/lib/module/domain/groupChannelSettings/module/moduleContext.js +10 -15
  202. package/lib/module/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
  203. package/lib/module/domain/groupChannelSettings/types.js.map +1 -1
  204. package/lib/module/domain/groupChannelUserList/types.js.map +1 -1
  205. package/lib/module/domain/userList/component/UserListList.js +3 -1
  206. package/lib/module/domain/userList/component/UserListList.js.map +1 -1
  207. package/lib/module/domain/userList/module/createUserListModule.js.map +1 -1
  208. package/lib/module/fragments/createGroupChannelCreateFragment.js.map +1 -1
  209. package/lib/module/fragments/createGroupChannelFragment.js +11 -4
  210. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  211. package/lib/module/fragments/createGroupChannelInviteFragment.js.map +1 -1
  212. package/lib/module/fragments/createGroupChannelNotificationsFragment.js +22 -0
  213. package/lib/module/fragments/createGroupChannelNotificationsFragment.js.map +1 -0
  214. package/lib/module/fragments/createGroupChannelSettingsFragment.js +3 -1
  215. package/lib/module/fragments/createGroupChannelSettingsFragment.js.map +1 -1
  216. package/lib/module/hooks/useConnection.js +3 -0
  217. package/lib/module/hooks/useConnection.js.map +1 -1
  218. package/lib/module/hooks/useContext.js +6 -0
  219. package/lib/module/hooks/useContext.js.map +1 -1
  220. package/lib/module/hooks/useKeyboardStatus.js +75 -0
  221. package/lib/module/hooks/useKeyboardStatus.js.map +1 -0
  222. package/lib/module/hooks/useMentionSuggestion.js +100 -0
  223. package/lib/module/hooks/useMentionSuggestion.js.map +1 -0
  224. package/lib/module/hooks/useMentionTextInput.js +128 -0
  225. package/lib/module/hooks/useMentionTextInput.js.map +1 -0
  226. package/lib/module/index.js +8 -3
  227. package/lib/module/index.js.map +1 -1
  228. package/lib/module/libs/EmojiManager.js +90 -0
  229. package/lib/module/libs/EmojiManager.js.map +1 -0
  230. package/lib/module/libs/MentionConfig.js +39 -0
  231. package/lib/module/libs/MentionConfig.js.map +1 -0
  232. package/lib/module/libs/MentionManager.js +223 -0
  233. package/lib/module/libs/MentionManager.js.map +1 -0
  234. package/lib/module/localization/StringSet.type.js +18 -6
  235. package/lib/module/localization/StringSet.type.js.map +1 -1
  236. package/lib/module/types.js.map +1 -1
  237. package/lib/module/utils/common.js +7 -0
  238. package/lib/module/utils/common.js.map +1 -0
  239. package/lib/module/version.js +1 -1
  240. package/lib/module/version.js.map +1 -1
  241. package/lib/typescript/__template__/types.d.ts +3 -3
  242. package/lib/typescript/src/components/ChannelCover.d.ts +1 -1
  243. package/lib/typescript/src/components/ChatFlatList.d.ts +1 -1
  244. package/lib/typescript/src/components/FileViewer.d.ts +1 -1
  245. package/lib/typescript/src/components/MessageRenderer/AdminMessage/index.d.ts +1 -1
  246. package/lib/typescript/src/components/MessageRenderer/FileMessage/BaseFileMessage.d.ts +2 -2
  247. package/lib/typescript/src/components/MessageRenderer/FileMessage/ImageFileMessage.d.ts +1 -1
  248. package/lib/typescript/src/components/MessageRenderer/FileMessage/VideoFileMessage.d.ts +1 -1
  249. package/lib/typescript/src/components/MessageRenderer/FileMessage/index.d.ts +11 -2
  250. package/lib/typescript/src/components/MessageRenderer/MessageDateSeparator.d.ts +1 -1
  251. package/lib/typescript/src/components/MessageRenderer/MessageIncomingAvatar.d.ts +1 -1
  252. package/lib/typescript/src/components/MessageRenderer/MessageIncomingSenderName.d.ts +1 -1
  253. package/lib/typescript/src/components/MessageRenderer/MessageOutgoingStatus.d.ts +1 -1
  254. package/lib/typescript/src/components/MessageRenderer/MessageTime.d.ts +1 -1
  255. package/lib/typescript/src/components/MessageRenderer/UnknownMessage/index.d.ts +1 -1
  256. package/lib/typescript/src/components/MessageRenderer/UserMessage/BaseUserMessage.d.ts +1 -1
  257. package/lib/typescript/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.d.ts +2 -2
  258. package/lib/typescript/src/components/MessageRenderer/UserMessage/index.d.ts +4 -1
  259. package/lib/typescript/src/components/MessageRenderer/index.d.ts +4 -3
  260. package/lib/typescript/src/components/NewMessagesButton.d.ts +1 -1
  261. package/lib/typescript/src/components/ReactionAddons/BottomSheetReactionAddon.d.ts +8 -0
  262. package/lib/typescript/src/components/ReactionAddons/MessageReactionAddon.d.ts +6 -0
  263. package/lib/typescript/src/components/ReactionAddons/ReactionRoundedButton.d.ts +14 -0
  264. package/lib/typescript/src/components/ReactionAddons/index.d.ts +11 -0
  265. package/lib/typescript/src/components/ReactionBottomSheets/ReactionListBottomSheet.d.ts +3 -0
  266. package/lib/typescript/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.d.ts +3 -0
  267. package/lib/typescript/src/components/ReactionBottomSheets/index.d.ts +20 -0
  268. package/lib/typescript/src/components/ScrollToBottomButton.d.ts +1 -1
  269. package/lib/typescript/src/components/StatusComposition.d.ts +1 -1
  270. package/lib/typescript/src/components/TypedPlaceholder.d.ts +1 -1
  271. package/lib/typescript/src/components/UserActionBar.d.ts +1 -1
  272. package/lib/typescript/src/components/UserSelectableBar.d.ts +1 -1
  273. package/lib/typescript/src/constants.d.ts +1 -0
  274. package/lib/typescript/src/containers/GroupChannelPreviewContainer.d.ts +1 -1
  275. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +12 -3
  276. package/lib/typescript/src/contexts/LocalizationCtx.d.ts +2 -2
  277. package/lib/typescript/src/contexts/PlatformServiceCtx.d.ts +1 -1
  278. package/lib/typescript/src/contexts/ReactionCtx.d.ts +18 -0
  279. package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +10 -2
  280. package/lib/typescript/src/contexts/UserProfileCtx.d.ts +4 -4
  281. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/EditInput.d.ts +35 -7
  282. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/SendInput.d.ts +32 -5
  283. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/index.d.ts +19 -2
  284. package/lib/typescript/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.d.ts +3 -0
  285. package/lib/typescript/src/domain/groupChannel/index.d.ts +1 -0
  286. package/lib/typescript/src/domain/groupChannel/module/createGroupChannelModule.d.ts +1 -1
  287. package/lib/typescript/src/domain/groupChannel/types.d.ts +24 -7
  288. package/lib/typescript/src/domain/groupChannelBannedUsers/types.d.ts +3 -3
  289. package/lib/typescript/src/domain/groupChannelList/types.d.ts +2 -2
  290. package/lib/typescript/src/domain/groupChannelModeration/types.d.ts +3 -3
  291. package/lib/typescript/src/domain/groupChannelMutedMembers/types.d.ts +3 -3
  292. package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.d.ts +3 -0
  293. package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsView.d.ts +2 -0
  294. package/lib/typescript/src/domain/groupChannelNotifications/index.d.ts +4 -0
  295. package/lib/typescript/src/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.d.ts +3 -0
  296. package/lib/typescript/src/domain/groupChannelNotifications/module/moduleContext.d.ts +3 -0
  297. package/lib/typescript/src/domain/groupChannelNotifications/types.d.ts +33 -0
  298. package/lib/typescript/src/domain/groupChannelOperators/types.d.ts +3 -3
  299. package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.d.ts +1 -1
  300. package/lib/typescript/src/domain/groupChannelSettings/types.d.ts +3 -1
  301. package/lib/typescript/src/domain/groupChannelUserList/types.d.ts +6 -6
  302. package/lib/typescript/src/domain/userList/component/UserListList.d.ts +2 -1
  303. package/lib/typescript/src/domain/userList/module/createUserListModule.d.ts +2 -1
  304. package/lib/typescript/src/fragments/createGroupChannelCreateFragment.d.ts +1 -1
  305. package/lib/typescript/src/fragments/createGroupChannelInviteFragment.d.ts +1 -1
  306. package/lib/typescript/src/fragments/createGroupChannelNotificationsFragment.d.ts +3 -0
  307. package/lib/typescript/src/hooks/useConnection.d.ts +1 -1
  308. package/lib/typescript/src/hooks/useContext.d.ts +4 -0
  309. package/lib/typescript/src/hooks/useKeyboardStatus.d.ts +6 -0
  310. package/lib/typescript/src/hooks/useMentionSuggestion.d.ts +17 -0
  311. package/lib/typescript/src/hooks/useMentionTextInput.d.ts +18 -0
  312. package/lib/typescript/src/index.d.ts +7 -2
  313. package/lib/typescript/src/libs/EmojiManager.d.ts +16 -0
  314. package/lib/typescript/src/libs/MentionConfig.d.ts +24 -0
  315. package/lib/typescript/src/libs/MentionManager.d.ts +61 -0
  316. package/lib/typescript/src/localization/StringSet.type.d.ts +16 -2
  317. package/lib/typescript/src/platform/createMediaService.expo.d.ts +1 -1
  318. package/lib/typescript/src/platform/createMediaService.native.d.ts +1 -1
  319. package/lib/typescript/src/platform/dynamicModule.d.ts +1 -1
  320. package/lib/typescript/src/platform/types.d.ts +5 -5
  321. package/lib/typescript/src/types.d.ts +13 -4
  322. package/lib/typescript/src/utils/common.d.ts +1 -0
  323. package/lib/typescript/src/version.d.ts +1 -1
  324. package/package.json +6 -6
  325. package/src/components/ChatFlatList.tsx +2 -1
  326. package/src/components/MessageRenderer/FileMessage/BaseFileMessage.tsx +17 -12
  327. package/src/components/MessageRenderer/FileMessage/ImageFileMessage.tsx +25 -18
  328. package/src/components/MessageRenderer/FileMessage/VideoFileMessage.tsx +20 -10
  329. package/src/components/MessageRenderer/UserMessage/BaseUserMessage.tsx +82 -14
  330. package/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.tsx +135 -61
  331. package/src/components/MessageRenderer/UserMessage/index.tsx +8 -1
  332. package/src/components/MessageRenderer/index.tsx +39 -7
  333. package/src/components/ReactionAddons/BottomSheetReactionAddon.tsx +106 -0
  334. package/src/components/ReactionAddons/MessageReactionAddon.tsx +123 -0
  335. package/src/components/ReactionAddons/ReactionRoundedButton.tsx +71 -0
  336. package/src/components/ReactionAddons/index.tsx +7 -0
  337. package/src/components/ReactionBottomSheets/ReactionListBottomSheet.tsx +113 -0
  338. package/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.tsx +249 -0
  339. package/src/components/ReactionBottomSheets/index.tsx +24 -0
  340. package/src/constants.ts +2 -0
  341. package/src/containers/GroupChannelPreviewContainer.tsx +3 -1
  342. package/src/containers/SendbirdUIKitContainer.tsx +141 -83
  343. package/src/contexts/ReactionCtx.tsx +102 -0
  344. package/src/contexts/SendbirdChatCtx.tsx +24 -2
  345. package/src/contexts/UserProfileCtx.tsx +9 -0
  346. package/src/domain/groupChannel/component/GroupChannelInput/EditInput.tsx +56 -30
  347. package/src/domain/groupChannel/component/GroupChannelInput/SendInput.tsx +48 -19
  348. package/src/domain/groupChannel/component/GroupChannelInput/index.tsx +137 -43
  349. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +27 -10
  350. package/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.tsx +173 -0
  351. package/src/domain/groupChannel/index.ts +1 -0
  352. package/src/domain/groupChannel/module/createGroupChannelModule.tsx +12 -1
  353. package/src/domain/groupChannel/module/moduleContext.tsx +4 -4
  354. package/src/domain/groupChannel/types.ts +28 -5
  355. package/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.tsx +3 -2
  356. package/src/domain/groupChannelList/component/GroupChannelListList.tsx +2 -1
  357. package/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.tsx +2 -1
  358. package/src/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.tsx +14 -0
  359. package/src/domain/groupChannelNotifications/component/GroupChannelNotificationsView.tsx +128 -0
  360. package/src/domain/groupChannelNotifications/index.ts +4 -0
  361. package/src/domain/groupChannelNotifications/module/createGroupChannelNotificationsModule.tsx +15 -0
  362. package/src/domain/groupChannelNotifications/module/moduleContext.tsx +31 -0
  363. package/src/domain/groupChannelNotifications/types.ts +38 -0
  364. package/src/domain/groupChannelOperators/component/GroupChannelOperatorsList.tsx +2 -1
  365. package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +42 -3
  366. package/src/domain/groupChannelSettings/module/moduleContext.tsx +9 -12
  367. package/src/domain/groupChannelSettings/types.ts +2 -0
  368. package/src/domain/groupChannelUserList/types.ts +7 -2
  369. package/src/domain/userList/component/UserListList.tsx +5 -1
  370. package/src/domain/userList/module/createUserListModule.tsx +3 -1
  371. package/src/fragments/createGroupChannelCreateFragment.tsx +8 -2
  372. package/src/fragments/createGroupChannelFragment.tsx +19 -6
  373. package/src/fragments/createGroupChannelInviteFragment.tsx +2 -2
  374. package/src/fragments/createGroupChannelNotificationsFragment.tsx +27 -0
  375. package/src/fragments/createGroupChannelSettingsFragment.tsx +2 -0
  376. package/src/hooks/useConnection.ts +3 -1
  377. package/src/hooks/useContext.ts +7 -0
  378. package/src/hooks/useKeyboardStatus.ts +54 -0
  379. package/src/hooks/useMentionSuggestion.ts +106 -0
  380. package/src/hooks/useMentionTextInput.ts +139 -0
  381. package/src/index.ts +13 -2
  382. package/src/libs/EmojiManager.ts +80 -0
  383. package/src/libs/MentionConfig.ts +40 -0
  384. package/src/libs/MentionManager.tsx +240 -0
  385. package/src/localization/StringSet.type.ts +38 -8
  386. package/src/types.ts +12 -0
  387. package/src/utils/common.ts +8 -0
  388. package/src/version.ts +1 -1
@@ -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
+ };
@@ -0,0 +1,113 @@
1
+ import React from 'react';
2
+ import { FlatList, Pressable, View, useWindowDimensions } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+
5
+ import { Image, Modal, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
6
+
7
+ import { UNKNOWN_USER_ID } from '../../constants';
8
+ import type { ReactionBottomSheetProps } from './index';
9
+
10
+ const NUM_COLUMN = 6;
11
+ const ReactionListBottomSheet = ({ visible, onClose, onDismiss, reactionCtx, chatCtx }: ReactionBottomSheetProps) => {
12
+ const { width } = useWindowDimensions();
13
+ const { bottom, left, right } = useSafeAreaInsets();
14
+ const { colors } = useUIKitTheme();
15
+
16
+ const { currentUser, emojiManager } = chatCtx;
17
+ const { channel, message } = reactionCtx;
18
+ const color = colors.ui.reaction.default;
19
+
20
+ return (
21
+ <Modal
22
+ type={'slide'}
23
+ visible={Boolean(visible && channel && message)}
24
+ onClose={onClose}
25
+ onDismiss={onDismiss}
26
+ backgroundStyle={styles.modal}
27
+ >
28
+ <View
29
+ style={[
30
+ styles.container,
31
+ {
32
+ width,
33
+ paddingBottom: bottom,
34
+ backgroundColor: colors.ui.dialog.default.none.background,
35
+ paddingLeft: left + styles.container.paddingHorizontal,
36
+ paddingRight: right + styles.container.paddingHorizontal,
37
+ },
38
+ ]}
39
+ >
40
+ <FlatList
41
+ data={emojiManager.allEmoji}
42
+ numColumns={NUM_COLUMN}
43
+ keyExtractor={(item) => item.key}
44
+ contentContainerStyle={styles.flatlist}
45
+ ItemSeparatorComponent={() => <View style={{ height: 16 }} />}
46
+ renderItem={({ item: { key, url } }) => {
47
+ const reactedUserIds = message?.reactions?.find((it) => it.key === key)?.userIds ?? [];
48
+
49
+ const idx = reactedUserIds.indexOf(currentUser?.userId ?? UNKNOWN_USER_ID);
50
+ const reacted = idx > -1;
51
+
52
+ return (
53
+ <View style={styles.emojiItem}>
54
+ <Pressable
55
+ key={key}
56
+ onPress={() => {
57
+ if (message && channel) {
58
+ if (reacted) channel.deleteReaction(message, key);
59
+ else channel.addReaction(message, key);
60
+ }
61
+ onClose();
62
+ }}
63
+ style={({ pressed }) => [
64
+ styles.button,
65
+ { backgroundColor: reacted || pressed ? color.selected.background : color.enabled.background },
66
+ ]}
67
+ >
68
+ <Image source={{ uri: url }} style={styles.emoji} />
69
+ </Pressable>
70
+ </View>
71
+ );
72
+ }}
73
+ />
74
+ </View>
75
+ </Modal>
76
+ );
77
+ };
78
+
79
+ const styles = createStyleSheet({
80
+ container: {
81
+ overflow: 'hidden',
82
+ borderTopLeftRadius: 8,
83
+ borderTopRightRadius: 8,
84
+ paddingTop: 16,
85
+ paddingHorizontal: 18,
86
+ flexDirection: 'row',
87
+ },
88
+ modal: {
89
+ alignItems: 'center',
90
+ justifyContent: 'flex-end',
91
+ },
92
+ flatlist: {
93
+ width: '100%',
94
+ flexDirection: 'column',
95
+ justifyContent: 'space-between',
96
+ },
97
+ emojiItem: {
98
+ width: `${100 / NUM_COLUMN}%`,
99
+ alignItems: 'center',
100
+ },
101
+ button: {
102
+ width: 44,
103
+ height: 44,
104
+ padding: 4,
105
+ borderRadius: 8,
106
+ },
107
+ emoji: {
108
+ width: '100%',
109
+ height: '100%',
110
+ },
111
+ });
112
+
113
+ export default ReactionListBottomSheet;