@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
@@ -0,0 +1,38 @@
1
+ import type React from 'react';
2
+
3
+ import type { SendbirdGroupChannel } from '@sendbird/uikit-utils';
4
+
5
+ import type { CommonComponent } from '../../types';
6
+
7
+ export type GroupChannelNotificationsProps = {
8
+ Fragment: {
9
+ channel: SendbirdGroupChannel;
10
+ onPressHeaderLeft: GroupChannelNotificationsProps['Header']['onPressHeaderLeft'];
11
+ };
12
+ Header: {
13
+ onPressHeaderLeft: () => void;
14
+ };
15
+ View: {};
16
+ Provider: {
17
+ channel: SendbirdGroupChannel;
18
+ };
19
+ };
20
+
21
+ /**
22
+ * Internal context for GroupChannelNotifications
23
+ * For example, the developer can create a custom header
24
+ * with getting data from the domain context
25
+ * */
26
+ export type GroupChannelNotificationsContextsType = {
27
+ Fragment: React.Context<{
28
+ channel: SendbirdGroupChannel;
29
+ headerTitle: string;
30
+ }>;
31
+ };
32
+ export interface GroupChannelNotificationsModule {
33
+ Provider: CommonComponent<GroupChannelNotificationsProps['Provider']>;
34
+ Header: CommonComponent<GroupChannelNotificationsProps['Header']>;
35
+ View: CommonComponent<GroupChannelNotificationsProps['View']>;
36
+ }
37
+
38
+ export type GroupChannelNotificationsFragment = CommonComponent<GroupChannelNotificationsProps['Fragment']>;
@@ -3,7 +3,7 @@ import { FlatList, ListRenderItem } from 'react-native';
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
5
  import type { SendbirdUser } from '@sendbird/uikit-utils';
6
- import { useFreshCallback } from '@sendbird/uikit-utils';
6
+ import { getUserUniqId, useFreshCallback } from '@sendbird/uikit-utils';
7
7
 
8
8
  import type { GroupChannelOperatorsProps } from '../types';
9
9
 
@@ -22,6 +22,7 @@ const GroupChannelOperatorsList = ({
22
22
  contentContainerStyle={{ paddingLeft: left, paddingRight: right, flexGrow: 1 }}
23
23
  ListEmptyComponent={ListEmptyComponent}
24
24
  bounces={false}
25
+ keyExtractor={getUserUniqId}
25
26
  />
26
27
  );
27
28
  };
@@ -4,22 +4,31 @@ import { View } from 'react-native';
4
4
  import { PushTriggerOption } from '@sendbird/chat';
5
5
  import type { MenuBarProps } from '@sendbird/uikit-react-native-foundation';
