@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
@@ -19,14 +19,16 @@ import {
19
19
  getFileType,
20
20
  isMyMessage,
21
21
  messageKeyExtractor,
22
+ shouldRenderReaction,
22
23
  toMegabyte,
23
24
  useFreshCallback,
24
25
  } from '@sendbird/uikit-utils';
25
26
 
26
27
  import type { ChatFlatListRef } from '../../../components/ChatFlatList';
27
28
  import ChatFlatList from '../../../components/ChatFlatList';
29
+ import { ReactionAddons } from '../../../components/ReactionAddons';
28
30
  import { DEPRECATION_WARNING } from '../../../constants';
29
- import { useLocalization, usePlatformService } from '../../../hooks/useContext';
31
+ import { useLocalization, usePlatformService, useSendbirdChat } from '../../../hooks/useContext';
30
32
  import { GroupChannelContexts } from '../module/moduleContext';
31
33
  import type { GroupChannelProps } from '../types';
32
34
 
@@ -57,11 +59,12 @@ const GroupChannelMessageList = ({
57
59
  const scrollRef = useRef<ChatFlatListRef>(null);
58
60
  const [newMessagesInternalBuffer, setNewMessagesInternalBuffer] = useState(() => newMessagesFromMembers);
59
61
  const getMessagePressActions = useGetMessagePressActions({
62
+ channel,
63
+ currentUserId,
60
64
  onDeleteMessage,
65
+ onResendFailedMessage,
61
66
  onPressImageMessage,
62
67
  onPressMediaMessage,
63
- currentUserId,
64
- onResendFailedMessage,
65
68
  });
66
69
 
67
70
  const safeAreaLayout = { paddingLeft: left, paddingRight: right };
@@ -140,14 +143,20 @@ const GroupChannelMessageList = ({
140
143
 
141
144
  type HandleableMessage = SendbirdUserMessage | SendbirdFileMessage;
142
145
  const useGetMessagePressActions = ({
146
+ channel,
147
+ currentUserId,
148
+ onResendFailedMessage,
149
+ onDeleteMessage,
143
150
  onPressImageMessage,
144
151
  onPressMediaMessage,
145
- onDeleteMessage,
146
- onResendFailedMessage,
147
- currentUserId,
148
152
  }: Pick<
149
153
  GroupChannelProps['MessageList'],
150
- 'onDeleteMessage' | 'onResendFailedMessage' | 'currentUserId' | 'onPressImageMessage' | 'onPressMediaMessage'
154
+ | 'channel'
155
+ | 'currentUserId'
156
+ | 'onResendFailedMessage'
157
+ | 'onDeleteMessage'
158
+ | 'onPressImageMessage'
159
+ | 'onPressMediaMessage'
151
160
  >) => {
152
161
  const { colors } = useUIKitTheme();
153
162
  const { STRINGS } = useLocalization();
@@ -155,7 +164,8 @@ const useGetMessagePressActions = ({
155
164
  const { openSheet } = useBottomSheet();
156
165
  const { alert } = useAlert();
157
166
  const { clipboardService, fileService } = usePlatformService();
158
- const { setEditMessage } = useContext(GroupChannelContexts.Fragment);
167
+ const { features } = useSendbirdChat();
168
+ const { setMessageToEdit } = useContext(GroupChannelContexts.Fragment);
159
169
 
160
170
  const handleFailedMessage = (message: HandleableMessage) => {
161
171
  openSheet({
@@ -215,7 +225,7 @@ const useGetMessagePressActions = ({
215
225
  {
216
226
  icon: 'edit',
217
227
  title: STRINGS.GROUP_CHANNEL.DIALOG_MESSAGE_EDIT,
218
- onPress: () => setEditMessage(msg),
228
+ onPress: () => setMessageToEdit(msg),
219
229
  },
220
230
  {
221
231
  icon: 'delete',
@@ -278,7 +288,14 @@ const useGetMessagePressActions = ({
278
288
  }
279
289
 
280
290
  if (sheetItems.length > 0) {
281
- response.onLongPress = () => openSheet({ sheetItems });
291
+ response.onLongPress = () => {
292
+ openSheet({
293
+ sheetItems,
294
+ HeaderComponent: shouldRenderReaction(channel, features.reactionEnabled)
295
+ ? ({ onClose }) => <ReactionAddons.BottomSheet message={msg} channel={channel} onClose={onClose} />
296
+ : undefined,
297
+ });
298
+ };
282
299
  }
283
300
 
284
301
  if (msg.sendingStatus === 'failed') {
@@ -0,0 +1,173 @@
1
+ import React, { useContext } from 'react';
2
+ import { Pressable, ScrollView, View, useWindowDimensions } from 'react-native';
3
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
+
5
+ import {
6
+ Avatar,
7
+ Divider,
8
+ Icon,
9
+ Text,
10
+ createStyleSheet,
11
+ useHeaderStyle,
12
+ useUIKitTheme,
13
+ } from '@sendbird/uikit-react-native-foundation';
14
+ import { conditionChaining } from '@sendbird/uikit-utils';
15
+
16
+ import { useLocalization, useSendbirdChat } from '../../../hooks/useContext';
17
+ import useKeyboardStatus from '../../../hooks/useKeyboardStatus';
18
+ import useMentionSuggestion from '../../../hooks/useMentionSuggestion';
19
+ import { GroupChannelContexts } from '../module/moduleContext';
20
+ import type { GroupChannelProps } from '../types';
21
+
22
+ const GroupChannelSuggestedMentionList = ({
23
+ text,
24
+ selection,
25
+ inputHeight,
26
+ bottomInset,
27
+ onPressToMention,
28
+ mentionedUsers,
29
+ }: GroupChannelProps['SuggestedMentionList']) => {
30
+ const { width: screenWidth, height: screenHeight } = useWindowDimensions();
31
+ const { channel } = useContext(GroupChannelContexts.Fragment);
32
+ const { mentionManager } = useSendbirdChat();
33
+ const { STRINGS } = useLocalization();
34
+ const { colors } = useUIKitTheme();
35
+ const { topInset } = useHeaderStyle();
36
+ const { left, right } = useSafeAreaInsets();
37
+
38
+ const keyboard = useKeyboardStatus();
39
+
40
+ const { members, reset, searchStringRange, searchLimited } = useMentionSuggestion({
41
+ text,
42
+ selection,
43
+ channel,
44
+ mentionedUsers,
45
+ });
46
+
47
+ const isLandscape = screenWidth > screenHeight;
48
+ const isShortened = isLandscape && keyboard.visible;
49
+ const canRenderMembers = members.length > 0;
50
+ const maxHeight = isShortened ? screenHeight - (topInset + inputHeight + keyboard.height) : styles.suggestion.height;
51
+
52
+ const renderLimitGuide = () => {
53
+ return (
54
+ <View style={[styles.searchLimited, { borderTopColor: colors.onBackground04 }]}>
55
+ <Icon icon={'info'} size={20} containerStyle={{ marginRight: 4 }} color={colors.onBackground02} />
56
+ <Text body3 color={colors.onBackground02}>
57
+ {STRINGS.GROUP_CHANNEL.MENTION_LIMITED(mentionManager.config.mentionLimit)}
58
+ </Text>
59
+ </View>
60
+ );
61
+ };
62
+
63
+ const renderMembers = () => {
64
+ return (
65
+ <View>
66
+ {members.map((member) => {
67
+ return (
68
+ <Pressable
69
+ onPress={() => {
70
+ onPressToMention(member, searchStringRange);
71
+ reset();
72
+ }}
73
+ key={member.userId}
74
+ style={styles.userContainer}
75
+ >
76
+ <Avatar size={28} uri={member.profileUrl} containerStyle={styles.userAvatar} />
77
+ <View style={styles.userInfo}>
78
+ <Text body2 color={colors.onBackground01} numberOfLines={1} style={styles.userNickname}>
79
+ {member.nickname || STRINGS.LABELS.USER_NO_NAME}
80
+ </Text>
81
+ <Text body3 color={colors.onBackground03} numberOfLines={1} style={styles.userId}>
82
+ {member.userId}
83
+ </Text>
84
+ <Divider style={{ position: 'absolute', bottom: 0 }} />
85
+ </View>
86
+ </Pressable>
87
+ );
88
+ })}
89
+ </View>
90
+ );
91
+ };
92
+
93
+ return (
94
+ <Pressable
95
+ onPress={reset}
96
+ pointerEvents={canRenderMembers ? 'auto' : 'none'}
97
+ style={[styles.container, { bottom: inputHeight + bottomInset }]}
98
+ >
99
+ <ScrollView
100
+ bounces={false}
101
+ keyboardDismissMode={'none'}
102
+ keyboardShouldPersistTaps={'always'}
103
+ style={[
104
+ styles.scrollView,
105
+ {
106
+ maxHeight,
107
+ backgroundColor: colors.background,
108
+ bottom: keyboard.bottomSpace,
109
+ },
110
+ canRenderMembers && {
111
+ borderTopWidth: 1,
112
+ borderTopColor: colors.onBackground04,
113
+ },
114
+ ]}
115
+ contentContainerStyle={{ paddingLeft: left, paddingRight: right }}
116
+ >
117
+ {conditionChaining([searchLimited, canRenderMembers], [renderLimitGuide(), renderMembers(), null])}
118
+ </ScrollView>
119
+ </Pressable>
120
+ );
121
+ };
122
+
123
+ const styles = createStyleSheet({
124
+ suggestion: {
125
+ height: 196,
126
+ },
127
+ container: {
128
+ position: 'absolute',
129
+ top: 0,
130
+ right: 0,
131
+ left: 0,
132
+ },
133
+ scrollView: {
134
+ position: 'absolute',
135
+ left: 0,
136
+ right: 0,
137
+ },
138
+ userContainer: {
139
+ paddingLeft: 16,
140
+ flexDirection: 'row',
141
+ height: 44,
142
+ alignItems: 'center',
143
+ justifyContent: 'center',
144
+ },
145
+ userAvatar: {
146
+ marginRight: 16,
147
+ },
148
+ userInfo: {
149
+ flexDirection: 'row',
150
+ flex: 1,
151
+ },
152
+ userNickname: {
153
+ flexShrink: 1,
154
+ lineHeight: 44,
155
+ textAlignVertical: 'center',
156
+ marginRight: 6,
157
+ },
158
+ userId: {
159
+ lineHeight: 44,
160
+ textAlignVertical: 'center',
161
+ minWidth: 32,
162
+ flexShrink: 1,
163
+ marginRight: 16,
164
+ },
165
+ searchLimited: {
166
+ borderTopWidth: 1,
167
+ paddingHorizontal: 16,
168
+ height: 44,
169
+ flexDirection: 'row',
170
+ alignItems: 'center',
171
+ },
172
+ });
173
+ export default GroupChannelSuggestedMentionList;
@@ -1,6 +1,7 @@
1
1
  export { default as GroupChannelHeader } from './component/GroupChannelHeader';
2
2
  export { default as GroupChannelMessageList } from './component/GroupChannelMessageList';
3
3
  export { default as GroupChannelInput } from './component/GroupChannelInput';
4
+ export { default as GroupChannelSuggestedMentionList } from './component/GroupChannelSuggestedMentionList';
4
5
  export { default as GroupChannelStatusEmpty } from './component/GroupChannelStatusEmpty';
5
6
  export { default as GroupChannelStatusLoading } from './component/GroupChannelStatusLoading';
6
7
  export { default as createGroupChannelModule } from './module/createGroupChannelModule';
@@ -3,6 +3,7 @@ import GroupChannelInput from '../component/GroupChannelInput';
3
3
  import GroupChannelMessageList from '../component/GroupChannelMessageList';
4
4
  import GroupChannelStatusEmpty from '../component/GroupChannelStatusEmpty';
5
5
  import GroupChannelStatusLoading from '../component/GroupChannelStatusLoading';
6
+ import GroupChannelSuggestedMentionList from '../component/GroupChannelSuggestedMentionList';
6
7
  import type { GroupChannelModule } from '../types';
7
8
  import { GroupChannelContextsProvider } from './moduleContext';
8
9
 
@@ -10,12 +11,22 @@ const createGroupChannelModule = ({
10
11
  Header = GroupChannelHeader,
11
12
  MessageList = GroupChannelMessageList,
12
13
  Input = GroupChannelInput,
14
+ SuggestedMentionList = GroupChannelSuggestedMentionList,
13
15
  StatusLoading = GroupChannelStatusLoading,
14
16
  StatusEmpty = GroupChannelStatusEmpty,
15
17
  Provider = GroupChannelContextsProvider,
16
18
  ...module
17
19
  }: Partial<GroupChannelModule> = {}): GroupChannelModule => {
18
- return { Header, MessageList, Input, StatusEmpty, StatusLoading, Provider, ...module };
20
+ return {
21
+ Header,
22
+ MessageList,
23
+ Input,
24
+ SuggestedMentionList,
25
+ StatusEmpty,
26
+ StatusLoading,
27
+ Provider,
28
+ ...module,
29
+ };
19
30
  };
20
31
 
21
32
  export default createGroupChannelModule;
@@ -19,7 +19,7 @@ export const GroupChannelContexts: GroupChannelContextsType = {
19
19
  Fragment: createContext({
20
20
  headerTitle: '',
21
21
  channel: {} as SendbirdGroupChannel,
22
- setEditMessage: NOOP,
22
+ setMessageToEdit: NOOP,
23
23
  }),
24
24
  TypingIndicator: createContext({
25
25
  typingUsers: [] as SendbirdUser[],
@@ -39,7 +39,7 @@ export const GroupChannelContextsProvider: GroupChannelModule['Provider'] = ({
39
39
  const { currentUser, sdk } = useSendbirdChat();
40
40
 
41
41
  const [typingUsers, setTypingUsers] = useState<SendbirdUser[]>([]);
42
- const [editMessage, setEditMessage] = useState<SendbirdUserMessage | SendbirdFileMessage>();
42
+ const [messageToEdit, setMessageToEdit] = useState<SendbirdUserMessage | SendbirdFileMessage>();
43
43
 
44
44
  useChannelHandler(sdk, `GroupChannelContextsProvider_${id}`, {
45
45
  onTypingStatusUpdated(eventChannel) {
@@ -55,8 +55,8 @@ export const GroupChannelContextsProvider: GroupChannelModule['Provider'] = ({
55
55
  value={{
56
56
  headerTitle: STRINGS.GROUP_CHANNEL.HEADER_TITLE(currentUser?.userId ?? '', channel),
57
57
  channel,
58
- editMessage,
59
- setEditMessage,
58
+ messageToEdit,
59
+ setMessageToEdit,
60
60
  keyboardAvoidOffset,
61
61
  }}
62
62
  >
@@ -6,6 +6,7 @@ import type {
6
6
  SendbirdFileMessage,
7
7
  SendbirdFileMessageCreateParams,
8
8
  SendbirdGroupChannel,
9
+ SendbirdMember,
9
10
  SendbirdMessage,
10
11
  SendbirdUser,
11
12
  SendbirdUserMessage,
@@ -13,7 +14,13 @@ import type {
13
14
  } from '@sendbird/uikit-utils';
14
15
 
15
16
  import type { FileType } from '../../platform/types';
16
- import type { CommonComponent } from '../../types';
17
+ import type { CommonComponent, MentionedUser, Range } from '../../types';
18
+
19
+ type UserMessageMentionParams = Required<{
20
+ messageTemplate: SendbirdUserMessageCreateParams['mentionedMessageTemplate'];
21
+ userIds: SendbirdUserMessageCreateParams['mentionedUserIds'];
22
+ type: SendbirdUserMessageCreateParams['mentionType'];
23
+ }>;
17
24
 
18
25
  export interface GroupChannelProps {
19
26
  Fragment: {
@@ -91,9 +98,24 @@ export interface GroupChannelProps {
91
98
  Input: {
92
99
  shouldRenderInput: boolean;
93
100
  onSendFileMessage: (file: FileType) => Promise<void>;
94
- onSendUserMessage: (text: string) => Promise<void>;
101
+ onSendUserMessage: (text: string, mention?: UserMessageMentionParams) => Promise<void>;
95
102
  onUpdateFileMessage: (editedFile: FileType, message: SendbirdFileMessage) => Promise<void>;
96
- onUpdateUserMessage: (editedText: string, message: SendbirdUserMessage) => Promise<void>;
103
+ onUpdateUserMessage: (
104
+ editedText: string,
105
+ message: SendbirdUserMessage,
106
+ mention?: UserMessageMentionParams,
107
+ ) => Promise<void>;
108
+ SuggestedMentionList: (props: GroupChannelProps['SuggestedMentionList']) => JSX.Element | null;
109
+ };
110
+
111
+ SuggestedMentionList: {
112
+ text: string;
113
+ selection: Range;
114
+ topInset: number;
115
+ bottomInset: number;
116
+ inputHeight: number;
117
+ onPressToMention: (user: SendbirdMember, searchStringRange: Range) => void;
118
+ mentionedUsers: MentionedUser[];
97
119
  };
98
120
  Provider: {
99
121
  channel: SendbirdGroupChannel;
@@ -111,8 +133,8 @@ export interface GroupChannelContextsType {
111
133
  Fragment: React.Context<{
112
134
  headerTitle: string;
113
135
  channel: SendbirdGroupChannel;
114
- editMessage?: SendbirdUserMessage | SendbirdFileMessage;
115
- setEditMessage: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;
136
+ messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;
137
+ setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;
116
138
  keyboardAvoidOffset?: number;
117
139
  }>;
118
140
  TypingIndicator: React.Context<{
@@ -124,6 +146,7 @@ export interface GroupChannelModule {
124
146
  Header: CommonComponent<GroupChannelProps['Header']>;
125
147
  MessageList: CommonComponent<GroupChannelProps['MessageList']>;
126
148
  Input: CommonComponent<GroupChannelProps['Input']>;
149
+ SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;
127
150
  StatusEmpty: CommonComponent;
128
151
  StatusLoading: CommonComponent;
129
152
  }
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { FlatList, ListRenderItem } from 'react-native';
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
- import { SendbirdRestrictedUser, useFreshCallback } from '@sendbird/uikit-utils';
5
+ import { SendbirdRestrictedUser, getUserUniqId, useFreshCallback } from '@sendbird/uikit-utils';
6
6
 
7
7
  import type { GroupChannelBannedUsersProps } from '../types';
8
8
 
@@ -23,8 +23,9 @@ const GroupChannelBannedUsersList = ({
23
23
  renderItem={renderItem}
24
24
  contentContainerStyle={{ paddingLeft: left, paddingRight: right, flexGrow: 1 }}
25
25
  ListEmptyComponent={ListEmptyComponent}
26
- onEndReached={() => onLoadNext()}
26
+ onEndReached={onLoadNext}
27
27
  bounces={false}
28
+ keyExtractor={getUserUniqId}
28
29
  />
29
30
  );
30
31
  };
@@ -4,7 +4,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
5
  import { PushTriggerOption } from '@sendbird/chat';
6
6
  import { useActionMenu, useToast } from '@sendbird/uikit-react-native-foundation';
7
- import { PASS, SendbirdGroupChannel, useFreshCallback } from '@sendbird/uikit-utils';
7
+ import { PASS, SendbirdGroupChannel, getChannelUniqId, useFreshCallback } from '@sendbird/uikit-utils';
8
8
 
9
9
  import { useLocalization, useSendbirdChat } from '../../../hooks/useContext';
10
10
  import type { GroupChannelListProps } from '../types';
@@ -69,6 +69,7 @@ const GroupChannelListList = ({
69
69
  onEndReached={onLoadNext}
70
70
  {...flatListProps}
71
71
  contentContainerStyle={[flatListProps?.contentContainerStyle, { paddingLeft: left, paddingRight: right }]}
72
+ keyExtractor={getChannelUniqId}
72
73
  />
73
74
  );
74
75
  };
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { FlatList, ListRenderItem } from 'react-native';
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
- import { SendbirdRestrictedUser, useFreshCallback } from '@sendbird/uikit-utils';
5
+ import { SendbirdRestrictedUser, getUserUniqId, useFreshCallback } from '@sendbird/uikit-utils';
6
6
 
7
7
  import type { GroupChannelMutedMembersProps } from '../types';
8
8
 
@@ -23,6 +23,7 @@ const GroupChannelMutedMembersList = ({
23
23
  contentContainerStyle={{ paddingLeft: left, paddingRight: right, flexGrow: 1 }}
24
24
  ListEmptyComponent={ListEmptyComponent}
25
25
  bounces={false}
26
+ keyExtractor={getUserUniqId}
26
27
  />
27
28
  );
28
29
  };
@@ -0,0 +1,14 @@
1
+ import React, { useContext } from 'react';
2
+
3
+ import { Icon, useHeaderStyle } from '@sendbird/uikit-react-native-foundation';
4
+
5
+ import { GroupChannelNotificationsContexts } from '../module/moduleContext';
6
+ import type { GroupChannelNotificationsProps } from '../types';
7
+
8
+ const GroupChannelNotificationsHeader = ({ onPressHeaderLeft }: GroupChannelNotificationsProps['Header']) => {
9
+ const { headerTitle } = useContext(GroupChannelNotificationsContexts.Fragment);
10
+ const { HeaderComponent } = useHeaderStyle();
11
+ return <HeaderComponent title={headerTitle} left={<Icon icon={'arrow-left'} />} onPressLeft={onPressHeaderLeft} />;
12
+ };
13
+
14
+ export default GroupChannelNotificationsHeader;
@@ -0,0 +1,128 @@
1
+ import React, { useContext } from 'react';
2
+ import { Pressable, ScrollView, View } from 'react-native';
3
+
4
+ import { PushTriggerOption } from '@sendbird/chat';
5
+ import { Divider, Icon, Switch, Text, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
6
+ import { useForceUpdate } from '@sendbird/uikit-utils';
7
+
8
+ import { useLocalization } from '../../../hooks/useContext';
9
+ import { GroupChannelNotificationsContexts } from '../module/moduleContext';
10
+
11
+ const GroupChannelNotificationsView = () => {
12
+ const { channel } = useContext(GroupChannelNotificationsContexts.Fragment);
13
+ const { STRINGS } = useLocalization();
14
+ const { colors } = useUIKitTheme();
15
+ const forceUpdate = useForceUpdate();
16
+
17
+ const turnedOnNotifications = channel.myPushTriggerOption !== PushTriggerOption.OFF;
18
+ const turnedOnNotificationsOptionAll = [PushTriggerOption.ALL, PushTriggerOption.DEFAULT].some(
19
+ (it) => it === channel.myPushTriggerOption,
20
+ );
21
+ const turnedOnNotificationsOptionMentionsOnly = channel.myPushTriggerOption === PushTriggerOption.MENTION_ONLY;
22
+
23
+ const toggleNotificationSwitch = async (val: boolean) => {
24
+ if (val) {
25
+ await channel.setMyPushTriggerOption(PushTriggerOption.ALL);
26
+ } else {
27
+ await channel.setMyPushTriggerOption(PushTriggerOption.OFF);
28
+ }
29
+ forceUpdate();
30
+ };
31
+
32
+ const onPressNotificationsOption = async (option: PushTriggerOption.ALL | PushTriggerOption.MENTION_ONLY) => {
33
+ await channel.setMyPushTriggerOption(option);
34
+ forceUpdate();
35
+ };
36
+
37
+ return (
38
+ <ScrollView bounces={false} contentContainerStyle={styles.container}>
39
+ <Bar
40
+ subtitle2
41
+ title={STRINGS.GROUP_CHANNEL_NOTIFICATIONS.MENU_NOTIFICATIONS}
42
+ description={STRINGS.GROUP_CHANNEL_NOTIFICATIONS.MENU_NOTIFICATIONS_DESC}
43
+ component={<Switch value={turnedOnNotifications} onChangeValue={toggleNotificationSwitch} />}
44
+ />
45
+ <Divider />
46
+ {turnedOnNotifications && (
47
+ <>
48
+ <Bar
49
+ body3
50
+ onPress={() => onPressNotificationsOption(PushTriggerOption.ALL)}
51
+ title={STRINGS.GROUP_CHANNEL_NOTIFICATIONS.MENU_NOTIFICATIONS_OPTION_ALL}
52
+ component={
53
+ <Icon
54
+ color={turnedOnNotificationsOptionAll ? colors.primary : colors.onBackground03}
55
+ icon={turnedOnNotificationsOptionAll ? 'radio-on' : 'radio-off'}
56
+ size={24}
57
+ />
58
+ }
59
+ />
60
+ <Divider />
61
+ <Bar
62
+ body3
63
+ onPress={() => onPressNotificationsOption(PushTriggerOption.MENTION_ONLY)}
64
+ title={STRINGS.GROUP_CHANNEL_NOTIFICATIONS.MENU_NOTIFICATIONS_OPTION_MENTION_ONLY}
65
+ component={
66
+ <Icon
67
+ color={turnedOnNotificationsOptionMentionsOnly ? colors.primary : colors.onBackground03}
68
+ icon={turnedOnNotificationsOptionMentionsOnly ? 'radio-on' : 'radio-off'}
69
+ size={24}
70
+ />
71
+ }
72
+ />
73
+ <Divider />
74
+ </>
75
+ )}
76
+ </ScrollView>
77
+ );
78
+ };
79
+
80
+ type BarProps = {
81
+ title: string;
82
+ onPress?: () => void;
83
+ description?: string;
84
+ component: React.ReactNode;
85
+ subtitle2?: boolean;
86
+ body3?: boolean;
87
+ };
88
+ const Bar = ({ title, onPress, description, component, subtitle2, body3 }: BarProps) => {
89
+ const { colors } = useUIKitTheme();
90
+ return (
91
+ <Pressable onPress={onPress} style={styles.barContainer}>
92
+ <View style={styles.titleContainer}>
93
+ <Text body3={body3} subtitle2={subtitle2} numberOfLines={1} color={colors.onBackground01} style={styles.title}>
94
+ {title}
95
+ </Text>
96
+ <View>{component}</View>
97
+ </View>
98
+ {Boolean(description) && (
99
+ <Text body3 color={colors.onBackground02} style={styles.desc}>
100
+ {description}
101
+ </Text>
102
+ )}
103
+ </Pressable>
104
+ );
105
+ };
106
+
107
+ const styles = createStyleSheet({
108
+ container: {
109
+ paddingHorizontal: 16,
110
+ },
111
+ barContainer: {
112
+ paddingVertical: 16,
113
+ },
114
+ titleContainer: {
115
+ flexDirection: 'row',
116
+ alignItems: 'center',
117
+ },
118
+ title: {
119
+ flex: 1,
120
+ marginRight: 8,
121
+ },
122
+ desc: {
123
+ marginTop: 8,
124
+ flex: 1,
125
+ },
126
+ });
127
+
128
+ export default GroupChannelNotificationsView;
@@ -0,0 +1,4 @@
1
+ export { default as GroupChannelNotificationsView } from './component/GroupChannelNotificationsView';
2
+ export { default as GroupChannelNotificationsHeader } from './component/GroupChannelNotificationsHeader';
3
+ export { default as createGroupChannelNotificationsModule } from './module/createGroupChannelNotificationsModule';
4
+ export { GroupChannelNotificationsContextsProvider, GroupChannelNotificationsContexts } from './module/moduleContext';
@@ -0,0 +1,15 @@
1
+ import GroupChannelNotificationsHeader from '../component/GroupChannelNotificationsHeader';
2
+ import GroupChannelNotificationsView from '../component/GroupChannelNotificationsView';
3
+ import type { GroupChannelNotificationsModule } from '../types';
4
+ import { GroupChannelNotificationsContextsProvider } from './moduleContext';
5
+
6
+ const createGroupChannelNotificationsModule = ({
7
+ Header = GroupChannelNotificationsHeader,
8
+ View = GroupChannelNotificationsView,
9
+ Provider = GroupChannelNotificationsContextsProvider,
10
+ ...module
11
+ }: Partial<GroupChannelNotificationsModule> = {}): GroupChannelNotificationsModule => {
12
+ return { Header, View, Provider, ...module };
13
+ };
14
+
15
+ export default createGroupChannelNotificationsModule;
@@ -0,0 +1,31 @@
1
+ import React, { createContext } from 'react';
2
+
3
+ import type { SendbirdGroupChannel } from '@sendbird/uikit-utils';
4
+
5
+ import ProviderLayout from '../../../components/ProviderLayout';
6
+ import { useLocalization } from '../../../hooks/useContext';
7
+ import type { GroupChannelNotificationsContextsType, GroupChannelNotificationsModule } from '../types';
8
+
9
+ export const GroupChannelNotificationsContexts: GroupChannelNotificationsContextsType = {
10
+ Fragment: createContext({
11
+ headerTitle: '',
12
+ channel: {} as SendbirdGroupChannel,
13
+ }),
14
+ };
15
+
16
+ export const GroupChannelNotificationsContextsProvider: GroupChannelNotificationsModule['Provider'] = ({
17
+ children,
18
+ channel,
19
+ }) => {
20
+ const { STRINGS } = useLocalization();
21
+
22
+ return (
23
+ <ProviderLayout>
24
+ <GroupChannelNotificationsContexts.Fragment.Provider
25
+ value={{ channel, headerTitle: STRINGS.GROUP_CHANNEL_NOTIFICATIONS.HEADER_TITLE }}
26
+ >
27
+ {children}
28
+ </GroupChannelNotificationsContexts.Fragment.Provider>
29
+ </ProviderLayout>
30
+ );
31
+ };