MT#59232 add blind transfer feature

Change-Id: Ieeaed08c6b442ada054a6bb4b6fbaa09cabe4a89
mr12.3
Nouhaila Idrissi Zouggari 2 years ago
parent 9008ae2184
commit ef05bdfe85

@ -158,6 +158,9 @@ export function callRegister ({ instanceId }) {
$incomingRtcSession.on('unhold', (unholdEvent) => { $incomingRtcSession.on('unhold', (unholdEvent) => {
callEvent.emit('incomingUnHold', unholdEvent) callEvent.emit('incomingUnHold', unholdEvent)
}) })
$incomingRtcSession.on('refer', (event) => {
callEvent.emit('incomingRefer', event)
})
} }
} }
}) })
@ -209,7 +212,11 @@ export async function callStart ({ number }) {
} else { } else {
callEvent.emit('outgoingUnHolded', event) callEvent.emit('outgoingUnHolded', event)
} }
},
refer (event) {
callEvent.emit('outgoingRefer', event)
} }
}, },
mediaStream: $localMediaStream mediaStream: $localMediaStream
}) })
@ -438,3 +445,28 @@ export function callToggleHold () {
} }
} }
} }
/**
* Blind Transfer.
*/
export function callBlindTransfer (numberToTransfer) {
return new Promise((resolve, reject) => {
const rtcSession = callGetRtcSession()
const eventHandlers = {
requestFailed: function (e) {
console.log('Transfer failed')
reject(new Error('Transfer failed'))
},
requestSucceeded: function (e) {
console.log('Success', e)
resolve(true)
}
}
try {
rtcSession.refer(numberToTransfer, {
eventHandlers
})
} catch (err) {
reject(err)
}
})
}

@ -9,7 +9,8 @@ import {
callMute, callMute,
callMuteRemote, callMuteRemote,
callUnMute, callUnMute,
callUnMuteRemote callUnMuteRemote,
callStart
} from 'src/api/ngcp-call' } from 'src/api/ngcp-call'
import { i18n } from 'boot/i18n' import { i18n } from 'boot/i18n'
@ -109,4 +110,18 @@ export default async ({ app, store }) => {
store.commit('call/toggleHold') store.commit('call/toggleHold')
store.commit('call/setLocalOnHold', false) store.commit('call/setLocalOnHold', false)
}) })
callEvent.on('outgoingRefer', (event) => {
const number = event.request.refer_to._uri._user
store.commit('call/startCalling', number)
callStart({
number
})
})
callEvent.on('incomingRefer', (event) => {
const number = event.request.refer_to._uri._user
store.commit('call/startCalling', number)
callStart({
number
})
})
} }

