mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-04 04:57:51 +00:00 
			
		
		
		
	**Before:** <img width="907" alt="Screenshot 2025-05-29 at 3 21 00 PM" src="https://github.com/user-attachments/assets/7738f684-7e9f-40ff-ac49-d9b389eca99b" /> **After:** <img width="903" alt="Screenshot 2025-05-29 at 3 20 33 PM" src="https://github.com/user-attachments/assets/1213d832-59d8-4d04-be96-f711297a887d" />
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<script setup>
 | 
						|
import { computed, onUnmounted } from 'vue';
 | 
						|
import { useToggle } from '@vueuse/core';
 | 
						|
import { useStore } from 'vuex';
 | 
						|
import { useAlert } from 'dashboard/composables';
 | 
						|
import { useI18n } from 'vue-i18n';
 | 
						|
import { emitter } from 'shared/helpers/mitt';
 | 
						|
import EmailTranscriptModal from './EmailTranscriptModal.vue';
 | 
						|
import ResolveAction from '../../buttons/ResolveAction.vue';
 | 
						|
import ButtonV4 from 'dashboard/components-next/button/Button.vue';
 | 
						|
import DropdownMenu from 'dashboard/components-next/dropdown-menu/DropdownMenu.vue';
 | 
						|
 | 
						|
import {
 | 
						|
  CMD_MUTE_CONVERSATION,
 | 
						|
  CMD_SEND_TRANSCRIPT,
 | 
						|
  CMD_UNMUTE_CONVERSATION,
 | 
						|
} from 'dashboard/helper/commandbar/events';
 | 
						|
 | 
						|
// No props needed as we're getting currentChat from the store directly
 | 
						|
const store = useStore();
 | 
						|
const { t } = useI18n();
 | 
						|
 | 
						|
const [showEmailActionsModal, toggleEmailModal] = useToggle(false);
 | 
						|
const [showActionsDropdown, toggleDropdown] = useToggle(false);
 | 
						|
 | 
						|
const currentChat = computed(() => store.getters.getSelectedChat);
 | 
						|
 | 
						|
const actionMenuItems = computed(() => {
 | 
						|
  const items = [];
 | 
						|
 | 
						|
  if (!currentChat.value.muted) {
 | 
						|
    items.push({
 | 
						|
      icon: 'i-lucide-volume-off',
 | 
						|
      label: t('CONTACT_PANEL.MUTE_CONTACT'),
 | 
						|
      action: 'mute',
 | 
						|
      value: 'mute',
 | 
						|
    });
 | 
						|
  } else {
 | 
						|
    items.push({
 | 
						|
      icon: 'i-lucide-volume-1',
 | 
						|
      label: t('CONTACT_PANEL.UNMUTE_CONTACT'),
 | 
						|
      action: 'unmute',
 | 
						|
      value: 'unmute',
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  items.push({
 | 
						|
    icon: 'i-lucide-share',
 | 
						|
    label: t('CONTACT_PANEL.SEND_TRANSCRIPT'),
 | 
						|
    action: 'send_transcript',
 | 
						|
    value: 'send_transcript',
 | 
						|
  });
 | 
						|
 | 
						|
  return items;
 | 
						|
});
 | 
						|
 | 
						|
const handleActionClick = ({ action }) => {
 | 
						|
  toggleDropdown(false);
 | 
						|
 | 
						|
  if (action === 'mute') {
 | 
						|
    store.dispatch('muteConversation', currentChat.value.id);
 | 
						|
    useAlert(t('CONTACT_PANEL.MUTED_SUCCESS'));
 | 
						|
  } else if (action === 'unmute') {
 | 
						|
    store.dispatch('unmuteConversation', currentChat.value.id);
 | 
						|
    useAlert(t('CONTACT_PANEL.UNMUTED_SUCCESS'));
 | 
						|
  } else if (action === 'send_transcript') {
 | 
						|
    toggleEmailModal();
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
// These functions are needed for the event listeners
 | 
						|
const mute = () => {
 | 
						|
  store.dispatch('muteConversation', currentChat.value.id);
 | 
						|
  useAlert(t('CONTACT_PANEL.MUTED_SUCCESS'));
 | 
						|
};
 | 
						|
 | 
						|
const unmute = () => {
 | 
						|
  store.dispatch('unmuteConversation', currentChat.value.id);
 | 
						|
  useAlert(t('CONTACT_PANEL.UNMUTED_SUCCESS'));
 | 
						|
};
 | 
						|
 | 
						|
emitter.on(CMD_MUTE_CONVERSATION, mute);
 | 
						|
emitter.on(CMD_UNMUTE_CONVERSATION, unmute);
 | 
						|
emitter.on(CMD_SEND_TRANSCRIPT, toggleEmailModal);
 | 
						|
 | 
						|
onUnmounted(() => {
 | 
						|
  emitter.off(CMD_MUTE_CONVERSATION, mute);
 | 
						|
  emitter.off(CMD_UNMUTE_CONVERSATION, unmute);
 | 
						|
  emitter.off(CMD_SEND_TRANSCRIPT, toggleEmailModal);
 | 
						|
});
 | 
						|
</script>
 | 
						|
 | 
						|
<template>
 | 
						|
  <div class="relative flex items-center gap-2 actions--container">
 | 
						|
    <ResolveAction
 | 
						|
      :conversation-id="currentChat.id"
 | 
						|
      :status="currentChat.status"
 | 
						|
    />
 | 
						|
    <div
 | 
						|
      v-on-clickaway="() => toggleDropdown(false)"
 | 
						|
      class="relative flex items-center group"
 | 
						|
    >
 | 
						|
      <ButtonV4
 | 
						|
        v-tooltip="$t('CONVERSATION.HEADER.MORE_ACTIONS')"
 | 
						|
        size="sm"
 | 
						|
        variant="ghost"
 | 
						|
        color="slate"
 | 
						|
        icon="i-lucide-more-vertical"
 | 
						|
        class="rounded-md group-hover:bg-n-alpha-2"
 | 
						|
        @click="toggleDropdown()"
 | 
						|
      />
 | 
						|
      <DropdownMenu
 | 
						|
        v-if="showActionsDropdown"
 | 
						|
        :menu-items="actionMenuItems"
 | 
						|
        class="mt-1 ltr:right-0 rtl:left-0 top-full"
 | 
						|
        @action="handleActionClick"
 | 
						|
      />
 | 
						|
    </div>
 | 
						|
    <EmailTranscriptModal
 | 
						|
      v-if="showEmailActionsModal"
 | 
						|
      :show="showEmailActionsModal"
 | 
						|
      :current-chat="currentChat"
 | 
						|
      @cancel="toggleEmailModal"
 | 
						|
    />
 | 
						|
  </div>
 | 
						|
</template>
 |