@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
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _uikitUtils = require("@sendbird/uikit-utils");
8
+ var _expoPermissionGranted = _interopRequireDefault(require("../utils/expoPermissionGranted"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
12
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
13
+ const createExpoPlayerService = _ref => {
14
+ let {
15
+ avModule
16
+ } = _ref;
17
+ const sound = new avModule.Audio.Sound();
18
+ class VoicePlayer {
19
+ constructor() {
20
+ _defineProperty(this, "uri", void 0);
21
+ _defineProperty(this, "state", 'idle');
22
+ _defineProperty(this, "playbackSubscribers", new Set());
23
+ _defineProperty(this, "stateSubscribers", new Set());
24
+ _defineProperty(this, "setState", state => {
25
+ this.state = state;
26
+ this.stateSubscribers.forEach(callback => {
27
+ callback(state);
28
+ });
29
+ });
30
+ _defineProperty(this, "setListener", () => {
31
+ sound.setProgressUpdateIntervalAsync(100);
32
+ sound.setOnPlaybackStatusUpdate(status => {
33
+ if (status.isLoaded) {
34
+ if (status.didJustFinish) this.stop();
35
+ if (status.isPlaying) {
36
+ this.playbackSubscribers.forEach(callback => {
37
+ callback({
38
+ currentTime: status.positionMillis,
39
+ duration: status.durationMillis ?? 0,
40
+ stopped: status.didJustFinish
41
+ });
42
+ });
43
+ }
44
+ }
45
+ });
46
+ });
47
+ _defineProperty(this, "removeListener", () => {
48
+ sound.setOnPlaybackStatusUpdate(null);
49
+ });
50
+ _defineProperty(this, "requestPermission", async () => {
51
+ const status = await avModule.Audio.getPermissionsAsync();
52
+ if ((0, _expoPermissionGranted.default)([status])) {
53
+ return true;
54
+ } else {
55
+ const status = await avModule.Audio.requestPermissionsAsync();
56
+ return (0, _expoPermissionGranted.default)([status]);
57
+ }
58
+ });
59
+ _defineProperty(this, "addPlaybackListener", callback => {
60
+ this.playbackSubscribers.add(callback);
61
+ return () => {
62
+ this.playbackSubscribers.delete(callback);
63
+ };
64
+ });
65
+ _defineProperty(this, "addStateListener", callback => {
66
+ this.stateSubscribers.add(callback);
67
+ return () => {
68
+ this.stateSubscribers.delete(callback);
69
+ };
70
+ });
71
+ _defineProperty(this, "prepare", async uri => {
72
+ this.setState('preparing');
73
+ await sound.loadAsync({
74
+ uri
75
+ }, {
76
+ shouldPlay: false
77
+ }, true);
78
+ this.uri = uri;
79
+ });
80
+ _defineProperty(this, "play", async uri => {
81
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'stopped'])) {
82
+ try {
83
+ await this.prepare(uri);
84
+ this.setListener();
85
+ await sound.playAsync();
86
+ this.setState('playing');
87
+ } catch (e) {
88
+ this.setState('idle');
89
+ this.uri = undefined;
90
+ this.removeListener();
91
+ throw e;
92
+ }
93
+ } else if ((0, _uikitUtils.matchesOneOf)(this.state, ['paused']) && this.uri === uri) {
94
+ try {
95
+ this.setListener();
96
+ await sound.playAsync();
97
+ this.setState('playing');
98
+ } catch (e) {
99
+ this.removeListener();
100
+ throw e;
101
+ }
102
+ }
103
+ });
104
+ _defineProperty(this, "pause", async () => {
105
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing'])) {
106
+ await sound.pauseAsync();
107
+ this.removeListener();
108
+ this.setState('paused');
109
+ }
110
+ });
111
+ _defineProperty(this, "stop", async () => {
112
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing', 'paused'])) {
113
+ await sound.stopAsync();
114
+ await sound.unloadAsync();
115
+ this.removeListener();
116
+ this.setState('stopped');
117
+ }
118
+ });
119
+ _defineProperty(this, "reset", async () => {
120
+ await this.stop();
121
+ this.setState('idle');
122
+ this.uri = undefined;
123
+ this.playbackSubscribers.clear();
124
+ this.stateSubscribers.clear();
125
+ });
126
+ _defineProperty(this, "seek", async time => {
127
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing', 'paused'])) {
128
+ await sound.playFromPositionAsync(time);
129
+ }
130
+ });
131
+ }
132
+ }
133
+ return new VoicePlayer();
134
+ };
135
+ var _default = createExpoPlayerService;
136
+ exports.default = _default;
137
+ //# sourceMappingURL=createPlayerService.expo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_uikitUtils","require","_expoPermissionGranted","_interopRequireDefault","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createExpoPlayerService","_ref","avModule","sound","Audio","Sound","VoicePlayer","constructor","Set","state","stateSubscribers","forEach","callback","setProgressUpdateIntervalAsync","setOnPlaybackStatusUpdate","status","isLoaded","didJustFinish","stop","isPlaying","playbackSubscribers","currentTime","positionMillis","duration","durationMillis","stopped","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","add","delete","uri","setState","loadAsync","shouldPlay","matchesOneOf","prepare","setListener","playAsync","e","removeListener","pauseAsync","stopAsync","unloadAsync","clear","time","playFromPositionAsync","_default","exports"],"sources":["createPlayerService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\n\nimport { matchesOneOf } from '@sendbird/uikit-utils';\n\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createExpoPlayerService = ({ avModule }: Modules): PlayerServiceInterface => {\n const sound = new avModule.Audio.Sound();\n\n class VoicePlayer implements PlayerServiceInterface {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n sound.setProgressUpdateIntervalAsync(100);\n sound.setOnPlaybackStatusUpdate((status) => {\n if (status.isLoaded) {\n if (status.didJustFinish) this.stop();\n if (status.isPlaying) {\n this.playbackSubscribers.forEach((callback) => {\n callback({\n currentTime: status.positionMillis,\n duration: status.durationMillis ?? 0,\n stopped: status.didJustFinish,\n });\n });\n }\n }\n });\n };\n\n private removeListener = () => {\n sound.setOnPlaybackStatusUpdate(null);\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n private prepare = async (uri: string) => {\n this.setState('preparing');\n await sound.loadAsync({ uri }, { shouldPlay: false }, true);\n this.uri = uri;\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n await this.prepare(uri);\n this.setListener();\n await sound.playAsync();\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await sound.playAsync();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await sound.pauseAsync();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await sound.stopAsync();\n await sound.unloadAsync();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await sound.playFromPositionAsync(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createExpoPlayerService;\n"],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _uikitUtils = require("@sendbird/uikit-utils");
9
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
10
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
11
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
12
+ const createNativePlayerService = _ref => {
13
+ let {
14
+ audioRecorderModule,
15
+ permissionModule
16
+ } = _ref;
17
+ const module = new audioRecorderModule.default();
18
+ class VoicePlayer {
19
+ constructor() {
20
+ _defineProperty(this, "uri", void 0);
21
+ _defineProperty(this, "state", 'idle');
22
+ _defineProperty(this, "playbackSubscribers", new Set());
23
+ _defineProperty(this, "stateSubscribers", new Set());
24
+ _defineProperty(this, "setState", state => {
25
+ this.state = state;
26
+ this.stateSubscribers.forEach(callback => {
27
+ callback(state);
28
+ });
29
+ });
30
+ _defineProperty(this, "setListener", () => {
31
+ module.addPlayBackListener(data => {
32
+ const stopped = data.currentPosition >= data.duration;
33
+ if (stopped) this.stop();
34
+ if (this.state === 'playing') {
35
+ this.playbackSubscribers.forEach(callback => {
36
+ callback({
37
+ currentTime: data.currentPosition,
38
+ duration: data.duration,
39
+ stopped
40
+ });
41
+ });
42
+ }
43
+ });
44
+ });
45
+ _defineProperty(this, "removeListener", () => {
46
+ module.removePlayBackListener();
47
+ });
48
+ _defineProperty(this, "requestPermission", async () => {
49
+ if (_reactNative.Platform.OS === 'android') {
50
+ const {
51
+ READ_MEDIA_AUDIO,
52
+ READ_EXTERNAL_STORAGE
53
+ } = permissionModule.PERMISSIONS.ANDROID;
54
+ const permission = _reactNative.Platform.Version > 32 ? READ_MEDIA_AUDIO : READ_EXTERNAL_STORAGE;
55
+ const status = await permissionModule.check(permission);
56
+ if (status === 'granted') {
57
+ return true;
58
+ } else {
59
+ const status = await permissionModule.request(permission);
60
+ return status === 'granted';
61
+ }
62
+ } else {
63
+ return true;
64
+ }
65
+ });
66
+ _defineProperty(this, "addPlaybackListener", callback => {
67
+ this.playbackSubscribers.add(callback);
68
+ return () => {
69
+ this.playbackSubscribers.delete(callback);
70
+ };
71
+ });
72
+ _defineProperty(this, "addStateListener", callback => {
73
+ this.stateSubscribers.add(callback);
74
+ return () => {
75
+ this.stateSubscribers.delete(callback);
76
+ };
77
+ });
78
+ _defineProperty(this, "play", async uri => {
79
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'stopped'])) {
80
+ try {
81
+ this.setState('preparing');
82
+ this.uri = uri;
83
+ this.setListener();
84
+
85
+ // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.
86
+ await (0, _uikitUtils.sleep)(0);
87
+ await module.startPlayer(uri);
88
+ this.setState('playing');
89
+ } catch (e) {
90
+ this.setState('idle');
91
+ this.uri = undefined;
92
+ this.removeListener();
93
+ throw e;
94
+ }
95
+ } else if ((0, _uikitUtils.matchesOneOf)(this.state, ['paused']) && this.uri === uri) {
96
+ try {
97
+ this.setListener();
98
+ await module.resumePlayer();
99
+ this.setState('playing');
100
+ } catch (e) {
101
+ this.removeListener();
102
+ throw e;
103
+ }
104
+ }
105
+ });
106
+ _defineProperty(this, "pause", async () => {
107
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing'])) {
108
+ await module.pausePlayer();
109
+ this.removeListener();
110
+ this.setState('paused');
111
+ }
112
+ });
113
+ _defineProperty(this, "stop", async () => {
114
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['preparing', 'playing', 'paused'])) {
115
+ await module.stopPlayer();
116
+ this.removeListener();
117
+ this.setState('stopped');
118
+ }
119
+ });
120
+ _defineProperty(this, "reset", async () => {
121
+ await this.stop();
122
+ this.setState('idle');
123
+ this.uri = undefined;
124
+ this.playbackSubscribers.clear();
125
+ this.stateSubscribers.clear();
126
+ });
127
+ _defineProperty(this, "seek", async time => {
128
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['playing', 'paused'])) {
129
+ await module.seekToPlayer(time);
130
+ }
131
+ });
132
+ module.setSubscriptionDuration(0.1);
133
+ }
134
+ }
135
+ return new VoicePlayer();
136
+ };
137
+ var _default = createNativePlayerService;
138
+ exports.default = _default;
139
+ //# sourceMappingURL=createPlayerService.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createNativePlayerService","_ref","audioRecorderModule","permissionModule","module","default","VoicePlayer","constructor","Set","state","stateSubscribers","forEach","callback","addPlayBackListener","data","stopped","currentPosition","duration","stop","playbackSubscribers","currentTime","removePlayBackListener","Platform","OS","READ_MEDIA_AUDIO","READ_EXTERNAL_STORAGE","PERMISSIONS","ANDROID","permission","Version","status","check","request","add","delete","uri","matchesOneOf","setState","setListener","sleep","startPlayer","e","removeListener","resumePlayer","pausePlayer","stopPlayer","clear","time","seekToPlayer","setSubscriptionDuration","_default","exports"],"sources":["createPlayerService.native.tsx"],"sourcesContent":["import { Platform } from 'react-native';\nimport type * as RNAudioRecorder from 'react-native-audio-recorder-player';\nimport * as Permissions from 'react-native-permissions';\n\nimport { matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport type { PlayerServiceInterface, Unsubscribe } from './types';\n\ntype Modules = {\n audioRecorderModule: typeof RNAudioRecorder;\n permissionModule: typeof Permissions;\n};\ntype PlaybackListener = Parameters<PlayerServiceInterface['addPlaybackListener']>[number];\ntype StateListener = Parameters<PlayerServiceInterface['addStateListener']>[number];\nconst createNativePlayerService = ({ audioRecorderModule, permissionModule }: Modules): PlayerServiceInterface => {\n const module = new audioRecorderModule.default();\n\n class VoicePlayer implements PlayerServiceInterface {\n uri?: string;\n state: PlayerServiceInterface['state'] = 'idle';\n\n private readonly playbackSubscribers = new Set<PlaybackListener>();\n private readonly stateSubscribers = new Set<StateListener>();\n\n constructor() {\n module.setSubscriptionDuration(0.1);\n }\n\n private setState = (state: PlayerServiceInterface['state']) => {\n this.state = state;\n this.stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n private setListener = () => {\n module.addPlayBackListener((data) => {\n const stopped = data.currentPosition >= data.duration;\n\n if (stopped) this.stop();\n if (this.state === 'playing') {\n this.playbackSubscribers.forEach((callback) => {\n callback({ currentTime: data.currentPosition, duration: data.duration, stopped });\n });\n }\n });\n };\n\n private removeListener = () => {\n module.removePlayBackListener();\n };\n\n public requestPermission = async (): Promise<boolean> => {\n if (Platform.OS === 'android') {\n const { READ_MEDIA_AUDIO, READ_EXTERNAL_STORAGE } = permissionModule.PERMISSIONS.ANDROID;\n const permission = Platform.Version > 32 ? READ_MEDIA_AUDIO : READ_EXTERNAL_STORAGE;\n\n const status = await permissionModule.check(permission);\n if (status === 'granted') {\n return true;\n } else {\n const status = await permissionModule.request(permission);\n return status === 'granted';\n }\n } else {\n return true;\n }\n };\n\n public addPlaybackListener = (callback: PlaybackListener): Unsubscribe => {\n this.playbackSubscribers.add(callback);\n return () => {\n this.playbackSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: (state: PlayerServiceInterface['state']) => void): Unsubscribe => {\n this.stateSubscribers.add(callback);\n return () => {\n this.stateSubscribers.delete(callback);\n };\n };\n\n public play = async (uri: string): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'stopped'])) {\n try {\n this.setState('preparing');\n this.uri = uri;\n this.setListener();\n\n // FIXME: Workaround, `module.startPlayer()` caused a significant frame-drop and prevented the 'preparing' UI transition.\n await sleep(0);\n await module.startPlayer(uri);\n\n this.setState('playing');\n } catch (e) {\n this.setState('idle');\n this.uri = undefined;\n this.removeListener();\n throw e;\n }\n } else if (matchesOneOf(this.state, ['paused']) && this.uri === uri) {\n try {\n this.setListener();\n await module.resumePlayer();\n this.setState('playing');\n } catch (e) {\n this.removeListener();\n throw e;\n }\n }\n };\n\n public pause = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['playing'])) {\n await module.pausePlayer();\n this.removeListener();\n this.setState('paused');\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['preparing', 'playing', 'paused'])) {\n await module.stopPlayer();\n this.removeListener();\n this.setState('stopped');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.setState('idle');\n this.uri = undefined;\n this.playbackSubscribers.clear();\n this.stateSubscribers.clear();\n };\n\n public seek = async (time: number): Promise<void> => {\n if (matchesOneOf(this.state, ['playing', 'paused'])) {\n await module.seekToPlayer(time);\n }\n };\n }\n\n return new VoicePlayer();\n};\n\nexport default createNativePlayerService;\n"],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _uikitUtils = require("@sendbird/uikit-utils");
9
+ var _VoiceMessageConfig = _interopRequireDefault(require("../libs/VoiceMessageConfig"));
10
+ var _expoPermissionGranted = _interopRequireDefault(require("../utils/expoPermissionGranted"));
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
14
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
15
+ const createExpoRecorderService = _ref => {
16
+ let {
17
+ avModule
18
+ } = _ref;
19
+ class VoiceRecorder {
20
+ constructor() {
21
+ _defineProperty(this, "uri", undefined);
22
+ _defineProperty(this, "state", 'idle');
23
+ _defineProperty(this, "options", {
24
+ minDuration: _VoiceMessageConfig.default.DEFAULT.RECORDER.MIN_DURATION,
25
+ maxDuration: _VoiceMessageConfig.default.DEFAULT.RECORDER.MAX_DURATION,
26
+ extension: _VoiceMessageConfig.default.DEFAULT.RECORDER.EXTENSION
27
+ });
28
+ // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs
29
+ _defineProperty(this, "_recordStartedAt", 0);
30
+ _defineProperty(this, "_getRecorderStopSafeBuffer", () => {
31
+ const minWaitingTime = 500;
32
+ const elapsedTime = Date.now() - this._recordStartedAt;
33
+ if (elapsedTime > minWaitingTime) return 0;else return minWaitingTime - elapsedTime;
34
+ });
35
+ _defineProperty(this, "_recorder", new avModule.Audio.Recording());
36
+ _defineProperty(this, "_recordingSubscribers", new Set());
37
+ _defineProperty(this, "_stateSubscribers", new Set());
38
+ _defineProperty(this, "_audioSettings", {
39
+ sampleRate: _VoiceMessageConfig.default.DEFAULT.RECORDER.SAMPLE_RATE,
40
+ bitRate: _VoiceMessageConfig.default.DEFAULT.RECORDER.BIT_RATE,
41
+ numberOfChannels: _VoiceMessageConfig.default.DEFAULT.RECORDER.CHANNELS
42
+ // encoding: mpeg4_aac
43
+ });
44
+ _defineProperty(this, "_audioOptions", {
45
+ android: {
46
+ ...this._audioSettings,
47
+ extension: `.${this.options.extension}`,
48
+ audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,
49
+ outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4
50
+ },
51
+ ios: {
52
+ ...this._audioSettings,
53
+ extension: `.${this.options.extension}`,
54
+ outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,
55
+ audioQuality: avModule.Audio.IOSAudioQuality.HIGH
56
+ },
57
+ web: {}
58
+ });
59
+ _defineProperty(this, "prepare", async () => {
60
+ this.setState('preparing');
61
+ if (_reactNative.Platform.OS === 'ios') {
62
+ await avModule.Audio.setAudioModeAsync({
63
+ allowsRecordingIOS: true,
64
+ playsInSilentModeIOS: true
65
+ });
66
+ }
67
+ if (this._recorder._isDoneRecording) {
68
+ this._recorder = new avModule.Audio.Recording();
69
+ }
70
+ this._recorder.setProgressUpdateInterval(100);
71
+ this._recorder.setOnRecordingStatusUpdate(status => {
72
+ const completed = status.durationMillis >= this.options.maxDuration;
73
+ if (completed) this.stop();
74
+ if (status.isRecording) {
75
+ this._recordingSubscribers.forEach(callback => {
76
+ callback({
77
+ currentTime: status.durationMillis,
78
+ completed: completed
79
+ });
80
+ });
81
+ }
82
+ });
83
+ await this._recorder.prepareToRecordAsync(this._audioOptions);
84
+ });
85
+ _defineProperty(this, "setState", state => {
86
+ this.state = state;
87
+ this._stateSubscribers.forEach(callback => {
88
+ callback(state);
89
+ });
90
+ });
91
+ _defineProperty(this, "requestPermission", async () => {
92
+ const status = await avModule.Audio.getPermissionsAsync();
93
+ if ((0, _expoPermissionGranted.default)([status])) {
94
+ return true;
95
+ } else {
96
+ const status = await avModule.Audio.requestPermissionsAsync();
97
+ return (0, _expoPermissionGranted.default)([status]);
98
+ }
99
+ });
100
+ _defineProperty(this, "addRecordingListener", callback => {
101
+ this._recordingSubscribers.add(callback);
102
+ return () => {
103
+ this._recordingSubscribers.delete(callback);
104
+ };
105
+ });
106
+ _defineProperty(this, "addStateListener", callback => {
107
+ this._stateSubscribers.add(callback);
108
+ return () => {
109
+ this._stateSubscribers.delete(callback);
110
+ };
111
+ });
112
+ _defineProperty(this, "record", async () => {
113
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'completed'])) {
114
+ try {
115
+ await this.prepare();
116
+ await this._recorder.startAsync();
117
+ if (_reactNative.Platform.OS === 'android') {
118
+ this._recordStartedAt = Date.now();
119
+ }
120
+ const uri = this._recorder.getURI();
121
+ if (uri) this.uri = uri;
122
+ this.setState('recording');
123
+ } catch (e) {
124
+ this.setState('idle');
125
+ throw e;
126
+ }
127
+ }
128
+ });
129
+ _defineProperty(this, "stop", async () => {
130
+ if ((0, _uikitUtils.matchesOneOf)(this.state, ['recording'])) {
131
+ if (_reactNative.Platform.OS === 'android') {
132
+ const buffer = this._getRecorderStopSafeBuffer();
133
+ if (buffer > 0) await (0, _uikitUtils.sleep)(buffer);
134
+ }
135
+ await this._recorder.stopAndUnloadAsync();
136
+ if (_reactNative.Platform.OS === 'ios') {
137
+ await avModule.Audio.setAudioModeAsync({
138
+ allowsRecordingIOS: false,
139
+ playsInSilentModeIOS: false
140
+ });
141
+ }
142
+ this.setState('completed');
143
+ }
144
+ });
145
+ _defineProperty(this, "reset", async () => {
146
+ await this.stop();
147
+ this.uri = undefined;
148
+ this._recordingSubscribers.clear();
149
+ this._recorder = new avModule.Audio.Recording();
150
+ this.setState('idle');
151
+ });
152
+ }
153
+ }
154
+ return new VoiceRecorder();
155
+ };
156
+ var _default = createExpoRecorderService;
157
+ exports.default = _default;
158
+ //# sourceMappingURL=createRecorderService.expo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_VoiceMessageConfig","_interopRequireDefault","_expoPermissionGranted","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","createExpoRecorderService","_ref","avModule","VoiceRecorder","constructor","minDuration","VoiceMessageConfig","DEFAULT","RECORDER","MIN_DURATION","maxDuration","MAX_DURATION","extension","EXTENSION","minWaitingTime","elapsedTime","Date","now","_recordStartedAt","Audio","Recording","Set","sampleRate","SAMPLE_RATE","bitRate","BIT_RATE","numberOfChannels","CHANNELS","android","_audioSettings","options","audioEncoder","AndroidAudioEncoder","AAC","outputFormat","AndroidOutputFormat","MPEG_4","ios","IOSOutputFormat","MPEG4AAC","audioQuality","IOSAudioQuality","HIGH","web","setState","Platform","OS","setAudioModeAsync","allowsRecordingIOS","playsInSilentModeIOS","_recorder","_isDoneRecording","setProgressUpdateInterval","setOnRecordingStatusUpdate","status","completed","durationMillis","stop","isRecording","_recordingSubscribers","forEach","callback","currentTime","prepareToRecordAsync","_audioOptions","state","_stateSubscribers","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","add","delete","matchesOneOf","prepare","startAsync","uri","getURI","e","buffer","_getRecorderStopSafeBuffer","sleep","stopAndUnloadAsync","clear","_default","exports"],"sources":["createRecorderService.expo.tsx"],"sourcesContent":["import * as ExpoAV from 'expo-av';\nimport type { RecordingOptions } from 'expo-av/build/Audio/Recording.types';\nimport { Platform } from 'react-native';\n\nimport { matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport VoiceMessageConfig from '../libs/VoiceMessageConfig';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { RecorderServiceInterface, Unsubscribe } from './types';\n\ntype RecordingListener = Parameters<RecorderServiceInterface['addRecordingListener']>[number];\ntype StateListener = Parameters<RecorderServiceInterface['addStateListener']>[number];\ntype Modules = {\n avModule: typeof ExpoAV;\n};\nconst createExpoRecorderService = ({ avModule }: Modules): RecorderServiceInterface => {\n class VoiceRecorder implements RecorderServiceInterface {\n public uri: RecorderServiceInterface['uri'] = undefined;\n public state: RecorderServiceInterface['state'] = 'idle';\n public options: RecorderServiceInterface['options'] = {\n minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,\n maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,\n extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION,\n };\n\n // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs\n private _recordStartedAt = 0;\n private _getRecorderStopSafeBuffer = () => {\n const minWaitingTime = 500;\n const elapsedTime = Date.now() - this._recordStartedAt;\n if (elapsedTime > minWaitingTime) return 0;\n else return minWaitingTime - elapsedTime;\n };\n\n private _recorder = new avModule.Audio.Recording();\n private readonly _recordingSubscribers = new Set<RecordingListener>();\n private readonly _stateSubscribers = new Set<StateListener>();\n private readonly _audioSettings = {\n sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,\n bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,\n numberOfChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS,\n // encoding: mpeg4_aac\n };\n private readonly _audioOptions: RecordingOptions = {\n android: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,\n outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4,\n },\n ios: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,\n audioQuality: avModule.Audio.IOSAudioQuality.HIGH,\n },\n web: {},\n };\n\n private prepare = async () => {\n this.setState('preparing');\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: true, playsInSilentModeIOS: true });\n }\n\n if (this._recorder._isDoneRecording) {\n this._recorder = new avModule.Audio.Recording();\n }\n this._recorder.setProgressUpdateInterval(100);\n this._recorder.setOnRecordingStatusUpdate((status) => {\n const completed = status.durationMillis >= this.options.maxDuration;\n if (completed) this.stop();\n if (status.isRecording) {\n this._recordingSubscribers.forEach((callback) => {\n callback({ currentTime: status.durationMillis, completed: completed });\n });\n }\n });\n await this._recorder.prepareToRecordAsync(this._audioOptions);\n };\n\n private setState = (state: RecorderServiceInterface['state']) => {\n this.state = state;\n this._stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public addRecordingListener = (callback: RecordingListener): Unsubscribe => {\n this._recordingSubscribers.add(callback);\n return () => {\n this._recordingSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: StateListener): Unsubscribe => {\n this._stateSubscribers.add(callback);\n return () => {\n this._stateSubscribers.delete(callback);\n };\n };\n\n public record = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n await this.prepare();\n await this._recorder.startAsync();\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n const uri = this._recorder.getURI();\n if (uri) this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await this._recorder.stopAndUnloadAsync();\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: false, playsInSilentModeIOS: false });\n }\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.uri = undefined;\n this._recordingSubscribers.clear();\n this._recorder = new avModule.Audio.Recording();\n this.setState('idle');\n };\n }\n\n return new VoiceRecorder();\n};\n\nexport default createExpoRecorderService;\n"],"mappings":"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"}