@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.
- package/README.md +67 -42
- package/lib/commonjs/components/ChannelInput/EditInput.js +2 -11
- package/lib/commonjs/components/ChannelInput/EditInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/MessageToReplyPreview.js +145 -0
- package/lib/commonjs/components/ChannelInput/MessageToReplyPreview.js.map +1 -0
- package/lib/commonjs/components/ChannelInput/SendInput.js +149 -323
- package/lib/commonjs/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js +238 -0
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js.map +1 -0
- package/lib/commonjs/components/ChannelInput/index.js +34 -3
- package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
- package/lib/commonjs/components/ChannelMessageList/index.js +148 -116
- package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +24 -13
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +134 -6
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/commonjs/components/MessageSearchResultItem.js +1 -0
- package/lib/commonjs/components/MessageSearchResultItem.js.map +1 -1
- package/lib/commonjs/components/OpenChannelMessageRenderer/index.js +1 -0
- package/lib/commonjs/components/OpenChannelMessageRenderer/index.js.map +1 -1
- package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +2 -2
- package/lib/commonjs/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -1
- package/lib/commonjs/components/ReactionBottomSheets/index.js.map +1 -1
- package/lib/commonjs/components/StatusComposition.js.map +1 -1
- package/lib/commonjs/constants.js +5 -1
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/containers/GroupChannelPreviewContainer.js +1 -0
- package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -1
- package/lib/commonjs/containers/InternalErrorBoundaryContainer.js.map +1 -1
- package/lib/commonjs/containers/SendbirdUIKitContainer.js +72 -34
- package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/commonjs/contexts/PlatformServiceCtx.js +16 -12
- package/lib/commonjs/contexts/PlatformServiceCtx.js.map +1 -1
- package/lib/commonjs/contexts/ReactionCtx.js +3 -2
- package/lib/commonjs/contexts/ReactionCtx.js.map +1 -1
- package/lib/commonjs/contexts/SendbirdChatCtx.js +2 -0
- package/lib/commonjs/contexts/SendbirdChatCtx.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js +14 -4
- package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +28 -42
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js +109 -5
- package/lib/commonjs/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/domain/userList/types.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +34 -7
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/fragments/createMessageSearchFragment.js +1 -1
- package/lib/commonjs/fragments/createMessageSearchFragment.js.map +1 -1
- package/lib/commonjs/hooks/useChannelInputItems.js +211 -0
- package/lib/commonjs/hooks/useChannelInputItems.js.map +1 -0
- package/lib/commonjs/hooks/useConnection.js +1 -1
- package/lib/commonjs/hooks/useConnection.js.map +1 -1
- package/lib/commonjs/hooks/useVoiceMessageInput.js +207 -0
- package/lib/commonjs/hooks/useVoiceMessageInput.js.map +1 -0
- package/lib/commonjs/index.js +36 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/libs/MentionManager.js.map +1 -1
- package/lib/commonjs/libs/SBUUtils.js +4 -0
- package/lib/commonjs/libs/SBUUtils.js.map +1 -1
- package/lib/commonjs/libs/VoiceMessageConfig.js +30 -0
- package/lib/commonjs/libs/VoiceMessageConfig.js.map +1 -0
- package/lib/commonjs/localization/StringSet.type.js.map +1 -1
- package/lib/commonjs/localization/createBaseStringSet.js +24 -9
- package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
- package/lib/commonjs/platform/createFileService.expo.js +10 -0
- package/lib/commonjs/platform/createFileService.expo.js.map +1 -1
- package/lib/commonjs/platform/createFileService.native.js +19 -0
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/platform/createPlayerService.expo.js +137 -0
- package/lib/commonjs/platform/createPlayerService.expo.js.map +1 -0
- package/lib/commonjs/platform/createPlayerService.native.js +139 -0
- package/lib/commonjs/platform/createPlayerService.native.js.map +1 -0
- package/lib/commonjs/platform/createRecorderService.expo.js +158 -0
- package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -0
- package/lib/commonjs/platform/createRecorderService.native.js +157 -0
- package/lib/commonjs/platform/createRecorderService.native.js.map +1 -0
- package/lib/commonjs/platform/types.js.map +1 -1
- package/lib/commonjs/types.js +7 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/utils/promise.js +138 -0
- package/lib/commonjs/utils/promise.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelInput/EditInput.js +3 -12
- package/lib/module/components/ChannelInput/EditInput.js.map +1 -1
- package/lib/module/components/ChannelInput/MessageToReplyPreview.js +137 -0
- package/lib/module/components/ChannelInput/MessageToReplyPreview.js.map +1 -0
- package/lib/module/components/ChannelInput/SendInput.js +152 -326
- package/lib/module/components/ChannelInput/SendInput.js.map +1 -1
- package/lib/module/components/ChannelInput/VoiceMessageInput.js +228 -0
- package/lib/module/components/ChannelInput/VoiceMessageInput.js.map +1 -0
- package/lib/module/components/ChannelInput/index.js +36 -5
- package/lib/module/components/ChannelInput/index.js.map +1 -1
- package/lib/module/components/ChannelMessageList/index.js +149 -117
- package/lib/module/components/ChannelMessageList/index.js.map +1 -1
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js +24 -13
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.js.map +1 -1
- package/lib/module/components/GroupChannelMessageRenderer/index.js +132 -7
- package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/module/components/MessageSearchResultItem.js +2 -1
- package/lib/module/components/MessageSearchResultItem.js.map +1 -1
- package/lib/module/components/OpenChannelMessageRenderer/index.js +1 -0
- package/lib/module/components/OpenChannelMessageRenderer/index.js.map +1 -1
- package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js +2 -2
- package/lib/module/components/ReactionBottomSheets/ReactionUserListBottomSheet.js.map +1 -1
- package/lib/module/components/ReactionBottomSheets/index.js.map +1 -1
- package/lib/module/components/StatusComposition.js.map +1 -1
- package/lib/module/constants.js +2 -0
- package/lib/module/constants.js.map +1 -1
- package/lib/module/containers/GroupChannelPreviewContainer.js +2 -1
- package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -1
- package/lib/module/containers/InternalErrorBoundaryContainer.js.map +1 -1
- package/lib/module/containers/SendbirdUIKitContainer.js +74 -36
- package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/module/contexts/PlatformServiceCtx.js +14 -11
- package/lib/module/contexts/PlatformServiceCtx.js.map +1 -1
- package/lib/module/contexts/ReactionCtx.js +3 -2
- package/lib/module/contexts/ReactionCtx.js.map +1 -1
- package/lib/module/contexts/SendbirdChatCtx.js +2 -0
- package/lib/module/contexts/SendbirdChatCtx.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js +15 -5
- package/lib/module/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +29 -43
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannel/module/moduleContext.js +111 -7
- package/lib/module/domain/groupChannel/module/moduleContext.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/domain/userList/types.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +36 -9
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/fragments/createMessageSearchFragment.js +1 -1
- package/lib/module/fragments/createMessageSearchFragment.js.map +1 -1
- package/lib/module/hooks/useChannelInputItems.js +203 -0
- package/lib/module/hooks/useChannelInputItems.js.map +1 -0
- package/lib/module/hooks/useConnection.js +1 -1
- package/lib/module/hooks/useConnection.js.map +1 -1
- package/lib/module/hooks/useVoiceMessageInput.js +199 -0
- package/lib/module/hooks/useVoiceMessageInput.js.map +1 -0
- package/lib/module/index.js +8 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/libs/MentionManager.js.map +1 -1
- package/lib/module/libs/SBUUtils.js +4 -0
- package/lib/module/libs/SBUUtils.js.map +1 -1
- package/lib/module/libs/VoiceMessageConfig.js +23 -0
- package/lib/module/libs/VoiceMessageConfig.js.map +1 -0
- package/lib/module/localization/StringSet.type.js.map +1 -1
- package/lib/module/localization/createBaseStringSet.js +25 -10
- package/lib/module/localization/createBaseStringSet.js.map +1 -1
- package/lib/module/platform/createFileService.expo.js +10 -0
- package/lib/module/platform/createFileService.expo.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +19 -0
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/platform/createPlayerService.expo.js +129 -0
- package/lib/module/platform/createPlayerService.expo.js.map +1 -0
- package/lib/module/platform/createPlayerService.native.js +132 -0
- package/lib/module/platform/createPlayerService.native.js.map +1 -0
- package/lib/module/platform/createRecorderService.expo.js +150 -0
- package/lib/module/platform/createRecorderService.expo.js.map +1 -0
- package/lib/module/platform/createRecorderService.native.js +149 -0
- package/lib/module/platform/createRecorderService.native.js.map +1 -0
- package/lib/module/platform/types.js.map +1 -1
- package/lib/module/types.js +5 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/promise.js +132 -0
- package/lib/module/utils/promise.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChannelCover.d.ts +2 -1
- package/lib/typescript/src/components/ChannelInput/AttachmentsButton.d.ts +2 -1
- package/lib/typescript/src/components/ChannelInput/MessageToReplyPreview.d.ts +7 -0
- package/lib/typescript/src/components/ChannelInput/VoiceMessageInput.d.ts +11 -0
- package/lib/typescript/src/components/ChannelInput/index.d.ts +9 -3
- package/lib/typescript/src/components/ChannelMessageList/index.d.ts +4 -1
- package/lib/typescript/src/components/FileViewer.d.ts +2 -1
- package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageDateSeparator.d.ts +2 -1
- package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageFocusAnimation.d.ts +1 -1
- package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageOutgoingStatus.d.ts +1 -1
- package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.d.ts +4 -2
- package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +3 -0
- package/lib/typescript/src/components/NewMessagesButton.d.ts +1 -1
- package/lib/typescript/src/components/OpenChannelMessageRenderer/OpenChannelMessageDateSeparator.d.ts +2 -1
- package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +2 -0
- package/lib/typescript/src/components/ProviderLayout.d.ts +1 -1
- package/lib/typescript/src/components/ReactionAddons/BottomSheetReactionAddon.d.ts +2 -1
- package/lib/typescript/src/components/ReactionAddons/MessageReactionAddon.d.ts +2 -1
- package/lib/typescript/src/components/ReactionAddons/ReactionRoundedButton.d.ts +3 -2
- package/lib/typescript/src/components/ReactionAddons/index.d.ts +3 -2
- package/lib/typescript/src/components/ReactionBottomSheets/ReactionListBottomSheet.d.ts +2 -1
- package/lib/typescript/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.d.ts +2 -1
- package/lib/typescript/src/components/ReactionBottomSheets/index.d.ts +4 -4
- package/lib/typescript/src/components/ScrollToBottomButton.d.ts +1 -1
- package/lib/typescript/src/components/StatusComposition.d.ts +4 -4
- package/lib/typescript/src/components/TypedPlaceholder.d.ts +2 -1
- package/lib/typescript/src/components/UserActionBar.d.ts +2 -1
- package/lib/typescript/src/components/UserSelectableBar.d.ts +2 -1
- package/lib/typescript/src/constants.d.ts +2 -0
- package/lib/typescript/src/containers/GroupChannelPreviewContainer.d.ts +2 -1
- package/lib/typescript/src/containers/InternalErrorBoundaryContainer.d.ts +3 -3
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +19 -8
- package/lib/typescript/src/contexts/LocalizationCtx.d.ts +1 -1
- package/lib/typescript/src/contexts/PlatformServiceCtx.d.ts +8 -8
- package/lib/typescript/src/contexts/ReactionCtx.d.ts +5 -2
- package/lib/typescript/src/contexts/SendbirdChatCtx.d.ts +6 -3
- package/lib/typescript/src/contexts/UserProfileCtx.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelSuggestedMentionList.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannel/types.d.ts +48 -0
- package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersList.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelBannedUsers/component/GroupChannelBannedUsersStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListList.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelList/component/GroupChannelListTypeSelector.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelModeration/component/GroupChannelModerationHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelModeration/component/GroupChannelModerationMenu.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersList.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelMutedMembers/component/GroupChannelMutedMembersStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelNotifications/component/GroupChannelNotificationsView.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsList.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelOperators/component/GroupChannelOperatorsStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsHeader.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsInfo.d.ts +2 -1
- package/lib/typescript/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.d.ts +2 -1
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchHeader.d.ts +2 -1
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchList.d.ts +2 -1
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/messageSearch/component/MessageSearchStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/openChannel/component/OpenChannelHeader.d.ts +2 -2
- package/lib/typescript/src/domain/openChannel/component/OpenChannelInput.d.ts +1 -1
- package/lib/typescript/src/domain/openChannel/component/OpenChannelMessageList.d.ts +1 -1
- package/lib/typescript/src/domain/openChannel/component/OpenChannelStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/openChannel/component/OpenChannelStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersHeader.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersList.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelBannedUsers/component/OpenChannelBannedUsersStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelCreate/component/OpenChannelCreateHeader.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelCreate/component/OpenChannelCreateProfileInput.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelCreate/component/OpenChannelCreateStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelList/component/OpenChannelListHeader.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelList/component/OpenChannelListList.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelList/component/OpenChannelListStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelList/component/OpenChannelListStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelModeration/component/OpenChannelModerationHeader.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelModeration/component/OpenChannelModerationMenu.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsHeader.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsList.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelMutedParticipants/component/OpenChannelMutedParticipantsStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsHeader.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsList.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelOperators/component/OpenChannelOperatorsStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelSettings/component/OpenChannelSettingsHeader.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelSettings/component/OpenChannelSettingsInfo.d.ts +2 -1
- package/lib/typescript/src/domain/openChannelSettings/component/OpenChannelSettingsMenu.d.ts +2 -1
- package/lib/typescript/src/domain/userList/component/UserListHeader.d.ts +3 -3
- package/lib/typescript/src/domain/userList/component/UserListList.d.ts +1 -1
- package/lib/typescript/src/domain/userList/component/UserListStatusEmpty.d.ts +2 -1
- package/lib/typescript/src/domain/userList/component/UserListStatusLoading.d.ts +2 -1
- package/lib/typescript/src/domain/userList/types.d.ts +2 -2
- package/lib/typescript/src/hooks/useChannelInputItems.d.ts +10 -0
- package/lib/typescript/src/hooks/useVoiceMessageInput.d.ts +53 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/libs/MentionManager.d.ts +2 -1
- package/lib/typescript/src/libs/SBUUtils.d.ts +1 -0
- package/lib/typescript/src/libs/VoiceMessageConfig.d.ts +25 -0
- package/lib/typescript/src/localization/StringSet.type.d.ts +7 -0
- package/lib/typescript/src/platform/createPlayerService.expo.d.ts +7 -0
- package/lib/typescript/src/platform/createPlayerService.native.d.ts +9 -0
- package/lib/typescript/src/platform/createRecorderService.expo.d.ts +7 -0
- package/lib/typescript/src/platform/createRecorderService.native.d.ts +9 -0
- package/lib/typescript/src/platform/types.d.ts +100 -1
- package/lib/typescript/src/types.d.ts +5 -1
- package/lib/typescript/src/utils/promise.d.ts +7 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +10 -12
- package/src/components/ChannelInput/EditInput.tsx +3 -15
- package/src/components/ChannelInput/MessageToReplyPreview.tsx +133 -0
- package/src/components/ChannelInput/SendInput.tsx +131 -329
- package/src/components/ChannelInput/VoiceMessageInput.tsx +206 -0
- package/src/components/ChannelInput/index.tsx +37 -6
- package/src/components/ChannelMessageList/index.tsx +145 -113
- package/src/components/GroupChannelMessageRenderer/GroupChannelMessageParentMessage.tsx +24 -11
- package/src/components/GroupChannelMessageRenderer/index.tsx +113 -4
- package/src/components/MessageSearchResultItem.tsx +2 -1
- package/src/components/OpenChannelMessageRenderer/index.tsx +1 -0
- package/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.tsx +2 -2
- package/src/components/ReactionBottomSheets/index.tsx +3 -2
- package/src/components/StatusComposition.tsx +3 -3
- package/src/constants.ts +2 -0
- package/src/containers/GroupChannelPreviewContainer.tsx +2 -0
- package/src/containers/InternalErrorBoundaryContainer.tsx +1 -1
- package/src/containers/SendbirdUIKitContainer.tsx +103 -59
- package/src/contexts/PlatformServiceCtx.tsx +22 -20
- package/src/contexts/ReactionCtx.tsx +7 -5
- package/src/contexts/SendbirdChatCtx.tsx +10 -2
- package/src/domain/groupChannel/component/GroupChannelHeader.tsx +14 -3
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +30 -43
- package/src/domain/groupChannel/module/moduleContext.tsx +119 -7
- package/src/domain/groupChannel/types.ts +45 -0
- package/src/domain/userList/types.ts +2 -2
- package/src/fragments/createGroupChannelFragment.tsx +43 -8
- package/src/fragments/createMessageSearchFragment.tsx +1 -1
- package/src/hooks/useChannelInputItems.ts +215 -0
- package/src/hooks/useConnection.ts +1 -1
- package/src/hooks/useVoiceMessageInput.ts +237 -0
- package/src/index.ts +9 -1
- package/src/libs/MentionManager.tsx +1 -1
- package/src/libs/SBUUtils.ts +5 -0
- package/src/libs/VoiceMessageConfig.ts +28 -0
- package/src/localization/StringSet.type.ts +8 -0
- package/src/localization/createBaseStringSet.ts +27 -11
- package/src/platform/createFileService.expo.ts +10 -0
- package/src/platform/createFileService.native.ts +19 -0
- package/src/platform/createPlayerService.expo.tsx +142 -0
- package/src/platform/createPlayerService.native.tsx +148 -0
- package/src/platform/createRecorderService.expo.tsx +160 -0
- package/src/platform/createRecorderService.native.tsx +170 -0
- package/src/platform/types.ts +114 -1
- package/src/types.ts +6 -1
- package/src/utils/promise.ts +139 -0
- 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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"}
|