diff --git a/src/api/ngcp-call.js b/src/api/ngcp-call.js index 6cb108ff..0b1a876d 100644 --- a/src/api/ngcp-call.js +++ b/src/api/ngcp-call.js @@ -168,31 +168,36 @@ export function callUnregister () { } export async function callStart ({ number }) { - $localMediaStream = await callCreateLocalAudioStream() - callEvent.emit('localStream', $localMediaStream) - $outgoingRtcSession = $userAgent.call(number, { - eventHandlers: { - progress (event) { - if (event.response.status_code === 183) { - callEvent.emit('outgoingProgress', event) - } else { - callEvent.emit('outgoingRinging', event) + try { + $localMediaStream = await callCreateLocalAudioStream() + callEvent.emit('localStream', $localMediaStream) + $outgoingRtcSession = $userAgent.call(number, { + eventHandlers: { + progress (event) { + if (event.response.status_code === 183) { + callEvent.emit('outgoingProgress', event) + } else { + callEvent.emit('outgoingRinging', event) + } + }, + failed (event) { + callEvent.emit('outgoingFailed', event) + }, + confirmed (event) { + callEvent.emit('outgoingConfirmed', event) + }, + ended (event) { + callEvent.emit('outgoingEnded', event) + $outgoingRtcSession = null } }, - failed (event) { - callEvent.emit('outgoingFailed', event) - }, - confirmed (event) { - callEvent.emit('outgoingConfirmed', event) - }, - ended (event) { - callEvent.emit('outgoingEnded', event) - $outgoingRtcSession = null - } - }, - mediaStream: $localMediaStream - }) - $outgoingRtcSession.connection.ontrack = handleRemoteMediaStream + mediaStream: $localMediaStream + }) + $outgoingRtcSession.connection.ontrack = handleRemoteMediaStream + return true + } catch (e) { + return false + } } export async function callAccept () { diff --git a/src/components/call/CscCall.vue b/src/components/call/CscCall.vue index d9e9774e..c21cf512 100644 --- a/src/components/call/CscCall.vue +++ b/src/components/call/CscCall.vue @@ -222,7 +222,7 @@ /> + > + + {{ $t('No microphone authorized.') }} + +
{ this.fetchLocalMediaWrapperWidth() this.fetchRemoteMediaWrapperWidth() @@ -579,6 +589,18 @@ export default { this.emitter.$on('window-resized', fetchMediaWrapperWidth) this.emitter.$on('content-resized', fetchMediaWrapperWidth) this.emitter.$on('orientation-changed', fetchMediaWrapperWidth) + if (!navigator.userAgent.includes('Firefox')) { + const permission = await navigator.permissions.query({ name: 'microphone' }) + this.permissionState = permission.state + this.microphoneNotAllowed = this.permissionState === 'denied' + permission.onchange = (event) => { + if (this.permissionState === 'prompt' && event.target.state === 'denied') { + this.closeCall() + } + this.permissionState = permission.state + this.microphoneNotAllowed = event.target.state === 'denied' + } + } }, methods: { fetchLocalMediaWrapperWidth () { diff --git a/src/i18n/en.json b/src/i18n/en.json index 2bf2e8c4..bbe1e1c9 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -289,6 +289,7 @@ "No groups created yet": "No groups created yet", "No manager secretary configuration created yet": "No manager secretary configuration created yet", "No messages": "No messages", + "No microphone authorized.": "No microphone authorized.", "No numbers assigned": "No numbers assigned", "No numbers found": "No numbers found", "No parents assigned": "No parents assigned", diff --git a/src/store/call/actions.js b/src/store/call/actions.js index c485c59c..d4b9836e 100644 --- a/src/store/call/actions.js +++ b/src/store/call/actions.js @@ -16,6 +16,12 @@ import { callHasLocalCamera } from 'src/api/ngcp-call' import { errorVisibilityTimeout } from 'src/store/call/common' +import { + showGlobalError +} from 'src/helpers/ui' +import { + i18n +} from 'boot/i18n' let errorVisibilityTimer = null @@ -26,11 +32,16 @@ export default { .replaceAll(' ', '') .replaceAll('-', '') context.commit('startCalling', number) - await callStart({ + const isStarted = await callStart({ number, localMedia }) - context.commit('localMediaSuccess', callGetLocalMediaStreamId()) + if (isStarted) { + context.commit('localMediaSuccess', callGetLocalMediaStreamId()) + } else { + context.commit('inputNumber') + showGlobalError(i18n.global.tc('No microphone authorized.')) + } }, async accept (context, localMedia) { await callAccept({