11import React , { createContext , useCallback , useContext , useEffect , useState } from 'react' ;
2+
3+ import { useLocalization } from '../../lib/LocalizationContext' ;
4+ import Modal from '../../ui/Modal' ;
25import {
36 BROWSER_SUPPORT_MIME_TYPE_LIST ,
47 VOICE_MESSAGE_FILE_NAME ,
@@ -36,6 +39,25 @@ export const VoiceRecorderProvider = (props: VoiceRecorderProps): React.ReactEle
3639 const { logger, isVoiceMessageEnabled } = config ;
3740 const [ mediaRecorder , setMediaRecorder ] = useState < MediaRecorder > ( null ) ;
3841 const [ isRecordable , setIsRecordable ] = useState < boolean > ( false ) ;
42+ const [ permissionWarning , setPermissionWarning ] = useState < boolean > ( false ) ;
43+ const { stringSet } = useLocalization ( ) ;
44+
45+ const checkPermission = ( ) => {
46+ try {
47+ // Type '"microphone"' is not assignable to type 'PermissionName'.ts(2322)
48+ // this is typescript issue
49+ // https://github.com/microsoft/TypeScript/issues/33923
50+ // @ts -expect-error
51+ navigator . permissions . query ( { name : 'microphone' } ) . then ( ( result ) => {
52+ if ( result . state === 'denied' ) {
53+ logger . warning ( 'VoiceRecorder: Permission denied.' ) ;
54+ setPermissionWarning ( true ) ;
55+ }
56+ } ) ;
57+ } catch ( error ) {
58+ logger . warning ( 'VoiceRecorder: Failed to check permission.' , error ) ;
59+ }
60+ } ;
3961
4062 const browserSupportMimeType = BROWSER_SUPPORT_MIME_TYPE_LIST . find ( ( mimeType ) => MediaRecorder . isTypeSupported ( mimeType ) ) ?? '' ;
4163 if ( ! browserSupportMimeType ) {
@@ -62,6 +84,7 @@ export const VoiceRecorderProvider = (props: VoiceRecorderProps): React.ReactEle
6284 stop ( ) ;
6385 logger . info ( 'VoiceRecorder: Previous mediaRecorder is stopped.' ) ;
6486 }
87+ checkPermission ( ) ;
6588 navigator ?. mediaDevices ?. getUserMedia ?.( { audio : true } )
6689 . then ( ( stream ) => {
6790 logger . info ( 'VoiceRecorder: Succeeded getting media stream.' , stream ) ;
@@ -114,6 +137,16 @@ export const VoiceRecorderProvider = (props: VoiceRecorderProps): React.ReactEle
114137 isRecordable,
115138 } } >
116139 { children }
140+ {
141+ permissionWarning && (
142+ < Modal
143+ hideFooter
144+ onCancel = { ( ) => setPermissionWarning ( false ) }
145+ >
146+ < > { stringSet . VOICE_RECORDING_PERMISSION_DENIED } </ >
147+ </ Modal >
148+ )
149+ }
117150 </ Context . Provider >
118151 ) ;
119152} ;
0 commit comments