diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue b/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue index 34c31aac1..ad007af1c 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue @@ -1,28 +1,30 @@ + + diff --git a/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue b/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue index e0b8817d8..89784037d 100644 --- a/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue +++ b/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue @@ -3,7 +3,7 @@ import { defineAsyncComponent, ref, computed } from 'vue'; import { useMapGetter } from 'dashboard/composables/store'; import { useI18n } from 'vue-i18n'; import { useUISettings } from 'dashboard/composables/useUISettings'; -// import { useFileUpload } from 'dashboard/composables/useFileUpload'; +import { useFileUpload } from 'dashboard/composables/useFileUpload'; import { vOnClickOutside } from '@vueuse/components'; import { ALLOWED_FILE_TYPES } from 'shared/constants/messages'; import { useKeyboardEvents } from 'dashboard/composables/useKeyboardEvents'; @@ -110,19 +110,10 @@ const onClickInsertEmoji = emoji => { emit('insertEmoji', emoji); }; -const useFileUpload = () => { - // Empty function for testing purposes - // TODO: Will use useFileUpload composable later - return { - onFileUpload: () => {}, - }; -}; - const { onFileUpload } = useFileUpload({ isATwilioSMSChannel: props.isTwilioSmsInbox, attachFile: ({ blob, file }) => { if (!file) return; - const reader = new FileReader(); reader.readAsDataURL(file.file); reader.onloadend = () => { diff --git a/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue b/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue index 7e72c7038..b1596ac04 100644 --- a/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue +++ b/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue @@ -141,7 +141,11 @@ const isAnyDropdownActive = computed(() => { }); const handleContactSearch = value => { - emit('searchContacts', value); + showContactsDropdown.value = true; + emit('searchContacts', { + keys: ['email', 'phone_number', 'name'], + query: value, + }); }; const handleDropdownUpdate = (type, value) => { @@ -156,12 +160,12 @@ const handleDropdownUpdate = (type, value) => { const searchCcEmails = value => { showCcEmailsDropdown.value = true; - emit('searchContacts', value); + emit('searchContacts', { keys: ['email'], query: value }); }; const searchBccEmails = value => { showBccEmailsDropdown.value = true; - emit('searchContacts', value); + emit('searchContacts', { keys: ['email'], query: value }); }; const setSelectedContact = async ({ value, action, ...rest }) => { @@ -250,7 +254,7 @@ const handleSendWhatsappMessage = async ({ message, templateParams }) => { diff --git a/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenu.vue b/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenu.vue index 347e2e25d..b9bb9f421 100644 --- a/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenu.vue +++ b/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenu.vue @@ -120,7 +120,7 @@ const allowedMenuItems = computed(() => { - + diff --git a/app/javascript/dashboard/routes/dashboard/conversation/contact/ConversationForm.vue b/app/javascript/dashboard/routes/dashboard/conversation/contact/ConversationForm.vue index c6d60eb53..47517798b 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/contact/ConversationForm.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/contact/ConversationForm.vue @@ -138,7 +138,7 @@ export default { }, selectedInbox: { get() { - const inboxList = this.contact.contactableInboxes || []; + const inboxList = this.contact.contact_inboxes || []; return ( inboxList.find(inbox => { return inbox.inbox?.id && inbox.inbox?.id === this.targetInbox?.id; @@ -152,7 +152,7 @@ export default { }, }, showNoInboxAlert() { - if (!this.contact.contactableInboxes) { + if (!this.contact.contact_inboxes) { return false; } return this.inboxes.length === 0 && !this.uiFlags.isFetchingInboxes; @@ -166,7 +166,7 @@ export default { : this.$t('CONVERSATION.FOOTER.ENABLE_SIGN_TOOLTIP'); }, inboxes() { - const inboxList = this.contact.contactableInboxes || []; + const inboxList = this.contact.contact_inboxes || []; return inboxList.map(inbox => ({ ...inbox.inbox, sourceId: inbox.source_id, diff --git a/app/javascript/dashboard/store/modules/contacts/actions.js b/app/javascript/dashboard/store/modules/contacts/actions.js index 80fe44beb..e8da81482 100644 --- a/app/javascript/dashboard/store/modules/contacts/actions.js +++ b/app/javascript/dashboard/store/modules/contacts/actions.js @@ -205,8 +205,8 @@ export const actions = { try { const response = await ContactAPI.getContactableInboxes(id); const contact = { - id, - contactableInboxes: response.data.payload, + id: Number(id), + contact_inboxes: response.data.payload, }; commit(types.SET_CONTACT_ITEM, contact); } catch (error) { diff --git a/app/javascript/dashboard/store/modules/conversationStats.js b/app/javascript/dashboard/store/modules/conversationStats.js index 201bf6564..025e3352f 100644 --- a/app/javascript/dashboard/store/modules/conversationStats.js +++ b/app/javascript/dashboard/store/modules/conversationStats.js @@ -5,6 +5,7 @@ const state = { mineCount: 0, unAssignedCount: 0, allCount: 0, + updatedOn: null, }; export const getters = { @@ -12,7 +13,17 @@ export const getters = { }; export const actions = { - get: async ({ commit }, params) => { + get: async ({ commit, state: $state }, params) => { + const currentTime = new Date(); + const lastUpdatedTime = new Date($state.updatedOn); + + // Skip large accounts from making too many requests + if (currentTime - lastUpdatedTime < 10000 && $state.allCount > 1000) { + // eslint-disable-next-line no-console + console.warn('Skipping conversation meta fetch'); + return; + } + try { const response = await ConversationApi.meta(params); const { @@ -40,6 +51,7 @@ export const mutations = { $state.mineCount = mineCount; $state.allCount = allCount; $state.unAssignedCount = unAssignedCount; + $state.updatedOn = new Date(); }, }; diff --git a/app/javascript/dashboard/store/modules/specs/conversationStats/actions.spec.js b/app/javascript/dashboard/store/modules/specs/conversationStats/actions.spec.js index 33d927103..4572387ac 100644 --- a/app/javascript/dashboard/store/modules/specs/conversationStats/actions.spec.js +++ b/app/javascript/dashboard/store/modules/specs/conversationStats/actions.spec.js @@ -11,7 +11,7 @@ describe('#actions', () => { it('sends correct mutations if API is success', async () => { axios.get.mockResolvedValue({ data: { meta: { mine_count: 1 } } }); await actions.get( - { commit }, + { commit, state: { updatedOn: null } }, { inboxId: 1, assigneeTpe: 'me', status: 'open' } ); expect(commit.mock.calls).toEqual([ @@ -21,7 +21,7 @@ describe('#actions', () => { it('sends correct actions if API is error', async () => { axios.get.mockRejectedValue({ message: 'Incorrect header' }); await actions.get( - { commit }, + { commit, state: { updatedOn: null } }, { inboxId: 1, assigneeTpe: 'me', status: 'open' } ); expect(commit.mock.calls).toEqual([]); diff --git a/app/javascript/dashboard/store/modules/specs/conversationStats/mutations.spec.js b/app/javascript/dashboard/store/modules/specs/conversationStats/mutations.spec.js index e49d938e3..e625eb13c 100644 --- a/app/javascript/dashboard/store/modules/specs/conversationStats/mutations.spec.js +++ b/app/javascript/dashboard/store/modules/specs/conversationStats/mutations.spec.js @@ -14,6 +14,7 @@ describe('#mutations', () => { mineCount: 1, unAssignedCount: 1, allCount: 2, + updatedOn: expect.any(Date), }); }); });