@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,4 +1,4 @@
1
- import React, { useEffect, useRef, useState } from 'react';
1
+ import React, { useLayoutEffect, useMemo, useRef, useState } from 'react';
2
2
  import { Platform } from 'react-native';
3
3
  import { SafeAreaProvider } from 'react-native-safe-area-context';
4
4
 
@@ -21,14 +21,20 @@ import type {
21
21
  SendbirdMember,
22
22
  SendbirdUser,
23
23
  } from '@sendbird/uikit-utils';
24
+ import { useIsFirstMount } from '@sendbird/uikit-utils';
24
25
 
25
- import { LocalizationProvider } from '../contexts/LocalizationCtx';
26
+ import { LocalizationContext, LocalizationProvider } from '../contexts/LocalizationCtx';
26
27
  import { PlatformServiceProvider } from '../contexts/PlatformServiceCtx';
28
+ import { ReactionProvider } from '../contexts/ReactionCtx';
27
29
  import type { UIKitFeaturesInSendbirdChatContext } from '../contexts/SendbirdChatCtx';
28
30
  import { SendbirdChatProvider } from '../contexts/SendbirdChatCtx';
29
31
  import { UserProfileProvider } from '../contexts/UserProfileCtx';
30
- import { useLocalization } from '../hooks/useContext';
32
+ import EmojiManager from '../libs/EmojiManager';
33
+ import type { ImageCompressionConfigInterface } from '../libs/ImageCompressionConfig';
34
+ import ImageCompressionConfig from '../libs/ImageCompressionConfig';
31
35
  import InternalLocalCacheStorage from '../libs/InternalLocalCacheStorage';
36
+ import MentionConfig, { MentionConfigInterface } from '../libs/MentionConfig';
37
+ import MentionManager from '../libs/MentionManager';
32
38
  import StringSetEn from '../localization/StringSet.en';
33
39
  import type { StringSet } from '../localization/StringSet.type';
34
40
  import SBUDynamicModule from '../platform/dynamicModule';
@@ -47,6 +53,14 @@ const NetInfo = SBUDynamicModule.get('@react-native-community/netinfo', 'warn');
47
53
  export const SendbirdUIKit = Object.freeze({
48
54
  VERSION,
49
55
  PLATFORM: Platform.OS.toLowerCase(),
56
+ DEFAULT: {
57
+ AUTO_PUSH_TOKEN_REGISTRATION: true,
58
+ CHANNEL_LIST_TYPING_INDICATOR: false,
59
+ CHANNEL_LIST_MESSAGE_RECEIPT_STATUS: false,
60
+ USE_USER_ID_FOR_NICKNAME: false,
61
+ USER_MENTION: false,
62
+ IMAGE_COMPRESSION: true,
63
+ },
50
64
  });
51
65
 
52
66
  export type SendbirdUIKitContainerProps = React.PropsWithChildren<{
@@ -55,7 +69,7 @@ export type SendbirdUIKitContainerProps = React.PropsWithChildren<{
55
69
  file: FileServiceInterface;
56
70
  notification: NotificationServiceInterface;
57
71
  clipboard: ClipboardServiceInterface;
58
- media?: MediaServiceInterface;
72
+ media: MediaServiceInterface;
59
73
  };
60
74
  chatOptions?: {
61
75
  localCacheStorage?: LocalCacheStorage;
@@ -71,6 +85,10 @@ export type SendbirdUIKitContainerProps = React.PropsWithChildren<{
71
85
  defaultHeaderHeight?: number;
72
86
  HeaderComponent?: HeaderStyleContextType['HeaderComponent'];
73
87
  };
88
+ errorBoundary?: {
89
+ onError?: (props: ErrorBoundaryProps) => void;
90
+ ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;
91
+ };
74
92
  toast?: {
75
93
  dismissTimeout?: number;
76
94
  };
@@ -81,10 +99,8 @@ export type SendbirdUIKitContainerProps = React.PropsWithChildren<{
81
99
  users: SendbirdUser[] | SendbirdMember[],
82
100
  ) => SendbirdGroupChannelCreateParams | Promise<SendbirdGroupChannelCreateParams>;
83
101
  };
84
- errorBoundary?: {
85
- onError?: (props: ErrorBoundaryProps) => void;
86
- ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;
87
- };
102
+ userMention?: Pick<Partial<MentionConfigInterface>, 'mentionLimit' | 'suggestionLimit' | 'debounceMills'>;
103
+ imageCompression?: Partial<ImageCompressionConfigInterface>;
88
104
  }>;
