@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
@@ -0,0 +1,249 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import { Animated, Easing, Pressable, ScrollView, View, useWindowDimensions } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+
5
+ import {
6
+ Avatar,
7
+ Divider,
8
+ Image,
9
+ Modal,
10
+ Text,
11
+ createStyleSheet,
12
+ useUIKitTheme,
13
+ } from '@sendbird/uikit-react-native-foundation';
14
+ import { SendbirdReaction, getReactionCount, truncatedCount } from '@sendbird/uikit-utils';
15
+
16
+ import type { ReactionBottomSheetProps } from './index';
17
+
18
+ const ReactionUserListBottomSheet = ({
19
+ visible,
20
+ onClose,
21
+ onDismiss,
22
+ reactionCtx,
23
+ chatCtx,
24
+ localizationCtx,
25
+ userProfileCtx,
26
+ }: ReactionBottomSheetProps) => {
27
+ const { width } = useWindowDimensions();
28
+ const { bottom, left, right } = useSafeAreaInsets();
29
+ const { colors } = useUIKitTheme();
30
+
31
+ const [tabIndex, setTabIndex] = useState(0);
32
+ const scrollRef = useRef<ScrollView>();
33
+ const tabIndicatorValue = useRef<Array<{ x: number; width: number }>>([]);
34
+ const tabIndicatorAnimated = useRef({ x: new Animated.Value(0), width: new Animated.Value(0) }).current;
35
+ const focusedWithLayoutCalculated = useRef(false);
36
+
37
+ const { emojiManager } = chatCtx;
38
+ const { channel, message, focusIndex } = reactionCtx;
39
+ const { STRINGS } = localizationCtx;
40
+
41
+ const color = colors.ui.reaction.default;
42
+ const reactions = message?.reactions ?? [];
43
+ const focusedReaction = reactions[tabIndex] as SendbirdReaction | undefined;
44
+ const containerSafeArea = {
45
+ paddingLeft: left + styles.layout.paddingHorizontal,
46
+ paddingRight: right + styles.layout.paddingHorizontal,
47
+ };
48
+
49
+ const focusTab = (index: number, animated = true) => {
50
+ const indicatorValue = tabIndicatorValue.current[index];
51
+ if (indicatorValue) {
52
+ setTabIndex(index);
53
+ animateTabIndicator(indicatorValue.x, indicatorValue.width, animated);
54
+ scrollRef.current?.scrollTo({ x: indicatorValue.x, animated });
55
+ }
56
+ };
57
+
58
+ const animateTabIndicator = (x: number, width: number, animated = true) => {
59
+ const baseConfig = { duration: animated ? 300 : 0, easing: Easing.inOut(Easing.ease), useNativeDriver: false };
60
+ Animated.parallel([
61
+ Animated.timing(tabIndicatorAnimated.x, { toValue: x, ...baseConfig }),
62
+ Animated.timing(tabIndicatorAnimated.width, { toValue: width, ...baseConfig }),
63
+ ]).start();
64
+ };
65
+
66
+ const layoutCalculated = () => {
67
+ return tabIndicatorValue.current.length === reactions.length && tabIndicatorValue.current.every(Boolean);
68
+ };
69
+
70
+ useEffect(() => {
71
+ if (!visible) {
72
+ tabIndicatorValue.current = [];
73
+ tabIndicatorAnimated.x = new Animated.Value(0);
74
+ tabIndicatorAnimated.width = new Animated.Value(0);
75
+ focusedWithLayoutCalculated.current = false;
76
+ }
77
+ }, [visible]);
78
+
79
+ const renderTabs = () => {
80
+ return (
81
+ <Pressable style={styles.tabsWrapper}>
82
+ {reactions.map((reaction, index) => {
83
+ const isFocused = focusedReaction?.key === reaction.key;
84
+ const isLastItem = reactions.length - 1 === index;
85
+ const emoji = emojiManager.allEmojiMap[reaction.key];
86
+
87
+ return (
88
+ <Pressable
89
+ key={reaction.key}
90
+ style={[styles.tabItem, isLastItem && { marginRight: styles.layout.marginRight }]}
91
+ onPress={() => focusTab(index)}
92
+ onLayout={(e) => {
93
+ tabIndicatorValue.current[index] = e.nativeEvent.layout;
94
+ if (layoutCalculated()) {
95
+ if (focusedWithLayoutCalculated.current) {
96
+ focusTab(tabIndex, false);
97
+ } else {
98
+ focusedWithLayoutCalculated.current = true;
99
+ focusTab(focusIndex);
100
+ }
101
+ }
102
+ }}
103
+ >
104
+ <Image source={{ uri: emoji.url }} style={styles.tabEmoji} />
105
+ <Text button color={isFocused ? color.selected.highlight : color.enabled.highlight}>
106
+ {truncatedCount(getReactionCount(reaction))}
107
+ </Text>
108
+ </Pressable>
109
+ );
110
+ })}
111
+ <Animated.View
112
+ style={[
113
+ styles.tabIndicator,
114
+ {
115
+ left: tabIndicatorAnimated.x,
116
+ width: tabIndicatorAnimated.width,
117
+ backgroundColor: color.selected.highlight,
118
+ },
119
+ ]}
120
+ />
121
+ </Pressable>
122
+ );
123
+ };
124
+
125
+ const renderPage = () => {
126
+ return (
127
+ <>
128
+ {focusedReaction?.userIds.map((userId) => {
129
+ if (channel?.isGroupChannel()) {
130
+ const user = channel.members.find((x) => x.userId === userId);
131
+ return (
132
+ <Pressable
133
+ key={userId}
134
+ onPress={async () => {
135
+ if (user) {
136
+ await onClose();
137
+ userProfileCtx.show(user);
138
+ }
139
+ }}
140
+ style={styles.pageItem}
141
+ >
142
+ <Avatar size={36} uri={user?.profileUrl} containerStyle={styles.avatar} />
143
+ <Text subtitle2 style={{ flex: 1 }}>
144
+ {user?.nickname || STRINGS.LABELS.USER_NO_NAME}
145
+ </Text>
146
+ </Pressable>
147
+ );
148
+ }
149
+ return null;
150
+ })}
151
+ </>
152
+ );
153
+ };
154
+
155
+ return (
156
+ <Modal
157
+ type={'slide-no-gesture'}
158
+ visible={Boolean(visible && channel && message)}
159
+ onClose={onClose}
160
+ onDismiss={onDismiss}
161
+ backgroundStyle={styles.modal}
162
+ >
163
+ <View
164
+ style={[
165
+ styles.container,
166
+ { width, paddingBottom: bottom, backgroundColor: colors.ui.dialog.default.none.background },
167
+ ]}
168
+ >
169
+ <ScrollView
170
+ ref={scrollRef as never}
171
+ horizontal
172
+ bounces={false}
173
+ showsHorizontalScrollIndicator={false}
174
+ contentContainerStyle={[containerSafeArea, styles.tabsContainer]}
175
+ >
176
+ {renderTabs()}
177
+ </ScrollView>
178
+ <Divider style={{ top: -1 }} />
179
+ <ScrollView
180
+ bounces={false}
181
+ showsVerticalScrollIndicator={false}
182
+ style={styles.pageContainer}
183
+ contentContainerStyle={containerSafeArea}
184
+ >
185
+ {renderPage()}
186
+ </ScrollView>
187
+ </View>
188
+ </Modal>
189
+ );
190
+ };
191
+
192
+ const styles = createStyleSheet({
193
+ layout: {
194
+ paddingHorizontal: 16,
195
+ marginRight: 0,
196
+ },
197
+ container: {
198
+ overflow: 'hidden',
199
+ borderTopLeftRadius: 8,
200
+ borderTopRightRadius: 8,
201
+ paddingTop: 16,
202
+ alignItems: 'center',
203
+ },
204
+ modal: {
205
+ alignItems: 'center',
206
+ justifyContent: 'flex-end',
207
+ },
208
+ tabsContainer: {
209
+ flexGrow: 1,
210
+ },
211
+ tabsWrapper: {
212
+ flexGrow: 1,
213
+ flexDirection: 'row',
214
+ alignItems: 'flex-start',
215
+ justifyContent: 'center',
216
+ height: 44,
217
+ },
218
+ tabItem: {
219
+ marginRight: 16,
220
+ flexDirection: 'row',
221
+ alignItems: 'center',
222
+ justifyContent: 'center',
223
+ },
224
+ tabEmoji: {
225
+ width: 28,
226
+ height: 28,
227
+ marginRight: 4,
228
+ },
229
+ tabIndicator: {
230
+ position: 'absolute',
231
+ bottom: 0,
232
+ height: 3,
233
+ },
234
+ pageContainer: {
235
+ height: 216,
236
+ width: '100%',
237
+ },
238
+ pageItem: {
239
+ flexDirection: 'row',
240
+ width: '100%',
241
+ height: 48,
242
+ alignItems: 'center',
243
+ },
244
+ avatar: {
245
+ marginRight: 16,
246
+ },
247
+ });
248
+
249
+ export default ReactionUserListBottomSheet;
@@ -0,0 +1,24 @@
1
+ import type React from 'react';
2
+
3
+ import type { LocalizationContext } from '../../contexts/LocalizationCtx';
4
+ import type { ReactionContext } from '../../contexts/ReactionCtx';
5
+ import type { SendbirdChatContext } from '../../contexts/SendbirdChatCtx';
6
+ import type { UserProfileContext } from '../../contexts/UserProfileCtx';
7
+ import ReactionList from './ReactionListBottomSheet';
8
+ import UserList from './ReactionUserListBottomSheet';
9
+
10
+ type GetFromContext<T> = T extends React.Context<infer Value> ? NonNullable<Value> : never;
11
+ export type ReactionBottomSheetProps = {
12
+ visible: boolean;
13
+ onDismiss: () => void;
14
+ onClose: () => Promise<void>;
15
+ chatCtx: GetFromContext<typeof SendbirdChatContext>;
16
+ reactionCtx: GetFromContext<typeof ReactionContext>;
17
+ localizationCtx: GetFromContext<typeof LocalizationContext>;
18
+ userProfileCtx: GetFromContext<typeof UserProfileContext>;
19
+ };
20
+
21
+ export const ReactionBottomSheets = {
22
+ ReactionList,
23
+ UserList,
24
+ };
package/src/constants.ts CHANGED
@@ -4,3 +4,5 @@ export const DEPRECATION_WARNING = {
4
4
  ON_PRESS_IMAGE_MESSAGE: '`onPressImageMessage` is deprecated, please use `onPressMediaMessage` instead',
5
5
  },
