chore: floating button for incoming call

This commit is contained in:
Sojan
2025-04-29 03:45:08 -07:00
parent 4c579bc71e
commit 3f0c01e166
11 changed files with 896 additions and 314 deletions
@@ -212,6 +212,33 @@ export class DashboardAudioNotificationHelper {
showBadgeOnFavicon();
this.playAudioEvery30Seconds();
};
onIncomingCall = () => {
// Always play audio alerts for incoming calls, regardless of other settings
// This ensures users never miss a call notification
// Use a different tone for calls if available, otherwise use regular tone
const originalTone = this.audioConfig.tone;
try {
// Temporarily set a call-specific tone if it exists
this.audioConfig.tone = 'call-ring';
this.intializeAudio();
this.playAudioAlert();
} catch (error) {
console.error('Error playing call notification:', error);
// Fallback to regular tone
this.audioConfig.tone = originalTone;
this.intializeAudio();
this.playAudioAlert();
} finally {
// Restore original tone for messages
this.audioConfig.tone = originalTone;
this.intializeAudio();
}
// Also show badge on favicon
showBadgeOnFavicon();
};
}
export default new DashboardAudioNotificationHelper(GlobalStore);
@@ -30,6 +30,10 @@ class ActionCableConnector extends BaseActionCableConnector {
'conversation.read': this.onConversationRead,
'conversation.updated': this.onConversationUpdated,
'account.cache_invalidated': this.onCacheInvalidate,
// Call events
'incoming_call': this.onIncomingCall,
'call_status_changed': this.onCallStatusChanged
};
}
@@ -191,6 +195,38 @@ class ActionCableConnector extends BaseActionCableConnector {
this.app.$store.dispatch('inboxes/revalidate', { newKey: keys.inbox });
this.app.$store.dispatch('teams/revalidate', { newKey: keys.team });
};
onIncomingCall = data => {
// Normalize snake_case to camelCase for consistency with frontend code
const normalizedPayload = {
callSid: data.call_sid,
conversationId: data.conversation_id,
inboxId: data.inbox_id,
inboxName: data.inbox_name,
contactName: data.contact_name,
contactId: data.contact_id,
};
// Update store
this.app.$store.dispatch('calls/setIncomingCall', normalizedPayload);
// Also update App.vue showCallWidget directly for immediate UI feedback
if (window.app && window.app.$data) {
window.app.$data.showCallWidget = true;
}
};
onCallStatusChanged = data => {
// Normalize snake_case to camelCase for consistency with frontend code
const normalizedPayload = {
callSid: data.call_sid,
status: data.status,
conversationId: data.conversation_id,
};
// Update store
this.app.$store.dispatch('calls/setActiveCall', normalizedPayload);
};
}
export default {