UNPKG

@sendbird/uikit-react

Version:

Sendbird UIKit for React: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.

145 lines (138 loc) 7.66 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); var LocalizationContext = require('../chunks/bundle-DPDyqKIJ.js'); var ui_Modal = require('../chunks/bundle-DZlJeh0V.js'); var consts = require('../chunks/bundle-Cfh78Xnm.js'); var utils = require('../chunks/bundle-CkQrhwR6.js'); var useSendbird = require('../chunks/bundle-Bq15P9qk.js'); require('../chunks/bundle-Conb-pOy.js'); require('../chunks/bundle-BbrBawlX.js'); require('../chunks/bundle-Cyl6_qLo.js'); require('react-dom'); require('../chunks/bundle-Fv6PNPGZ.js'); require('../ui/IconButton.js'); require('../ui/Button.js'); require('../chunks/bundle-zgmRG2KL.js'); require('../ui/Icon.js'); require('../chunks/bundle-t8BQsgL5.js'); require('../chunks/bundle-B19RHFpR.js'); require('@sendbird/chat'); require('@sendbird/chat/groupChannel'); require('@sendbird/chat/openChannel'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var React__default = /*#__PURE__*/_interopDefaultCompat(React); var Context = React.createContext({ start: utils.noop, stop: utils.noop, isRecordable: false, }); var VoiceRecorderProvider = function (props) { var _a; var children = props.children; var state = useSendbird.useSendbird().state; var config = state.config; var logger = config.logger, groupChannel = config.groupChannel; var _b = React.useState(null), mediaRecorder = _b[0], setMediaRecorder = _b[1]; var _c = React.useState(false), isRecordable = _c[0], setIsRecordable = _c[1]; var _d = React.useState(false), permissionWarning = _d[0], setPermissionWarning = _d[1]; var stringSet = LocalizationContext.useLocalization().stringSet; var isVoiceMessageEnabled = groupChannel.enableVoiceMessage; var _e = React.useState(null), webAudioUtils = _e[0], setWebAudioUtils = _e[1]; var browserSupportMimeType = (_a = consts.BROWSER_SUPPORT_MIME_TYPE_LIST.find(function (mimeType) { return MediaRecorder.isTypeSupported(mimeType); })) !== null && _a !== void 0 ? _a : ''; if (isVoiceMessageEnabled && !browserSupportMimeType) { logger.error('VoiceRecorder: Browser does not support mimeType', { mimmeTypes: consts.BROWSER_SUPPORT_MIME_TYPE_LIST }); } React.useEffect(function () { if (isVoiceMessageEnabled && !webAudioUtils) { Promise.resolve().then(function () { return require('../chunks/bundle-CvzQ7oQz.js'); }).then(function (module) { return setWebAudioUtils(module); }); } }, [isVoiceMessageEnabled, webAudioUtils]); var start = React.useCallback(function (eventHandler) { var _a, _b; if (isVoiceMessageEnabled && !webAudioUtils) { logger.error('VoiceRecorder: Recording audio processor is being loaded.'); return; } var checkPermission = function () { try { // Type '"microphone"' is not assignable to type 'PermissionName'.ts(2322) // this is typescript issue // https://github.com/microsoft/TypeScript/issues/33923 // @ts-expect-error navigator.permissions.query({ name: 'microphone' }).then(function (result) { if (result.state === 'denied') { logger.warning('VoiceRecorder: Permission denied.'); setPermissionWarning(true); } }); } catch (error) { logger.warning('VoiceRecorder: Failed to check permission.', error); } }; logger.info('VoiceRecorder: Start recording.'); if (mediaRecorder) { stop(); logger.info('VoiceRecorder: Previous mediaRecorder is stopped.'); } checkPermission(); (_b = (_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) === null || _b === void 0 ? void 0 : _b.call(_a, { audio: true }).then(function (stream) { var _a; logger.info('VoiceRecorder: Succeeded getting media stream.', stream); setIsRecordable(true); var mediaRecorder = new MediaRecorder(stream, { mimeType: browserSupportMimeType, audioBitsPerSecond: consts.VOICE_RECORDER_AUDIO_BIT_RATE, }); // when recording stops mediaRecorder.ondataavailable = function (e) { logger.info('VoiceRecorder: Succeeded getting an available data.', e.data); var audioFile = new File([e.data], consts.VOICE_MESSAGE_FILE_NAME, { lastModified: new Date().getTime(), type: consts.VOICE_MESSAGE_MIME_TYPE, }); webAudioUtils === null || webAudioUtils === void 0 ? void 0 : webAudioUtils.downsampleToWav(audioFile, function (buffer) { var _a; var mp3Buffer = webAudioUtils === null || webAudioUtils === void 0 ? void 0 : webAudioUtils.encodeMp3(buffer); var mp3blob = new Blob(mp3Buffer, { type: consts.VOICE_MESSAGE_MIME_TYPE }); var convertedAudioFile = new File([mp3blob], consts.VOICE_MESSAGE_FILE_NAME, { lastModified: new Date().getTime(), type: consts.VOICE_MESSAGE_MIME_TYPE, }); (_a = eventHandler === null || eventHandler === void 0 ? void 0 : eventHandler.onRecordingEnded) === null || _a === void 0 ? void 0 : _a.call(eventHandler, convertedAudioFile); logger.info('VoiceRecorder: Succeeded converting audio file.', convertedAudioFile); }); var tracks = stream.getAudioTracks(); tracks.forEach(function (track) { return track.stop(); }); setIsRecordable(false); }; mediaRecorder.onstart = (_a = eventHandler === null || eventHandler === void 0 ? void 0 : eventHandler.onRecordingStarted) !== null && _a !== void 0 ? _a : utils.noop; mediaRecorder === null || mediaRecorder === void 0 ? void 0 : mediaRecorder.start(); setMediaRecorder(mediaRecorder); }).catch(function (err) { logger.error('VoiceRecorder: Failed getting media stream.', err); setMediaRecorder(null); }); }, [mediaRecorder, webAudioUtils]); var stop = React.useCallback(function () { // Stop recording mediaRecorder === null || mediaRecorder === void 0 ? void 0 : mediaRecorder.stop(); setMediaRecorder(null); setIsRecordable(false); logger.info('VoiceRecorder: Stop recording.'); }, [mediaRecorder]); return (React__default.default.createElement(Context.Provider, { value: { start: start, stop: stop, isRecordable: isRecordable } }, children, permissionWarning && (React__default.default.createElement(ui_Modal.Modal, { hideFooter: true, onClose: function () { return setPermissionWarning(false); } }, React__default.default.createElement(React__default.default.Fragment, null, stringSet.VOICE_RECORDING_PERMISSION_DENIED))))); }; var useVoiceRecorderContext = function () { return React.useContext(Context); }; var index = { VoiceRecorderProvider: VoiceRecorderProvider, useVoiceRecorderContext: useVoiceRecorderContext, }; exports.VoiceRecorderProvider = VoiceRecorderProvider; exports.default = index; exports.useVoiceRecorderContext = useVoiceRecorderContext; //# sourceMappingURL=context.js.map