From f4b9092ac25a962d04643e81b9b07ec2ce2bc54f Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Wed, 30 Apr 2025 13:25:37 +0530 Subject: [PATCH] chore: add whatsapp typing indicators --- app/models/channel/whatsapp.rb | 1 + .../conversations/typing_status_manager.rb | 13 +++++++++++++ app/services/whatsapp/providers/base_service.rb | 4 ++++ .../providers/whatsapp_cloud_service.rb | 17 +++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/app/models/channel/whatsapp.rb b/app/models/channel/whatsapp.rb index 1848e17a9..82496e0a0 100644 --- a/app/models/channel/whatsapp.rb +++ b/app/models/channel/whatsapp.rb @@ -54,6 +54,7 @@ class Channel::Whatsapp < ApplicationRecord delegate :send_message, to: :provider_service delegate :send_template, to: :provider_service + delegate :send_typing_indicator, to: :provider_service delegate :sync_templates, to: :provider_service delegate :media_url, to: :provider_service delegate :api_headers, to: :provider_service diff --git a/app/services/conversations/typing_status_manager.rb b/app/services/conversations/typing_status_manager.rb index e3e9cebc6..c397b8bc2 100644 --- a/app/services/conversations/typing_status_manager.rb +++ b/app/services/conversations/typing_status_manager.rb @@ -18,9 +18,22 @@ class Conversations::TypingStatusManager case params[:typing_status] when 'on' trigger_typing_event(CONVERSATION_TYPING_ON, params[:is_private]) + send_whatsapp_typing_indicator if conversation.inbox.whatsapp? && conversation.inbox.channel.provider == 'whatsapp_cloud' when 'off' trigger_typing_event(CONVERSATION_TYPING_OFF, params[:is_private]) end # Return the head :ok response from the controller end + + private + + def send_whatsapp_typing_indicator + last_incoming_message = @conversation.messages&.incoming&.last + return if last_incoming_message.blank? + + conversation.inbox.channel.send_typing_indicator( + last_incoming_message.conversation.contact_inbox.source_id, + last_incoming_message.source_id + ) + end end diff --git a/app/services/whatsapp/providers/base_service.rb b/app/services/whatsapp/providers/base_service.rb index 55714ba4d..a6fcaf5e9 100644 --- a/app/services/whatsapp/providers/base_service.rb +++ b/app/services/whatsapp/providers/base_service.rb @@ -23,6 +23,10 @@ class Whatsapp::Providers::BaseService raise 'Overwrite this method in child class' end + def send_typing_indicator(_phone_number, _message_id) + raise 'Overwrite this method in child class' + end + def validate_provider_config raise 'Overwrite this method in child class' end diff --git a/app/services/whatsapp/providers/whatsapp_cloud_service.rb b/app/services/whatsapp/providers/whatsapp_cloud_service.rb index ec2275920..76ee10032 100644 --- a/app/services/whatsapp/providers/whatsapp_cloud_service.rb +++ b/app/services/whatsapp/providers/whatsapp_cloud_service.rb @@ -157,4 +157,21 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi process_response(response) end + + def send_typing_indicator(_phone_number, message_id) + response = HTTParty.post( + "#{phone_id_path}/messages", + headers: api_headers, + body: { + messaging_product: 'whatsapp', + status: 'read', + message_id: message_id, + typing_indicator: { + type: 'text' + } + }.to_json + ) + + process_response(response) + end end