MT#63089 Match the calling/called number into the phonebook

For outgoing or incoming calls show the
name saved in the phonebook (if it exists).
Note when retrieving phonebook entries
we always return the first entry.
As a result of that:
- if there are duplicates we only show
  one name.
- if there isn't an exact match, as per
today, it won't find any entries.

Change-Id: I5c4307b8e22e6bc65f8efe159867d462d72f0d0d
master
Debora Crescenzo 3 months ago committed by Crescenzo Debora
parent 8b4f8b2e9b
commit 837de61280

@ -0,0 +1,8 @@
import { getList } from 'src/api/common'
export async function fetchPhonebookEntries (number) {
return getList({
resource: 'subscriberphonebookentries',
params: { number }
})
}

@ -53,9 +53,8 @@ export default async ({ app, store }) => {
callEvent.on('outgoingEnded', callFailed) callEvent.on('outgoingEnded', callFailed)
callEvent.on('incomingEnded', callFailed) callEvent.on('incomingEnded', callFailed)
callEvent.on('incoming', (session) => { callEvent.on('incoming', (session) => {
store.commit('call/incomingCall', { const number = _.get(session, 'remote_identity.uri.user', 'Unknown')
number: _.get(session, 'remote_identity.uri.user', 'Unknown') store.dispatch('call/processIncomingCall', number)
})
}) })
callEvent.on('localStream', (stream) => { callEvent.on('localStream', (stream) => {
if (store.state.call.microphoneEnabled) { if (store.state.call.microphoneEnabled) {

@ -47,21 +47,21 @@
<span <span
v-if="isInitiating" v-if="isInitiating"
> >
{{ $t('Calling {number}...', {number: callNumberFormatted || callNumberQuery }) }}</span> {{ $t('Calling {number}...', { number: callDisplayName}) }}</span>
<span <span
v-else-if="isRinging" v-else-if="isRinging"
> >
{{ $t('Ringing at {number}...', {number: callNumberFormatted || callNumberQuery }) }}</span> {{ $t('Ringing at {number}...', { number: callDisplayName}) }}</span>
<span <span
v-else-if="isIncoming" v-else-if="isIncoming"
> >
{{ $t('Incoming call from {number}...', {number: callNumberFormatted || callNumberQuery }) }}</span> {{ $t('Incoming call from {number}...', { number: callDisplayName}) }}</span>
</div> </div>
<div <div
v-else-if="isEnded" v-else-if="isEnded"
class="csc-call-error" class="csc-call-error"
> >
{{ $filters.startCase(endedReason) }} ({{ callNumberFormatted || callNumberQuery }}) {{ $filters.startCase(endedReason) }} ({{ callDisplayName }})
</div> </div>
</div> </div>
</div> </div>
@ -86,7 +86,7 @@
size="24px" size="24px"
/> />
<div> <div>
{{ $t('In call with {number}', {number: callNumberFormatted || callNumberQuery }) }} {{ $t('In call with {number}', { number: callDisplayName}) }}
</div> </div>
<q-btn <q-btn
v-if="!dialpadOpened" v-if="!dialpadOpened"
@ -181,7 +181,7 @@
class="q-mr-sm" class="q-mr-sm"
round round
size="large" size="large"
:disable="islocalOnHold || isremoteOnHold || transferEnabled" :disable="isLocalOnHold || isRemoteOnHold || transferEnabled"
@click="toggleHold()" @click="toggleHold()"
/> />
@ -193,7 +193,7 @@
text-color="dark" text-color="dark"
round round
size="large" size="large"
:disable="islocalOnHold || isremoteOnHold" :disable="isLocalOnHold || isRemoteOnHold"
@click="initiateTransfer()" @click="initiateTransfer()"
/> />
</div> </div>
@ -323,7 +323,7 @@
<div <div
class="csc-call-info-number" class="csc-call-info-number"
> >
{{ callNumberFormatted || callNumberQuery }} {{ callDisplayName }}
</div> </div>
</div> </div>
</div> </div>
@ -339,7 +339,7 @@
<div <div
class="csc-call-info-number" class="csc-call-info-number"
> >
{{ callNumberFormatted || callNumberQuery }} {{ callDisplayName }}
</div> </div>
</div> </div>
</div> </div>
@ -367,7 +367,7 @@
<script> <script>
import CscCallDialpad from 'components/CscCallDialpad' import CscCallDialpad from 'components/CscCallDialpad'
import CscMedia from 'components/CscMedia' import CscMedia from 'components/CscMedia'
import numberFormat, { normalizeDestination } from 'src/filters/number-format' import { normalizeDestination } from 'src/filters/number-format'
import { showCallNotification } from 'src/helpers/ui' import { showCallNotification } from 'src/helpers/ui'
import platformMixin from 'src/mixins/platform' import platformMixin from 'src/mixins/platform'
import { CallStateTitle } from 'src/store/call/common' import { CallStateTitle } from 'src/store/call/common'
@ -391,6 +391,10 @@ export default {
type: String, type: String,
required: true required: true
}, },
phonebookEntryName: {
type: String,
required: true
},
numberInput: { numberInput: {
type: String, type: String,
required: true required: true
@ -548,6 +552,9 @@ export default {
callNumberQuery () { callNumberQuery () {
return normalizeDestination(this.$route.query.number) return normalizeDestination(this.$route.query.number)
}, },
callDisplayName () {
return this.phonebookEntryName || this.callNumberFormatted || this.callNumberQuery
},
iconToggleMicrophone () { iconToggleMicrophone () {
if (this.microphoneEnabled) { if (this.microphoneEnabled) {
return 'mic' return 'mic'
@ -608,10 +615,10 @@ export default {
isNumberInputDefined () { isNumberInputDefined () {
return this.numberInput !== '' && this.numberInput !== null return this.numberInput !== '' && this.numberInput !== null
}, },
islocalOnHold () { isLocalOnHold () {
return this.localOnHold return this.localOnHold
}, },
isremoteOnHold () { isRemoteOnHold () {
return this.remoteOnHold return this.remoteOnHold
} }
}, },
@ -620,12 +627,19 @@ export default {
if (state === 'ringing' || state === 'incoming') { if (state === 'ringing' || state === 'incoming') {
this.playCallSound() this.playCallSound()
if (state === 'incoming') { if (state === 'incoming') {
showCallNotification(numberFormat(this.callNumber)) showCallNotification(this.callDisplayName)
} }
} else { } else {
this.stopCallSound() this.stopCallSound()
} }
}, },
phonebookEntryName (name, oldName) {
if (oldName !== name) {
this.$nextTick(() => {
showCallNotification(name)
})
}
},
closed (closed) { closed (closed) {
if (closed && this.$refs.startButton) { if (closed && this.$refs.startButton) {
this.$refs.startButton.hide() this.$refs.startButton.hide()

@ -190,6 +190,7 @@
ref="call" ref="call"
:call-state="callState" :call-state="callState"
:call-number="number" :call-number="number"
:phonebook-entry-name="phonebookEntryName"
:number-input="numberInput" :number-input="numberInput"
:ended-reason="endedReason" :ended-reason="endedReason"
:full-view="isFullView" :full-view="isFullView"
@ -313,6 +314,7 @@ export default {
'callState', 'callState',
'number', 'number',
'numberInput', 'numberInput',
'phonebookEntryName',
'endedReason', 'endedReason',
'localMediaStream', 'localMediaStream',
'remoteMediaStream', 'remoteMediaStream',
@ -445,7 +447,7 @@ export default {
return '' return ''
}, },
callNumberFormatted () { callNumberFormatted () {
return normalizeDestination(this.number) return this.phonebookEntryName || normalizeDestination(this.number)
}, },
callEndedReasonFormatted () { callEndedReasonFormatted () {
return startCase(this.endedReason) return startCase(this.endedReason)

@ -1,4 +1,5 @@
import { i18n } from 'boot/i18n' import { i18n } from 'boot/i18n'
import { fetchPhonebookEntries } from 'src/api/call'
import { import {
callAccept, callAccept,
callAddCamera, callAddCamera,
@ -26,6 +27,7 @@ let errorVisibilityTimer = null
export default { export default {
async start (context, localMedia) { async start (context, localMedia) {
const number = context.getters.callNumberInput.replaceAll('(', '').replaceAll(')', '').replaceAll(' ', '').replaceAll('-', '') const number = context.getters.callNumberInput.replaceAll('(', '').replaceAll(')', '').replaceAll(' ', '').replaceAll('-', '')
context.dispatch('fetchPhonebookEntryName', number)
context.commit('startCalling', number) context.commit('startCalling', number)
const isStarted = await callStart({ const isStarted = await callStart({
number, number,
@ -38,6 +40,23 @@ export default {
showGlobalError(i18n.global.t('No microphone authorized.')) showGlobalError(i18n.global.t('No microphone authorized.'))
} }
}, },
async fetchPhonebookEntryName (context, number) {
try {
const phoneBookEntryArray = await fetchPhonebookEntries(number)
const phoneBookEntry = phoneBookEntryArray?.items[0] || null
if (phoneBookEntry) {
context.commit('fetchPhonebookEntrySuccess', phoneBookEntry.name)
}
} catch (err) {
context.commit('fetchPhonebookEntryFailure')
}
},
async processIncomingCall (context, number) {
await context.dispatch('fetchPhonebookEntryName', number)
context.commit('incomingCall', {
number
})
},
async accept (context, localMedia) { async accept (context, localMedia) {
await callAccept({ await callAccept({
localMedia localMedia

@ -70,6 +70,7 @@ export default {
state.remoteVideoEnabled = false state.remoteVideoEnabled = false
state.localMediaStream = null state.localMediaStream = null
state.remoteMediaStream = null state.remoteMediaStream = null
state.newPhonebookEntryName = null
}, },
toggleMicrophone (state, enabled) { toggleMicrophone (state, enabled) {
state.microphoneEnabled = enabled state.microphoneEnabled = enabled
@ -129,5 +130,11 @@ export default {
} else { } else {
state.transferEnabled = false state.transferEnabled = false
} }
},
fetchPhonebookEntrySuccess (state, phonebookEntryName) {
state.phonebookEntryName = phonebookEntryName
},
fetchPhonebookEntryFailure (state) {
state.phonebookEntryName = null
} }
} }

@ -6,6 +6,7 @@ export default {
endedReason: null, endedReason: null,
callState: CallState.input, callState: CallState.input,
number: '', number: '',
phonebookEntryName: null,
numberInput: '', numberInput: '',
localMediaStream: null, localMediaStream: null,
remoteMediaStream: null, remoteMediaStream: null,

Loading…
Cancel
Save