Skip to content

Commit f7f2c6a

Browse files
authored
fix: Use dynamic import for VoiceRecorder (#501)
### Description Of Changes * Use dynamic import to lazy load the audio processor only when using the voice message feature [UIKIT-3590](https://sendbird.atlassian.net/browse/UIKIT-3590)
1 parent c334821 commit f7f2c6a

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

src/hooks/VoiceRecorder/index.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import React, { createContext, useCallback, useContext, useState } from 'react';
2-
import { downsampleToWav, encodeMp3 } from './WebAudioUtils';
1+
import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
32
import {
43
VOICE_MESSAGE_FILE_NAME,
54
VOICE_MESSAGE_MIME_TYPE,
@@ -34,11 +33,25 @@ const VoiceRecorderContext = createContext<VoiceRecorderContext>({
3433
export const VoiceRecorderProvider = (props: VoiceRecorderProps): React.ReactElement => {
3534
const { children } = props;
3635
const { config } = useSendbirdStateContext();
37-
const { logger } = config;
36+
const { logger, isVoiceMessageEnabled } = config;
3837
const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder>(null);
3938
const [isRecordable, setIsRecordable] = useState<boolean>(false);
4039

40+
const [webAudioUtils, setWebAudioUtils] = useState(null);
41+
useEffect(() => {
42+
if (isVoiceMessageEnabled && !webAudioUtils) {
43+
import('./WebAudioUtils').then((data) => {
44+
setWebAudioUtils(data);
45+
})
46+
}
47+
}, []);
48+
4149
const start = useCallback((eventHandler: VoiceRecorderEventHandler): void => {
50+
if (isVoiceMessageEnabled && !webAudioUtils) {
51+
logger.error('VoiceRecorder: Recording audio processor is being loaded.');
52+
return;
53+
}
54+
4255
logger.info('VoiceRecorder: Start recording.');
4356
if (mediaRecorder) {
4457
stop();
@@ -58,8 +71,8 @@ export const VoiceRecorderProvider = (props: VoiceRecorderProps): React.ReactEle
5871
lastModified: new Date().getTime(),
5972
type: VOICE_MESSAGE_MIME_TYPE,
6073
});
61-
downsampleToWav(audioFile, (buffer) => {
62-
const mp3Buffer = encodeMp3(buffer);
74+
webAudioUtils?.downsampleToWav(audioFile, (buffer) => {
75+
const mp3Buffer = webAudioUtils?.encodeMp3(buffer);
6376
const mp3blob = new Blob(mp3Buffer, { type: VOICE_MESSAGE_MIME_TYPE });
6477
const convertedAudioFile = new File([mp3blob], VOICE_MESSAGE_FILE_NAME, {
6578
lastModified: new Date().getTime(),
@@ -79,7 +92,7 @@ export const VoiceRecorderProvider = (props: VoiceRecorderProps): React.ReactEle
7992
logger.error('VoiceRecorder: Failed getting media stream.', err);
8093
setMediaRecorder(null);
8194
});
82-
}, [mediaRecorder]);
95+
}, [mediaRecorder, webAudioUtils]);
8396

8497
const stop = useCallback((): void => {
8598
// Stop recording

0 commit comments

Comments
 (0)