-
- {{ senderName }}
-
- <{{ fromEmail[0] }}>
+
+
+
+ {{ senderName }}
+
+ <{{ fromEmail[0] }}>
+
+
+ {{ fromEmail[0] }}
+
{{ $t('EMAIL_HEADER.TO') }}: {{ toEmail.join(', ') }}
diff --git a/app/javascript/dashboard/components-next/message/chips/Audio.vue b/app/javascript/dashboard/components-next/message/chips/Audio.vue
index 4f72d137e..680584048 100644
--- a/app/javascript/dashboard/components-next/message/chips/Audio.vue
+++ b/app/javascript/dashboard/components-next/message/chips/Audio.vue
@@ -44,9 +44,10 @@ onMounted(() => {
});
const formatTime = time => {
+ if (!time || Number.isNaN(time)) return '00:00';
const minutes = Math.floor(time / 60);
const seconds = Math.floor(time % 60);
- return `${minutes}:${seconds.toString().padStart(2, '0')}`;
+ return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
};
const toggleMute = () => {
@@ -55,7 +56,7 @@ const toggleMute = () => {
};
const onTimeUpdate = () => {
- currentTime.value = audioPlayer.value.currentTime;
+ currentTime.value = audioPlayer.value?.currentTime;
};
const seek = event => {
diff --git a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue
index 862857cb4..d00e162c9 100644
--- a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue
@@ -243,6 +243,15 @@ export default {
unreadMessageCount() {
return this.currentChat.unread_count || 0;
},
+ unreadMessageLabel() {
+ const count =
+ this.unreadMessageCount > 9 ? '9+' : this.unreadMessageCount;
+ const label =
+ this.unreadMessageCount > 1
+ ? 'CONVERSATION.UNREAD_MESSAGES'
+ : 'CONVERSATION.UNREAD_MESSAGE';
+ return `${count} ${this.$t(label)}`;
+ },
isInstagramDM() {
return this.conversationType === 'instagram_direct_message';
},
@@ -492,12 +501,11 @@ export default {
@@ -507,15 +515,10 @@ export default {
-
+
- {{ unreadMessageCount > 9 ? '9+' : unreadMessageCount }}
- {{
- unreadMessageCount > 1
- ? $t('CONVERSATION.UNREAD_MESSAGES')
- : $t('CONVERSATION.UNREAD_MESSAGE')
- }}
+ {{ unreadMessageLabel }}
diff --git a/app/javascript/dashboard/i18n/locale/en/chatlist.json b/app/javascript/dashboard/i18n/locale/en/chatlist.json
index dd5e1416c..ec416f6cb 100644
--- a/app/javascript/dashboard/i18n/locale/en/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/en/chatlist.json
@@ -99,6 +99,9 @@
},
"fallback": {
"CONTENT": "has shared a url"
+ },
+ "contact": {
+ "CONTENT": "Shared contact"
}
},
"CHAT_SORT_BY_FILTER": {
diff --git a/app/javascript/dashboard/i18n/locale/en/search.json b/app/javascript/dashboard/i18n/locale/en/search.json
index 7a0fc4f82..3cb566813 100644
--- a/app/javascript/dashboard/i18n/locale/en/search.json
+++ b/app/javascript/dashboard/i18n/locale/en/search.json
@@ -24,6 +24,7 @@
"READ_MORE": "Read more",
"WROTE": "wrote:",
"FROM": "from",
- "EMAIL": "email"
+ "EMAIL": "email",
+ "EMAIL_SUBJECT": "subject"
}
}
diff --git a/app/javascript/dashboard/modules/search/components/SearchResultConversationItem.vue b/app/javascript/dashboard/modules/search/components/SearchResultConversationItem.vue
index 179d98c8d..e081be829 100644
--- a/app/javascript/dashboard/modules/search/components/SearchResultConversationItem.vue
+++ b/app/javascript/dashboard/modules/search/components/SearchResultConversationItem.vue
@@ -35,6 +35,10 @@ const props = defineProps({
type: Number,
default: 0,
},
+ emailSubject: {
+ type: String,
+ default: '',
+ },
});
const navigateTo = computed(() => {
@@ -49,6 +53,28 @@ const navigateTo = computed(() => {
});
const createdAtTime = dynamicTime(props.createdAt);
+
+const infoItems = computed(() => [
+ {
+ label: 'SEARCH.FROM',
+ value: props.name,
+ show: !!props.name,
+ },
+ {
+ label: 'SEARCH.EMAIL',
+ value: props.email,
+ show: !!props.email,
+ },
+ {
+ label: 'SEARCH.EMAIL_SUBJECT',
+ value: props.emailSubject,
+ show: !!props.emailSubject,
+ },
+]);
+
+const visibleInfoItems = computed(() =>
+ infoItems.value.filter(item => item.show)
+);
@@ -86,26 +112,18 @@ const createdAtTime = dynamicTime(props.createdAt);
{{ createdAtTime }}
-
+
-
- {{ $t('SEARCH.FROM') }}:
-
- {{ name }}
-
-
- {{ $t('SEARCH.EMAIL') }}:
+ {{ $t(item.label) }}:
- {{ email }}
+ {{ item.value }}
diff --git a/app/javascript/dashboard/modules/search/components/SearchResultConversationsList.vue b/app/javascript/dashboard/modules/search/components/SearchResultConversationsList.vue
index 9bcbe8f2a..55c6cdb43 100644
--- a/app/javascript/dashboard/modules/search/components/SearchResultConversationsList.vue
+++ b/app/javascript/dashboard/modules/search/components/SearchResultConversationsList.vue
@@ -1,9 +1,10 @@
@@ -34,7 +42,10 @@ const accountId = useMapGetter('getCurrentAccountId');
:is-fetching="isFetching"
>
diff --git a/app/services/telegram/incoming_message_service.rb b/app/services/telegram/incoming_message_service.rb
index a36231634..d39005030 100644
--- a/app/services/telegram/incoming_message_service.rb
+++ b/app/services/telegram/incoming_message_service.rb
@@ -43,6 +43,7 @@ class Telegram::IncomingMessageService
def process_message_attachments
attach_location
attach_files
+ attach_contact
end
def update_contact_avatar
@@ -136,6 +137,16 @@ class Telegram::IncomingMessageService
)
end
+ def attach_contact
+ return unless contact_card
+
+ @message.attachments.new(
+ account_id: @message.account_id,
+ file_type: :contact,
+ fallback_title: contact_card['phone_number'].to_s
+ )
+ end
+
def file
@file ||= visual_media_params || params[:message][:voice].presence || params[:message][:audio].presence || params[:message][:document].presence
end
@@ -154,6 +165,10 @@ class Telegram::IncomingMessageService
@location ||= params.dig(:message, :location).presence
end
+ def contact_card
+ @contact_card ||= params.dig(:message, :contact).presence
+ end
+
def visual_media_params
params[:message][:photo].presence&.last || params.dig(:message, :sticker, :thumb).presence || params[:message][:video].presence
end
diff --git a/app/views/api/v1/accounts/search/conversations.json.jbuilder b/app/views/api/v1/accounts/search/conversations.json.jbuilder
index 570cf3b4c..70d48a89e 100644
--- a/app/views/api/v1/accounts/search/conversations.json.jbuilder
+++ b/app/views/api/v1/accounts/search/conversations.json.jbuilder
@@ -16,6 +16,8 @@ json.payload do
json.agent do
json.partial! 'agent', formats: [:json], agent: conversation.assignee if conversation.try(:assignee).present?
end
+
+ json.additional_attributes conversation.additional_attributes
end
end
end
diff --git a/app/views/installation/onboarding/index.html.erb b/app/views/installation/onboarding/index.html.erb
index 220da62dd..8b337d16c 100644
--- a/app/views/installation/onboarding/index.html.erb
+++ b/app/views/installation/onboarding/index.html.erb
@@ -70,7 +70,9 @@
Finish Setup
- <% end %>
+ <% end %>
+
+