89
105
 
90
106
  const SendbirdUIKitContainer = ({
@@ -94,75 +110,92 @@ const SendbirdUIKitContainer = ({
94
110
  platformServices,
95
111
  localization,
96
112
  styles,
113
+ errorBoundary,
97
114
  toast,
98
115
  userProfile,
99
- errorBoundary,
116
+ userMention,
117
+ imageCompression,
100
118
  }: SendbirdUIKitContainerProps) => {
101
- const unsubscribes = useRef<(() => void)[]>([]).current;
102
- const getSendbirdSDK = () => {
103
- let sdk: SendbirdChatSDK;
104
-
105
- sdk = Sendbird.init({
106
- appId,
107
- modules: [new GroupChannelModule(), new OpenChannelModule()],
108
- localCacheEnabled: Boolean(chatOptions?.localCacheStorage),
109
- // @ts-ignore
110
- useAsyncStorageStore: chatOptions?.localCacheStorage
111
- ? new InternalLocalCacheStorage(chatOptions.localCacheStorage)
112
- : undefined,
113
- });
119
+ const defaultStringSet = localization?.stringSet ?? StringSetEn;
114
120
 
115
- if (chatOptions?.onInitialized) {
116
- sdk = chatOptions?.onInitialized(sdk);
117
- }
121
+ const isFirstMount = useIsFirstMount();
122
+ const unsubscribes = useRef<Array<() => void>>([]);
123
+ const internalStorage = useMemo(
124
+ () => (chatOptions?.localCacheStorage ? new InternalLocalCacheStorage(chatOptions.localCacheStorage) : undefined),
125
+ [chatOptions?.localCacheStorage],
126
+ );
118
127
 
119
- if (SendbirdUIKit.VERSION) {
120
- sdk.addExtension('sb_uikit', SendbirdUIKit.VERSION);
121
- }
128
+ const [sdkInstance, setSdkInstance] = useState<SendbirdChatSDK>(() => {
129
+ const sendbird = initializeSendbird(appId, internalStorage, chatOptions?.onInitialized);
130
+ unsubscribes.current = sendbird.unsubscribes;
131
+ return sendbird.chatSDK;
132
+ });
122
133
 
123
- if (SendbirdUIKit.PLATFORM) {
124
- sdk.addExtension('device-os-platform', SendbirdUIKit.PLATFORM);
125
- }
134
+ const emojiManager = useMemo(() => new EmojiManager(internalStorage), [internalStorage]);
126
135
 
127
- if (NetInfo?.addEventListener) {
128
- const listener = (callback: () => void, callbackType: 'online' | 'offline') => {
129
- const unsubscribe = NetInfo.addEventListener((state) => {
130
- const online = Boolean(state.isConnected) || Boolean(state.isInternetReachable);
131
- if (online && callbackType === 'online') callback();
132
- if (!online && callbackType === 'offline') callback();
133
- });
134
- unsubscribes.push(unsubscribe);
135
- return unsubscribe;
136
- };
137
- sdk.setOnlineListener?.((onOnline) => listener(onOnline, 'online'));
138
- sdk.setOfflineListener?.((onOffline) => listener(onOffline, 'offline'));
139
- }
140
- return sdk;
141
- };
136
+ const mentionManager = useMemo(() => {
137
+ const config = new MentionConfig({
138
+ mentionLimit: userMention?.mentionLimit || MentionConfig.DEFAULT.MENTION_LIMIT,
139
+ suggestionLimit: userMention?.suggestionLimit || MentionConfig.DEFAULT.SUGGESTION_LIMIT,
140
+ debounceMills: userMention?.debounceMills ?? MentionConfig.DEFAULT.DEBOUNCE_MILLS,
141
+ delimiter: MentionConfig.DEFAULT.DELIMITER,
142
+ trigger: MentionConfig.DEFAULT.TRIGGER,
143
+ });
144
+ return new MentionManager(config, chatOptions?.enableUserMention ?? SendbirdUIKit.DEFAULT.USER_MENTION);
145
+ }, [userMention?.mentionLimit, userMention?.suggestionLimit, userMention?.debounceMills]);
146
+
147
+ const imageCompressionConfig = useMemo(
148
+ () =>
149
+ new ImageCompressionConfig({
150
+ compressionRate: imageCompression?.compressionRate || ImageCompressionConfig.DEFAULT.COMPRESSION_RATE,
151
+ width: imageCompression?.width,
152
+ height: imageCompression?.height,
153
+ }),
154
+ [imageCompression?.compressionRate, imageCompression?.width, imageCompression?.height],
155
+ );
142
156
 
143
- const [sdkInstance, setSdkInstance] = useState<SendbirdChatSDK>(getSendbirdSDK);
157
+ useLayoutEffect(() => {
158
+ if (!isFirstMount) {
159
+ const sendbird = initializeSendbird(appId, internalStorage, chatOptions?.onInitialized);
160
+ setSdkInstance(sendbird.chatSDK);
161
+ unsubscribes.current = sendbird.unsubscribes;
162
+ }
144
163
 
145
- useEffect(() => {
146
- setSdkInstance(getSendbirdSDK);
147
164
  return () => {
148
- unsubscribes.forEach((u) => {
149
- try {
150
- u();
151
- } catch {}
152
- });
165
+ if (!isFirstMount) {
166
+ unsubscribes.current.forEach((u) => {
167
+ try {
168
+ u();
169
+ } catch {}
170
+ });
171
+ }
153
172
  };
154
- }, [appId, chatOptions?.localCacheStorage]);
173
+ }, [appId, internalStorage]);
155
174
 
156
175
  return (
157
176
  <SafeAreaProvider>
158
177
  <SendbirdChatProvider
159
178
  sdkInstance={sdkInstance}
160
- enableAutoPushTokenRegistration={chatOptions?.enableAutoPushTokenRegistration ?? true}
161
- enableChannelListTypingIndicator={chatOptions?.enableChannelListTypingIndicator ?? false}
162
- enableChannelListMessageReceiptStatus={chatOptions?.enableChannelListMessageReceiptStatus ?? false}
163
- enableUseUserIdForNickname={chatOptions?.enableUseUserIdForNickname ?? false}
179
+ emojiManager={emojiManager}
180
+ mentionManager={mentionManager}
181
+ imageCompressionConfig={imageCompressionConfig}
182
+ enableAutoPushTokenRegistration={
183
+ chatOptions?.enableAutoPushTokenRegistration ?? SendbirdUIKit.DEFAULT.AUTO_PUSH_TOKEN_REGISTRATION
184
+ }
185
+ enableChannelListTypingIndicator={
186
+ chatOptions?.enableChannelListTypingIndicator ?? SendbirdUIKit.DEFAULT.CHANNEL_LIST_TYPING_INDICATOR
187
+ }
188
+ enableChannelListMessageReceiptStatus={
189
+ chatOptions?.enableChannelListMessageReceiptStatus ??
190
+ SendbirdUIKit.DEFAULT.CHANNEL_LIST_MESSAGE_RECEIPT_STATUS
191
+ }
192
+ enableUseUserIdForNickname={
193
+ chatOptions?.enableUseUserIdForNickname ?? SendbirdUIKit.DEFAULT.USE_USER_ID_FOR_NICKNAME
194
+ }
195
+ enableUserMention={chatOptions?.enableUserMention ?? SendbirdUIKit.DEFAULT.USER_MENTION}
196
+ enableImageCompression={chatOptions?.enableImageCompression ?? SendbirdUIKit.DEFAULT.IMAGE_COMPRESSION}
164
197
  >
165
- <LocalizationProvider stringSet={localization?.stringSet ?? StringSetEn}>
198
+ <LocalizationProvider stringSet={defaultStringSet}>
166
199
  <PlatformServiceProvider
167
200
  fileService={platformServices.file}
168
201
  notificationService={platformServices.notification}
@@ -175,16 +208,36 @@ const SendbirdUIKitContainer = ({
175
208
  defaultTitleAlign={styles?.defaultHeaderTitleAlign ?? 'left'}
176
209
  statusBarTranslucent={styles?.statusBarTranslucent ?? true}
177
210
  >
178
- <LocalizedDialogProvider>
179
- <ToastProvider dismissTimeout={toast?.dismissTimeout}>
180
- <UserProfileProvider
181
- onCreateChannel={userProfile?.onCreateChannel}
182
- onBeforeCreateChannel={userProfile?.onBeforeCreateChannel}
183
- >
184
- <InternalErrorBoundaryContainer {...errorBoundary}>{children}</InternalErrorBoundaryContainer>
185
- </UserProfileProvider>
186
- </ToastProvider>
187
- </LocalizedDialogProvider>
211
+ <ToastProvider dismissTimeout={toast?.dismissTimeout}>
212
+ <UserProfileProvider
213
+ onCreateChannel={userProfile?.onCreateChannel}
214
+ onBeforeCreateChannel={userProfile?.onBeforeCreateChannel}
215
+ >
216
+ <ReactionProvider>
217
+ <LocalizationContext.Consumer>
218
+ {(value) => {
219
+ const STRINGS = value?.STRINGS || defaultStringSet;
220
+ return (
221
+ <DialogProvider
222
+ defaultLabels={{
223
+ alert: { ok: STRINGS.DIALOG.ALERT_DEFAULT_OK },
224
+ prompt: {
225
+ ok: STRINGS.DIALOG.PROMPT_DEFAULT_OK,
226
+ cancel: STRINGS.DIALOG.PROMPT_DEFAULT_CANCEL,
227
+ placeholder: STRINGS.DIALOG.PROMPT_DEFAULT_PLACEHOLDER,
228
+ },
229
+ }}
230
+ >
231
+ <InternalErrorBoundaryContainer {...errorBoundary}>
232
+ {children}
233
+ </InternalErrorBoundaryContainer>
234
+ </DialogProvider>
235
+ );
236
+ }}
237
+ </LocalizationContext.Consumer>
238
+ </ReactionProvider>
239
+ </UserProfileProvider>
240
+ </ToastProvider>
188
241
  </HeaderStyleProvider>
189
242
  </UIKitThemeProvider>
190
243
  </PlatformServiceProvider>
@@ -194,24 +247,48 @@ const SendbirdUIKitContainer = ({
194
247
  );
195
248
  };
196
249
 
197
- const LocalizedDialogProvider = ({ children }: React.PropsWithChildren) => {
198
- const { STRINGS } = useLocalization();
199
- return (
200
- <DialogProvider
201
- defaultLabels={{
202
- alert: {
203
- ok: STRINGS.DIALOG.ALERT_DEFAULT_OK,
204
- },
205
- prompt: {
206
- ok: STRINGS.DIALOG.PROMPT_DEFAULT_OK,
207
- cancel: STRINGS.DIALOG.PROMPT_DEFAULT_CANCEL,
208
- placeholder: STRINGS.DIALOG.PROMPT_DEFAULT_PLACEHOLDER,
209
- },
210
- }}
211
- >
212
- {children}
213
- </DialogProvider>
214
- );
250
+ const initializeSendbird = (
251
+ appId: string,
252
+ internalStorage?: InternalLocalCacheStorage,
253
+ onInitialized?: (sdk: SendbirdChatSDK) => SendbirdChatSDK,
254
+ ) => {
255
+ const unsubscribes: Array<() => void> = [];
256
+ let chatSDK: SendbirdChatSDK;
257
+
258
+ chatSDK = Sendbird.init({
259
+ appId,
260
+ modules: [new GroupChannelModule(), new OpenChannelModule()],
261
+ localCacheEnabled: Boolean(internalStorage),
262
+ useAsyncStorageStore: internalStorage as never,
263
+ newInstance: true,
264
+ });
265
+
266
+ if (onInitialized) {
267
+ chatSDK = onInitialized(chatSDK);
268
+ }
269
+
270
+ if (SendbirdUIKit.VERSION) {
271
+ chatSDK.addExtension('sb_uikit', SendbirdUIKit.VERSION);
272
+ }
273
+
274
+ if (SendbirdUIKit.PLATFORM) {
275
+ chatSDK.addExtension('device-os-platform', SendbirdUIKit.PLATFORM);
276
+ }
277
+
278
+ if (NetInfo?.addEventListener) {
279
+ const listener = (callback: () => void, callbackType: 'online' | 'offline') => {
280
+ const unsubscribe = NetInfo.addEventListener((state) => {
281
+ const online = Boolean(state.isConnected) || Boolean(state.isInternetReachable);
282
+ if (online && callbackType === 'online') callback();
283
+ if (!online && callbackType === 'offline') callback();
284
+ });
285
+ unsubscribes.push(unsubscribe);
286
+ return unsubscribe;
287
+ };
288
+ chatSDK.setOnlineListener?.((onOnline) => listener(onOnline, 'online'));
289
+ chatSDK.setOfflineListener?.((onOffline) => listener(onOffline, 'offline'));
290
+ }
291
+ return { chatSDK, unsubscribes };
215
292
  };
216
293
 
217
294
  export default SendbirdUIKitContainer;
@@ -11,10 +11,17 @@ type Props = React.PropsWithChildren<{
11
11
  fileService: FileServiceInterface;
12
12
  clipboardService: ClipboardServiceInterface;
13
13
  notificationService: NotificationServiceInterface;
14
- mediaService?: MediaServiceInterface;
14
+ mediaService: MediaServiceInterface;
15
15
  }>;
16
16
 
17
- export const PlatformServiceContext = React.createContext<Props | null>(null);
17
+ export type PlatformServiceContextType = {
18
+ fileService: FileServiceInterface;
19
+ clipboardService: ClipboardServiceInterface;
20
+ notificationService: NotificationServiceInterface;
21
+ mediaService: MediaServiceInterface;
22
+ };
23
+
24
+ export const PlatformServiceContext = React.createContext<PlatformServiceContextType | null>(null);
18
25
  export const PlatformServiceProvider = ({
19
26
  children,
20
27
  fileService,
@@ -0,0 +1,102 @@
1
+ import React, { useCallback, useContext, useReducer, useRef, useState } from 'react';
2
+
3
+ import type { SendbirdBaseChannel, SendbirdBaseMessage } from '@sendbird/uikit-utils';
4
+ import { NOOP } from '@sendbird/uikit-utils';
5
+
6
+ import { ReactionBottomSheets } from '../components/ReactionBottomSheets';
7
+ import { LocalizationContext } from '../contexts/LocalizationCtx';
8
+ import { SendbirdChatContext } from '../contexts/SendbirdChatCtx';
9
+ import { UserProfileContext } from '../contexts/UserProfileCtx';
10
+
11
+ type State = {
12
+ message?: SendbirdBaseMessage;
13
+ channel?: SendbirdBaseChannel;
14
+ };
15
+ export type ReactionContextType = {
16
+ openReactionList(param: Required<State>): void;
17
+ openReactionUserList(param: Required<State> & { focusIndex?: number }): void;
18
+ updateReactionFocusedItem(param?: State): void;
19
+ focusIndex: number;
20
+ } & State;
21
+
22
+ type Props = React.PropsWithChildren<{}>;
23
+
24
+ export const ReactionContext = React.createContext<ReactionContextType | null>(null);
25
+ export const ReactionProvider = ({ children }: Props) => {
26
+ const chatCtx = useContext(SendbirdChatContext);
27
+ const localizationCtx = useContext(LocalizationContext);
28
+ const userProfileCtx = useContext(UserProfileContext);
29
+ if (!chatCtx) throw new Error('SendbirdChatContext is not provided');
30
+ if (!localizationCtx) throw new Error('LocalizationContext is not provided');
31
+ if (!userProfileCtx) throw new Error('UserProfileContext is not provided');
32
+
33
+ const [state, setState] = useReducer((prev: State, next: State) => ({ ...prev, ...next }), {});
34
+ const [reactionListVisible, setReactionListVisible] = useState(false);
35
+ const [reactionUserListVisible, setReactionUserListVisible] = useState(false);
36
+ const [reactionUserListFocusIndex, setReactionUserListFocusIndex] = useState(0);
37
+
38
+ const closeResolver = useRef<() => void>(NOOP);
39
+
40
+ const openReactionList: ReactionContextType['openReactionList'] = useCallback((params) => {
41
+ setState(params);
42
+ setReactionListVisible(true);
43
+ }, []);
44
+
45
+ const openReactionUserList: ReactionContextType['openReactionUserList'] = useCallback(
46
+ ({ channel, message, focusIndex = 0 }) => {
47
+ setState({ channel, message });
48
+ setReactionUserListFocusIndex(focusIndex);
49
+ setReactionUserListVisible(true);
50
+ },
51
+ [],
52
+ );
53
+
54
+ const updateReactionFocusedItem: ReactionContextType['updateReactionFocusedItem'] = useCallback((params) => {
55
+ if (params) setState(params);
56
+ else setState({});
57
+ }, []);
58
+
59
+ const createOnCloseWithResolver = (callback: () => void) => {
60
+ return () => {
61
+ return new Promise<void>((resolve) => {
62
+ closeResolver.current = resolve;
63
+ callback();
64
+ });
65
+ };
66
+ };
67
+
68
+ const reactionCtx = {
69
+ ...state,
70
+ openReactionList,
71
+ openReactionUserList,
72
+ updateReactionFocusedItem,
73
+ focusIndex: reactionUserListFocusIndex,
74
+ };
75
+
76
+ const sheetProps = {
77
+ chatCtx,
78
+ reactionCtx,
79
+ localizationCtx,
80
+ userProfileCtx,
81
+ onDismiss: () => {
82
+ setState({});
83
+ closeResolver.current?.();
84
+ },
85
+ };
86
+
87
+ return (
88
+ <ReactionContext.Provider value={reactionCtx}>
89
+ {children}
90
+ <ReactionBottomSheets.UserList
91
+ {...sheetProps}
92
+ visible={reactionUserListVisible}
93
+ onClose={createOnCloseWithResolver(() => setReactionUserListVisible(false))}
94
+ />
95
+ <ReactionBottomSheets.ReactionList
96
+ {...sheetProps}
97
+ visible={reactionListVisible}
98
+ onClose={createOnCloseWithResolver(() => setReactionListVisible(false))}
99
+ />
100
+ </ReactionContext.Provider>
101
+ );
102
+ };
@@ -1,5 +1,4 @@
1
- import React, { useCallback, useEffect, useState } from 'react';
2
- import { AppState, AppStateStatus } from 'react-native';
1
+ import React, { useCallback, useState } from 'react';
3
2
 
4
3
  import { useAppFeatures } from '@sendbird/uikit-chat-hooks';
5
4
  import type {
@@ -8,8 +7,11 @@ import type {
8
7
  SendbirdUser,
9
8
  SendbirdUserUpdateParams,
10
9
  } from '@sendbird/uikit-utils';
11
- import { confirmAndMarkAsDelivered, useForceUpdate } from '@sendbird/uikit-utils';
10
+ import { confirmAndMarkAsDelivered, useAppState, useForceUpdate } from '@sendbird/uikit-utils';
12
11
 
12
+ import type EmojiManager from '../libs/EmojiManager';
13
+ import type ImageCompressionConfig from '../libs/ImageCompressionConfig';
14
+ import type MentionManager from '../libs/MentionManager';
13
15
  import type { FileType } from '../platform/types';
14
16
 
15
17
  export interface UIKitFeaturesInSendbirdChatContext {
@@ -17,14 +19,22 @@ export interface UIKitFeaturesInSendbirdChatContext {
17
19
  enableChannelListTypingIndicator: boolean;
18
20
  enableChannelListMessageReceiptStatus: boolean;
19
21
  enableUseUserIdForNickname: boolean;
22
+ enableUserMention: boolean;
23
+ enableImageCompression: boolean;
20
24
  }
21
25
 
22
26
  interface Props extends UIKitFeaturesInSendbirdChatContext, React.PropsWithChildren {
23
27
  sdkInstance: SendbirdChatSDK;
28
+ emojiManager: EmojiManager;
29
+ mentionManager: MentionManager;
30
+ imageCompressionConfig: ImageCompressionConfig;
24
31
  }
25
32
 
26
- type Context = {
33
+ export type SendbirdChatContextType = {
27
34
  sdk: SendbirdChatSDK;
35
+ emojiManager: EmojiManager;
36
+ mentionManager: MentionManager;
37
+ imageCompressionConfig: ImageCompressionConfig;
28
38
  currentUser?: SendbirdUser;
29
39
  setCurrentUser: React.Dispatch<React.SetStateAction<SendbirdUser | undefined>>;
30
40
 
@@ -38,6 +48,8 @@ type Context = {
38
48
  channelListTypingIndicatorEnabled: boolean;
39
49
  channelListMessageReceiptStatusEnabled: boolean;
40
50
  useUserIdForNicknameEnabled: boolean;
51
+ userMentionEnabled: boolean;
52
+ imageCompressionEnabled: boolean;
41
53
 
42
54
  // Sendbird application features
43
55
  deliveryReceiptEnabled: boolean;
@@ -47,34 +59,47 @@ type Context = {
47
59
  };
48
60
  };
49
61
 
50
- export const SendbirdChatContext = React.createContext<Context | null>(null);
62
+ export const SendbirdChatContext = React.createContext<SendbirdChatContextType | null>(null);
51
63
  export const SendbirdChatProvider = ({
52
64
  children,
53
65
  sdkInstance,
66
+ emojiManager,
67
+ mentionManager,
68
+ imageCompressionConfig,
54
69
  enableAutoPushTokenRegistration,
55
70
  enableChannelListMessageReceiptStatus,
56
71
  enableChannelListTypingIndicator,
57
72
  enableUseUserIdForNickname,
73
+ enableUserMention,
74
+ enableImageCompression,
58
75
  }: Props) => {
59
76
  const [currentUser, _setCurrentUser] = useState<SendbirdUser>();
60
77
  const forceUpdate = useForceUpdate();
61
78
  const appFeatures = useAppFeatures(sdkInstance);
62
79
 
63
- const setCurrentUser: Context['setCurrentUser'] = useCallback((user) => {
80
+ const setCurrentUser: SendbirdChatContextType['setCurrentUser'] = useCallback((user) => {
64
81
  // NOTE: Sendbird SDK handle User object is always same object, so force update after setCurrentUser
65
82
  _setCurrentUser(user);
66
83
  forceUpdate();
67
84
  }, []);
68
85
 
69
- const updateCurrentUserInfo: Context['updateCurrentUserInfo'] = useCallback(
86
+ const updateCurrentUserInfo: SendbirdChatContextType['updateCurrentUserInfo'] = useCallback(
70
87
  async (nickname, profile) => {
71
88
  let user = currentUser;
72
89
 
73
90
  if (!user) throw new Error('Current user is not defined, please connect using `useConnection()` hook first');
74
91
 
75
- const params: SendbirdUserUpdateParams = { nickname };
92
+ const params: SendbirdUserUpdateParams = {};
76
93
 
77
- if (typeof profile === 'string') {
94
+ if (!nickname) {
95
+ params.nickname = user.nickname;
96
+ } else {
97
+ params.nickname = nickname;
98
+ }
99
+
100
+ if (!profile) {
101
+ params.profileUrl = user.profileUrl;
102
+ } else if (typeof profile === 'string') {
78
103
  params.profileUrl = profile;
79
104
  } else if (typeof profile === 'object') {
80
105
  params.profileImage = profile;
@@ -90,26 +115,24 @@ export const SendbirdChatProvider = ({
90
115
  [sdkInstance, currentUser, setCurrentUser],
91
116
  );
92
117
 
93
- const markAsDeliveredWithChannel: Context['markAsDeliveredWithChannel'] = useCallback(
118
+ const markAsDeliveredWithChannel: SendbirdChatContextType['markAsDeliveredWithChannel'] = useCallback(
94
119
  (channel: SendbirdGroupChannel) => {
95
120
  if (appFeatures.deliveryReceiptEnabled) confirmAndMarkAsDelivered([channel]);
96
121
  },
97
122
  [sdkInstance, appFeatures.deliveryReceiptEnabled],
98
123
  );
99
124
 
100
- useEffect(() => {
101
- const listener = (status: AppStateStatus) => {
102
- // 'active' | 'background' | 'inactive' | 'unknown' | 'extension';
103
- if (status === 'active') sdkInstance.connectionState === 'CLOSED' && sdkInstance.setForegroundState();
104
- else if (status === 'background') sdkInstance.connectionState === 'OPEN' && sdkInstance.setBackgroundState();
105
- };
106
-
107
- const subscriber = AppState.addEventListener('change', listener);
108
- return () => subscriber.remove();
109
- }, [sdkInstance]);
125
+ useAppState('change', (status) => {
126
+ // 'active' | 'background' | 'inactive' | 'unknown' | 'extension';
127
+ if (status === 'active') sdkInstance.connectionState === 'CLOSED' && sdkInstance.setForegroundState();
128
+ else if (status === 'background') sdkInstance.connectionState === 'OPEN' && sdkInstance.setBackgroundState();
129
+ });
110
130
 
111
- const value: Context = {
131
+ const value: SendbirdChatContextType = {
112
132
  sdk: sdkInstance,
133
+ emojiManager,
134
+ mentionManager,
135
+ imageCompressionConfig,
113
136
  currentUser,
114
137
  setCurrentUser,
115
138
 
@@ -122,6 +145,8 @@ export const SendbirdChatProvider = ({
122
145
  channelListTypingIndicatorEnabled: enableChannelListTypingIndicator,
123
146
  channelListMessageReceiptStatusEnabled: enableChannelListMessageReceiptStatus,
124
147
  useUserIdForNicknameEnabled: enableUseUserIdForNickname,
148
+ userMentionEnabled: enableUserMention,
149
+ imageCompressionEnabled: enableImageCompression,
125
150
  },
126
151
  };
127
152
 
@@ -29,6 +29,8 @@ type Props = React.PropsWithChildren<{
29
29
  onBeforeCreateChannel?: OnBeforeCreateChannel;
30
30
  }>;
31
31
 
32
+ let WARN_onCreateChannel = false;
33
+
32
34
  export const UserProfileContext = React.createContext<UserProfileContextType | null>(null);
33
35
  export const UserProfileProvider = ({ children, onCreateChannel, onBeforeCreateChannel = PASS }: Props) => {
34
36
  const chatContext = useContext(SendbirdChatContext);
@@ -37,6 +39,13 @@ export const UserProfileProvider = ({ children, onCreateChannel, onBeforeCreateC
37
39
  if (!chatContext) throw new Error('SendbirdChatContext is not provided');
38
40
  if (!localizationContext) throw new Error('LocalizationContext is not provided');
39
41
 
42
+ if (__DEV__ && !WARN_onCreateChannel && !onCreateChannel) {
43
+ Logger.warn(
44
+ 'You should pass `userProfile.onCreateChannel` prop to SendbirdUIKitContainer if want to use message in a user profile',
45
+ );
46
+ WARN_onCreateChannel = true;
47
+ }
48
+
40
49
  const { bottom, left, right } = useSafeAreaInsets();
41
50
 
42
51
  const [user, setUser] = useState<SendbirdUser | SendbirdMember>();