@ -32,8 +32,11 @@
/> />
</div> </div>
</div> </div>
<div class="number-display">
{{ dialedNumber }}
</div>
<div <div
v-for="(keyRow, rowIndex) in keys" v-for="(keyRow, rowIndex) in transferCall ? keysTransfer : keys"
:key="rowIndex" :key="rowIndex"
class="csc-dialpad-btn-group" class="csc-dialpad-btn-group"
> >
@ -46,9 +49,18 @@
color="default" color="default"
round round
small small
@click="click(key)" @click="transferCall ? clickTransfer(key) : click(key)"
> >
<template v-if="typeof key === 'object'">
<q-icon
:name="key.icon"
:color="key.icon === 'call' ? 'green' : ''"
:size="key.icon === 'call' ? '40px' : ''"
/>
</template>
<template v-else>
{{ key }} {{ key }}
</template>
</q-btn> </q-btn>
</div> </div>
</div> </div>
@ -58,6 +70,9 @@
<script> <script>
import platformMixin from '../mixins/platform' import platformMixin from '../mixins/platform'
import {
mapActions
} from 'vuex'
export default { export default {
name: 'CscCallDialpad', name: 'CscCallDialpad',
mixins: [ mixins: [
@ -71,11 +86,17 @@ export default {
showClearButton: { showClearButton: {
type: Boolean, type: Boolean,
default: false default: false
},
transferCall: {
type: Boolean,
default: false
} }
}, },
emits: ['click', 'remove', 'remove-all'], emits: ['click', 'remove', 'remove-all'],
data () { data () {
return {} return {
dialedNumber: ''
}
}, },
computed: { computed: {
keys () { keys () {
@ -86,17 +107,50 @@ export default {
['*', '0', '#'], ['*', '0', '#'],
['+'] ['+']
] ]
},
keysTransfer () {
return [
['1', '2', '3'],
['4', '5', '6'],
['7', '8', '9'],
['*', '0', '#'],
['+'],
[{ icon: 'backspace' }, { icon: 'call' }, { icon: 'cancel' }]
]
} }
}, },
methods: { methods: {
...mapActions('call', [
'toggleTransfer'
]),
click (value) { click (value) {
this.$emit('click', value) this.$emit('click', value)
}, },
clickTransfer (value) {
if (value.icon === 'call') {
this.transferCallMethod()
} else if (value.icon === 'cancel') {
this.dialedNumber = ''
} else if (value.icon === 'backspace') {
this.removeLastDigit()
} else {
this.dialedNumber += value
}
},
remove () { remove () {
this.$emit('remove') this.$emit('remove')
}, },
removeAll () { removeAll () {
this.$emit('remove-all') this.$emit('remove-all')
},
transferCallMethod () {
this.toggleTransfer(this.dialedNumber)
// this.$store.dispatch('call/end')
},
removeLastDigit () {
if (this.dialedNumber.length > 0) {
this.dialedNumber = this.dialedNumber.slice(0, -1)
}
} }
} }
} }
@ -139,4 +193,11 @@ export default {
.csc-dialpad-btn-group:last-child .csc-dialpad-btn-group:last-child
margin-bottom: 0 margin-bottom: 0
.number-display
font-size: 24px
color: white
margin-bottom: 16px
text-align: center
</style> </style>

@ -111,6 +111,7 @@
v-if="dialpadOpened" v-if="dialpadOpened"
:show-backspace-button="false" :show-backspace-button="false"
:show-clear-button="false" :show-clear-button="false"
:transfer-call="transferEnabled"
@click="dialpadClick" @click="dialpadClick"
/> />
</div> </div>
@ -180,9 +181,21 @@
class="q-mr-sm" class="q-mr-sm"
round round
size="large" size="large"
:disable="islocalOnHold || isremoteOnHold" :disable="islocalOnHold || isremoteOnHold || transferEnabled"
@click="toggleHold()" @click="toggleHold()"
/> />
<q-btn
v-if="isEstablished || isHolded && !(isMobile && minimized)"
:color="colorTransfer"
icon="phone_forwarded"
class="q-mr-sm"
text-color="dark"
round
size="large"
:disable="islocalOnHold || isremoteOnHold"
@click="initiateTransfer()"
/>
</div> </div>
<q-btn <q-btn
v-if="isHolded || isEstablished && !(isMobile && minimized)" v-if="isHolded || isEstablished && !(isMobile && minimized)"
@ -439,6 +452,10 @@ export default {
type: Boolean, type: Boolean,
default: false default: false
}, },
transferEnabled: {
type: Boolean,
default: false
},
localOnHold: { localOnHold: {
type: Boolean, type: Boolean,
default: false default: false
@ -464,7 +481,7 @@ export default {
default: false default: false
} }
}, },
emits: ['toggle-screen', 'toggle-camera', 'minimize-call', 'maximize-call', 'click-dialpad', 'toggle-remote-volume', 'toggle-microphone', 'toggle-holdon', 'toggle-dialpad', 'close-call', 'end-call', 'accept-call', 'start-call'], emits: ['toggle-screen', 'toggle-camera', 'minimize-call', 'maximize-call', 'click-dialpad', 'toggle-remote-volume', 'toggle-microphone', 'toggle-holdon', 'toggle-state-transfer', 'toggle-dialpad', 'close-call', 'end-call', 'accept-call', 'start-call'],
data () { data () {
return { return {
localMediaWrapperWidth: 0, localMediaWrapperWidth: 0,
@ -578,6 +595,13 @@ export default {
return 'grey-1' return 'grey-1'
} }
}, },
colorTransfer () {
if (this.transferEnabled) {
return 'primary'
} else {
return 'grey-1'
}
},
iconToggleRemoteVolume () { iconToggleRemoteVolume () {
if (this.remoteVolumeEnabled) { if (this.remoteVolumeEnabled) {
return 'volume_up' return 'volume_up'
@ -586,7 +610,6 @@ export default {
} }
}, },
colorToggleRemoteVolume () { colorToggleRemoteVolume () {
console.log(this.platformInfo)
if (this.remoteVolumeEnabled) { if (this.remoteVolumeEnabled) {
return 'primary' return 'primary'
} else { } else {
@ -730,6 +753,11 @@ export default {
}, },
toggleScreen () { toggleScreen () {
this.$emit('toggle-screen') this.$emit('toggle-screen')
},
initiateTransfer () {
this.$emit('toggle-state-transfer')
this.toggleDialpad()
this.toggleHold()
} }
} }
} }

@ -179,6 +179,7 @@
:camera-enabled="cameraEnabled" :camera-enabled="cameraEnabled"
:screen-enabled="screenEnabled" :screen-enabled="screenEnabled"
:hold-enabled="holdEnabled" :hold-enabled="holdEnabled"
:transfer-enabled="transferEnabled"
:local-on-hold="localOnHold" :local-on-hold="localOnHold"
:remote-on-hold="remoteOnHold" :remote-on-hold="remoteOnHold"
:remote-volume-enabled="remoteAudioEnabled" :remote-volume-enabled="remoteAudioEnabled"
@ -190,6 +191,7 @@
@close-call="closeCall" @close-call="closeCall"
@toggle-microphone="toggleMicrophone" @toggle-microphone="toggleMicrophone"
@toggle-holdon="toggleHoldon" @toggle-holdon="toggleHoldon"
@toggle-state-transfer="toggleStateTransfer"
@toggle-camera="toggleCamera" @toggle-camera="toggleCamera"
@toggle-screen="toggleScreen" @toggle-screen="toggleScreen"
@toggle-remote-volume="toggleRemoteAudio" @toggle-remote-volume="toggleRemoteAudio"
@ -294,6 +296,7 @@ export default {
'cameraEnabled', 'cameraEnabled',
'screenEnabled', 'screenEnabled',
'holdEnabled', 'holdEnabled',
'transferEnabled',
'microphoneEnabled', 'microphoneEnabled',
'remoteAudioEnabled', 'remoteAudioEnabled',
'maximized', 'maximized',
@ -537,6 +540,7 @@ export default {
'toggleScreen', 'toggleScreen',
'toggleMicrophone', 'toggleMicrophone',
'toggleHoldon', 'toggleHoldon',
'toggleStateTransfer',
'toggleRemoteAudio' 'toggleRemoteAudio'
]), ]),
layoutResized () { layoutResized () {

@ -9,6 +9,7 @@ import {
callHasLocalVideo, callHasLocalVideo,
callToggleMicrophone, callToggleMicrophone,
callToggleHold, callToggleHold,
callBlindTransfer,
callIsMuted, callIsMuted,
callSendDTMF, callSendDTMF,
callToggleRemoteAudio, callToggleRemoteAudio,
@ -58,6 +59,19 @@ export default {
callToggleHold() callToggleHold()
context.commit('toggleHold') context.commit('toggleHold')
}, },
async toggleTransfer (context, number) {
try {
const result = await callBlindTransfer(number)
if (result) {
context.dispatch('end')
}
} catch (error) {
console.error(error.message)
}
},
async toggleStateTransfer (context) {
context.commit('toggleTransfer')
},
toggleRemoteAudio (context) { toggleRemoteAudio (context) {
callToggleRemoteAudio() callToggleRemoteAudio()
context.commit('toggleRemoteAudio', !callIsRemoteMuted()) context.commit('toggleRemoteAudio', !callIsRemoteMuted())

@ -61,6 +61,7 @@ export default {
state.holdEnabled = false state.holdEnabled = false
state.remoteOnHold = false state.remoteOnHold = false
state.localOnHold = false state.localOnHold = false
state.transferEnabled = false
state.endedReason = reason state.endedReason = reason
} }
state.dialpadOpened = false state.dialpadOpened = false
@ -123,6 +124,14 @@ export default {
setRemoteOnHold (state, value) { setRemoteOnHold (state, value) {
state.remoteOnHold = value state.remoteOnHold = value
},
toggleTransfer (state) {
state.transferEnabled = !state.transferEnabled
if (state.transferEnabled) {
state.transferEnabled = true
} else {
state.transferEnabled = false
}
} }
} }

@ -16,6 +16,7 @@ export default {
callee: false, callee: false,
microphoneEnabled: true, microphoneEnabled: true,
holdEnabled: false, holdEnabled: false,
transferEnabled: false,
cameraEnabled: false, cameraEnabled: false,
screenEnabled: false, screenEnabled: false,
remoteAudioEnabled: true, remoteAudioEnabled: true,

Loading…
Cancel
Save