6
6
  } as const;
7
+
8
+ export const UNKNOWN_USER_ID = '##__USER_ID_IS_NOT_PROVIDED__##';
@@ -32,7 +32,7 @@ type Props = {
32
32
  onLongPress: () => void;
33
33
  };
34
34
  const GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props) => {
35
- const { currentUser, sdk, features } = useSendbirdChat();
35
+ const { currentUser, sdk, features, mentionManager } = useSendbirdChat();
36
36
  const { STRINGS } = useLocalization();
37
37
  const { colors } = useUIKitTheme();
38
38
 
@@ -100,6 +100,8 @@ const GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props)
100
100
  body={bodyText}
101
101
  bodyIcon={bodyIcon}
102
102
  badgeCount={channel.unreadMessageCount}
103
+ mentioned={channel.unreadMentionCount > 0}
104
+ mentionTrigger={mentionManager.config.trigger}
103
105
  memberCount={channel.memberCount > 2 ? channel.memberCount : undefined}
104
106
  frozen={channel.isFrozen}
105
107
  broadcast={channel.isBroadcast}
@@ -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,18 @@ 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';
31
33
  import InternalLocalCacheStorage from '../libs/InternalLocalCacheStorage';
34
+ import MentionConfig, { MentionConfigInterface } from '../libs/MentionConfig';
35
+ import MentionManager from '../libs/MentionManager';
32
36
  import StringSetEn from '../localization/StringSet.en';
