diff --git a/app/controllers/webhooks/whatsapp_controller.rb b/app/controllers/webhooks/whatsapp_controller.rb index 8f408d2b0..c4c376e5c 100644 --- a/app/controllers/webhooks/whatsapp_controller.rb +++ b/app/controllers/webhooks/whatsapp_controller.rb @@ -2,6 +2,12 @@ class Webhooks::WhatsappController < ActionController::API include MetaTokenVerifyConcern def process_payload + if inactive_whatsapp_number? + Rails.logger.warn("Rejected webhook for inactive WhatsApp number: #{params[:phone_number]}") + render json: { error: 'Inactive WhatsApp number' }, status: :unprocessable_entity + return + end + Webhooks::WhatsappEventsJob.perform_later(params.to_unsafe_hash) head :ok end @@ -13,4 +19,15 @@ class Webhooks::WhatsappController < ActionController::API whatsapp_webhook_verify_token = channel.provider_config['webhook_verify_token'] if channel.present? token == whatsapp_webhook_verify_token if whatsapp_webhook_verify_token.present? end + + def inactive_whatsapp_number? + phone_number = params[:phone_number] + return false if phone_number.blank? + + inactive_numbers = GlobalConfig.get_value('INACTIVE_WHATSAPP_NUMBERS').to_s + return false if inactive_numbers.blank? + + inactive_numbers_array = inactive_numbers.split(',').map(&:strip) + inactive_numbers_array.include?(phone_number) + end end diff --git a/app/javascript/dashboard/api/liveReports.js b/app/javascript/dashboard/api/liveReports.js new file mode 100644 index 000000000..1435da258 --- /dev/null +++ b/app/javascript/dashboard/api/liveReports.js @@ -0,0 +1,20 @@ +/* global axios */ +import ApiClient from './ApiClient'; + +class LiveReportsAPI extends ApiClient { + constructor() { + super('live_reports', { accountScoped: true, apiVersion: 'v2' }); + } + + getConversationMetric(params = {}) { + return axios.get(`${this.url}/conversation_metrics`, { params }); + } + + getGroupedConversations({ groupBy } = { groupBy: 'assignee_id' }) { + return axios.get(`${this.url}/grouped_conversation_metrics`, { + params: { group_by: groupBy }, + }); + } +} + +export default new LiveReportsAPI(); diff --git a/app/javascript/dashboard/assets/scss/widgets/_base.scss b/app/javascript/dashboard/assets/scss/widgets/_base.scss index 9367e8b2d..a8da23f3b 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_base.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_base.scss @@ -82,7 +82,7 @@ input[type='url']:not(.reset-base) { } input[type='file'] { - @apply bg-white dark:bg-n-solid-1 leading-[1.15] mb-4; + @apply bg-n-background leading-[1.15] mb-4; } // Select diff --git a/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue b/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue index 95b368dae..4e3b96259 100644 --- a/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue +++ b/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue @@ -29,6 +29,10 @@ const props = defineProps({ type: Boolean, default: false, }, + labelClass: { + type: String, + default: '', + }, }); const emit = defineEmits(['action']); @@ -97,9 +101,13 @@ onMounted(() => { {{ item.emoji }} - {{ - item.label - }} + + {{ item.label }} +
{