From 3f0c01e1668611e1d5b30df7a42cdf8d3d5ada60 Mon Sep 17 00:00:00 2001 From: Sojan Date: Tue, 29 Apr 2025 03:45:08 -0700 Subject: [PATCH] chore: floating button for incoming call --- .../channels/voice/webhooks_controller.rb | 41 +- .../api/v1/accounts/voice_controller.rb | 117 ++- app/javascript/dashboard/App.vue | 96 ++- .../dashboard/api/channels/voice.js | 101 +-- .../components/widgets/FloatingCallWidget.vue | 706 +++++++++++++----- .../DashboardAudioNotificationHelper.js | 27 + .../dashboard/helper/actionCable.js | 36 + .../i18n/locale/en/conversation.json | 15 +- .../dashboard/store/modules/calls.js | 69 +- config/routes.rb | 2 + public/audio/dashboard/call-ring.mp3 | Bin 0 -> 85518 bytes 11 files changed, 896 insertions(+), 314 deletions(-) create mode 100644 public/audio/dashboard/call-ring.mp3 diff --git a/app/controllers/api/v1/accounts/channels/voice/webhooks_controller.rb b/app/controllers/api/v1/accounts/channels/voice/webhooks_controller.rb index c149f1b05..bb9e6eec1 100644 --- a/app/controllers/api/v1/accounts/channels/voice/webhooks_controller.rb +++ b/app/controllers/api/v1/accounts/channels/voice/webhooks_controller.rb @@ -61,6 +61,16 @@ class Api::V1::Accounts::Channels::Voice::WebhooksController < Api::V1::Accounts } ).perform + # Broadcast incoming call notification on account-level channel + broadcast_call_status('incoming_call', { + call_sid: call_sid, + conversation_id: conversation.id, + inbox_id: inbox.id, + inbox_name: inbox.name, + contact_name: contact.name || from_number, + contact_id: contact.id + }, account_id: inbox.account_id) + # Generate minimal TwiML response response = Twilio::TwiML::VoiceResponse.new response.say(message: 'Thank you for calling. An agent will be with you shortly.') @@ -144,18 +154,12 @@ class Api::V1::Accounts::Channels::Voice::WebhooksController < Api::V1::Accounts } ).perform - # Broadcast minimal update to frontend - ActionCable.server.broadcast( - "#{conversation.account_id}_#{conversation.inbox_id}", - { - event_name: 'call_status_changed', - data: { - call_sid: call_sid, - status: conversation.additional_attributes['call_status'] || 'in-progress', - conversation_id: conversation.id - } - } - ) + # Broadcast call status updates on account-level channel + broadcast_call_status('call_status_changed', { + call_sid: call_sid, + status: conversation.additional_attributes['call_status'] || 'in-progress', + conversation_id: conversation.id + }, account_id: conversation.account_id) # Return minimal response head :ok @@ -210,4 +214,17 @@ class Api::V1::Accounts::Channels::Voice::WebhooksController < Api::V1::Accounts def base_url ENV.fetch('FRONTEND_URL', "https://#{request.host_with_port}") end + + def broadcast_call_status(event_name, data, account_id:) + # Include account_id in the data to help with validation + data_with_account = data.merge(account_id: account_id) + + ActionCable.server.broadcast( + "account_#{account_id}", + { + event: event_name, + data: data_with_account + } + ) + end end diff --git a/app/controllers/api/v1/accounts/voice_controller.rb b/app/controllers/api/v1/accounts/voice_controller.rb index f5e5899fd..b023d332e 100644 --- a/app/controllers/api/v1/accounts/voice_controller.rb +++ b/app/controllers/api/v1/accounts/voice_controller.rb @@ -1,5 +1,5 @@ class Api::V1::Accounts::VoiceController < Api::V1::Accounts::BaseController - before_action :fetch_conversation, only: [:end_call, :call_status] + before_action :fetch_conversation, only: [:end_call, :join_call, :reject_call, :call_status] def end_call call_sid = params[:call_sid] || @conversation.additional_attributes&.dig('call_sid') @@ -53,6 +53,121 @@ class Api::V1::Accounts::VoiceController < Api::V1::Accounts::BaseController end end + def join_call + call_sid = params[:call_sid] || @conversation.additional_attributes&.dig('call_sid') + return render json: { error: 'No active call found' }, status: :not_found unless call_sid + + # Get the inbox and channel information + inbox = @conversation.inbox + channel = inbox&.channel + + if channel.is_a?(Channel::Voice) && channel.provider == 'twilio' + config = channel.provider_config_hash + + begin + # Create a Twilio client + client = Twilio::REST::Client.new(config['account_sid'], config['auth_token']) + + # Get the conference SID from the conversation attributes + # For incoming calls, Twilio typically places the caller in a conference that agents can join + conference_sid = @conversation.additional_attributes&.dig('conference_sid') + + if conference_sid + # Create a call that connects the agent to the conference + client.calls.create( + to: current_user.phone_number || config['agent_phone_number'], + from: channel.phone_number, + status_callback: "#{ENV.fetch('FRONTEND_URL', nil)}/twilio/voice/status_callback", + status_callback_event: ['initiated', 'ringing', 'answered', 'completed'], + status_callback_method: 'POST', + url: "#{ENV.fetch('FRONTEND_URL', nil)}/twilio/voice/twiml?conference_sid=#{conference_sid}&agent_id=#{current_user.id}" + ) + + # Update conversation to show agent joined + @conversation.additional_attributes ||= {} + @conversation.additional_attributes['agent_joined'] = true + @conversation.additional_attributes['joined_at'] = Time.now.to_i + @conversation.additional_attributes['joined_by'] = { + id: current_user.id, + name: current_user.name + } + @conversation.save! + + # Create an activity message noting the agent joined + Messages::MessageBuilder.new( + nil, + @conversation, + { + content: "#{current_user.name} joined the call", + message_type: :activity, + additional_attributes: { + call_sid: call_sid, + conference_sid: conference_sid, + joined_by: current_user.name, + joined_at: Time.now.to_i + } + } + ).perform + + render json: { + status: 'success', + message: 'Agent joining call', + conference_sid: conference_sid + } + else + render json: { error: 'Conference not found for this call' }, status: :unprocessable_entity + end + rescue Twilio::REST::RestError => e + render json: { error: "Failed to join call: #{e.message}" }, status: :internal_server_error + end + else + render json: { error: 'Unsupported channel provider for call control' }, status: :unprocessable_entity + end + end + + def reject_call + call_sid = params[:call_sid] || @conversation.additional_attributes&.dig('call_sid') + return render json: { error: 'No active call found' }, status: :not_found unless call_sid + + # Get the inbox and channel information + inbox = @conversation.inbox + channel = inbox&.channel + + if channel.is_a?(Channel::Voice) && channel.provider == 'twilio' + # Update conversation to show agent rejected call + @conversation.additional_attributes ||= {} + @conversation.additional_attributes['agent_rejected'] = true + @conversation.additional_attributes['rejected_at'] = Time.now.to_i + @conversation.additional_attributes['rejected_by'] = { + id: current_user.id, + name: current_user.name + } + @conversation.save! + + # Create an activity message noting the agent rejected the call + Messages::MessageBuilder.new( + nil, + @conversation, + { + content: "#{current_user.name} declined to answer", + message_type: :activity, + additional_attributes: { + call_sid: call_sid, + rejected_by: current_user.name, + rejected_at: Time.now.to_i + } + } + ).perform + + render json: { + status: 'success', + message: 'Call rejected by agent' + } + else + render json: { error: 'Unsupported channel provider for call control' }, status: :unprocessable_entity + end + end + def call_status call_sid = @conversation.additional_attributes&.dig('call_sid') return render json: { error: 'No call found' }, status: :not_found unless call_sid diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue index 8998c0df0..81445bf78 100644 --- a/app/javascript/dashboard/App.vue +++ b/app/javascript/dashboard/App.vue @@ -55,7 +55,7 @@ export default { showAddAccountModal: false, latestChatwootVersion: null, reconnectService: null, - showCallWidget: false, // Set to true for testing, false for production + showCallWidget: false, // Will be set to true when calls are active }; }, computed: { @@ -67,6 +67,8 @@ export default { accountUIFlags: 'accounts/getUIFlags', activeCall: 'calls/getActiveCall', hasActiveCall: 'calls/hasActiveCall', + incomingCall: 'calls/getIncomingCall', + hasIncomingCall: 'calls/hasIncomingCall', }), hasAccounts() { const { accounts = [] } = this.currentUser || {}; @@ -91,18 +93,34 @@ export default { } }, }, + hasIncomingCall: { + immediate: true, + handler(newVal) { + console.log('App.vue detected change in hasIncomingCall to', newVal); + if (newVal) { + console.log('Incoming call data:', this.incomingCall); + this.showCallWidget = true; + } + } + }, + hasActiveCall: { + immediate: true, + handler(newVal) { + console.log('App.vue detected change in hasActiveCall to', newVal); + if (newVal) { + console.log('Active call data:', this.activeCall); + this.showCallWidget = true; + } + } + }, }, mounted() { - // Make app instance available globally for debugging and cross-component access - window.app = this; - - // Set up global force end call mechanism - window.forceEndCall = () => this.forceEndCall(); - window.forceEndCallHandlers = []; - this.initializeColorTheme(); this.listenToThemeChanges(); this.setLocale(window.chatwootConfig.selectedLocale); + + // Make app instance available globally for direct call widget updates + window.app = this; }, unmounted() { if (this.reconnectService) { @@ -121,80 +139,52 @@ export default { this.$root.$i18n.locale = locale; }, handleCallEnded() { - console.log('Call ended event received in App.vue'); - // Update our local state first for immediate UI update this.showCallWidget = false; - // Then update the store this.$store.dispatch('calls/clearActiveCall'); + this.$store.dispatch('calls/clearIncomingCall'); }, - - // Public method that can be called from anywhere + handleCallJoined() { + this.showCallWidget = true; + }, + handleCallRejected() { + this.showCallWidget = false; + this.$store.dispatch('calls/clearIncomingCall'); + }, forceEndCall() { - console.log('Force end call triggered in App.vue'); - - // 1. Update UI immediately this.showCallWidget = false; - - // 2. Try to notify any other components if (window.forceEndCallHandlers) { window.forceEndCallHandlers.forEach(handler => { try { handler(); } catch (e) { - console.error('Error in end call handler:', e); + // Optionally log error in production } }); } - - // 3. CRITICAL: Make API call to actually end the call on the server if (this.activeCall && this.activeCall.callSid) { const { callSid, conversationId } = this.activeCall; - - // Save references before clearing the store const savedCallSid = callSid; const savedConversationId = conversationId; - - // Now clear the store this.$store.dispatch('calls/clearActiveCall'); - - // Make API call if we have a conversation ID if (savedConversationId) { - console.log( - 'App.vue making API call to end call with SID:', - savedCallSid, - 'for conversation:', - savedConversationId - ); - - // Make the API call to end the call on the server with both parameters VoiceAPI.endCall(savedCallSid, savedConversationId) .then(response => { - console.log('Call ended successfully via API:', response); useAlert({ message: 'Call ended successfully', type: 'success' }); }) .catch(error => { - console.error('Error ending call via API:', error); - - // If first attempt fails, try one more time with additional logging - console.log('Retrying end call with more debugging...'); setTimeout(() => { VoiceAPI.endCall(savedCallSid, savedConversationId) .then(retryResponse => { - console.log('Retry successful:', retryResponse); }) .catch(retryError => { - console.error('Retry also failed:', retryError); }); }, 1000); - useAlert({ message: 'Call UI has been reset', type: 'info' }); }); } else { - console.log('App.vue: Not making API call because conversation ID is missing'); useAlert({ message: 'Call ended', type: 'success' }); } } else { - // No active call data, just clear the store this.$store.dispatch('calls/clearActiveCall'); } }, @@ -247,12 +237,16 @@ export default { diff --git a/app/javascript/dashboard/api/channels/voice.js b/app/javascript/dashboard/api/channels/voice.js index 1d345de50..a07950f53 100644 --- a/app/javascript/dashboard/api/channels/voice.js +++ b/app/javascript/dashboard/api/channels/voice.js @@ -3,76 +3,87 @@ import ApiClient from '../ApiClient'; class VoiceAPI extends ApiClient { constructor() { - // Use empty string for resource to avoid duplicate 'accounts' in URL - super('', { accountScoped: true }); + // Use 'voice' as the resource with accountScoped: true + super('voice', { accountScoped: true }); } // Initiate a call to a contact initiateCall(contactId) { - // Get the account ID from the current URL - const accountId = this.accountIdFromRoute; - // Make sure we have the right endpoint path - return axios.post( - `/api/v1/accounts/${accountId}/contacts/${contactId}/call` - ); + if (!contactId) { + throw new Error('Contact ID is required to initiate a call'); + } + + // Based on the route definition, the correct URL path is /api/v1/accounts/{accountId}/contacts/{contactId}/call + // The endpoint is defined in the contacts namespace, not voice namespace + return axios.post(`${this.baseUrl().replace('/voice', '')}/contacts/${contactId}/call`); } // End an active call endCall(callSid, conversationId) { if (!conversationId) { - console.error('VoiceAPI: Cannot end call - conversation ID is required'); - return Promise.reject( - new Error('Conversation ID is required to end a call') - ); + throw new Error('Conversation ID is required to end a call'); } if (!callSid) { - console.error('VoiceAPI: Cannot end call - call SID is required'); - return Promise.reject(new Error('Call SID is required to end a call')); + throw new Error('Call SID is required to end a call'); } - // Validate call SID format - Twilio call SID starts with 'CA' followed by alphanumeric characters + // Validate call SID format - Twilio call SID starts with 'CA' or 'TJ' if (!callSid.startsWith('CA') && !callSid.startsWith('TJ')) { - console.error('VoiceAPI: Invalid call SID format:', callSid); - return Promise.reject( - new Error( - 'Invalid call SID format. Expected Twilio call SID starting with CA or TJ.' - ) + throw new Error( + 'Invalid call SID format. Expected Twilio call SID starting with CA or TJ.' ); } - // Get the account ID from the current URL - const accountId = this.accountIdFromRoute; - console.log( - `VoiceAPI: Ending call with SID ${callSid} for conversation ${conversationId} in account ${accountId}` - ); - - // Make the actual API call with conversation ID as a parameter - // Using the route structure that matches the Rails routes.rb definition - return axios - .post(`/api/v1/accounts/${accountId}/voice/end_call`, { - call_sid: callSid, - conversation_id: conversationId, - id: conversationId, // Also include as 'id' as the controller may check for it - }) - .then(response => { - console.log('VoiceAPI: End call API succeeded:', response); - return response; - }) - .catch(error => { - console.error('VoiceAPI: End call API failed:', error); - throw error; - }); + return axios.post(`${this.url}/end_call`, { + call_sid: callSid, + conversation_id: conversationId, + id: conversationId, + }); } // Get call status getCallStatus(callSid) { - // Get the account ID from the current URL - const accountId = this.accountIdFromRoute; - return axios.get(`/api/v1/accounts/${accountId}/voice/call_status`, { + if (!callSid) { + throw new Error('Call SID is required to get call status'); + } + + return axios.get(`${this.url}/call_status`, { params: { call_sid: callSid }, }); } + + // Join an incoming call as an agent (join the conference) + joinCall(callSid, conversationId) { + if (!conversationId) { + throw new Error('Conversation ID is required to join a call'); + } + + if (!callSid) { + throw new Error('Call SID is required to join a call'); + } + + return axios.post(`${this.url}/join_call`, { + call_sid: callSid, + conversation_id: conversationId, + }); + } + + // Reject an incoming call as an agent (don't join the conference) + rejectCall(callSid, conversationId) { + if (!conversationId) { + throw new Error('Conversation ID is required to reject a call'); + } + + if (!callSid) { + throw new Error('Call SID is required to reject a call'); + } + + return axios.post(`${this.url}/reject_call`, { + call_sid: callSid, + conversation_id: conversationId, + }); + } } export default new VoiceAPI(); diff --git a/app/javascript/dashboard/components/widgets/FloatingCallWidget.vue b/app/javascript/dashboard/components/widgets/FloatingCallWidget.vue index 29e4f7559..b42d4c2e0 100644 --- a/app/javascript/dashboard/components/widgets/FloatingCallWidget.vue +++ b/app/javascript/dashboard/components/widgets/FloatingCallWidget.vue @@ -4,6 +4,7 @@ import { useStore } from 'vuex'; import { useAlert } from 'dashboard/composables'; import { useI18n } from 'vue-i18n'; import VoiceAPI from 'dashboard/api/channels/voice'; +import ContactAPI from 'dashboard/api/contacts'; export default { name: 'FloatingCallWidget', @@ -20,8 +21,16 @@ export default { type: [Number, String], default: null, }, + contactName: { + type: String, + default: '', + }, + contactId: { + type: [Number, String], + default: null, + }, }, - emits: ['call-ended'], + emits: ['callEnded', 'callJoined', 'callRejected'], setup(props, { emit }) { const store = useStore(); const { t } = useI18n(); @@ -31,20 +40,47 @@ export default { const isMuted = ref(false); const showCallOptions = ref(false); const isFullscreen = ref(false); + const ringtoneAudio = ref(null); + const displayContactName = ref(props.contactName || 'Loading...'); // Define local fallback translations in case i18n fails const translations = { 'CONVERSATION.END_CALL': 'End call', + 'CONVERSATION.JOIN_CALL': 'Join call', + 'CONVERSATION.REJECT_CALL': 'Reject', 'CONVERSATION.CALL_ENDED': 'Call ended', 'CONVERSATION.CALL_END_ERROR': 'Failed to end call', + 'CONVERSATION.CALL_ACCEPTED': 'Joining call...', + 'CONVERSATION.CALL_REJECTED': 'Call rejected', + 'CONVERSATION.CALL_JOIN_ERROR': 'Failed to join call', + 'CONVERSATION.INCOMING_CALL': 'Incoming call', }; + // Computed properties + const activeCall = computed(() => store.getters['calls/getActiveCall']); + const incomingCall = computed(() => store.getters['calls/getIncomingCall']); + const hasIncomingCall = computed(() => store.getters['calls/hasIncomingCall']); + const hasActiveCall = computed(() => store.getters['calls/hasActiveCall']); + + const isIncoming = computed(() => { + return hasIncomingCall.value && !hasActiveCall.value; + }); + + const callInfo = computed(() => { + return isIncoming.value ? incomingCall.value : activeCall.value; + }); + + const isJoined = computed(() => { + return activeCall.value && activeCall.value.isJoined; + }); + const formattedCallDuration = computed(() => { const minutes = Math.floor(callDuration.value / 60); const seconds = callDuration.value % 60; return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; }); + // Methods const startDurationTimer = () => { console.log('Starting duration timer'); if (durationTimer.value) clearInterval(durationTimer.value); @@ -61,21 +97,58 @@ export default { } }; + const playRingtone = () => { + if (!ringtoneAudio.value) { + // Fixed path to an existing audio file + ringtoneAudio.value = new Audio('/audio/dashboard/call-ring.mp3'); + ringtoneAudio.value.loop = true; + + // Preload the audio to reduce delay + ringtoneAudio.value.preload = 'auto'; + + // Make sure volume is set appropriately + ringtoneAudio.value.volume = 0.7; + + // Log confirmation + console.log('Ringtone audio initialized with path: /audio/dashboard/call-ring.mp3'); + } + + // Force play with user interaction if needed + const playPromise = ringtoneAudio.value.play(); + + if (playPromise !== undefined) { + playPromise.catch(error => { + console.error('Failed to play ringtone:', error); + + // If autoplay was prevented, try again on next user interaction + document.addEventListener('click', () => { + ringtoneAudio.value.play().catch(() => {}); + }, { once: true }); + }); + } + }; + + const stopRingtone = () => { + if (ringtoneAudio.value) { + ringtoneAudio.value.pause(); + ringtoneAudio.value.currentTime = 0; + } + }; + // Emergency force end call function - simpler and more direct const forceEndCall = () => { console.log('FORCE END CALL triggered from floating widget'); // Try all methods to ensure call ends - - // 1. Local component state stopDurationTimer(); + stopRingtone(); isCallActive.value = false; // Save the call data before potential reset const savedCallSid = props.callSid; const savedConversationId = props.conversationId; - // 2. First, make direct API call if we have a valid call SID and conversation ID + // First, make direct API call if we have a valid call SID and conversation ID if (savedConversationId && savedCallSid && savedCallSid !== 'pending') { // Check if it's a valid Twilio call SID (starts with CA or TJ) const isValidTwilioSid = @@ -121,45 +194,45 @@ export default { console.log('FloatingCallWidget: Missing required data for API call'); } - // 3. Also use global method to update UI states + // Also use global method to update UI states if (window.forceEndCall) { console.log('Using global forceEndCall method'); window.forceEndCall(); } - // Fallbacks if global method not available - - // 4. Force App state update directly + // Force App state update directly if (window.app) { console.log('Forcing app state update'); window.app.$data.showCallWidget = false; } - // 5. Emit event - emit('call-ended'); + // Emit event + emit('callEnded'); - // 6. Update store - using store from setup scope + // Update store - using store from setup scope store.dispatch('calls/clearActiveCall'); + store.dispatch('calls/clearIncomingCall'); - // 7. User feedback + // User feedback useAlert({ message: 'Call ended', type: 'success' }); }; - // Original more careful implementation + // End active call const endCall = async () => { console.log('Attempting to end call with SID:', props.callSid); // First, always hide the UI for immediate feedback stopDurationTimer(); + stopRingtone(); isCallActive.value = false; - // Force update the app's state + // Force update the app's state to hide widget if (typeof window !== 'undefined' && window.app && window.app.$data) { window.app.$data.showCallWidget = false; } // Emit the event to parent components - emit('call-ended'); + emit('callEnded'); // Show success message to user useAlert({ message: 'Call ended', type: 'success' }); @@ -174,7 +247,7 @@ export default { !props.callSid.startsWith('debug-') ) { console.log('Ending real call with SID:', props.callSid); - await VoiceAPI.endCall(props.callSid); + await VoiceAPI.endCall(props.callSid, props.conversationId); } else { console.log('Using fake/temp call SID, skipping API call'); } @@ -184,8 +257,95 @@ export default { } // Clear from store as last step - const store = useStore(); store.dispatch('calls/clearActiveCall'); + store.dispatch('calls/clearIncomingCall'); + + // Set global call status in all possible places to ensure widget is removed + if (window.globalCallStatus) { + window.globalCallStatus.active = false; + window.globalCallStatus.incoming = false; + } + + // Add a timeout to ensure UI is properly reset if there are async issues + setTimeout(() => { + if (window.app && window.app.$data) { + window.app.$data.showCallWidget = false; + } + store.dispatch('calls/clearActiveCall'); + store.dispatch('calls/clearIncomingCall'); + }, 300); + }; + + // Accept incoming call + const acceptCall = async () => { + console.log('Accepting incoming call with SID:', incomingCall.value?.callSid); + + stopRingtone(); + + try { + // Call the API to join the call (conference) as an agent + if (incomingCall.value) { + const { callSid, conversationId } = incomingCall.value; + + // Show user feedback + useAlert({ message: safeTranslate('CONVERSATION.CALL_ACCEPTED'), type: 'info' }); + + // Make API call to join the conference + await VoiceAPI.joinCall(callSid, conversationId); + + // Move incoming call to active call + store.dispatch('calls/acceptIncomingCall'); + + // Start call duration timer + startDurationTimer(); + + // Emit event + emit('callJoined'); + } + } catch (error) { + console.error('Error joining call:', error); + useAlert({ message: safeTranslate('CONVERSATION.CALL_JOIN_ERROR'), type: 'error' }); + forceEndCall(); + } + }; + + // Reject incoming call + const rejectCall = async () => { + console.log('Rejecting incoming call with SID:', incomingCall.value?.callSid); + + stopRingtone(); + + try { + if (incomingCall.value) { + const { callSid, conversationId } = incomingCall.value; + + // Show user feedback + useAlert({ message: safeTranslate('CONVERSATION.CALL_REJECTED'), type: 'info' }); + + // Make API call to reject the call (optional, the caller will stay in the queue) + await VoiceAPI.rejectCall(callSid, conversationId); + + // Clear the incoming call from store + store.dispatch('calls/clearIncomingCall'); + + // Emit event + emit('callRejected'); + + // Update app state - checking for $data property + if (window.app && window.app.$data) { + window.app.$data.showCallWidget = false; + } + } + } catch (error) { + console.error('Error rejecting call:', error); + // Clear anyway for UX purposes + store.dispatch('calls/clearIncomingCall'); + + // Update app state + if (window.app) { + window.app.$data.showCallWidget = false; + } + } }; const toggleMute = () => { @@ -211,33 +371,34 @@ export default { }; // Explicit debug handler for end call click - const handleEndCallClick = () => { - console.log('END CALL BUTTON CLICKED in FloatingCallWidget'); - console.log( - 'Current call SID:', - props.callSid, - 'Conversation ID:', - props.conversationId - ); - + const handleEndCallClick = async () => { // Save the call data before UI updates - const savedCallSid = props.callSid; - const savedConversationId = props.conversationId; + const callData = isIncoming.value ? incomingCall.value : activeCall.value; + + if (!callData) { + console.log('No call data found'); + return; + } + + const savedCallSid = callData.callSid; + const savedConversationId = callData.conversationId; // Always update UI immediately for better user experience stopDurationTimer(); + stopRingtone(); isCallActive.value = false; - // Update app state - if (window.app) { + // Update app state - checking for $data property + if (window.app && window.app.$data) { window.app.$data.showCallWidget = false; } // Update store store.dispatch('calls/clearActiveCall'); + store.dispatch('calls/clearIncomingCall'); // Emit event - emit('call-ended'); + emit('callEnded'); // Make API call if we have a valid conversation ID and a real call SID (not pending) if (savedConversationId && savedCallSid && savedCallSid !== 'pending') { @@ -246,54 +407,37 @@ export default { savedCallSid.startsWith('CA') || savedCallSid.startsWith('TJ'); if (isValidTwilioSid) { - console.log( - 'handleEndCallClick: Making API call to end Twilio call with SID:', - savedCallSid, - 'for conversation:', - savedConversationId - ); - - // Make the API call after UI is updated - VoiceAPI.endCall(savedCallSid, savedConversationId) - .then(response => { - console.log( - 'handleEndCallClick: Call ended successfully via API:', - response - ); - useAlert({ message: 'Call ended', type: 'success' }); - }) - .catch(error => { - console.error( - 'handleEndCallClick: Error ending call via API:', - error - ); - useAlert({ - message: 'Call ended (but server may still show as active)', - type: 'warning', - }); + try { + await VoiceAPI.endCall(savedCallSid, savedConversationId); + useAlert({ message: 'Call ended', type: 'success' }); + } catch (error) { + console.error('Error ending call:', error); + useAlert({ + message: 'Call ended (but server may still show as active)', + type: 'warning', }); + } } else { - console.log( - 'handleEndCallClick: Invalid Twilio call SID format:', - savedCallSid - ); useAlert({ message: 'Call ended', type: 'success' }); } } else { - if (savedCallSid === 'pending') { - console.log( - 'handleEndCallClick: Call was still in pending state, no API call needed' - ); - } else if (!savedConversationId) { - console.log( - 'handleEndCallClick: No conversation ID available for ending call' - ); - } else { - console.log('handleEndCallClick: Missing required data for API call'); - } - useAlert({ message: 'Call ended', type: 'success' }); } + + // Set global call status in all possible places to ensure widget is removed + if (window.globalCallStatus) { + window.globalCallStatus.active = false; + window.globalCallStatus.incoming = false; + } + + // Add a timeout to ensure UI is properly reset if there are async issues + setTimeout(() => { + if (window.app && window.app.$data) { + window.app.$data.showCallWidget = false; + } + store.dispatch('calls/clearActiveCall'); + store.dispatch('calls/clearIncomingCall'); + }, 300); }; // Safe translation helper with fallback @@ -304,30 +448,97 @@ export default { return translations[key] || key; } }; + + // Function to fetch contact details if needed + const fetchContactDetails = async () => { + // If we already have a contact name, don't fetch + if (displayContactName.value !== 'Loading...' && displayContactName.value !== 'Unknown Caller') { + return; + } + + // If we have a contact ID, fetch the details + const contactId = props.contactId || callInfo.value?.contactId; + if (contactId) { + try { + console.log('Fetching contact details for ID:', contactId); + const response = await ContactAPI.show(contactId); + if (response.data && response.data.payload) { + const contact = response.data.payload; + displayContactName.value = contact.name || 'Unknown Caller'; + console.log('Contact details fetched:', contact.name); + } + } catch (error) { + console.error('Error fetching contact details:', error); + displayContactName.value = 'Unknown Caller'; + } + } else { + displayContactName.value = 'Unknown Caller'; + } + }; onMounted(() => { - console.log('FloatingCallWidget mounted with callSid:', props.callSid); - // Always start the timer, regardless of callSid - startDurationTimer(); + // If this is an active call, start timer + if (hasActiveCall.value) { + startDurationTimer(); + } + + // If this is an incoming call, play ringtone + if (isIncoming.value) { + // Slight delay to ensure DOM is fully rendered + setTimeout(() => { + playRingtone(); + }, 300); + } + + // Fetch contact details if needed (after slight delay to ensure callInfo is populated) + setTimeout(() => { + fetchContactDetails(); + }, 500); }); onBeforeUnmount(() => { stopDurationTimer(); + stopRingtone(); }); - // Watch for call SID changes + // Watch for call store changes watch( - () => props.callSid, - newCallSid => { - isCallActive.value = !!newCallSid; - - if (newCallSid) { - startDurationTimer(); - } else { + () => isIncoming.value, + newIsIncoming => { + if (newIsIncoming) { + // Immediate UI feedback with delay for audio to allow browser autoplay policies stopDurationTimer(); + setTimeout(() => { + playRingtone(); + }, 300); + } else { + stopRingtone(); + } + }, + { immediate: true } // Check immediately on component creation + ); + + watch( + () => isJoined.value, + newIsJoined => { + if (newIsJoined) { + stopRingtone(); + startDurationTimer(); } } ); + + // Watch for call info changes to fetch contact details if needed + watch( + () => callInfo.value, + (newCallInfo) => { + if (newCallInfo && newCallInfo.contactId) { + // Try to fetch contact details when call info changes + fetchContactDetails(); + } + }, + { immediate: true } + ); return { isCallActive, @@ -336,8 +547,16 @@ export default { isMuted, showCallOptions, isFullscreen, + isIncoming, + isJoined, + activeCall, + incomingCall, + callInfo, + displayContactName, endCall, forceEndCall, + acceptCall, + rejectCall, handleEndCallClick, toggleMute, toggleCallOptions, @@ -349,49 +568,76 @@ export default { @@ -400,122 +646,190 @@ export default { position: fixed; bottom: 20px; right: 20px; - background-color: #1f2937; - border-radius: 8px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); - padding: 12px 16px; + background-color: rgba(31, 41, 55, 0.95); /* var(--b-700, #1f2937) with opacity */ + backdrop-filter: blur(4px); + border-radius: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); + padding: 16px; z-index: 10000; display: flex; flex-direction: column; - min-width: 220px; + width: 320px; color: white; + transition: all 0.3s ease; + border: 1px solid var(--b-600, #374151); - .call-info { + &.is-minimized { + min-width: auto; + padding: 12px; + } + + &.is-fullscreen { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + border-radius: 0; + } + + &.is-incoming { + animation: pulse 1.5s infinite; + border-color: var(--b-600, #374151); + background-color: rgba(31, 41, 55, 0.95); /* Same background, no red */ + } +} + +.call-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; + padding: 0 0 8px 0; +} + +.call-icon-wrapper { + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + border-radius: 50%; + background-color: var(--b-500, #4b5563); + color: white; +} + +.call-title { + margin: 0; + font-size: 16px; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 180px; + line-height: 1.2; +} + +.call-subtitle { + font-size: 12px; + color: var(--s-200, #9ca3af); + margin-top: 2px; +} + +.call-duration { + font-size: 14px; + font-weight: 500; + color: var(--s-100, #f3f4f6); + background-color: var(--b-600, #374151); + padding: 4px 8px; + border-radius: 12px; +} + +.call-actions { + display: flex; + gap: 12px; + justify-content: center; + + .control-button { display: flex; - justify-content: space-between; align-items: center; - margin-bottom: 10px; + justify-content: center; + width: 44px; + height: 44px; + border-radius: 50%; + border: none; + cursor: pointer; + background: var(--b-600, #374151); + color: white; + font-size: 18px; + transition: all 0.2s ease; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); - .inbox-name { - font-weight: 500; + &:hover { + background: var(--b-500, #4b5563); + transform: translateY(-2px); } - .call-duration { - font-variant-numeric: tabular-nums; + &:active { + transform: translateY(0); } - } - .call-controls { - display: flex; - justify-content: space-around; - gap: 8px; + &.active { + background: var(--w-500, #2563eb); + } - .control-button { + &.end-call-button { + background: var(--r-500, #dc2626); + + &:hover { + background: var(--r-600, #b91c1c); + } + } + + &.accept-call-button, + &.reject-call-button { display: flex; align-items: center; justify-content: center; - width: 40px; - height: 40px; - border-radius: 50%; + gap: 8px; + flex: 1; + height: 44px; + border-radius: 22px; border: none; cursor: pointer; - background: #374151; + font-weight: 600; + font-size: 14px; + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2); + } + + &.accept-call-button { + background: var(--g-500, #10b981); color: white; - font-size: 18px; &:hover { - background: #4b5563; + background: var(--g-600, #059669); + transform: translateY(-2px); } - - &.active { - background: #2563eb; - } - - &.end-call-button { - background: #dc2626; - - &:hover { - background: #b91c1c; - } - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - - &:hover { - background: #374151; - } + + &:active { + transform: translateY(0); } } - .status-indicator { - display: flex; - align-items: center; - justify-content: center; - min-width: 40px; - height: 40px; - font-size: 12px; - font-weight: 500; - background: #2563eb; - border-radius: 16px; - padding: 0 12px; + &.reject-call-button { + background: var(--r-500, #dc2626); color: white; - animation: pulse 1.5s infinite; - } - - @keyframes pulse { - 0% { - opacity: 0.6; - } - 50% { - opacity: 1; - } - 100% { - opacity: 0.6; - } - } - } - - .call-options { - margin-top: 8px; - padding-top: 8px; - border-top: 1px solid rgba(255, 255, 255, 0.1); - - button { - display: block; - width: 100%; - text-align: left; - padding: 6px 0; - background: transparent; - border: none; - color: white; - cursor: pointer; &:hover { - color: #e5e7eb; + background: var(--r-600, #b91c1c); + transform: translateY(-2px); } + + &:active { + transform: translateY(0); + } + } + + .button-text { + margin-left: 8px; } } } + +@keyframes pulse { + 0% { + box-shadow: 0 0 0 0 rgba(220, 38, 38, 0.4); + transform: scale(1); + } + 50% { + box-shadow: 0 0 0 10px rgba(220, 38, 38, 0); + transform: scale(1.01); + } + 100% { + box-shadow: 0 0 0 0 rgba(220, 38, 38, 0); + transform: scale(1); + } +} diff --git a/app/javascript/dashboard/helper/AudioAlerts/DashboardAudioNotificationHelper.js b/app/javascript/dashboard/helper/AudioAlerts/DashboardAudioNotificationHelper.js index 9e79bb3a2..79ee8691c 100644 --- a/app/javascript/dashboard/helper/AudioAlerts/DashboardAudioNotificationHelper.js +++ b/app/javascript/dashboard/helper/AudioAlerts/DashboardAudioNotificationHelper.js @@ -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); diff --git a/app/javascript/dashboard/helper/actionCable.js b/app/javascript/dashboard/helper/actionCable.js index adb33eb6d..9c5cc20dc 100644 --- a/app/javascript/dashboard/helper/actionCable.js +++ b/app/javascript/dashboard/helper/actionCable.js @@ -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 { diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index d24444784..dfc539839 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -236,6 +236,20 @@ "SIDEBAR": { "CONTACT": "Contact", "COPILOT": "Copilot" + }, + "INCOMING_CALL": "Incoming call", + "JOIN_CALL": "Join call", + "REJECT_CALL": "Reject call", + "END_CALL": "End call", + "MINIMIZE_CALL": "Minimize call", + "EXPAND_CALL": "Expand call", + "CALL_STATUS": { + "CONNECTING": "Connecting...", + "RINGING": "Ringing...", + "CONNECTED": "Connected", + "ENDED": "Call ended", + "FAILED": "Call failed", + "REJECTED": "Call rejected" } }, "EMAIL_TRANSCRIPT": { @@ -382,7 +396,6 @@ "VOICE_CALL": "Call", "CALL_ERROR": "Failed to initiate call. Please try again.", "CALL_INITIATED": "Call initiated successfully.", - "END_CALL": "End call", "AUDIO_NOT_SUPPORTED": "Your browser does not support audio playback", "TRANSCRIPTION": "Call transcription", "COPILOT": { diff --git a/app/javascript/dashboard/store/modules/calls.js b/app/javascript/dashboard/store/modules/calls.js index f53a0e004..4ca449f7f 100644 --- a/app/javascript/dashboard/store/modules/calls.js +++ b/app/javascript/dashboard/store/modules/calls.js @@ -1,30 +1,77 @@ const state = { activeCall: null, + incomingCall: null, }; const getters = { getActiveCall: $state => $state.activeCall, hasActiveCall: $state => !!$state.activeCall, + getIncomingCall: $state => $state.incomingCall, + hasIncomingCall: $state => !!$state.incomingCall, }; const actions = { setActiveCall({ commit }, callData) { - console.log('Setting active call in store:', callData); + if (!callData || !callData.callSid) { + throw new Error('Invalid call data provided'); + } + commit('SET_ACTIVE_CALL', callData); - // If we're in a browser environment, try to set the app state + // Update app state if in browser environment + if (typeof window !== 'undefined' && window.app?.$data) { + window.app.$data.showCallWidget = true; + } + }, + + clearActiveCall({ commit }) { + commit('CLEAR_ACTIVE_CALL'); + + // Update app state if in browser environment + if (typeof window !== 'undefined' && window.app?.$data) { + window.app.$data.showCallWidget = false; + } + }, + + setIncomingCall({ commit, state }, callData) { + if (!callData || !callData.callSid) { + throw new Error('Invalid call data provided'); + } + + // Don't set as incoming if call is already active + if (state.activeCall?.callSid === callData.callSid) { + return; + } + + // Don't set as incoming if call is already incoming + if (state.incomingCall?.callSid === callData.callSid) { + return; + } + + commit('SET_INCOMING_CALL', callData); + + // Update app state if in browser environment if (typeof window !== 'undefined' && window.app && window.app.$data) { window.app.$data.showCallWidget = true; } }, - clearActiveCall({ commit }) { - console.log('Clearing active call in store'); - commit('CLEAR_ACTIVE_CALL'); - // If we're in a browser environment, try to clear the app state - if (typeof window !== 'undefined' && window.app && window.app.$data) { - window.app.$data.showCallWidget = false; + clearIncomingCall({ commit }) { + commit('CLEAR_INCOMING_CALL'); + }, + + acceptIncomingCall({ commit, state }) { + const incomingCall = state.incomingCall; + if (!incomingCall) { + throw new Error('No incoming call to accept'); } + + // Move incoming call to active call + commit('SET_ACTIVE_CALL', { + ...incomingCall, + isJoined: true, + }); + commit('CLEAR_INCOMING_CALL'); }, }; @@ -35,6 +82,12 @@ const mutations = { CLEAR_ACTIVE_CALL($state) { $state.activeCall = null; }, + SET_INCOMING_CALL($state, callData) { + $state.incomingCall = callData; + }, + CLEAR_INCOMING_CALL($state) { + $state.incomingCall = null; + }, }; export default { diff --git a/config/routes.rb b/config/routes.rb index c22d2e7ea..55db8e099 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -184,6 +184,8 @@ Rails.application.routes.draw do # Voice call management post 'voice/end_call', to: 'voice#end_call' + post 'voice/join_call', to: 'voice#join_call' + post 'voice/reject_call', to: 'voice#reject_call' get 'voice/call_status', to: 'voice#call_status' resources :inbox_members, only: [:create, :show], param: :inbox_id do collection do diff --git a/public/audio/dashboard/call-ring.mp3 b/public/audio/dashboard/call-ring.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..77087072fc966da3516b54a6f01879934e758711 GIT binary patch literal 85518 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 Gjesd3AG|!WYJ^1fTT5ZVpMj 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