33
37
  import type { StringSet } from '../localization/StringSet.type';
34
38
  import SBUDynamicModule from '../platform/dynamicModule';
@@ -47,6 +51,13 @@ const NetInfo = SBUDynamicModule.get('@react-native-community/netinfo', 'warn');
47
51
  export const SendbirdUIKit = Object.freeze({
48
52
  VERSION,
49
53
  PLATFORM: Platform.OS.toLowerCase(),
54
+ DEFAULT: {
55
+ AUTO_PUSH_TOKEN_REGISTRATION: true,
56
+ CHANNEL_LIST_TYPING_INDICATOR: false,
57
+ CHANNEL_LIST_MESSAGE_RECEIPT_STATUS: false,
58
+ USE_USER_ID_FOR_NICKNAME: false,
59
+ USER_MENTION: false,
60
+ },
50
61
  });
51
62
 
52
63
  export type SendbirdUIKitContainerProps = React.PropsWithChildren<{
@@ -81,6 +92,7 @@ export type SendbirdUIKitContainerProps = React.PropsWithChildren<{
81
92
  users: SendbirdUser[] | SendbirdMember[],
82
93
  ) => SendbirdGroupChannelCreateParams | Promise<SendbirdGroupChannelCreateParams>;
83
94
  };
95
+ userMention?: Pick<Partial<MentionConfigInterface>, 'mentionLimit' | 'suggestionLimit' | 'debounceMills'>;
84
96
  errorBoundary?: {
85
97
  onError?: (props: ErrorBoundaryProps) => void;
86
98
  ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;
@@ -96,73 +108,75 @@ const SendbirdUIKitContainer = ({
96
108
  styles,
97
109
  toast,
98
110
  userProfile,
111
+ userMention,
99
112
  errorBoundary,
100
113
  }: 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
- });
114
-
115
- if (chatOptions?.onInitialized) {
116
- sdk = chatOptions?.onInitialized(sdk);
117
- }
114
+ const defaultStringSet = localization?.stringSet ?? StringSetEn;
118
115
 
