@sendbird/uikit-react-native 3.1.2 → 3.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 (337) hide show
  1. package/README.md +67 -42
  2. package/lib/commonjs/components/ChannelInput/EditInput.js +2 -11
  3. package/lib/commonjs/components/ChannelInput/EditInput.js.map +1 -1
  4. package/lib/commonjs/components/ChannelInput/MessageToReplyPreview.js +145 -0
  5. package/lib/commonjs/components/ChannelInput/MessageToReplyPreview.js.map +1 -0
  6. package/lib/commonjs/components/ChannelInput/SendInput.js +149 -323
  7. package/lib/commonjs/components/ChannelInput/SendInput.js.map +1 -1
  8. package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js +238 -0
  9. package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js.map +1 -0
  10. package/lib/commonjs/components/ChannelInput/index.js +34 -3
  11. package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
  12. package/lib/commonjs/components/ChannelMessageList/index.js +148 -116
  13. package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
  14. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +24 -13
  15. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
  16. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +134 -6
  17. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
  18. package/lib/commonjs/components/MessageSearchResultItem.js +1 -0
  19. package/lib/commonjs/components/MessageSearchResultItem.js.map +1 -1
  20. package/lib/commonjs/components/OpenChannelMessageRenderer/index.js +1 -0
  21. package/lib/commonjs/components/OpenChannelMessageRenderer/index.js.map +1 -1
  22. package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +2 -2
  23. package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -1
  24. package/lib/commonjs/components/ReactionBottomSheets/index.js.map +1 -1
  25. package/lib/commonjs/components/StatusComposition.js.map +1 -1
  26. package/lib/commonjs/constants.js +5 -1
  27. package/lib/commonjs/constants.js.map +1 -1
  28. package/lib/commonjs/containers/GroupChannelPreviewContainer.js +1 -0
  29. package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -1
  30. package/lib/commonjs/containers/InternalErrorBoundaryContainer.js.map +1 -1
  31. package/lib/commonjs/containers/SendbirdUIKitContainer.js +72 -34
  32. package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
  33. package/lib/commonjs/contexts/PlatformServiceCtx.js +16 -12
  34. package/lib/commonjs/contexts/PlatformServiceCtx.js.map +1 -1
  35. package/lib/commonjs/contexts/ReactionCtx.js +3 -2
  36. package/lib/commonjs/contexts/ReactionCtx.js.map +1 -1
  37. package/lib/commonjs/contexts/SendbirdChatCtx.js +2 -0
  38. package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
  39. package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js +14 -4
  40. package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
  41. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +28 -42
  42. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  43. package/lib/commonjs/domain/groupChannel/module/moduleContext.js +109 -5
  44. package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
  45. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  46. package/lib/commonjs/domain/userList/types.js.map +1 -1
  47. package/lib/commonjs/fragments/createGroupChannelFragment.js +34 -7
  48. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  49. package/lib/commonjs/fragments/createMessageSearchFragment.js +1 -1
  50. package/lib/commonjs/fragments/createMessageSearchFragment.js.map +1 -1
  51. package/lib/commonjs/hooks/useChannelInputItems.js +211 -0
  52. package/lib/commonjs/hooks/useChannelInputItems.js.map +1 -0
  53. package/lib/commonjs/hooks/useConnection.js +1 -1
  54. package/lib/commonjs/hooks/useConnection.js.map +1 -1
  55. package/lib/commonjs/hooks/useVoiceMessageInput.js +207 -0
  56. package/lib/commonjs/hooks/useVoiceMessageInput.js.map +1 -0
  57. package/lib/commonjs/index.js +36 -0
  58. package/lib/commonjs/index.js.map +1 -1
  59. package/lib/commonjs/libs/MentionManager.js.map +1 -1
  60. package/lib/commonjs/libs/SBUUtils.js +4 -0
  61. package/lib/commonjs/libs/SBUUtils.js.map +1 -1
  62. package/lib/commonjs/libs/VoiceMessageConfig.js +30 -0
  63. package/lib/commonjs/libs/VoiceMessageConfig.js.map +1 -0
  64. package/lib/commonjs/localization/StringSet.type.js.map +1 -1
  65. package/lib/commonjs/localization/createBaseStringSet.js +24 -9
  66. package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
  67. package/lib/commonjs/platform/createFileService.expo.js +10 -0
  68. package/lib/commonjs/platform/createFileService.expo.js.map +1 -1
  69. package/lib/commonjs/platform/createFileService.native.js +19 -0
  70. package/lib/commonjs/platform/createFileService.native.js.map +1 -1
  71. package/lib/commonjs/platform/createPlayerService.expo.js +137 -0
  72. package/lib/commonjs/platform/createPlayerService.expo.js.map +1 -0
  73. package/lib/commonjs/platform/createPlayerService.native.js +139 -0
  74. package/lib/commonjs/platform/createPlayerService.native.js.map +1 -0
  75. package/lib/commonjs/platform/createRecorderService.expo.js +158 -0
  76. package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -0
  77. package/lib/commonjs/platform/createRecorderService.native.js +157 -0
  78. package/lib/commonjs/platform/createRecorderService.native.js.map +1 -0
  79. package/lib/commonjs/platform/types.js.map +1 -1
  80. package/lib/commonjs/types.js +7 -0
  81. package/lib/commonjs/types.js.map +1 -1
  82. package/lib/commonjs/utils/promise.js +138 -0
  83. package/lib/commonjs/utils/promise.js.map +1 -0
  84. package/lib/commonjs/version.js +1 -1
  85. package/lib/commonjs/version.js.map +1 -1
  86. package/lib/module/components/ChannelInput/EditInput.js +3 -12
  87. package/lib/module/components/ChannelInput/EditInput.js.map +1 -1
  88. package/lib/module/components/ChannelInput/MessageToReplyPreview.js +137 -0
  89. package/lib/module/components/ChannelInput/MessageToReplyPreview.js.map +1 -0
  90. package/lib/module/components/ChannelInput/SendInput.js +152 -326
  91. package/lib/module/components/ChannelInput/SendInput.js.map +1 -1
  92. package/lib/module/components/ChannelInput/VoiceMessageInput.js +228 -0
  93. package/lib/module/components/ChannelInput/VoiceMessageInput.js.map +1 -0
  94. package/lib/module/components/ChannelInput/index.js +36 -5
  95. package/lib/module/components/ChannelInput/index.js.map +1 -1
  96. package/lib/module/components/ChannelMessageList/index.js +149 -117
  97. package/lib/module/components/ChannelMessageList/index.js.map +1 -1
  98. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +24 -13
  99. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
  100. package/lib/module/components/GroupChannelMessageRenderer/index.js +132 -7
  101. package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
  102. package/lib/module/components/MessageSearchResultItem.js +2 -1
  103. package/lib/module/components/MessageSearchResultItem.js.map +1 -1
  104. package/lib/module/components/OpenChannelMessageRenderer/index.js +1 -0
  105. package/lib/module/components/OpenChannelMessageRenderer/index.js.map +1 -1
  106. package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +2 -2
  107. package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -1
  108. package/lib/module/components/ReactionBottomSheets/index.js.map +1 -1
  109. package/lib/module/components/StatusComposition.js.map +1 -1
  110. package/lib/module/constants.js +2 -0
  111. package/lib/module/constants.js.map +1 -1
  112. package/lib/module/containers/GroupChannelPreviewContainer.js +2 -1
  113. package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -1
  114. package/lib/module/containers/InternalErrorBoundaryContainer.js.map +1 -1
  115. package/lib/module/containers/SendbirdUIKitContainer.js +74 -36
  116. package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
  117. package/lib/module/contexts/PlatformServiceCtx.js +14 -11
  118. package/lib/module/contexts/PlatformServiceCtx.js.map +1 -1
  119. package/lib/module/contexts/ReactionCtx.js +3 -2
  120. package/lib/module/contexts/ReactionCtx.js.map +1 -1
  121. package/lib/module/contexts/SendbirdChatCtx.js +2 -0
  122. package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
  123. package/lib/module/domain/groupChannel/component/GroupChannelHeader.js +15 -5
  124. package/lib/module/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
  125. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +29 -43
  126. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  127. package/lib/module/domain/groupChannel/module/moduleContext.js +111 -7
  128. package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
  129. package/lib/module/domain/groupChannel/types.js.map +1 -1
  130. package/lib/module/domain/userList/types.js.map +1 -1
  131. package/lib/module/fragments/createGroupChannelFragment.js +36 -9
  132. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  133. package/lib/module/fragments/createMessageSearchFragment.js +1 -1
  134. package/lib/module/fragments/createMessageSearchFragment.js.map +1 -1
  135. package/lib/module/hooks/useChannelInputItems.js +203 -0
  136. package/lib/module/hooks/useChannelInputItems.js.map +1 -0
  137. package/lib/module/hooks/useConnection.js +1 -1
  138. package/lib/module/hooks/useConnection.js.map +1 -1
  139. package/lib/module/hooks/useVoiceMessageInput.js +199 -0
  140. package/lib/module/hooks/useVoiceMessageInput.js.map +1 -0
  141. package/lib/module/index.js +8 -0
  142. package/lib/module/index.js.map +1 -1
  143. package/lib/module/libs/MentionManager.js.map +1 -1
  144. package/lib/module/libs/SBUUtils.js +4 -0
  145. package/lib/module/libs/SBUUtils.js.map +1 -1
  146. package/lib/module/libs/VoiceMessageConfig.js +23 -0
  147. package/lib/module/libs/VoiceMessageConfig.js.map +1 -0
  148. package/lib/module/localization/StringSet.type.js.map +1 -1
  149. package/lib/module/localization/createBaseStringSet.js +25 -10
  150. package/lib/module/localization/createBaseStringSet.js.map +1 -1
  151. package/lib/module/platform/createFileService.expo.js +10 -0
  152. package/lib/module/platform/createFileService.expo.js.map +1 -1
  153. package/lib/module/platform/createFileService.native.js +19 -0
  154. package/lib/module/platform/createFileService.native.js.map +1 -1
  155. package/lib/module/platform/createPlayerService.expo.js +129 -0
  156. package/lib/module/platform/createPlayerService.expo.js.map +1 -0
  157. package/lib/module/platform/createPlayerService.native.js +132 -0
  158. package/lib/module/platform/createPlayerService.native.js.map +1 -0
  159. package/lib/module/platform/createRecorderService.expo.js +150 -0
  160. package/lib/module/platform/createRecorderService.expo.js.map +1 -0
  161. package/lib/module/platform/createRecorderService.native.js +149 -0
  162. package/lib/module/platform/createRecorderService.native.js.map +1 -0
  163. package/lib/module/platform/types.js.map +1 -1
  164. package/lib/module/types.js +5 -1
  165. package/lib/module/types.js.map +1 -1
  166. package/lib/module/utils/promise.js +132 -0
  167. package/lib/module/utils/promise.js.map +1 -0
  168. package/lib/module/version.js +1 -1
  169. package/lib/module/version.js.map +1 -1
  170. package/lib/typescript/src/components/ChannelCover.d.ts +2 -1
  171. package/lib/typescript/src/components/ChannelInput/AttachmentsButton.d.ts +2 -1
  172. package/lib/typescript/src/components/ChannelInput/MessageToReplyPreview.d.ts +7 -0
  173. package/lib/typescript/src/components/ChannelInput/VoiceMessageInput.d.ts +11 -0
  174. package/lib/typescript/src/components/ChannelInput/index.d.ts +9 -3
  175. package/lib/typescript/src/components/ChannelMessageList/index.d.ts +4 -1
  176. package/lib/typescript/src/components/FileViewer.d.ts +2 -1
  177. package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageDateSeparator.d.ts +2 -1
  178. package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageFocusAnimation.d.ts +1 -1
  179. package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageOutgoingStatus.d.ts +1 -1
  180. package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.d.ts +4 -2
  181. package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +3 -0
  182. package/lib/typescript/src/components/NewMessagesButton.d.ts +1 -1
  183. package/lib/typescript/src/components/OpenChannelMessageRenderer/OpenChannelMessageDateSeparator.d.ts +2 -1
  184. package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +2 -0
  185. package/lib/typescript/src/components/ProviderLayout.d.ts +1 -1
  186. package/lib/typescript/src/components/ReactionAddons/BottomSheetReactionAddon.d.ts +2 -1
  187. package/lib/typescript/src/components/ReactionAddons/MessageReactionAddon.d.ts +2 -1
  188. package/lib/typescript/src/components/ReactionAddons/ReactionRoundedButton.d.ts +3 -2
  189. package/lib/typescript/src/components/ReactionAddons/index.d.ts +3 -2
  190. package/lib/typescript/src/components/ReactionBottomSheets/ReactionListBottomSheet.d.ts +2 -1
  191. package/lib/typescript/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.d.ts +2 -1
  192. package/lib/typescript/src/components/ReactionBottomSheets/index.d.ts +4 -4
  193. package/lib/typescript/src/components/ScrollToBottomButton.d.ts +1 -1
  194. package/lib/typescript/src/components/StatusComposition.d.ts +4 -4
  195. package/lib/typescript/src/components/TypedPlaceholder.d.ts +2 -1
  196. package/lib/typescript/src/components/UserActionBar.d.ts +2 -1
  197. package/lib/typescript/src/components/UserSelectableBar.d.ts +2 -1
  198. package/lib/typescript/src/constants.d.ts +2 -0
  199. package/lib/typescript/src/containers/GroupChannelPreviewContainer.d.ts +2 -1
  200. package/lib/typescript/src/containers/InternalErrorBoundaryContainer.d.ts +3 -3
  201. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +19 -8
  202. package/lib/typescript/src/contexts/LocalizationCtx.d.ts +1 -1
  203. package/lib/typescript/src/contexts/PlatformServiceCtx.d.ts +8 -8
  204. package/lib/typescript/src/contexts/ReactionCtx.d.ts +5 -2
  205. package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +6 -3
  206. package/lib/typescript/src/contexts/UserProfileCtx.d.ts +1 -1
  207. package/lib/typescript/src/domain/groupChannel/component/GroupChannelHeader.d.ts +2 -1
  208. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput.d.ts +1 -1
  209. package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +1 -1
  210. package/lib/typescript/src/domain/groupChannel/component/GroupChannelStatusEmpty.d.ts +2 -1
  211. package/lib/typescript/src/domain/groupChannel/component/GroupChannelStatusLoading.d.ts +2 -1
  212. package/lib/typescript/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.d.ts +2 -1
  213. package/lib/typescript/src/domain/groupChannel/types.d.ts +48 -0
  214. package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersHeader.d.ts +2 -1
  215. package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.d.ts +2 -1
  216. package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersStatusEmpty.d.ts +2 -1
  217. package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersStatusLoading.d.ts +2 -1
  218. package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListHeader.d.ts +2 -1
  219. package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListList.d.ts +2 -1
  220. package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListStatusEmpty.d.ts +2 -1
  221. package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListStatusLoading.d.ts +2 -1
  222. package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListTypeSelector.d.ts +2 -1
  223. package/lib/typescript/src/domain/groupChannelModeration/component/GroupChannelModerationHeader.d.ts +2 -1
  224. package/lib/typescript/src/domain/groupChannelModeration/component/GroupChannelModerationMenu.d.ts +2 -1
  225. package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersHeader.d.ts +2 -1
  226. package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.d.ts +2 -1
  227. package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersStatusEmpty.d.ts +2 -1
  228. package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersStatusLoading.d.ts +2 -1
  229. package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.d.ts +2 -1
  230. package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsView.d.ts +2 -1
  231. package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsHeader.d.ts +2 -1
  232. package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsList.d.ts +2 -1
  233. package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsStatusEmpty.d.ts +2 -1
  234. package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsStatusLoading.d.ts +2 -1
  235. package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsHeader.d.ts +2 -1
  236. package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsInfo.d.ts +2 -1
  237. package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.d.ts +2 -1
  238. package/lib/typescript/src/domain/messageSearch/component/MessageSearchHeader.d.ts +2 -1
  239. package/lib/typescript/src/domain/messageSearch/component/MessageSearchList.d.ts +2 -1
  240. package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusEmpty.d.ts +2 -1
  241. package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusLoading.d.ts +2 -1
  242. package/lib/typescript/src/domain/openChannel/component/OpenChannelHeader.d.ts +2 -2
  243. package/lib/typescript/src/domain/openChannel/component/OpenChannelInput.d.ts +1 -1
  244. package/lib/typescript/src/domain/openChannel/component/OpenChannelMessageList.d.ts +1 -1
  245. package/lib/typescript/src/domain/openChannel/component/OpenChannelStatusEmpty.d.ts +2 -1
  246. package/lib/typescript/src/domain/openChannel/component/OpenChannelStatusLoading.d.ts +2 -1
  247. package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersHeader.d.ts +2 -1
  248. package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersList.d.ts +2 -1
  249. package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersStatusEmpty.d.ts +2 -1
  250. package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersStatusLoading.d.ts +2 -1
  251. package/lib/typescript/src/domain/openChannelCreate/component/OpenChannelCreateHeader.d.ts +2 -1
  252. package/lib/typescript/src/domain/openChannelCreate/component/OpenChannelCreateProfileInput.d.ts +2 -1
  253. package/lib/typescript/src/domain/openChannelCreate/component/OpenChannelCreateStatusLoading.d.ts +2 -1
  254. package/lib/typescript/src/domain/openChannelList/component/OpenChannelListHeader.d.ts +2 -1
  255. package/lib/typescript/src/domain/openChannelList/component/OpenChannelListList.d.ts +2 -1
  256. package/lib/typescript/src/domain/openChannelList/component/OpenChannelListStatusEmpty.d.ts +2 -1
  257. package/lib/typescript/src/domain/openChannelList/component/OpenChannelListStatusLoading.d.ts +2 -1
  258. package/lib/typescript/src/domain/openChannelModeration/component/OpenChannelModerationHeader.d.ts +2 -1
  259. package/lib/typescript/src/domain/openChannelModeration/component/OpenChannelModerationMenu.d.ts +2 -1
  260. package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsHeader.d.ts +2 -1
  261. package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsList.d.ts +2 -1
  262. package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsStatusEmpty.d.ts +2 -1
  263. package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsStatusLoading.d.ts +2 -1
  264. package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsHeader.d.ts +2 -1
  265. package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsList.d.ts +2 -1
  266. package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsStatusEmpty.d.ts +2 -1
  267. package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsStatusLoading.d.ts +2 -1
  268. package/lib/typescript/src/domain/openChannelSettings/component/OpenChannelSettingsHeader.d.ts +2 -1
  269. package/lib/typescript/src/domain/openChannelSettings/component/OpenChannelSettingsInfo.d.ts +2 -1
  270. package/lib/typescript/src/domain/openChannelSettings/component/OpenChannelSettingsMenu.d.ts +2 -1
  271. package/lib/typescript/src/domain/userList/component/UserListHeader.d.ts +3 -3
  272. package/lib/typescript/src/domain/userList/component/UserListList.d.ts +1 -1
  273. package/lib/typescript/src/domain/userList/component/UserListStatusEmpty.d.ts +2 -1
  274. package/lib/typescript/src/domain/userList/component/UserListStatusLoading.d.ts +2 -1
  275. package/lib/typescript/src/domain/userList/types.d.ts +2 -2
  276. package/lib/typescript/src/hooks/useChannelInputItems.d.ts +10 -0
  277. package/lib/typescript/src/hooks/useVoiceMessageInput.d.ts +53 -0
  278. package/lib/typescript/src/index.d.ts +4 -0
  279. package/lib/typescript/src/libs/MentionManager.d.ts +2 -1
  280. package/lib/typescript/src/libs/SBUUtils.d.ts +1 -0
  281. package/lib/typescript/src/libs/VoiceMessageConfig.d.ts +25 -0
  282. package/lib/typescript/src/localization/StringSet.type.d.ts +7 -0
  283. package/lib/typescript/src/platform/createPlayerService.expo.d.ts +7 -0
  284. package/lib/typescript/src/platform/createPlayerService.native.d.ts +9 -0
  285. package/lib/typescript/src/platform/createRecorderService.expo.d.ts +7 -0
  286. package/lib/typescript/src/platform/createRecorderService.native.d.ts +9 -0
  287. package/lib/typescript/src/platform/types.d.ts +100 -1
  288. package/lib/typescript/src/types.d.ts +5 -1
  289. package/lib/typescript/src/utils/promise.d.ts +7 -0
  290. package/lib/typescript/src/version.d.ts +1 -1
  291. package/package.json +10 -12
  292. package/src/components/ChannelInput/EditInput.tsx +3 -15
  293. package/src/components/ChannelInput/MessageToReplyPreview.tsx +133 -0
  294. package/src/components/ChannelInput/SendInput.tsx +131 -329
  295. package/src/components/ChannelInput/VoiceMessageInput.tsx +206 -0
  296. package/src/components/ChannelInput/index.tsx +37 -6
  297. package/src/components/ChannelMessageList/index.tsx +145 -113
  298. package/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.tsx +24 -11
  299. package/src/components/GroupChannelMessageRenderer/index.tsx +113 -4
  300. package/src/components/MessageSearchResultItem.tsx +2 -1
  301. package/src/components/OpenChannelMessageRenderer/index.tsx +1 -0
  302. package/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.tsx +2 -2
  303. package/src/components/ReactionBottomSheets/index.tsx +3 -2
  304. package/src/components/StatusComposition.tsx +3 -3
  305. package/src/constants.ts +2 -0
  306. package/src/containers/GroupChannelPreviewContainer.tsx +2 -0
  307. package/src/containers/InternalErrorBoundaryContainer.tsx +1 -1
  308. package/src/containers/SendbirdUIKitContainer.tsx +103 -59
  309. package/src/contexts/PlatformServiceCtx.tsx +22 -20
  310. package/src/contexts/ReactionCtx.tsx +7 -5
  311. package/src/contexts/SendbirdChatCtx.tsx +10 -2
  312. package/src/domain/groupChannel/component/GroupChannelHeader.tsx +14 -3
  313. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +30 -43
  314. package/src/domain/groupChannel/module/moduleContext.tsx +119 -7
  315. package/src/domain/groupChannel/types.ts +45 -0
  316. package/src/domain/userList/types.ts +2 -2
  317. package/src/fragments/createGroupChannelFragment.tsx +43 -8
  318. package/src/fragments/createMessageSearchFragment.tsx +1 -1
  319. package/src/hooks/useChannelInputItems.ts +215 -0
  320. package/src/hooks/useConnection.ts +1 -1
  321. package/src/hooks/useVoiceMessageInput.ts +237 -0
  322. package/src/index.ts +9 -1
  323. package/src/libs/MentionManager.tsx +1 -1
  324. package/src/libs/SBUUtils.ts +5 -0
  325. package/src/libs/VoiceMessageConfig.ts +28 -0
  326. package/src/localization/StringSet.type.ts +8 -0
  327. package/src/localization/createBaseStringSet.ts +27 -11
  328. package/src/platform/createFileService.expo.ts +10 -0
  329. package/src/platform/createFileService.native.ts +19 -0
  330. package/src/platform/createPlayerService.expo.tsx +142 -0
  331. package/src/platform/createPlayerService.native.tsx +148 -0
  332. package/src/platform/createRecorderService.expo.tsx +160 -0
  333. package/src/platform/createRecorderService.native.tsx +170 -0
  334. package/src/platform/types.ts +114 -1
  335. package/src/types.ts +6 -1
  336. package/src/utils/promise.ts +139 -0
  337. package/src/version.ts +1 -1
