mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-30 18:47:51 +00:00 
			
		
		
		
	 a1f61f0e21
			
		
	
	a1f61f0e21
	
	
	
		
			
			# Pull Request Template ## Description This PR fixes the issue where a clock with animation is shown inside the message bubble for failed and deleted messages. The message status is now hidden for such messages. ## Type of change Please delete options that are not relevant. - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? ### Before **Failed message bubble** <img width="223" alt="image" src="https://github.com/user-attachments/assets/bb4d7a34-4a1c-495a-9a3d-21d065bba020" /> **Deleted message bubble** <img width="223" alt="image" src="https://github.com/user-attachments/assets/ece8e2ff-c6d7-4fa7-b11c-04748bf9ea2d" /> ### After **Failed message bubble** <img width="223" alt="image" src="https://github.com/user-attachments/assets/6a6d81eb-52d9-48c3-bbc1-810b19770d61" /> **Deleted message bubble** <img width="223" alt="image" src="https://github.com/user-attachments/assets/828b553a-c88a-4a9e-9773-d75d76a9d0fd" /> ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <script setup>
 | |
| import { computed } from 'vue';
 | |
| import { messageTimestamp } from 'shared/helpers/timeHelper';
 | |
| 
 | |
| import MessageStatus from './MessageStatus.vue';
 | |
| import Icon from 'next/icon/Icon.vue';
 | |
| import { useInbox } from 'dashboard/composables/useInbox';
 | |
| import { useMessageContext } from './provider.js';
 | |
| 
 | |
| import { MESSAGE_STATUS, MESSAGE_TYPES } from './constants';
 | |
| 
 | |
| const {
 | |
|   isAFacebookInbox,
 | |
|   isALineChannel,
 | |
|   isAPIInbox,
 | |
|   isASmsInbox,
 | |
|   isATelegramChannel,
 | |
|   isATwilioChannel,
 | |
|   isAWebWidgetInbox,
 | |
|   isAWhatsAppChannel,
 | |
|   isAnEmailChannel,
 | |
|   isAInstagramChannel,
 | |
| } = useInbox();
 | |
| 
 | |
| const {
 | |
|   status,
 | |
|   isPrivate,
 | |
|   createdAt,
 | |
|   sourceId,
 | |
|   messageType,
 | |
|   contentAttributes,
 | |
| } = useMessageContext();
 | |
| 
 | |
| const readableTime = computed(() =>
 | |
|   messageTimestamp(createdAt.value, 'LLL d, h:mm a')
 | |
| );
 | |
| 
 | |
| const showStatusIndicator = computed(() => {
 | |
|   if (isPrivate.value) return false;
 | |
|   // Don't show status for failed messages, we already show error message
 | |
|   if (status.value === MESSAGE_STATUS.FAILED) return false;
 | |
|   // Don't show status for deleted messages
 | |
|   if (contentAttributes.value?.deleted) return false;
 | |
| 
 | |
|   if (messageType.value === MESSAGE_TYPES.OUTGOING) return true;
 | |
|   if (messageType.value === MESSAGE_TYPES.TEMPLATE) return true;
 | |
| 
 | |
|   return false;
 | |
| });
 | |
| 
 | |
| const isSent = computed(() => {
 | |
|   if (!showStatusIndicator.value) return false;
 | |
| 
 | |
|   // Messages will be marked as sent for the Email channel if they have a source ID.
 | |
|   if (isAnEmailChannel.value) return !!sourceId.value;
 | |
| 
 | |
|   if (
 | |
|     isAWhatsAppChannel.value ||
 | |
|     isATwilioChannel.value ||
 | |
|     isAFacebookInbox.value ||
 | |
|     isASmsInbox.value ||
 | |
|     isATelegramChannel.value ||
 | |
|     isAInstagramChannel.value
 | |
|   ) {
 | |
|     return sourceId.value && status.value === MESSAGE_STATUS.SENT;
 | |
|   }
 | |
| 
 | |
|   // All messages will be mark as sent for the Line channel, as there is no source ID.
 | |
|   if (isALineChannel.value) return true;
 | |
| 
 | |
|   return false;
 | |
| });
 | |
| 
 | |
| const isDelivered = computed(() => {
 | |
|   if (!showStatusIndicator.value) return false;
 | |
| 
 | |
|   if (
 | |
|     isAWhatsAppChannel.value ||
 | |
|     isATwilioChannel.value ||
 | |
|     isASmsInbox.value ||
 | |
|     isAFacebookInbox.value
 | |
|   ) {
 | |
|     return sourceId.value && status.value === MESSAGE_STATUS.DELIVERED;
 | |
|   }
 | |
|   // All messages marked as delivered for the web widget inbox and API inbox once they are sent.
 | |
|   if (isAWebWidgetInbox.value || isAPIInbox.value) {
 | |
|     return status.value === MESSAGE_STATUS.SENT;
 | |
|   }
 | |
|   if (isALineChannel.value) {
 | |
|     return status.value === MESSAGE_STATUS.DELIVERED;
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| });
 | |
| 
 | |
| const isRead = computed(() => {
 | |
|   if (!showStatusIndicator.value) return false;
 | |
| 
 | |
|   if (
 | |
|     isAWhatsAppChannel.value ||
 | |
|     isATwilioChannel.value ||
 | |
|     isAFacebookInbox.value ||
 | |
|     isAInstagramChannel.value
 | |
|   ) {
 | |
|     return sourceId.value && status.value === MESSAGE_STATUS.READ;
 | |
|   }
 | |
| 
 | |
|   if (isAWebWidgetInbox.value || isAPIInbox.value) {
 | |
|     return status.value === MESSAGE_STATUS.READ;
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| });
 | |
| 
 | |
| const statusToShow = computed(() => {
 | |
|   if (isRead.value) return MESSAGE_STATUS.READ;
 | |
|   if (isDelivered.value) return MESSAGE_STATUS.DELIVERED;
 | |
|   if (isSent.value) return MESSAGE_STATUS.SENT;
 | |
| 
 | |
|   return MESSAGE_STATUS.PROGRESS;
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <template>
 | |
|   <div class="text-xs flex items-center gap-1.5">
 | |
|     <div class="inline">
 | |
|       <time class="inline">{{ readableTime }}</time>
 | |
|     </div>
 | |
|     <Icon v-if="isPrivate" icon="i-lucide-lock-keyhole" class="size-3" />
 | |
|     <MessageStatus v-if="showStatusIndicator" :status="statusToShow" />
 | |
|   </div>
 | |
| </template>
 | |
| `
 |