diff --git a/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue b/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue index 46c5a00fd..fb5018362 100644 --- a/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue +++ b/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue @@ -97,20 +97,30 @@ const labelKey = computed(() => { ? 'CONVERSATION.VOICE_CALL.OUTGOING_CALL' : 'CONVERSATION.VOICE_CALL.INCOMING_CALL'; } - return isFailed.value - ? 'CONVERSATION.VOICE_CALL.MISSED_CALL' - : 'CONVERSATION.VOICE_CALL.INCOMING_CALL'; + if (isFailed.value) { + return isOutbound.value + ? 'CONVERSATION.VOICE_CALL.NO_ANSWER_OUTBOUND_LABEL' + : 'CONVERSATION.VOICE_CALL.MISSED_CALL'; + } + return 'CONVERSATION.VOICE_CALL.INCOMING_CALL'; }); const subtext = computed(() => { if (status.value === VOICE_CALL_STATUS.RINGING) { - return t('CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET'); + return isOutbound.value + ? t('CONVERSATION.VOICE_CALL.CALLING') + : t('CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET'); } if (status.value === VOICE_CALL_STATUS.COMPLETED) { return formattedDuration.value; } if (status.value === VOICE_CALL_STATUS.IN_PROGRESS) { - if (isOutbound.value) return t('CONVERSATION.VOICE_CALL.THEY_ANSWERED'); + // Outbound calls can flip to in-progress before the contact actually + // picks up (e.g., Twilio marks in-progress when the agent joins the + // conference); claiming "they answered" here would be misleading. The + // 'Call in progress' label alone is accurate; the floating widget shows + // the live duration. + if (isOutbound.value) return null; if (didCurrentUserAnswer.value) { return t('CONVERSATION.VOICE_CALL.YOU_ANSWERED'); } @@ -119,11 +129,14 @@ const subtext = computed(() => { agentName: displayAgentName.value, }); } - return t('CONVERSATION.VOICE_CALL.THEY_ANSWERED'); + return null; } - return isFailed.value - ? t('CONVERSATION.VOICE_CALL.NO_ANSWER') - : t('CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET'); + if (isFailed.value) { + return isOutbound.value + ? t('CONVERSATION.VOICE_CALL.NO_ANSWER_OUTBOUND_SUBTEXT') + : t('CONVERSATION.VOICE_CALL.MISSED_CALL_INBOUND_SUBTEXT'); + } + return t('CONVERSATION.VOICE_CALL.NOT_ANSWERED_YET'); }); const iconName = computed(() => { diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index aa512f569..78e18d09d 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -79,9 +79,13 @@ "OUTGOING_CALL": "Outgoing call", "CALL_IN_PROGRESS": "Call in progress", "NO_ANSWER": "No answer", + "NO_ANSWER_OUTBOUND_LABEL": "No answer", + "NO_ANSWER_OUTBOUND_SUBTEXT": "Contact didn't pick up", "MISSED_CALL": "Missed call", + "MISSED_CALL_INBOUND_SUBTEXT": "No agent picked up", "CALL_ENDED": "Call ended", "NOT_ANSWERED_YET": "Not answered yet", + "CALLING": "Calling…", "THEY_ANSWERED": "They answered", "YOU_ANSWERED": "You answered", "AGENT_ANSWERED": "{agentName} answered",