@@ -2,7 +2,8 @@ import React, { useContext } from 'react';
2
2
  import { View } from 'react-native';
3
3
  import { Header, Icon, createStyleSheet, useHeaderStyle } from '@sendbird/uikit-react-native-foundation';
4
4
  import ChannelCover from '../../../components/ChannelCover';
5
- import { useLocalization } from '../../../hooks/useContext';
5
+ import { useLocalization, useSendbirdChat } from '../../../hooks/useContext';
6
+ import { TypingIndicatorType } from '../../../types';
6
7
  import { GroupChannelContexts } from '../module/moduleContext';
7
8
  const GroupChannelHeader = _ref => {
8
9
  let {
@@ -10,6 +11,9 @@ const GroupChannelHeader = _ref => {
10
11
  onPressHeaderLeft,
11
12
  onPressHeaderRight
12
13
  } = _ref;
14
+ const {
15
+ sbOptions
16
+ } = useSendbirdChat();
13
17
  const {
14
18
  headerTitle,
15
19
  channel
@@ -23,7 +27,15 @@ const GroupChannelHeader = _ref => {
23
27
  const {
24
28
  HeaderComponent
25
29
  } = useHeaderStyle();
26
- const subtitle = STRINGS.LABELS.TYPING_INDICATOR_TYPINGS(typingUsers);
30
+ const renderSubtitle = () => {
31
+ const subtitle = STRINGS.LABELS.TYPING_INDICATOR_TYPINGS(typingUsers);
32
+ if (!subtitle) return null;
33
+ if (!sbOptions.uikit.groupChannel.channel.enableTypingIndicator) return null;
34
+ if (!sbOptions.uikit.groupChannel.channel.typingIndicatorTypes.has(TypingIndicatorType.Text)) return null;
35
+ return /*#__PURE__*/React.createElement(Header.Subtitle, {
36
+ style: styles.subtitle
37
+ }, subtitle);
38
+ };
27
39
  const isHidden = shouldHideRight();
28
40
  return /*#__PURE__*/React.createElement(HeaderComponent, {
29
41
  clearTitleMargin: true,
@@ -39,9 +51,7 @@ const GroupChannelHeader = _ref => {
39
51
  }
40
52
  }, /*#__PURE__*/React.createElement(Header.Title, {
41
53
  h2: true
42
- }, headerTitle), Boolean(subtitle) && subtitle && /*#__PURE__*/React.createElement(Header.Subtitle, {
43
- style: styles.subtitle
44
- }, subtitle))),
54
+ }, headerTitle), renderSubtitle())),
45
55
  left: /*#__PURE__*/React.createElement(Icon, {
46
56
  icon: 'arrow-left'
47
57
  }),
