From 504a32214e1e97d75be4b59e422f0317d7e0a42e Mon Sep 17 00:00:00 2001 From: Tanmay Deep Sharma Date: Tue, 24 Mar 2026 13:13:49 +0530 Subject: [PATCH] feat(whatsapp-call): add call recording, transcription, beforeunload termination and documentation --- app/javascript/dashboard/api/whatsappCalls.js | 12 + .../message/bubbles/VoiceCall.vue | 145 +- .../conversation/ConversationHeader.vue | 5 + .../composables/useWhatsappCallSession.js | 417 ++++-- app/javascript/dashboard/helper/voice.js | 20 +- .../i18n/locale/en/conversation.json | 8 +- config/routes.rb | 3 +- ...100000_add_message_id_to_whatsapp_calls.rb | 5 + ...110000_add_transcript_to_whatsapp_calls.rb | 5 + db/schema.rb | 6 +- docs/whatsapp-calling.md | 1176 +++++++++++++++++ .../enterprise/messages/message_builder.rb | 4 +- .../v1/accounts/whatsapp_calls_controller.rb | 47 +- .../jobs/whatsapp/call_transcription_job.rb | 15 + enterprise/app/models/whatsapp_call.rb | 9 + .../services/whatsapp/call_message_builder.rb | 108 ++ .../app/services/whatsapp/call_service.rb | 12 + .../whatsapp/call_transcription_service.rb | 82 ++ .../whatsapp/incoming_call_service.rb | 57 +- 19 files changed, 1943 insertions(+), 193 deletions(-) create mode 100644 db/migrate/20260323100000_add_message_id_to_whatsapp_calls.rb create mode 100644 db/migrate/20260323110000_add_transcript_to_whatsapp_calls.rb create mode 100644 docs/whatsapp-calling.md create mode 100644 enterprise/app/jobs/whatsapp/call_transcription_job.rb create mode 100644 enterprise/app/services/whatsapp/call_message_builder.rb create mode 100644 enterprise/app/services/whatsapp/call_transcription_service.rb diff --git a/app/javascript/dashboard/api/whatsappCalls.js b/app/javascript/dashboard/api/whatsappCalls.js index 450390897..3b35588b1 100644 --- a/app/javascript/dashboard/api/whatsappCalls.js +++ b/app/javascript/dashboard/api/whatsappCalls.js @@ -6,6 +6,10 @@ class WhatsappCallsAPI extends ApiClient { super('whatsapp_calls', { accountScoped: true }); } + show(callId) { + return axios.get(`${this.url}/${callId}`); + } + accept(callId, sdpAnswer) { return axios.post(`${this.url}/${callId}/accept`, { sdp_answer: sdpAnswer, @@ -26,6 +30,14 @@ class WhatsappCallsAPI extends ApiClient { sdp_offer: sdpOffer, }); } + + uploadRecording(callId, blob) { + const formData = new FormData(); + formData.append('recording', blob, `call-${callId}.webm`); + return axios.post(`${this.url}/${callId}/upload_recording`, formData, { + headers: { 'Content-Type': 'multipart/form-data' }, + }); + } } export default new WhatsappCallsAPI(); diff --git a/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue b/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue index 5a7d39a4e..c192e6ddc 100644 --- a/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue +++ b/app/javascript/dashboard/components-next/message/bubbles/VoiceCall.vue @@ -1,7 +1,9 @@