6
6
  import { Icon, MenuBar, Switch, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
7
+ import { Logger, conditionChaining, useIIFE } from '@sendbird/uikit-utils';
7
8
 
8
9
  import { useLocalization, useSendbirdChat } from '../../../hooks/useContext';
9
10
  import { GroupChannelSettingsContexts } from '../module/moduleContext';
10
11
  import type { GroupChannelSettingsProps } from '../types';
11
12
 
13
+ let WARN_onPressMenuNotification = false;
14
+
12
15
  const GroupChannelSettingsMenu = ({
13
16
  onPressMenuModeration,
14
17
  onPressMenuMembers,
15
18
  onPressMenuLeaveChannel,
19
+ onPressMenuNotification,
16
20
  menuItemsCreator = (menu) => menu,
17
21
  }: GroupChannelSettingsProps['Menu']) => {
18
- const { sdk } = useSendbirdChat();
22
+ const { sdk, features } = useSendbirdChat();
19
23
  const { channel } = useContext(GroupChannelSettingsContexts.Fragment);
20
24
  const { STRINGS } = useLocalization();
21
25
  const { colors } = useUIKitTheme();
22
26
 
27
+ if (__DEV__ && !WARN_onPressMenuNotification && !onPressMenuNotification) {
28
+ Logger.warn('You should pass `onPressMenuNotification` prop if using mention');
29
+ WARN_onPressMenuNotification = true;
30
+ }
31
+
23
32
  const toggleNotification = async () => {
24
33
  if (channel.myPushTriggerOption === 'off') {
25
34
  await channel.setMyPushTriggerOption(PushTriggerOption.DEFAULT);
@@ -28,6 +37,35 @@ const GroupChannelSettingsMenu = ({
28
37
  }
29
38
  };
30
39
 
40
+ const { onPressNotificationMenu, actionLabelNotificationMenu, actionItemNotificationMenu } = useIIFE(() => {
41
+ const getNotificationsLabel = () => {
42
+ switch (channel.myPushTriggerOption) {
43
+ case PushTriggerOption.ALL:
44
+ case PushTriggerOption.DEFAULT:
45
+ return STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION_LABEL_ON;
46
+ case PushTriggerOption.OFF:
47
+ return STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION_LABEL_OFF;
48
+ case PushTriggerOption.MENTION_ONLY:
49
+ return STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION_LABEL_MENTION_ONLY;
50
+ }
51
+ };
52
+
53
+ return {
54
+ actionLabelNotificationMenu: getNotificationsLabel(),
55
+ actionItemNotificationMenu: conditionChaining(
56
+ [features.userMentionEnabled],
57
+ [
58
+ <Icon icon={'chevron-right'} color={colors.onBackground01} />,
59
+ <Switch value={channel.myPushTriggerOption !== 'off'} onChangeValue={toggleNotification} />,
60
+ ],
61
+ ),
62
+ onPressNotificationMenu: () => {
63
+ if (features.userMentionEnabled) onPressMenuNotification?.();
64
+ else toggleNotification();
65
+ },
66
+ };
67
+ });
68
+
31
69
  const menuItems: MenuBarProps[] = menuItemsCreator([
32
70
  {
33
71
  icon: 'moderation',
@@ -39,8 +77,9 @@ const GroupChannelSettingsMenu = ({
39
77
  {
40
78
  icon: 'notifications',
41
79
  name: STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION,
42
- onPress: toggleNotification,
43
- actionItem: <Switch value={channel.myPushTriggerOption !== 'off'} onChangeValue={toggleNotification} />,
80
+ onPress: onPressNotificationMenu,
81
+ actionLabel: actionLabelNotificationMenu,
82
+ actionItem: actionItemNotificationMenu,
44
83
  },
45
84
  {
46
85
  icon: 'members',
@@ -1,6 +1,6 @@
1
1
  import React, { createContext, useCallback } from 'react';
2
2
 
3
- import { useActiveGroupChannel, useChannelHandler } from '@sendbird/uikit-chat-hooks';
3
+ import { useChannelHandler } from '@sendbird/uikit-chat-hooks';
4
4
  import { useActionMenu, useAlert, useBottomSheet, usePrompt, useToast } from '@sendbird/uikit-react-native-foundation';
5
5
  import {
6
6
  NOOP,
@@ -36,11 +36,8 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
36
36
  const { fileService } = usePlatformService();
37
37
  const { alert } = useAlert();
38
38
 
39
- const { activeChannel, setActiveChannel } = useActiveGroupChannel(sdk, channel);
40
-
41
- const onChannelChanged = (channel: SendbirdBaseChannel) => {
42
- if (isDifferentChannel(channel, activeChannel) || !channel.isGroupChannel()) return;
43
- setActiveChannel(channel);
39
+ const onChannelChanged = (eventChannel: SendbirdBaseChannel) => {
40
+ if (isDifferentChannel(eventChannel, channel)) return;
44
41
  forceUpdate();
45
42
  };
46
43
 
@@ -48,6 +45,7 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
48
45
  onChannelChanged: onChannelChanged,
49
46
  onChannelFrozen: onChannelChanged,
50
47
  onChannelUnfrozen: onChannelChanged,
48
+ onUserBanned: onChannelChanged,
51
49
  });
52
50
 
53
51
  const toast = useToast();
@@ -57,11 +55,10 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
57
55
 
58
56
  const updateChannel = useCallback(
59
57
  async (params: SendbirdGroupChannelUpdateParams) => {
60
- const updatedChannel = await activeChannel.updateChannel(params);
61
- setActiveChannel(updatedChannel);
58
+ await channel.updateChannel(params);
62
59
  forceUpdate();
63
60
  },
64
- [activeChannel],
61
+ [channel],
65
62
  );
66
63
 
67
64
  const changeChannelName = useCallback(() => {
@@ -69,10 +66,10 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
69
66
  title: STRINGS.GROUP_CHANNEL_SETTINGS.DIALOG_CHANGE_NAME_PROMPT_TITLE,
70
67
  submitLabel: STRINGS.GROUP_CHANNEL_SETTINGS.DIALOG_CHANGE_NAME_PROMPT_OK,
71
68
  placeholder: STRINGS.GROUP_CHANNEL_SETTINGS.DIALOG_CHANGE_NAME_PROMPT_PLACEHOLDER,
72
- defaultValue: activeChannel.name,
69
+ defaultValue: channel.name,
73
70
  onSubmit: (channelName) => updateChannel({ name: channelName }),
74
71
  });
75
- }, [STRINGS, updateChannel, activeChannel.name]);
72
+ }, [STRINGS, updateChannel, channel.name]);
76
73
 
77
74
  const changeChannelImage = useCallback(() => {
78
75
  openMenu({
@@ -87,7 +84,10 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
87
84
  if (error.code === SBUError.CODE.ERR_PERMISSIONS_DENIED) {
88
85
  alert({
89
86
  title: STRINGS.DIALOG.ALERT_PERMISSIONS_TITLE,
90
- message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE('camera', 'UIKitSample'),
87
+ message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE(
88
+ STRINGS.LABELS.PERMISSION_CAMERA,
89
+ STRINGS.LABELS.PERMISSION_APP_NAME,
90
+ ),
91
91
  buttons: [{ text: STRINGS.DIALOG.ALERT_PERMISSIONS_OK, onPress: () => SBUUtils.openSettings() }],
92
92
  });
93
93
  } else {
@@ -110,7 +110,10 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
110
110
  if (error.code === SBUError.CODE.ERR_PERMISSIONS_DENIED) {
111
111
  alert({
112
112
  title: STRINGS.DIALOG.ALERT_PERMISSIONS_TITLE,
113
- message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE('device storage', 'UIKitSample'),
113
+ message: STRINGS.DIALOG.ALERT_PERMISSIONS_MESSAGE(
114
+ STRINGS.LABELS.PERMISSION_DEVICE_STORAGE,
115
+ STRINGS.LABELS.PERMISSION_APP_NAME,
116
+ ),
114
117
  buttons: [{ text: STRINGS.DIALOG.ALERT_PERMISSIONS_OK, onPress: () => SBUUtils.openSettings() }],
115
118
  });
116
119
  } else {
@@ -140,7 +143,7 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
140
143
  <ProviderLayout>
141
144
  <GroupChannelSettingsContexts.Fragment.Provider
142
145
  value={{
143
- channel: activeChannel,
146
+ channel,
144
147
  headerTitle: STRINGS.GROUP_CHANNEL_SETTINGS.HEADER_TITLE,
145
148
  headerRight: STRINGS.GROUP_CHANNEL_SETTINGS.HEADER_RIGHT,
146
149
  onPressHeaderRight,
@@ -12,6 +12,7 @@ export interface GroupChannelSettingsProps {
12
12
  onPressMenuModeration: GroupChannelSettingsProps['Menu']['onPressMenuModeration'];
13
13
  onPressMenuMembers: GroupChannelSettingsProps['Menu']['onPressMenuMembers'];
14
14
  onPressMenuLeaveChannel: GroupChannelSettingsProps['Menu']['onPressMenuLeaveChannel'];
15
+ onPressMenuNotification?: GroupChannelSettingsProps['Menu']['onPressMenuNotification'];
15
16
  menuItemsCreator?: GroupChannelSettingsProps['Menu']['menuItemsCreator'];
16
17
  };
17
18
  Header: {
@@ -22,6 +23,7 @@ export interface GroupChannelSettingsProps {
22
23
  onPressMenuModeration: () => void;
23
24
  onPressMenuMembers: () => void;
24
25
  onPressMenuLeaveChannel: () => void;
26
+ onPressMenuNotification?: () => void;
25
27
  menuItemsCreator?: (defaultMenuItems: MenuBarProps[]) => MenuBarProps[];
26
28
  };
27
29
  Provider: {
@@ -1,5 +1,10 @@
1
- import type { UseUserListOptions, UserStruct } from '@sendbird/uikit-chat-hooks';
2
- import type { SendbirdGroupChannel, SendbirdGroupChannelCreateParams, SendbirdMember } from '@sendbird/uikit-utils';
1
+ import type { UseUserListOptions } from '@sendbird/uikit-chat-hooks';
2
+ import type {
3
+ SendbirdGroupChannel,
4
+ SendbirdGroupChannelCreateParams,
5
+ SendbirdMember,
6
+ UserStruct,
7
+ } from '@sendbird/uikit-utils';
3
8
 
4
9
  import type { CommonComponent } from '../../types';
5
10
  import type { GroupChannelType } from '../groupChannelList/types';
@@ -2,10 +2,13 @@ import React, { useCallback, useContext } from 'react';
2
2
  import { FlatList, ListRenderItem } from 'react-native';
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
+ import type { UserStruct } from '@sendbird/uikit-utils';
6
+ import { getUserUniqId } from '@sendbird/uikit-utils';
7
+
5
8
  import { UserListContexts } from '../module/moduleContext';
6
9
  import type { UserListContextsType, UserListProps } from '../types';
7
10
 
8
- const UserListList = <T,>({
11
+ const UserListList = <T extends UserStruct>({
9
12
  users,
10
13
  onRefresh,
11
14
  refreshing,
@@ -29,6 +32,7 @@ const UserListList = <T,>({
29
32
  onEndReached={onLoadNext}
30
33
  contentContainerStyle={{ paddingLeft: left, paddingRight: right, flexGrow: 1 }}
31
34
  ListEmptyComponent={ListEmptyComponent}
35
+ keyExtractor={getUserUniqId}
32
36
  />
33
37
  );
34
38
  };
@@ -1,3 +1,5 @@
1
+ import type { UserStruct } from '@sendbird/uikit-utils';
2
+
1
3
  import UserListHeader from '../component/UserListHeader';
2
4
  import UserListList from '../component/UserListList';
3
5
  import UserListStatusEmpty from '../component/UserListStatusEmpty';
@@ -6,7 +8,7 @@ import UserListStatusLoading from '../component/UserListStatusLoading';
6
8
  import type { UserListModule } from '../types';
7
9
  import { UserListContextsProvider } from './moduleContext';
8
10
 
9
- const createUserListModule = <T,>({
11
+ const createUserListModule = <T extends UserStruct>({
10
12
  Header = UserListHeader,
11
13
  List = UserListList,
12
14
  StatusLoading = UserListStatusLoading,
@@ -1,8 +1,14 @@
1
1
  import React from 'react';
2
2
  import { TouchableOpacity } from 'react-native';
3
3
 
4
- import { UserStruct, useUserList } from '@sendbird/uikit-chat-hooks';
5
- import { PASS, SendbirdGroupChannelCreateParams, SendbirdUser, useFreshCallback } from '@sendbird/uikit-utils';
4
+ import { useUserList } from '@sendbird/uikit-chat-hooks';
5
+ import {
6
+ PASS,
7
+ SendbirdGroupChannelCreateParams,
8
+ SendbirdUser,
9
+ UserStruct,
10
+ useFreshCallback,
11
+ } from '@sendbird/uikit-utils';
6
12
 
7
13
  import StatusComposition from '../components/StatusComposition';
8
14
  import UserSelectableBar from '../components/UserSelectableBar';
@@ -75,10 +75,17 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
75
75
  const processedParams = await onBeforeSendFileMessage({ file });
76
76
  await sendFileMessage(processedParams);
77
77
  });
78
- const onSendUserMessage: GroupChannelProps['Input']['onSendUserMessage'] = useFreshCallback(async (text) => {
79
- const processedParams = await onBeforeSendUserMessage({ message: text });
80
- await sendUserMessage(processedParams);
81
- });
78
+ const onSendUserMessage: GroupChannelProps['Input']['onSendUserMessage'] = useFreshCallback(
79
+ async (text, mention) => {
80
+ const processedParams = await onBeforeSendUserMessage({
81
+ message: text,
82
+ mentionedUserIds: mention?.userIds,
83
+ mentionedMessageTemplate: mention?.messageTemplate,
84
+ mentionType: mention?.type,
85
+ });
86
+ await sendUserMessage(processedParams);
87
+ },
88
+ );
82
89
  const onUpdateFileMessage: GroupChannelProps['Input']['onUpdateFileMessage'] = useFreshCallback(
83
90
  async (editedFile, message) => {
84
91
  const processedParams = await onBeforeSendFileMessage({ file: editedFile });
@@ -86,8 +93,13 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
86
93
  },
87
94
  );
88
95
  const onUpdateUserMessage: GroupChannelProps['Input']['onUpdateUserMessage'] = useFreshCallback(
89
- async (editedText, message) => {
90
- const processedParams = await onBeforeSendUserMessage({ message: editedText });
96
+ async (editedText, message, mention) => {
97
+ const processedParams = await onBeforeSendUserMessage({
98
+ message: editedText,
99
+ mentionedUserIds: mention?.userIds,
100
+ mentionedMessageTemplate: mention?.messageTemplate,
101
+ mentionType: mention?.type,
102
+ });
91
103
  await updateUserMessage(message.messageId, processedParams);
92
104
  },
93
105
  );
@@ -119,6 +131,7 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
119
131
  flatListProps={memoizedFlatListProps}
120
132
  />
121
133
  <GroupChannelModule.Input
134
+ SuggestedMentionList={GroupChannelModule.SuggestedMentionList}
122
135
  shouldRenderInput={shouldRenderInput(channel)}
123
136
  onSendFileMessage={onSendFileMessage}
124
137
  onSendUserMessage={onSendUserMessage}
@@ -1,8 +1,8 @@
1
1
  import React, { useCallback } from 'react';
2
2
  import { TouchableOpacity } from 'react-native';
3
3
 
4
- import { UserStruct, useUserList } from '@sendbird/uikit-chat-hooks';
5
- import type { SendbirdGroupChannel, SendbirdUser } from '@sendbird/uikit-utils';
4
+ import { useUserList } from '@sendbird/uikit-chat-hooks';
5
+ import type { SendbirdGroupChannel, SendbirdUser, UserStruct } from '@sendbird/uikit-utils';
6
6
 
7
7
  import StatusComposition from '../components/StatusComposition';
8
8
  import UserSelectableBar from '../components/UserSelectableBar';
@@ -1,8 +1,7 @@
1
- import React, { useEffect } from 'react';
2
- import { AppState } from 'react-native';
1
+ import React from 'react';
3
2
 
4
3
  import { useGroupChannelList } from '@sendbird/uikit-chat-hooks';
5
- import { PASS, useFreshCallback } from '@sendbird/uikit-utils';
4
+ import { PASS, useAppState, useFreshCallback } from '@sendbird/uikit-utils';
6
5
 
7
6
  import StatusComposition from '../components/StatusComposition';
8
7
  import GroupChannelPreviewContainer from '../containers/GroupChannelPreviewContainer';
@@ -34,12 +33,9 @@ const createGroupChannelListFragment = (initModule?: Partial<GroupChannelListMod
34
33
  });
35
34
 
36
35
  if (features.deliveryReceiptEnabled) {
37
- useEffect(() => {
38
- const listener = AppState.addEventListener('change', (status) => {
39
- if (status === 'active') groupChannels.forEach(markAsDeliveredWithChannel);
40
- });
41
- return () => listener.remove();
42
- }, []);
36
+ useAppState('change', (status) => {
37
+ if (status === 'active') groupChannels.forEach(markAsDeliveredWithChannel);
38
+ });
43
39
  }
44
40
 
45
41
  const _renderGroupChannelPreview: GroupChannelListProps['List']['renderGroupChannelPreview'] = useFreshCallback(
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+
3
+ import { NOOP } from '@sendbird/uikit-utils';
4
+
5
+ import { createGroupChannelNotificationsModule } from '../domain/groupChannelNotifications';
6
+ import type {
7
+ GroupChannelNotificationsFragment,
8
+ GroupChannelNotificationsModule,
9
+ } from '../domain/groupChannelNotifications/types';
10
+
11
+ const createGroupChannelNotificationsFragment = (
12
+ initModule?: Partial<GroupChannelNotificationsModule>,
13
+ ): GroupChannelNotificationsFragment => {
14
+ const GroupChannelNotificationsModule = createGroupChannelNotificationsModule(initModule);
15
+
16
+ return ({ onPressHeaderLeft = NOOP, children, channel }) => {
17
+ return (
18
+ <GroupChannelNotificationsModule.Provider channel={channel}>
19
+ <GroupChannelNotificationsModule.Header onPressHeaderLeft={onPressHeaderLeft} />
20
+ <GroupChannelNotificationsModule.View />
21
+ {children}
22
+ </GroupChannelNotificationsModule.Provider>
23
+ );
24
+ };
25
+ };
26
+
27
+ export default createGroupChannelNotificationsFragment;
@@ -19,6 +19,7 @@ const createGroupChannelSettingsFragment = (
19
19
  onPressMenuModeration,
20
20
  onPressMenuMembers,
21
21
  onPressMenuLeaveChannel,
22
+ onPressMenuNotification,
22
23
  menuItemsCreator,
23
24
  }) => {
24
25
  const { colors } = useUIKitTheme();
@@ -40,6 +41,7 @@ const createGroupChannelSettingsFragment = (
40
41
  onPressMenuModeration={onPressMenuModeration}
41
42
  onPressMenuMembers={onPressMenuMembers}
42
43
  onPressMenuLeaveChannel={onPressMenuLeaveChannel}
44
+ onPressMenuNotification={onPressMenuNotification}
43
45
  />
44
46
  </ScrollView>
45
47
  </GroupChannelSettingsModule.Provider>
@@ -9,7 +9,7 @@ type ConnectOptions = { nickname?: string; accessToken?: string };
9
9
  const cacheRestrictCodes = [400300, 400301, 400302, 400310];
10
10
 
11
11
  const useConnection = () => {
12
- const { sdk, setCurrentUser, features } = useSendbirdChat();
12
+ const { sdk, emojiManager, setCurrentUser, features } = useSendbirdChat();
13
13
  const { registerPushTokenForCurrentUser, unregisterPushTokenForCurrentUser } = usePushTokenRegistration();
14
14
 
15
15
  const connect = useCallback(
@@ -37,6 +37,7 @@ const useConnection = () => {
37
37
 
38
38
  Logger.debug('[useConnection]', 'connected! (online)');
39
39
  setCurrentUser(user);
40
+ sdk.getAllEmoji().then(emojiManager.init);
40
41
 
41
42
  return user;
42
43
  } catch (e) {
@@ -50,6 +51,7 @@ const useConnection = () => {
50
51
  } else if (sdk.currentUser) {
51
52
  Logger.debug('[useConnection]', 'connected! (offline)');
52
53
  setCurrentUser(sdk.currentUser);
54
+ sdk.getAllEmoji().finally(emojiManager.init);
53
55
  return sdk.currentUser;
54
56
  }
55
57
  }
@@ -2,6 +2,7 @@ import { useContext } from 'react';
2
2
 
3
3
  import { LocalizationContext } from '../contexts/LocalizationCtx';
4
4
  import { PlatformServiceContext } from '../contexts/PlatformServiceCtx';
5
+ import { ReactionContext } from '../contexts/ReactionCtx';
5
6
  import { SendbirdChatContext } from '../contexts/SendbirdChatCtx';
6
7
  import { UserProfileContext } from '../contexts/UserProfileCtx';
7
8
 
@@ -28,3 +29,9 @@ export const useUserProfile = () => {
28
29
  if (!value) throw new Error('UserProfileContext is not provided');
29
30
  return value;
30
31
  };
32
+
33
+ export const useReaction = () => {
34
+ const value = useContext(ReactionContext);
35
+ if (!value) throw new Error('ReactionContext is not provided');
36
+ return value;
37
+ };
@@ -0,0 +1,59 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { Keyboard, KeyboardEvent, KeyboardEventName, LayoutAnimation, Platform } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+
5
+ import { NOOP } from '@sendbird/uikit-utils';
6
+
7
+ type KeyboardEvents = {
8
+ showEvent: KeyboardEventName;
9
+ hideEvent: KeyboardEventName;
10
+ };
11
+
12
+ let isLayoutAnimationConfigured = false;
13
+
14
+ const configureNextLayoutAnimation = (event: KeyboardEvent) => {
15
+ if (isLayoutAnimationConfigured) return;
16
+ const config = LayoutAnimation.create(event.duration, event.easing, LayoutAnimation.Properties.scaleY);
17
+ isLayoutAnimationConfigured = true;
18
+ const onEnd = () => (isLayoutAnimationConfigured = false);
19
+ LayoutAnimation.configureNext(config, onEnd, onEnd);
20
+ };
21
+
22
+ const { showEvent, hideEvent } = Platform.select<KeyboardEvents>({
23
+ android: { showEvent: 'keyboardDidShow', hideEvent: 'keyboardDidHide' },
24
+ default: { showEvent: 'keyboardWillShow', hideEvent: 'keyboardWillHide' },
25
+ });
26
+
27
+ const useKeyboardStatus = () => {
28
+ const [keyboardStatus, setKeyboardStatus] = useState({ visible: false, height: 0, bottomSpace: 0 });
29
+ const { bottom: bottomInset } = useSafeAreaInsets();
30
+
31
+ useEffect(() => {
32
+ const subscriptions = [
33
+ Keyboard.addListener(showEvent, (event) => {
34
+ const height = event.endCoordinates.height;
35
+ const bottomSpace = Platform.select({ ios: height - bottomInset, default: 0 });
36
+ const nextLayoutAnimation = Platform.select({ ios: configureNextLayoutAnimation, default: NOOP });
37
+
38
+ nextLayoutAnimation(event);
39
+ setKeyboardStatus({ visible: true, height, bottomSpace });
40
+ }),
41
+
42
+ Keyboard.addListener(hideEvent, () => {
43
+ const height = 0;
44
+ const bottomSpace = Platform.select({ default: height });
45
+ // const nextLayoutAnimation = Platform.select({ ios: configureNextLayoutAnimation, default: NOOP });
46
+
47
+ // nextLayoutAnimation(event);
48
+ setKeyboardStatus({ visible: false, height, bottomSpace });
49
+ }),
50
+ ];
51
+ return () => {
52
+ subscriptions.forEach((it) => it.remove());
53
+ };
54
+ }, []);
55
+
56
+ return keyboardStatus;
57
+ };
58
+
59
+ export default useKeyboardStatus;
@@ -0,0 +1,106 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+
3
+ import type { SendbirdGroupChannel, SendbirdMember, SendbirdUser } from '@sendbird/uikit-utils';
4
+ import { useAsyncEffect } from '@sendbird/uikit-utils';
5
+
6
+ import { useSendbirdChat } from '../hooks/useContext';
7
+ import type { Range } from '../types';
8
+
9
+ const useMentionSuggestion = (params: {
10
+ text: string;
11
+ selection: Range;
12
+ channel: SendbirdGroupChannel;
13
+ mentionedUsers: { user: SendbirdUser; range: Range }[];
14
+ }) => {
15
+ const { text, selection, channel, mentionedUsers } = params;
16
+
17
+ const [freshChannel, setFreshChannel] = useState(channel);
18
+
19
+ useAsyncEffect(async () => {
20
+ setFreshChannel(await channel.refresh());
21
+ }, [channel.url]);
22
+
23
+ const { mentionManager, currentUser } = useSendbirdChat();
24
+ const [members, setMembers] = useState<SendbirdMember[]>([]);
25
+ const timeoutRef = useRef<NodeJS.Timeout>();
26
+
27
+ const searchStringRangeRef = useRef<Range>({ start: 0, end: 0 });
28
+ const searchLimitedRef = useRef(false);
29
+
30
+ const updateSearchStringRange = (selectionIndex: number, searchString: string) => {
31
+ searchStringRangeRef.current = mentionManager.getSearchStringRangeInText(selectionIndex, searchString);
32
+ return searchStringRangeRef.current;
33
+ };
34
+ const updateSearchLimited = (mentionCount: number, mentionLimit: number) => {
35
+ searchLimitedRef.current = mentionCount >= mentionLimit;
36
+ return searchLimitedRef.current;
37
+ };
38
+ const resetRefs = () => {
39
+ searchLimitedRef.current = false;
40
+ searchStringRangeRef.current = { start: 0, end: 0 };
41
+ };
42
+
43
+ const fetchMembers = async (): Promise<SendbirdMember[]> => {
44
+ resetRefs();
45
+
46
+ const selectionRanged = selection.start !== selection.end;
47
+ if (selectionRanged) return [];
48
+
49
+ const selectionContainsMentionedUser = mentionedUsers.some((it) =>
50
+ mentionManager.rangeHelpers.overlaps(it.range, selection, 'underMore'),
51
+ );
52
+ if (selectionContainsMentionedUser) return [];
53
+
54
+ const { isTriggered, isValidSearchString, searchString } = mentionManager.getSearchString(text, selection.start);
55
+ if (!isTriggered() || !isValidSearchString()) return [];
56
+
57
+ const limited = updateSearchLimited(mentionedUsers.length, mentionManager.config.mentionLimit);
58
+ if (limited) return [];
59
+
60
+ updateSearchStringRange(selection.start, searchString);
61
+
62
+ if (freshChannel.isSuper) {
63
+ return freshChannel
64
+ .createMemberListQuery({
65
+ nicknameStartsWithFilter: searchString,
66
+ limit: mentionManager.config.suggestionLimit + 1,
67
+ })
68
+ .next()
69
+ .then((members) => members.filter((member) => member.userId !== currentUser?.userId));
70
+ } else {
71
+ return freshChannel.members
72
+ .sort((a, b) => a.nickname?.localeCompare(b.nickname))
73
+ .filter(
74
+ (member) =>
75
+ member.nickname?.toLowerCase().startsWith(searchString.toLowerCase()) &&
76
+ member.userId !== currentUser?.userId,
77
+ )
78
+ .slice(0, mentionManager.config.suggestionLimit);
79
+ }
80
+ };
81
+
82
+ useEffect(() => {
83
+ timeoutRef.current = setTimeout(async () => {
84
+ fetchMembers()
85
+ .then(setMembers)
86
+ .catch(() => setMembers([]))
87
+ .finally(() => (timeoutRef.current = undefined));
88
+ }, mentionManager.config.debounceMills);
89
+
90
+ return () => {
91
+ if (timeoutRef.current) {
92
+ clearTimeout(timeoutRef.current);
93
+ timeoutRef.current = undefined;
94
+ }
95
+ };
96
+ }, [text, selection]);
97
+
98
+ return {
99
+ members,
100
+ reset: useCallback(() => setMembers([]), []),
101
+ searchStringRange: searchStringRangeRef.current,
102
+ searchLimited: searchLimitedRef.current,
103
+ };
104
+ };
105
+
106
+ export default useMentionSuggestion;