diff --git a/package-lock.json b/package-lock.json index 0b38149255..8194051e4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "@nextcloud/vue-dashboard": "^2.0.1", "@riophae/vue-treeselect": "^0.4.0", "@vue/babel-preset-app": "^5.0.8", + "address-rfc2822": "^2.1.0", "buffer": "^6.0.3", "color-convert": "^2.0.1", "core-js": "^3.31.0", @@ -5759,6 +5760,14 @@ "node": ">=0.4.0" } }, + "node_modules/address-rfc2822": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/address-rfc2822/-/address-rfc2822-2.1.0.tgz", + "integrity": "sha512-TwoTmJcYzS+CLw/h+AO3zOzRFGSMNowmp/tlOXcYPygkr2vMAWLs0pDajJiJK/dtVPpFx1utw/CzzLfmmtkagw==", + "dependencies": { + "email-addresses": "^4.0.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -7949,6 +7958,11 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/email-addresses": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-4.0.0.tgz", + "integrity": "sha512-Nas3sSSiD5lSIoqBos0FMjB9h4clHxXuAahHKGJ5doRWavEB7pBHzOxnI7R5f1MuGNrrSnsZFJ81HCBv0DZmnw==" + }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -22120,6 +22134,14 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, + "address-rfc2822": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/address-rfc2822/-/address-rfc2822-2.1.0.tgz", + "integrity": "sha512-TwoTmJcYzS+CLw/h+AO3zOzRFGSMNowmp/tlOXcYPygkr2vMAWLs0pDajJiJK/dtVPpFx1utw/CzzLfmmtkagw==", + "requires": { + "email-addresses": "^4.0.0" + } + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -23779,6 +23801,11 @@ } } }, + "email-addresses": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-4.0.0.tgz", + "integrity": "sha512-Nas3sSSiD5lSIoqBos0FMjB9h4clHxXuAahHKGJ5doRWavEB7pBHzOxnI7R5f1MuGNrrSnsZFJ81HCBv0DZmnw==" + }, "emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", diff --git a/package.json b/package.json index 8e4eb610a5..6fdc1be8a0 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@nextcloud/vue-dashboard": "^2.0.1", "@riophae/vue-treeselect": "^0.4.0", "@vue/babel-preset-app": "^5.0.8", + "address-rfc2822": "^2.1.0", "buffer": "^6.0.3", "color-convert": "^2.0.1", "core-js": "^3.31.0", diff --git a/src/components/MailboxThread.vue b/src/components/MailboxThread.vue index c3a9fd7bdf..bfd62bf872 100644 --- a/src/components/MailboxThread.vue +++ b/src/components/MailboxThread.vue @@ -75,6 +75,7 @@ import { NcAppContent as AppContent, NcAppContentList as AppContentList, NcButto import isMobile from '@nextcloud/vue/dist/Mixins/isMobile' import SectionTitle from './SectionTitle' import Vue from 'vue' +import addressParser from 'address-rfc2822' import infiniteScroll from '../directives/infinite-scroll' import IconInfo from 'vue-material-design-icons/Information' @@ -266,12 +267,25 @@ export default { return [] } - return [ - { - label: str, - email: str, - }, - ] + let addresses = [] + try { + addresses = addressParser.parse(str) + } catch (error) { + logger.debug('could not parse string into email addresses', { str, error }) + } + + return addresses.map(address => { + const result = { + label: address.name(), + email: address.address, + } + + if (result.label === '') { + result.label = result.email + } + + return result + }) }, onUpdateSearchQuery(query) { this.searchQuery = query