119
- if (SendbirdUIKit.VERSION) {
120
- sdk.addExtension('sb_uikit', SendbirdUIKit.VERSION);
121
- }
116
+ const isFirstMount = useIsFirstMount();
117
+ const unsubscribes = useRef<Array<() => void>>([]);
118
+ const internalStorage = useMemo(
119
+ () => (chatOptions?.localCacheStorage ? new InternalLocalCacheStorage(chatOptions.localCacheStorage) : undefined),
120
+ [chatOptions?.localCacheStorage],
121
+ );
122
122
 
123
- if (SendbirdUIKit.PLATFORM) {
124
- sdk.addExtension('device-os-platform', SendbirdUIKit.PLATFORM);
125
- }
123
+ const [sdkInstance, setSdkInstance] = useState<SendbirdChatSDK>(() => {
124
+ const sendbird = initializeSendbird(appId, internalStorage, chatOptions?.onInitialized);
125
+ unsubscribes.current = sendbird.unsubscribes;
126
+ return sendbird.chatSDK;
127
+ });
128
+ const emojiManager = useMemo(() => new EmojiManager(internalStorage), [internalStorage]);
129
+ const mentionManager = useMemo(() => {
130
+ const config = new MentionConfig({
131
+ mentionLimit: userMention?.mentionLimit || MentionConfig.DEFAULT.MENTION_LIMIT,
132
+ suggestionLimit: userMention?.suggestionLimit || MentionConfig.DEFAULT.SUGGESTION_LIMIT,
133
+ debounceMills: userMention?.debounceMills ?? MentionConfig.DEFAULT.DEBOUNCE_MILLS,
134
+ delimiter: MentionConfig.DEFAULT.DELIMITER,
135
+ trigger: MentionConfig.DEFAULT.TRIGGER,
136
+ });
137
+ return new MentionManager(config, chatOptions?.enableUserMention ?? SendbirdUIKit.DEFAULT.USER_MENTION);
138
+ }, [userMention?.mentionLimit, userMention?.suggestionLimit, userMention?.debounceMills]);
126
139
 
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'));
140
+ useLayoutEffect(() => {
141
+ if (!isFirstMount) {
142
+ const sendbird = initializeSendbird(appId, internalStorage, chatOptions?.onInitialized);
143
+ setSdkInstance(sendbird.chatSDK);
144
+ unsubscribes.current = sendbird.unsubscribes;
139
145
  }
140
- return sdk;
141
- };
142
146
 
143
- const [sdkInstance, setSdkInstance] = useState<SendbirdChatSDK>(getSendbirdSDK);
144
-
145
- useEffect(() => {
146
- setSdkInstance(getSendbirdSDK);
147
147
  return () => {
148
- unsubscribes.forEach((u) => {
149
- try {
150
- u();
151
- } catch {}
152
- });
148
+ if (!isFirstMount) {
149
+ unsubscribes.current.forEach((u) => {
150
+ try {
151
+ u();
152
+ } catch {}
153
+ });
154
+ }
153
155
  };
154
- }, [appId, chatOptions?.localCacheStorage]);
156
+ }, [appId, internalStorage]);
155
157
 