@@ -1 +1 @@
1
- {"version":3,"names":["React","useContext","View","Header","Icon","createStyleSheet","useHeaderStyle","ChannelCover","useLocalization","GroupChannelContexts","GroupChannelHeader","_ref","shouldHideRight","onPressHeaderLeft","onPressHeaderRight","headerTitle","channel","Fragment","typingUsers","TypingIndicator","STRINGS","HeaderComponent","subtitle","LABELS","TYPING_INDICATOR_TYPINGS","isHidden","createElement","clearTitleMargin","title","style","styles","titleContainer","size","containerStyle","avatarGroup","flexShrink","Title","h2","Boolean","Subtitle","left","icon","onPressLeft","right","onPressRight","undefined","maxWidth","flexDirection","alignItems","marginRight","marginTop"],"sources":["GroupChannelHeader.tsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport { View } from 'react-native';\n\nimport { Header, Icon, createStyleSheet, useHeaderStyle } from '@sendbird/uikit-react-native-foundation';\n\nimport ChannelCover from '../../../components/ChannelCover';\nimport { useLocalization } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelHeader = ({\n shouldHideRight,\n onPressHeaderLeft,\n onPressHeaderRight,\n}: GroupChannelProps['Header']) => {\n const { headerTitle, channel } = useContext(GroupChannelContexts.Fragment);\n const { typingUsers } = useContext(GroupChannelContexts.TypingIndicator);\n const { STRINGS } = useLocalization();\n const { HeaderComponent } = useHeaderStyle();\n const subtitle = STRINGS.LABELS.TYPING_INDICATOR_TYPINGS(typingUsers);\n\n const isHidden = shouldHideRight();\n\n return (\n <HeaderComponent\n clearTitleMargin\n title={\n <View style={styles.titleContainer}>\n <ChannelCover channel={channel} size={34} containerStyle={styles.avatarGroup} />\n <View style={{ flexShrink: 1 }}>\n <Header.Title h2>{headerTitle}</Header.Title>\n {Boolean(subtitle) && subtitle && <Header.Subtitle style={styles.subtitle}>{subtitle}</Header.Subtitle>}\n </View>\n </View>\n }\n left={<Icon icon={'arrow-left'} />}\n onPressLeft={onPressHeaderLeft}\n right={isHidden ? null : <Icon icon={'info'} />}\n onPressRight={isHidden ? undefined : onPressHeaderRight}\n />\n );\n};\n\nconst styles = createStyleSheet({\n titleContainer: {\n maxWidth: '100%',\n flexDirection: 'row',\n alignItems: 'center',\n },\n avatarGroup: {\n marginRight: 8,\n },\n subtitle: {\n marginTop: 2,\n },\n});\n\nexport default GroupChannelHeader;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,SAASC,IAAI,QAAQ,cAAc;AAEnC,SAASC,MAAM,EAAEC,IAAI,EAAEC,gBAAgB,EAAEC,cAAc,QAAQ,yCAAyC;AAExG,OAAOC,YAAY,MAAM,kCAAkC;AAC3D,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,oBAAoB,QAAQ,yBAAyB;AAG9D,MAAMC,kBAAkB,GAAGC,IAAA,IAIQ;EAAA,IAJP;IAC1BC,eAAe;IACfC,iBAAiB;IACjBC;EAC2B,CAAC,GAAAH,IAAA;EAC5B,MAAM;IAAEI,WAAW;IAAEC;EAAQ,CAAC,GAAGf,UAAU,CAACQ,oBAAoB,CAACQ,QAAQ,CAAC;EAC1E,MAAM;IAAEC;EAAY,CAAC,GAAGjB,UAAU,CAACQ,oBAAoB,CAACU,eAAe,CAAC;EACxE,MAAM;IAAEC;EAAQ,CAAC,GAAGZ,eAAe,EAAE;EACrC,MAAM;IAAEa;EAAgB,CAAC,GAAGf,cAAc,EAAE;EAC5C,MAAMgB,QAAQ,GAAGF,OAAO,CAACG,MAAM,CAACC,wBAAwB,CAACN,WAAW,CAAC;EAErE,MAAMO,QAAQ,GAAGb,eAAe,EAAE;EAElC,oBACEZ,KAAA,CAAA0B,aAAA,CAACL,eAAe;IACdM,gBAAgB;IAChBC,KAAK,eACH5B,KAAA,CAAA0B,aAAA,CAACxB,IAAI;MAAC2B,KAAK,EAAEC,MAAM,CAACC;IAAe,gBACjC/B,KAAA,CAAA0B,aAAA,CAACnB,YAAY;MAACS,OAAO,EAAEA,OAAQ;MAACgB,IAAI,EAAE,EAAG;MAACC,cAAc,EAAEH,MAAM,CAACI;IAAY,EAAG,eAChFlC,KAAA,CAAA0B,aAAA,CAACxB,IAAI;MAAC2B,KAAK,EAAE;QAAEM,UAAU,EAAE;MAAE;IAAE,gBAC7BnC,KAAA,CAAA0B,aAAA,CAACvB,MAAM,CAACiC,KAAK;MAACC,EAAE;IAAA,GAAEtB,WAAW,CAAgB,EAC5CuB,OAAO,CAAChB,QAAQ,CAAC,IAAIA,QAAQ,iBAAItB,KAAA,CAAA0B,aAAA,CAACvB,MAAM,CAACoC,QAAQ;MAACV,KAAK,EAAEC,MAAM,CAACR;IAAS,GAAEA,QAAQ,CAAmB,CAClG,CAEV;IACDkB,IAAI,eAAExC,KAAA,CAAA0B,aAAA,CAACtB,IAAI;MAACqC,IAAI,EAAE;IAAa,EAAI;IACnCC,WAAW,EAAE7B,iBAAkB;IAC/B8B,KAAK,EAAElB,QAAQ,GAAG,IAAI,gBAAGzB,KAAA,CAAA0B,aAAA,CAACtB,IAAI;MAACqC,IAAI,EAAE;IAAO,EAAI;IAChDG,YAAY,EAAEnB,QAAQ,GAAGoB,SAAS,GAAG/B;EAAmB,EACxD;AAEN,CAAC;AAED,MAAMgB,MAAM,GAAGzB,gBAAgB,CAAC;EAC9B0B,cAAc,EAAE;IACde,QAAQ,EAAE,MAAM;IAChBC,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE;EACd,CAAC;EACDd,WAAW,EAAE;IACXe,WAAW,EAAE;EACf,CAAC;EACD3B,QAAQ,EAAE;IACR4B,SAAS,EAAE;EACb;AACF,CAAC,CAAC;AAEF,eAAexC,kBAAkB"}
1
+ {"version":3,"names":["React","useContext","View","Header","Icon","createStyleSheet","useHeaderStyle","ChannelCover","useLocalization","useSendbirdChat","TypingIndicatorType","GroupChannelContexts","GroupChannelHeader","_ref","shouldHideRight","onPressHeaderLeft","onPressHeaderRight","sbOptions","headerTitle","channel","Fragment","typingUsers","TypingIndicator","STRINGS","HeaderComponent","renderSubtitle","subtitle","LABELS","TYPING_INDICATOR_TYPINGS","uikit","groupChannel","enableTypingIndicator","typingIndicatorTypes","has","Text","createElement","Subtitle","style","styles","isHidden","clearTitleMargin","title","titleContainer","size","containerStyle","avatarGroup","flexShrink","Title","h2","left","icon","onPressLeft","right","onPressRight","undefined","maxWidth","flexDirection","alignItems","marginRight","marginTop"],"sources":["GroupChannelHeader.tsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport { View } from 'react-native';\n\nimport { Header, Icon, createStyleSheet, useHeaderStyle } from '@sendbird/uikit-react-native-foundation';\n\nimport ChannelCover from '../../../components/ChannelCover';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { TypingIndicatorType } from '../../../types';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelHeader = ({\n shouldHideRight,\n onPressHeaderLeft,\n onPressHeaderRight,\n}: GroupChannelProps['Header']) => {\n const { sbOptions } = useSendbirdChat();\n const { headerTitle, channel } = useContext(GroupChannelContexts.Fragment);\n const { typingUsers } = useContext(GroupChannelContexts.TypingIndicator);\n const { STRINGS } = useLocalization();\n const { HeaderComponent } = useHeaderStyle();\n\n const renderSubtitle = () => {\n const subtitle = STRINGS.LABELS.TYPING_INDICATOR_TYPINGS(typingUsers);\n\n if (!subtitle) return null;\n if (!sbOptions.uikit.groupChannel.channel.enableTypingIndicator) return null;\n if (!sbOptions.uikit.groupChannel.channel.typingIndicatorTypes.has(TypingIndicatorType.Text)) return null;\n\n return <Header.Subtitle style={styles.subtitle}>{subtitle}</Header.Subtitle>;\n };\n\n const isHidden = shouldHideRight();\n\n return (\n <HeaderComponent\n clearTitleMargin\n title={\n <View style={styles.titleContainer}>\n <ChannelCover channel={channel} size={34} containerStyle={styles.avatarGroup} />\n <View style={{ flexShrink: 1 }}>\n <Header.Title h2>{headerTitle}</Header.Title>\n {renderSubtitle()}\n </View>\n </View>\n }\n left={<Icon icon={'arrow-left'} />}\n onPressLeft={onPressHeaderLeft}\n right={isHidden ? null : <Icon icon={'info'} />}\n onPressRight={isHidden ? undefined : onPressHeaderRight}\n />\n );\n};\n\nconst styles = createStyleSheet({\n titleContainer: {\n maxWidth: '100%',\n flexDirection: 'row',\n alignItems: 'center',\n },\n avatarGroup: {\n marginRight: 8,\n },\n subtitle: {\n marginTop: 2,\n },\n});\n\nexport default GroupChannelHeader;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
- import React, { useContext, useEffect, useRef } from 'react';
2
+ import React, { useContext, useEffect } from 'react';
3
3
  import { useChannelHandler } from '@sendbird/uikit-chat-hooks';
4
4
  import { useToast } from '@sendbird/uikit-react-native-foundation';
5
5
  import { isDifferentChannel, useFreshCallback, useIsFirstMount, useUniqHandlerId } from '@sendbird/uikit-utils';
@@ -22,39 +22,14 @@ const GroupChannelMessageList = props => {
22
22
  const {
23
23
  subscribe
24
24
  } = useContext(GroupChannelContexts.PubSub);
25
+ const {
26
+ flatListRef,
27
+ lazyScrollToBottom,
28
+ lazyScrollToIndex
29
+ } = useContext(GroupChannelContexts.MessageList);
25
30
  const id = useUniqHandlerId('GroupChannelMessageList');
26
- const ref = useRef(null);
27
31
  const isFirstMount = useIsFirstMount();
28
-
29
- // FIXME: Workaround, should run after data has been applied to UI.
30
- const lazyScrollToBottom = function () {
31
- let animated = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
32
- let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
33
- setTimeout(() => {
34
- var _ref$current;
35
- (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.scrollToOffset({
36
- offset: 0,
37
- animated
38
- });
39
- }, timeout);
40
- };
41
-
42
- // FIXME: Workaround, should run after data has been applied to UI.
43
- const lazyScrollToIndex = function () {
44
- let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
45
- let animated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
46
- let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
47
- setTimeout(() => {
48
- var _ref$current2;
49
- (_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.scrollToIndex({
50
- index,
51
- animated,
52
- viewPosition: 0.5
53
- });
54
- }, timeout);
55
- };
56
- const scrollToMessage = useFreshCallback(function (createdAt) {
57
- let focusAnimated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
32
+ const scrollToMessageWithCreatedAt = useFreshCallback((createdAt, focusAnimated, timeout) => {
58
33
  const foundMessageIndex = props.messages.findIndex(it => it.createdAt === createdAt);
59
34
  const isIncludedInList = foundMessageIndex > -1;
60
35
  if (isIncludedInList) {
@@ -63,7 +38,11 @@ const GroupChannelMessageList = props => {
63
38
  startingPoint: createdAt
64
39
  }), MESSAGE_FOCUS_ANIMATION_DELAY);
65
40
  }
66
- lazyScrollToIndex(foundMessageIndex, true, isFirstMount ? MESSAGE_SEARCH_SAFE_SCROLL_DELAY : 0);
41
+ lazyScrollToIndex({
42
+ index: foundMessageIndex,
43
+ animated: true,
44
+ timeout
45
+ });
67
46
  } else {
68
47
  if (props.channel.messageOffsetTimestamp <= createdAt) {
69
48
  if (focusAnimated) props.onUpdateSearchItem({
@@ -83,10 +62,14 @@ const GroupChannelMessageList = props => {
83
62
  props.onScrolledAwayFromBottom(false);
84
63
  props.onResetMessageList(() => {
85
64
  props.onScrolledAwayFromBottom(false);
86
- lazyScrollToBottom(animated);
65
+ lazyScrollToBottom({
66
+ animated
67
+ });
87
68
  });
88
69
  } else {
89
- lazyScrollToBottom(animated);
70
+ lazyScrollToBottom({
71
+ animated
72
+ });
90
73
  }
91
74
  });
92
75
  useChannelHandler(sdk, id, {
@@ -96,7 +79,10 @@ const GroupChannelMessageList = props => {
96
79
  const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;
97
80
  const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();
98
81
  if (isRecentMessage && scrollReachedBottomAndCanScroll) {
99
- lazyScrollToBottom(true, 250);
82
+ lazyScrollToBottom({
83
+ animated: true,
84
+ timeout: 250
85
+ });
100
86
  }
101
87
  }
102
88
  });
@@ -106,6 +92,7 @@ const GroupChannelMessageList = props => {
106
92
  type
107
93
  } = _ref;
108
94
  switch (type) {
95
+ case 'TYPING_BUBBLE_RENDERED':
109
96
  case 'MESSAGES_RECEIVED':
110
97
  {
111
98
  if (!props.scrolledAwayFromBottom) {
@@ -122,21 +109,20 @@ const GroupChannelMessageList = props => {
122
109
  }
123
110
  });
124
111
  }, [props.scrolledAwayFromBottom]);
125
-
126
- // Only trigger once when message list mount with initial props.searchItem
127
- // - Search screen + searchItem > mount message list
128
- // - Reset message list + searchItem > re-mount message list
129
112
  useEffect(() => {
113
+ // Only trigger once when message list mount with initial props.searchItem
114
+ // - Search screen + searchItem > mount message list
115
+ // - Reset message list + searchItem > re-mount message list
130
116
  if (isFirstMount && props.searchItem) {
131
- scrollToMessage(props.searchItem.startingPoint);
117
+ scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);
132
118
  }
133
119
  }, [isFirstMount]);
134
120
  const onPressParentMessage = useFreshCallback(message => {
135
- const canScrollToParent = scrollToMessage(message.createdAt, true);
121
+ const canScrollToParent = scrollToMessageWithCreatedAt(message.createdAt, true, 0);
136
122
  if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');
137
123
  });
138
124
  return /*#__PURE__*/React.createElement(ChannelMessageList, _extends({}, props, {
139
- ref: ref,
125
+ ref: flatListRef,
140
126
  onReplyMessage: setMessageToReply,
141
127
  onEditMessage: setMessageToEdit,
142
128
  onPressParentMessage: onPressParentMessage,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useContext","useEffect","useRef","useChannelHandler","useToast","isDifferentChannel","useFreshCallback","useIsFirstMount","useUniqHandlerId","ChannelMessageList","MESSAGE_FOCUS_ANIMATION_DELAY","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","useLocalization","useSendbirdChat","GroupChannelContexts","GroupChannelMessageList","props","toast","STRINGS","sdk","setMessageToEdit","setMessageToReply","Fragment","subscribe","PubSub","id","ref","isFirstMount","lazyScrollToBottom","animated","arguments","length","undefined","timeout","setTimeout","_ref$current","current","scrollToOffset","offset","lazyScrollToIndex","index","_ref$current2","scrollToIndex","viewPosition","scrollToMessage","createdAt","focusAnimated","foundMessageIndex","messages","findIndex","it","isIncludedInList","onUpdateSearchItem","startingPoint","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","scrollToBottom","hasNext","onScrolledAwayFromBottom","onResetMessageList","onReactionUpdated","event","recentMessage","isRecentMessage","messageId","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","_ref","type","searchItem","onPressParentMessage","message","canScrollToParent","show","TOAST","FIND_PARENT_MSG_ERROR","createElement","_extends","onReplyMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import React, { useContext, useEffect, useRef } from 'react';\nimport type { FlatList } from 'react-native';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdMessage } from '@sendbird/uikit-utils';\nimport { isDifferentChannel, useFreshCallback, useIsFirstMount, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const { subscribe } = useContext(GroupChannelContexts.PubSub);\n\n const id = useUniqHandlerId('GroupChannelMessageList');\n const ref = useRef<FlatList<SendbirdMessage>>(null);\n const isFirstMount = useIsFirstMount();\n\n // FIXME: Workaround, should run after data has been applied to UI.\n const lazyScrollToBottom = (animated = false, timeout = 0) => {\n setTimeout(() => {\n ref.current?.scrollToOffset({ offset: 0, animated });\n }, timeout);\n };\n\n // FIXME: Workaround, should run after data has been applied to UI.\n const lazyScrollToIndex = (index = 0, animated = false, timeout = 0) => {\n setTimeout(() => {\n ref.current?.scrollToIndex({ index, animated, viewPosition: 0.5 });\n }, timeout);\n };\n\n const scrollToMessage = useFreshCallback((createdAt: number, focusAnimated = false): boolean => {\n const foundMessageIndex = props.messages.findIndex((it) => it.createdAt === createdAt);\n const isIncludedInList = foundMessageIndex > -1;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n lazyScrollToIndex(foundMessageIndex, true, isFirstMount ? MESSAGE_SEARCH_SAFE_SCROLL_DELAY : 0);\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) props.onUpdateSearchItem({ startingPoint: createdAt });\n props.onResetMessageListWithStartingPoint(createdAt);\n } else {\n return false;\n }\n }\n\n return true;\n });\n\n const scrollToBottom = useFreshCallback((animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n props.onScrolledAwayFromBottom(false);\n\n props.onResetMessageList(() => {\n props.onScrolledAwayFromBottom(false);\n lazyScrollToBottom(animated);\n });\n } else {\n lazyScrollToBottom(animated);\n }\n });\n\n useChannelHandler(sdk, id, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom(true, 250);\n }\n },\n });\n\n useEffect(() => {\n return subscribe(({ type }) => {\n switch (type) {\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n useEffect(() => {\n if (isFirstMount && props.searchItem) {\n scrollToMessage(props.searchItem.startingPoint);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback((message: SendbirdMessage) => {\n const canScrollToParent = scrollToMessage(message.createdAt, true);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n });\n\n return (\n <ChannelMessageList\n {...props}\n ref={ref}\n onReplyMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useContext","useEffect","useChannelHandler","useToast","isDifferentChannel","useFreshCallback","useIsFirstMount","useUniqHandlerId","ChannelMessageList","MESSAGE_FOCUS_ANIMATION_DELAY","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","useLocalization","useSendbirdChat","GroupChannelContexts","GroupChannelMessageList","props","toast","STRINGS","sdk","setMessageToEdit","setMessageToReply","Fragment","subscribe","PubSub","flatListRef","lazyScrollToBottom","lazyScrollToIndex","MessageList","id","isFirstMount","scrollToMessageWithCreatedAt","createdAt","focusAnimated","timeout","foundMessageIndex","messages","findIndex","it","isIncludedInList","setTimeout","onUpdateSearchItem","startingPoint","index","animated","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","scrollToBottom","arguments","length","undefined","hasNext","onScrolledAwayFromBottom","onResetMessageList","onReactionUpdated","event","recentMessage","isRecentMessage","messageId","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","_ref","type","searchItem","onPressParentMessage","message","canScrollToParent","show","TOAST","FIND_PARENT_MSG_ERROR","createElement","_extends","ref","onReplyMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import React, { useContext, useEffect } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdMessage } from '@sendbird/uikit-utils';\nimport { isDifferentChannel, useFreshCallback, useIsFirstMount, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const { subscribe } = useContext(GroupChannelContexts.PubSub);\n const { flatListRef, lazyScrollToBottom, lazyScrollToIndex } = useContext(GroupChannelContexts.MessageList);\n\n const id = useUniqHandlerId('GroupChannelMessageList');\n const isFirstMount = useIsFirstMount();\n\n const scrollToMessageWithCreatedAt = useFreshCallback(\n (createdAt: number, focusAnimated: boolean, timeout: number): boolean => {\n const foundMessageIndex = props.messages.findIndex((it) => it.createdAt === createdAt);\n const isIncludedInList = foundMessageIndex > -1;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n lazyScrollToIndex({ index: foundMessageIndex, animated: true, timeout });\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) props.onUpdateSearchItem({ startingPoint: createdAt });\n props.onResetMessageListWithStartingPoint(createdAt);\n } else {\n return false;\n }\n }\n return true;\n },\n );\n\n const scrollToBottom = useFreshCallback((animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n props.onScrolledAwayFromBottom(false);\n\n props.onResetMessageList(() => {\n props.onScrolledAwayFromBottom(false);\n lazyScrollToBottom({ animated });\n });\n } else {\n lazyScrollToBottom({ animated });\n }\n });\n\n useChannelHandler(sdk, id, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom({ animated: true, timeout: 250 });\n }\n },\n });\n\n useEffect(() => {\n return subscribe(({ type }) => {\n switch (type) {\n case 'TYPING_BUBBLE_RENDERED':\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n useEffect(() => {\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n if (isFirstMount && props.searchItem) {\n scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback((message: SendbirdMessage) => {\n const canScrollToParent = scrollToMessageWithCreatedAt(message.createdAt, true, 0);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n });\n\n return (\n <ChannelMessageList\n {...props}\n ref={flatListRef}\n onReplyMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import React, { createContext, useCallback, useState } from 'react';
1
+ import React, { createContext, useCallback, useRef, useState } from 'react';
2
2
  import { useChannelHandler } from '@sendbird/uikit-chat-hooks';
3
- import { NOOP, isDifferentChannel, useUniqHandlerId } from '@sendbird/uikit-utils';
3
+ import { Logger, NOOP, getGroupChannelChatAvailableState, isDifferentChannel, useFreshCallback, useUniqHandlerId } from '@sendbird/uikit-utils';
4
4
  import ProviderLayout from '../../../components/ProviderLayout';
5
+ import { MESSAGE_FOCUS_ANIMATION_DELAY } from '../../../constants';
5
6
  import { useLocalization, useSendbirdChat } from '../../../hooks/useContext';
6
7
  export const GroupChannelContexts = {
7
8
  Fragment: /*#__PURE__*/createContext({
@@ -16,6 +17,18 @@ export const GroupChannelContexts = {
16
17
  PubSub: /*#__PURE__*/createContext({
17
18
  publish: NOOP,
18
19
  subscribe: () => NOOP
20
+ }),
21
+ MessageList: /*#__PURE__*/createContext({
22
+ flatListRef: {
23
+ current: null
24
+ },
25
+ scrollToMessage: () => false,
26
+ lazyScrollToBottom: () => {
27
+ // noop
28
+ },
29
+ lazyScrollToIndex: () => {
30
+ // noop
31
+ }
19
32
  })
20
33
  };
21
34
  export const GroupChannelContextsProvider = _ref => {
@@ -24,7 +37,9 @@ export const GroupChannelContextsProvider = _ref => {
24
37
  channel,
25
38
  enableTypingIndicator,
26
39
  keyboardAvoidOffset = 0,
27
- groupChannelPubSub
40
+ groupChannelPubSub,
41
+ messages,
42
+ onUpdateSearchItem
28
43
  } = _ref;
29
44
  if (!channel) throw new Error('GroupChannel is not provided to GroupChannelModule');
30
45
  const handlerId = useUniqHandlerId('GroupChannelContextsProvider');
@@ -38,6 +53,15 @@ export const GroupChannelContextsProvider = _ref => {
38
53
  const [typingUsers, setTypingUsers] = useState([]);
39
54
  const [messageToEdit, setMessageToEdit] = useState();
40
55
  const [messageToReply, setMessageToReply] = useState();
56
+ const {
57
+ flatListRef,
58
+ lazyScrollToIndex,
59
+ lazyScrollToBottom,
60
+ scrollToMessage
61
+ } = useScrollActions({
62
+ messages,
63
+ onUpdateSearchItem
64
+ });
41
65
  const updateInputMode = (mode, message) => {
42
66
  if (mode === 'send' || !message) {
43
67
  setMessageToEdit(undefined);
@@ -61,7 +85,9 @@ export const GroupChannelContextsProvider = _ref => {
61
85
  },
62
86
  onChannelFrozen(frozenChannel) {
63
87
  if (frozenChannel.url === channel.url) {
64
- setMessageToReply(undefined);
88
+ if (frozenChannel.isGroupChannel() && getGroupChannelChatAvailableState(channel).frozen) {
89
+ setMessageToReply(undefined);
90
+ }
65
91
  }
66
92
  },
67
93
  onUserMuted(mutedChannel, user) {
@@ -86,12 +112,90 @@ export const GroupChannelContextsProvider = _ref => {
86
112
  messageToReply,
87
113
  setMessageToReply: useCallback(message => updateInputMode('reply', message), [])
88
114
  }
115
+ }, /*#__PURE__*/React.createElement(GroupChannelContexts.PubSub.Provider, {
116
+ value: groupChannelPubSub
89
117
  }, /*#__PURE__*/React.createElement(GroupChannelContexts.TypingIndicator.Provider, {
90
118
  value: {
91
119
  typingUsers
92
120
  }
93
- }, /*#__PURE__*/React.createElement(GroupChannelContexts.PubSub.Provider, {
94
- value: groupChannelPubSub
95
- }, children))));
121
+ }, /*#__PURE__*/React.createElement(GroupChannelContexts.MessageList.Provider, {
122
+ value: {
123
+ flatListRef,
124
+ scrollToMessage,
125
+ lazyScrollToIndex,
126
+ lazyScrollToBottom
127
+ }
128
+ }, children)))));
129
+ };
130
+ const useScrollActions = params => {
131
+ const {
132
+ messages,
133
+ onUpdateSearchItem
134
+ } = params;
135
+ const flatListRef = useRef(null);
136
+
137
+ // FIXME: Workaround, should run after data has been applied to UI.
138
+ const lazyScrollToBottom = useFreshCallback(params => {
139
+ if (!flatListRef.current) {
140
+ logFlatListRefWarning();
141
+ return;
142
+ }
143
+ setTimeout(() => {
144
+ var _flatListRef$current;
145
+ (_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 ? void 0 : _flatListRef$current.scrollToOffset({
146
+ offset: 0,
147
+ animated: (params === null || params === void 0 ? void 0 : params.animated) ?? false
148
+ });
149
+ }, (params === null || params === void 0 ? void 0 : params.timeout) ?? 0);
150
+ });
151
+
152
+ // FIXME: Workaround, should run after data has been applied to UI.
153
+ const lazyScrollToIndex = useFreshCallback(params => {
154
+ if (!flatListRef.current) {
155
+ logFlatListRefWarning();
156
+ return;
157
+ }
158
+ setTimeout(() => {
159
+ var _flatListRef$current2;
160
+ (_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 ? void 0 : _flatListRef$current2.scrollToIndex({
161
+ index: (params === null || params === void 0 ? void 0 : params.index) ?? 0,
162
+ animated: (params === null || params === void 0 ? void 0 : params.animated) ?? false,
163
+ viewPosition: (params === null || params === void 0 ? void 0 : params.viewPosition) ?? 0.5
164
+ });
165
+ }, (params === null || params === void 0 ? void 0 : params.timeout) ?? 0);
166
+ });
167
+ const scrollToMessage = useFreshCallback((messageId, options) => {
168
+ if (!flatListRef.current) {
169
+ logFlatListRefWarning();
170
+ return false;
171
+ }
172
+ const foundMessageIndex = messages.findIndex(it => it.messageId === messageId);
173
+ const isIncludedInList = foundMessageIndex > -1;
174
+ if (isIncludedInList) {
175
+ if (options !== null && options !== void 0 && options.focusAnimated) {
176
+ setTimeout(() => onUpdateSearchItem({
177
+ startingPoint: messages[foundMessageIndex].createdAt
178
+ }), MESSAGE_FOCUS_ANIMATION_DELAY);
179
+ }
180
+ lazyScrollToIndex({
181
+ index: foundMessageIndex,
182
+ animated: true,
183
+ timeout: 0,
184
+ viewPosition: options === null || options === void 0 ? void 0 : options.viewPosition
185
+ });
186
+ return true;
187
+ } else {
188
+ return false;
189
+ }
190
+ });
191
+ return {
192
+ flatListRef,
193
+ lazyScrollToIndex,
194
+ lazyScrollToBottom,
195
+ scrollToMessage
196
+ };
197
+ };
198
+ const logFlatListRefWarning = () => {
199
+ Logger.warn('Cannot find flatListRef.current, please render FlatList and pass the flatListRef' + 'or please try again after FlatList has been rendered.');
96
200
  };
97
201
  //# sourceMappingURL=moduleContext.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","createContext","useCallback","useState","useChannelHandler","NOOP","isDifferentChannel","useUniqHandlerId","ProviderLayout","useLocalization","useSendbirdChat","GroupChannelContexts","Fragment","headerTitle","channel","setMessageToEdit","setMessageToReply","TypingIndicator","typingUsers","PubSub","publish","subscribe","GroupChannelContextsProvider","_ref","children","enableTypingIndicator","keyboardAvoidOffset","groupChannelPubSub","Error","handlerId","STRINGS","currentUser","sdk","setTypingUsers","messageToEdit","messageToReply","updateInputMode","mode","message","undefined","onMessageDeleted","_","messageId","onChannelFrozen","frozenChannel","url","onUserMuted","mutedChannel","user","_sdk$currentUser","userId","onTypingStatusUpdated","eventChannel","getTypingUsers","createElement","Provider","value","GROUP_CHANNEL","HEADER_TITLE"],"sources":["moduleContext.tsx"],"sourcesContent":["import React, { createContext, useCallback, useState } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport {\n NOOP,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdUser,\n SendbirdUserMessage,\n isDifferentChannel,\n useUniqHandlerId,\n} from '@sendbird/uikit-utils';\n\nimport ProviderLayout from '../../../components/ProviderLayout';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport type { PubSub } from '../../../utils/pubsub';\nimport type { GroupChannelContextsType, GroupChannelModule, GroupChannelPubSubContextPayload } from '../types';\n\nexport const GroupChannelContexts: GroupChannelContextsType = {\n Fragment: createContext({\n headerTitle: '',\n channel: {} as SendbirdGroupChannel,\n setMessageToEdit: NOOP,\n setMessageToReply: NOOP,\n }),\n TypingIndicator: createContext({\n typingUsers: [] as SendbirdUser[],\n }),\n PubSub: createContext({\n publish: NOOP,\n subscribe: () => NOOP,\n } as PubSub<GroupChannelPubSubContextPayload>),\n};\n\nexport const GroupChannelContextsProvider: GroupChannelModule['Provider'] = ({\n children,\n channel,\n enableTypingIndicator,\n keyboardAvoidOffset = 0,\n groupChannelPubSub,\n}) => {\n if (!channel) throw new Error('GroupChannel is not provided to GroupChannelModule');\n\n const handlerId = useUniqHandlerId('GroupChannelContextsProvider');\n const { STRINGS } = useLocalization();\n const { currentUser, sdk } = useSendbirdChat();\n\n const [typingUsers, setTypingUsers] = useState<SendbirdUser[]>([]);\n const [messageToEdit, setMessageToEdit] = useState<SendbirdUserMessage | SendbirdFileMessage>();\n const [messageToReply, setMessageToReply] = useState<SendbirdUserMessage | SendbirdFileMessage>();\n\n const updateInputMode = (mode: 'send' | 'edit' | 'reply', message?: SendbirdUserMessage | SendbirdFileMessage) => {\n if (mode === 'send' || !message) {\n setMessageToEdit(undefined);\n setMessageToReply(undefined);\n return;\n } else if (mode === 'edit') {\n setMessageToEdit(message);\n setMessageToReply(undefined);\n return;\n } else if (mode === 'reply') {\n setMessageToEdit(undefined);\n setMessageToReply(message);\n return;\n }\n };\n\n useChannelHandler(sdk, handlerId, {\n onMessageDeleted(_, messageId) {\n if (messageToReply?.messageId === messageId) {\n setMessageToReply(undefined);\n }\n },\n onChannelFrozen(frozenChannel) {\n if (frozenChannel.url === channel.url) {\n setMessageToReply(undefined);\n }\n },\n onUserMuted(mutedChannel, user) {\n if (mutedChannel.url === channel.url && user.userId === sdk.currentUser?.userId) {\n setMessageToReply(undefined);\n }\n },\n onTypingStatusUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!enableTypingIndicator) return;\n setTypingUsers(eventChannel.getTypingUsers());\n },\n });\n\n return (\n <ProviderLayout>\n <GroupChannelContexts.Fragment.Provider\n value={{\n headerTitle: STRINGS.GROUP_CHANNEL.HEADER_TITLE(currentUser?.userId ?? '', channel),\n channel,\n keyboardAvoidOffset,\n messageToEdit,\n setMessageToEdit: useCallback((message) => updateInputMode('edit', message), []),\n messageToReply,\n setMessageToReply: useCallback((message) => updateInputMode('reply', message), []),\n }}\n >\n <GroupChannelContexts.TypingIndicator.Provider value={{ typingUsers }}>\n <GroupChannelContexts.PubSub.Provider value={groupChannelPubSub}>\n {children}\n </GroupChannelContexts.PubSub.Provider>\n </GroupChannelContexts.TypingIndicator.Provider>\n </GroupChannelContexts.Fragment.Provider>\n </ProviderLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","createContext","useCallback","useRef","useState","useChannelHandler","Logger","NOOP","getGroupChannelChatAvailableState","isDifferentChannel","useFreshCallback","useUniqHandlerId","ProviderLayout","MESSAGE_FOCUS_ANIMATION_DELAY","useLocalization","useSendbirdChat","GroupChannelContexts","Fragment","headerTitle","channel","setMessageToEdit","setMessageToReply","TypingIndicator","typingUsers","PubSub","publish","subscribe","MessageList","flatListRef","current","scrollToMessage","lazyScrollToBottom","lazyScrollToIndex","GroupChannelContextsProvider","_ref","children","enableTypingIndicator","keyboardAvoidOffset","groupChannelPubSub","messages","onUpdateSearchItem","Error","handlerId","STRINGS","currentUser","sdk","setTypingUsers","messageToEdit","messageToReply","useScrollActions","updateInputMode","mode","message","undefined","onMessageDeleted","_","messageId","onChannelFrozen","frozenChannel","url","isGroupChannel","frozen","onUserMuted","mutedChannel","user","_sdk$currentUser","userId","onTypingStatusUpdated","eventChannel","getTypingUsers","createElement","Provider","value","GROUP_CHANNEL","HEADER_TITLE","params","logFlatListRefWarning","setTimeout","_flatListRef$current","scrollToOffset","offset","animated","timeout","_flatListRef$current2","scrollToIndex","index","viewPosition","options","foundMessageIndex","findIndex","it","isIncludedInList","focusAnimated","startingPoint","createdAt","warn"],"sources":["moduleContext.tsx"],"sourcesContent":["import React, { createContext, useCallback, useRef, useState } from 'react';\nimport type { FlatList } from 'react-native';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport {\n ContextValue,\n Logger,\n NOOP,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdUser,\n SendbirdUserMessage,\n getGroupChannelChatAvailableState,\n isDifferentChannel,\n useFreshCallback,\n useUniqHandlerId,\n} from '@sendbird/uikit-utils';\n\nimport ProviderLayout from '../../../components/ProviderLayout';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY } from '../../../constants';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport type { PubSub } from '../../../utils/pubsub';\nimport type { GroupChannelContextsType, GroupChannelModule, GroupChannelPubSubContextPayload } from '../types';\nimport { GroupChannelProps } from '../types';\n\nexport const GroupChannelContexts: GroupChannelContextsType = {\n Fragment: createContext({\n headerTitle: '',\n channel: {} as SendbirdGroupChannel,\n setMessageToEdit: NOOP,\n setMessageToReply: NOOP,\n }),\n TypingIndicator: createContext({\n typingUsers: [] as SendbirdUser[],\n }),\n PubSub: createContext({\n publish: NOOP,\n subscribe: () => NOOP,\n } as PubSub<GroupChannelPubSubContextPayload>),\n MessageList: createContext({\n flatListRef: { current: null },\n scrollToMessage: () => false,\n lazyScrollToBottom: () => {\n // noop\n },\n lazyScrollToIndex: () => {\n // noop\n },\n } as MessageListContextValue),\n};\n\nexport const GroupChannelContextsProvider: GroupChannelModule['Provider'] = ({\n children,\n channel,\n enableTypingIndicator,\n keyboardAvoidOffset = 0,\n groupChannelPubSub,\n messages,\n onUpdateSearchItem,\n}) => {\n if (!channel) throw new Error('GroupChannel is not provided to GroupChannelModule');\n\n const handlerId = useUniqHandlerId('GroupChannelContextsProvider');\n const { STRINGS } = useLocalization();\n const { currentUser, sdk } = useSendbirdChat();\n\n const [typingUsers, setTypingUsers] = useState<SendbirdUser[]>([]);\n const [messageToEdit, setMessageToEdit] = useState<SendbirdUserMessage | SendbirdFileMessage>();\n const [messageToReply, setMessageToReply] = useState<SendbirdUserMessage | SendbirdFileMessage>();\n\n const { flatListRef, lazyScrollToIndex, lazyScrollToBottom, scrollToMessage } = useScrollActions({\n messages,\n onUpdateSearchItem,\n });\n\n const updateInputMode = (mode: 'send' | 'edit' | 'reply', message?: SendbirdUserMessage | SendbirdFileMessage) => {\n if (mode === 'send' || !message) {\n setMessageToEdit(undefined);\n setMessageToReply(undefined);\n return;\n } else if (mode === 'edit') {\n setMessageToEdit(message);\n setMessageToReply(undefined);\n return;\n } else if (mode === 'reply') {\n setMessageToEdit(undefined);\n setMessageToReply(message);\n return;\n }\n };\n\n useChannelHandler(sdk, handlerId, {\n onMessageDeleted(_, messageId) {\n if (messageToReply?.messageId === messageId) {\n setMessageToReply(undefined);\n }\n },\n onChannelFrozen(frozenChannel) {\n if (frozenChannel.url === channel.url) {\n if (frozenChannel.isGroupChannel() && getGroupChannelChatAvailableState(channel).frozen) {\n setMessageToReply(undefined);\n }\n }\n },\n onUserMuted(mutedChannel, user) {\n if (mutedChannel.url === channel.url && user.userId === sdk.currentUser?.userId) {\n setMessageToReply(undefined);\n }\n },\n onTypingStatusUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!enableTypingIndicator) return;\n setTypingUsers(eventChannel.getTypingUsers());\n },\n });\n\n return (\n <ProviderLayout>\n <GroupChannelContexts.Fragment.Provider\n value={{\n headerTitle: STRINGS.GROUP_CHANNEL.HEADER_TITLE(currentUser?.userId ?? '', channel),\n channel,\n keyboardAvoidOffset,\n messageToEdit,\n setMessageToEdit: useCallback((message) => updateInputMode('edit', message), []),\n messageToReply,\n setMessageToReply: useCallback((message) => updateInputMode('reply', message), []),\n }}\n >\n <GroupChannelContexts.PubSub.Provider value={groupChannelPubSub}>\n <GroupChannelContexts.TypingIndicator.Provider value={{ typingUsers }}>\n <GroupChannelContexts.MessageList.Provider\n value={{\n flatListRef,\n scrollToMessage,\n lazyScrollToIndex,\n lazyScrollToBottom,\n }}\n >\n {children}\n </GroupChannelContexts.MessageList.Provider>\n </GroupChannelContexts.TypingIndicator.Provider>\n </GroupChannelContexts.PubSub.Provider>\n </GroupChannelContexts.Fragment.Provider>\n </ProviderLayout>\n );\n};\n\ntype MessageListContextValue = ContextValue<GroupChannelContextsType['MessageList']>;\nconst useScrollActions = (params: Pick<GroupChannelProps['Provider'], 'messages' | 'onUpdateSearchItem'>) => {\n const { messages, onUpdateSearchItem } = params;\n const flatListRef = useRef<FlatList<SendbirdMessage>>(null);\n\n // FIXME: Workaround, should run after data has been applied to UI.\n const lazyScrollToBottom = useFreshCallback<MessageListContextValue['lazyScrollToIndex']>((params) => {\n if (!flatListRef.current) {\n logFlatListRefWarning();\n return;\n }\n\n setTimeout(() => {\n flatListRef.current?.scrollToOffset({ offset: 0, animated: params?.animated ?? false });\n }, params?.timeout ?? 0);\n });\n\n // FIXME: Workaround, should run after data has been applied to UI.\n const lazyScrollToIndex = useFreshCallback<MessageListContextValue['lazyScrollToIndex']>((params) => {\n if (!flatListRef.current) {\n logFlatListRefWarning();\n return;\n }\n\n setTimeout(() => {\n flatListRef.current?.scrollToIndex({\n index: params?.index ?? 0,\n animated: params?.animated ?? false,\n viewPosition: params?.viewPosition ?? 0.5,\n });\n }, params?.timeout ?? 0);\n });\n\n const scrollToMessage = useFreshCallback<MessageListContextValue['scrollToMessage']>((messageId, options) => {\n if (!flatListRef.current) {\n logFlatListRefWarning();\n return false;\n }\n\n const foundMessageIndex = messages.findIndex((it) => it.messageId === messageId);\n const isIncludedInList = foundMessageIndex > -1;\n\n if (isIncludedInList) {\n if (options?.focusAnimated) {\n setTimeout(\n () => onUpdateSearchItem({ startingPoint: messages[foundMessageIndex].createdAt }),\n MESSAGE_FOCUS_ANIMATION_DELAY,\n );\n }\n lazyScrollToIndex({\n index: foundMessageIndex,\n animated: true,\n timeout: 0,\n viewPosition: options?.viewPosition,\n });\n return true;\n } else {\n return false;\n }\n });\n\n return {\n flatListRef,\n lazyScrollToIndex,\n lazyScrollToBottom,\n scrollToMessage,\n };\n};\n\nconst logFlatListRefWarning = () => {\n Logger.warn(\n 'Cannot find flatListRef.current, please render FlatList and pass the flatListRef' +\n 'or please try again after FlatList has been rendered.',\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: (callback?: () => void) => void;\n onResetMessageListWithStartingPoint: (startingPoint: number, callback?: () => void) => void;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n Input: Pick<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = CommonComponent<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n };\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\nimport type { FlatList } from 'react-native';\n\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: (callback?: () => void) => void;\n onResetMessageListWithStartingPoint: (startingPoint: number, callback?: () => void) => void;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n Input: Pick<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n\n messages: SendbirdMessage[];\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n MessageList: React.Context<{\n /**\n * ref object for FlatList of MessageList\n * */\n flatListRef: React.MutableRefObject<FlatList | null>;\n /**\n * Function that scrolls to a message within a group channel.\n * @param messageId {number} - The id of the message to scroll.\n * @param options {object} - Scroll options (optional).\n * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.\n * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)\n *\n * @example\n * ```\n * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList);\n * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });\n * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');\n * ```\n * */\n scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;\n /**\n * Call the FlatList function asynchronously to scroll to bottom lazily\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;\n /**\n * Call the FlatList function asynchronously to scroll to index lazily.\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToIndex: (params?: {\n index?: number;\n animated?: boolean;\n timeout?: number;\n viewPosition?: number;\n }) => void;\n }>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = CommonComponent<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n }\n | {\n type: 'TYPING_BUBBLE_RENDERED';\n data?: undefined;\n };\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { ContextValue } from '@sendbird/uikit-utils';\n\nimport type { CommonComponent } from '../../types';\n\nexport interface UserListProps<User> {\n /** Props for `UserListModule.Header` **/\n Header: {\n right?: React.ReactElement;\n left?: React.ReactElement;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: (selectedUsers: User[]) => Promise<void>;\n shouldActivateHeaderRight?: (selectedUsers: User[]) => boolean;\n };\n /** Props for `UserListModule.List` **/\n List: {\n /** User list from SendbirdChat SDK or Custom query {@link Fragment.queryCreator} **/\n users: User[];\n /** Render user component **/\n renderUser: (\n user: User,\n selectedUsers: ContextValue<UserListContextsType<User>['List']>['selectedUsers'],\n setSelectedUsers: ContextValue<UserListContextsType<User>['List']>['setSelectedUsers'],\n ) => React.ReactElement | null;\n /** Load next user list **/\n onLoadNext: () => Promise<void>;\n /** Refresh user list **/\n onRefresh?: () => Promise<void>;\n /** Refreshing state **/\n refreshing?: boolean;\n /** List empty component **/\n ListEmptyComponent?: React.ReactElement;\n };\n /** Props for `UserListModule.Provider` **/\n Provider: {\n headerTitle: string;\n headerRight: (selectedUsers: Array<User>) => string;\n };\n StatusError: {\n onPressRetry: () => void;\n };\n}\n\n/**\n * Internal context for UserList\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface UserListContextsType<User> {\n Fragment: React.Context<{\n headerTitle: string;\n headerRight: string;\n }>;\n List: React.Context<{\n selectedUsers: User[];\n setSelectedUsers: React.Dispatch<React.SetStateAction<User[]>>;\n }>;\n}\n\nexport interface UserListModule<User> {\n Provider: CommonComponent<UserListProps<User>['Provider']>;\n Header: CommonComponent<UserListProps<User>['Header']>;\n List: CommonComponent<UserListProps<User>['List']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n StatusError: CommonComponent<UserListProps<User>['StatusError']>;\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { ContextValue } from '@sendbird/uikit-utils';\n\nimport type { CommonComponent } from '../../types';\n\nexport interface UserListProps<User> {\n /** Props for `UserListModule.Header` **/\n Header: {\n right?: React.ReactNode;\n left?: React.ReactNode;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: (selectedUsers: User[]) => Promise<void>;\n shouldActivateHeaderRight?: (selectedUsers: User[]) => boolean;\n };\n /** Props for `UserListModule.List` **/\n List: {\n /** User list from SendbirdChat SDK or Custom query {@link Fragment.queryCreator} **/\n users: User[];\n /** Render user component **/\n renderUser: (\n user: User,\n selectedUsers: ContextValue<UserListContextsType<User>['List']>['selectedUsers'],\n setSelectedUsers: ContextValue<UserListContextsType<User>['List']>['setSelectedUsers'],\n ) => React.ReactElement | null;\n /** Load next user list **/\n onLoadNext: () => Promise<void>;\n /** Refresh user list **/\n onRefresh?: () => Promise<void>;\n /** Refreshing state **/\n refreshing?: boolean;\n /** List empty component **/\n ListEmptyComponent?: React.ReactElement;\n };\n /** Props for `UserListModule.Provider` **/\n Provider: {\n headerTitle: string;\n headerRight: (selectedUsers: Array<User>) => string;\n };\n StatusError: {\n onPressRetry: () => void;\n };\n}\n\n/**\n * Internal context for UserList\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface UserListContextsType<User> {\n Fragment: React.Context<{\n headerTitle: string;\n headerRight: string;\n }>;\n List: React.Context<{\n selectedUsers: User[];\n setSelectedUsers: React.Dispatch<React.SetStateAction<User[]>>;\n }>;\n}\n\nexport interface UserListModule<User> {\n Provider: CommonComponent<UserListProps<User>['Provider']>;\n Header: CommonComponent<UserListProps<User>['Header']>;\n List: CommonComponent<UserListProps<User>['List']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n StatusError: CommonComponent<UserListProps<User>['StatusError']>;\n}\n"],"mappings":""}
@@ -1,13 +1,14 @@
1
- import React, { useCallback, useMemo, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import { ReplyType } from '@sendbird/chat/message';
3
3
  import { useGroupChannelMessages } from '@sendbird/uikit-chat-hooks';
4
+ import { Box } from '@sendbird/uikit-react-native-foundation';
4
5
  import { NOOP, PASS, messageComparator, useFreshCallback, useIIFE, useRefTracker } from '@sendbird/uikit-utils';
5
- import GroupChannelMessageRenderer from '../components/GroupChannelMessageRenderer';
6
+ import GroupChannelMessageRenderer, { GroupChannelTypingIndicatorBubble } from '../components/GroupChannelMessageRenderer';
6
7
  import NewMessagesButton from '../components/NewMessagesButton';
7
8
  import ScrollToBottomButton from '../components/ScrollToBottomButton';
8
9
  import StatusComposition from '../components/StatusComposition';
9
10
  import createGroupChannelModule from '../domain/groupChannel/module/createGroupChannelModule';
10
- import { useSendbirdChat } from '../hooks/useContext';
11
+ import { usePlatformService, useSendbirdChat } from '../hooks/useContext';
11
12
  import pubsub from '../utils/pubsub';
12
13
  const createGroupChannelFragment = initModule => {
13
14
  const GroupChannelModule = createGroupChannelModule(initModule);
@@ -33,6 +34,10 @@ const createGroupChannelFragment = initModule => {
33
34
  sortComparator = messageComparator,
34
35
  flatListProps
35
36
  } = _ref;
37
+ const {
38
+ playerService,
39
+ recorderService
40
+ } = usePlatformService();
36
41
  const {
37
42
  sdk,
38
43
  currentUser,
@@ -86,9 +91,29 @@ const createGroupChannelFragment = initModule => {
86
91
  startingPoint: internalSearchItem === null || internalSearchItem === void 0 ? void 0 : internalSearchItem.startingPoint,
87
92
  enableCollectionWithoutLocalCache: true
88
93
  });
94
+ const onBlurFragment = () => {
95
+ return Promise.allSettled([playerService.reset(), recorderService.reset()]);
96
+ };
97
+ const _onPressHeaderLeft = useFreshCallback(async () => {
98
+ await onBlurFragment();
99
+ onPressHeaderLeft();
100
+ });
101
+ const _onPressHeaderRight = useFreshCallback(async () => {
102
+ await onBlurFragment();
103
+ onPressHeaderRight();
104
+ });
105
+ const _onPressMediaMessage = useFreshCallback(async (message, deleteMessage, uri) => {
106
+ await onBlurFragment();
107
+ onPressMediaMessage(message, deleteMessage, uri);
108
+ });
109
+ useEffect(() => {
110
+ return () => {
111
+ onBlurFragment();
112
+ };
113
+ }, []);
89
114
  const renderItem = useFreshCallback(props => {
90
- if (renderMessage) return renderMessage(props);
91
- return /*#__PURE__*/React.createElement(GroupChannelMessageRenderer, props);
115
+ const content = renderMessage ? renderMessage(props) : /*#__PURE__*/React.createElement(GroupChannelMessageRenderer, props);
116
+ return /*#__PURE__*/React.createElement(Box, null, content, props.isFirstItem && !hasNext() && /*#__PURE__*/React.createElement(GroupChannelTypingIndicatorBubble, null));
92
117
  });
93
118
  const memoizedFlatListProps = useMemo(() => ({
94
119
  ListEmptyComponent: /*#__PURE__*/React.createElement(GroupChannelModule.StatusEmpty, null),
@@ -152,11 +177,13 @@ const createGroupChannelFragment = initModule => {
152
177
  channel: channel,
153
178
  groupChannelPubSub: groupChannelPubSub,
154
179
  enableTypingIndicator: enableTypingIndicator ?? sbOptions.uikit.groupChannel.channel.enableTypingIndicator,
155
- keyboardAvoidOffset: keyboardAvoidOffset
180
+ keyboardAvoidOffset: keyboardAvoidOffset,
181
+ messages: messages,
182
+ onUpdateSearchItem: onUpdateSearchItem
156
183
  }, /*#__PURE__*/React.createElement(GroupChannelModule.Header, {
157
184
  shouldHideRight: navigateFromMessageSearch,
158
- onPressHeaderLeft: onPressHeaderLeft,
159
- onPressHeaderRight: onPressHeaderRight
185
+ onPressHeaderLeft: _onPressHeaderLeft,
186
+ onPressHeaderRight: _onPressHeaderRight
160
187
  }), /*#__PURE__*/React.createElement(StatusComposition, {
161
188
  loading: loading,
162
189
  LoadingComponent: /*#__PURE__*/React.createElement(GroupChannelModule.StatusLoading, null)
@@ -180,7 +207,7 @@ const createGroupChannelFragment = initModule => {
180
207
  renderScrollToBottomButton: renderScrollToBottomButton,
181
208
  onResendFailedMessage: resendMessage,
182
209
  onDeleteMessage: deleteMessage,
183
- onPressMediaMessage: onPressMediaMessage,
210
+ onPressMediaMessage: _onPressMediaMessage,
184
211
  flatListProps: memoizedFlatListProps
185
212
  }), /*#__PURE__*/React.createElement(GroupChannelModule.Input, {
186
213
  SuggestedMentionList: GroupChannelModule.SuggestedMentionList,