156
158
  return (
157
159
  <SafeAreaProvider>
158
160
  <SendbirdChatProvider
159
161
  sdkInstance={sdkInstance}
160
- enableAutoPushTokenRegistration={chatOptions?.enableAutoPushTokenRegistration ?? true}
161
- enableChannelListTypingIndicator={chatOptions?.enableChannelListTypingIndicator ?? false}
162
- enableChannelListMessageReceiptStatus={chatOptions?.enableChannelListMessageReceiptStatus ?? false}
163
- enableUseUserIdForNickname={chatOptions?.enableUseUserIdForNickname ?? false}
162
+ emojiManager={emojiManager}
163
+ mentionManager={mentionManager}
164
+ enableAutoPushTokenRegistration={
165
+ chatOptions?.enableAutoPushTokenRegistration ?? SendbirdUIKit.DEFAULT.AUTO_PUSH_TOKEN_REGISTRATION
166
+ }
167
+ enableChannelListTypingIndicator={
168
+ chatOptions?.enableChannelListTypingIndicator ?? SendbirdUIKit.DEFAULT.CHANNEL_LIST_TYPING_INDICATOR
169
+ }
170
+ enableChannelListMessageReceiptStatus={
171
+ chatOptions?.enableChannelListMessageReceiptStatus ??
172
+ SendbirdUIKit.DEFAULT.CHANNEL_LIST_MESSAGE_RECEIPT_STATUS
173
+ }
174
+ enableUseUserIdForNickname={
175
+ chatOptions?.enableUseUserIdForNickname ?? SendbirdUIKit.DEFAULT.USE_USER_ID_FOR_NICKNAME
176
+ }
177
+ enableUserMention={chatOptions?.enableUserMention ?? SendbirdUIKit.DEFAULT.USER_MENTION}
164
178
  >
165
- <LocalizationProvider stringSet={localization?.stringSet ?? StringSetEn}>
179
+ <LocalizationProvider stringSet={defaultStringSet}>
166
180
  <PlatformServiceProvider
167
181
  fileService={platformServices.file}
168
182
  notificationService={platformServices.notification}
@@ -175,16 +189,36 @@ const SendbirdUIKitContainer = ({
175
189
  defaultTitleAlign={styles?.defaultHeaderTitleAlign ?? 'left'}
176
190
  statusBarTranslucent={styles?.statusBarTranslucent ?? true}
177
191
  >
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>
192
+ <ToastProvider dismissTimeout={toast?.dismissTimeout}>
193
+ <UserProfileProvider
194
+ onCreateChannel={userProfile?.onCreateChannel}
195
+ onBeforeCreateChannel={userProfile?.onBeforeCreateChannel}
196
+ >
197
+ <ReactionProvider>
198
+ <LocalizationContext.Consumer>
199
+ {(value) => {
200
+ const STRINGS = value?.STRINGS || defaultStringSet;
201
+ return (
202
+ <DialogProvider
203
+ defaultLabels={{
204
+ alert: { ok: STRINGS.DIALOG.ALERT_DEFAULT_OK },
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
+ <InternalErrorBoundaryContainer {...errorBoundary}>
213
+ {children}
214
+ </InternalErrorBoundaryContainer>
215
+ </DialogProvider>
216
+ );
217
+ }}
218
+ </LocalizationContext.Consumer>
219
+ </ReactionProvider>
220
+ </UserProfileProvider>
221
+ </ToastProvider>
188
222
  </HeaderStyleProvider>
189
223
  </UIKitThemeProvider>
190
224
  </PlatformServiceProvider>
@@ -194,24 +228,48 @@ const SendbirdUIKitContainer = ({
194
228
  );
195
229
  };
196
230
 
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
- );
231
+ const initializeSendbird = (
232
+ appId: string,
233
+ internalStorage?: InternalLocalCacheStorage,
234
+ onInitialized?: (sdk: SendbirdChatSDK) => SendbirdChatSDK,
235
+ ) => {
236
+ const unsubscribes: Array<() => void> = [];
237
+ let chatSDK: SendbirdChatSDK;
238
+
239
+ chatSDK = Sendbird.init({
240
+ appId,
241
+ modules: [new GroupChannelModule(), new OpenChannelModule()],
242
+ localCacheEnabled: Boolean(internalStorage),
243
+ useAsyncStorageStore: internalStorage as never,
244
+ newInstance: true,
245
+ });
246
+
247
+ if (onInitialized) {
248
+ chatSDK = onInitialized(chatSDK);
249
+ }
250
+
251
+ if (SendbirdUIKit.VERSION) {
252
+ chatSDK.addExtension('sb_uikit', SendbirdUIKit.VERSION);
253
+ }
254
+
255
+ if (SendbirdUIKit.PLATFORM) {
256
+ chatSDK.addExtension('device-os-platform', SendbirdUIKit.PLATFORM);
257
+ }
258
+
259
+ if (NetInfo?.addEventListener) {
260
+ const listener = (callback: () => void, callbackType: 'online' | 'offline') => {
261
+ const unsubscribe = NetInfo.addEventListener((state) => {
262
+ const online = Boolean(state.isConnected) || Boolean(state.isInternetReachable);
263
+ if (online && callbackType === 'online') callback();
264
+ if (!online && callbackType === 'offline') callback();
265
+ });
266
+ unsubscribes.push(unsubscribe);
267
+ return unsubscribe;
268
+ };
269
+ chatSDK.setOnlineListener?.((onOnline) => listener(onOnline, 'online'));
270
+ chatSDK.setOfflineListener?.((onOffline) => listener(onOffline, 'offline'));
271
+ }
272
+ return { chatSDK, unsubscribes };
215
273
  };
216
274
 
217
275
  export default SendbirdUIKitContainer;