diff --git a/package-lock.json b/package-lock.json index 1e46830..77ccaf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mailchain-web", - "version": "0.0.9", + "version": "0.0.11", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2061,9 +2061,9 @@ } }, "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "adm-zip": { "version": "0.4.13", diff --git a/package.json b/package.json index 4deeb8b..7f1dbcc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mailchain-web", - "version": "0.0.9", + "version": "0.0.11", "scripts": { "ng": "ng", "start": "ng serve", @@ -60,4 +60,4 @@ "tslint": "~5.11.0", "typescript": "~3.5.3" } -} \ No newline at end of file +} diff --git a/src/app/inbox/inbox-compose/inbox-compose.component.ts b/src/app/inbox/inbox-compose/inbox-compose.component.ts index 61dafd0..266e239 100644 --- a/src/app/inbox/inbox-compose/inbox-compose.component.ts +++ b/src/app/inbox/inbox-compose/inbox-compose.component.ts @@ -216,7 +216,7 @@ export class InboxComposeComponent implements OnInit { let returnObs if (this.mailchainService.validateEnsName(value)) { - returnObs = this.nameserviceService.resolveName( + returnObs = await this.nameserviceService.resolveName( this.currentProtocol, this.currentNetwork, value diff --git a/src/app/inbox/inbox-message/inbox-message.component.html b/src/app/inbox/inbox-message/inbox-message.component.html index 06a25c9..982b5c8 100644 --- a/src/app/inbox/inbox-message/inbox-message.component.html +++ b/src/app/inbox/inbox-message/inbox-message.component.html @@ -67,17 +67,7 @@

{{currentMessage.subject}}


- -
-

-
- - - -
-
-
- +
diff --git a/src/app/inbox/inbox-message/inbox-message.component.scss b/src/app/inbox/inbox-message/inbox-message.component.scss index e30fc5b..78bf24f 100644 --- a/src/app/inbox/inbox-message/inbox-message.component.scss +++ b/src/app/inbox/inbox-message/inbox-message.component.scss @@ -8,6 +8,14 @@ font-family: 'Courier New', Courier, monospace; } +.message-body-container { + display: contents; +} + +.message-body-html { + flex-grow: 1; border: none; margin: 0; padding: 0; +} + .message-identicon { width: 35px; height: 35px; diff --git a/src/app/inbox/inbox-message/inbox-message.component.spec.ts b/src/app/inbox/inbox-message/inbox-message.component.spec.ts index fc51a50..c1270f5 100644 --- a/src/app/inbox/inbox-message/inbox-message.component.spec.ts +++ b/src/app/inbox/inbox-message/inbox-message.component.spec.ts @@ -124,4 +124,84 @@ describe('InboxMessageComponent', () => { }); }); + describe('getViewForContentType', () => { + it('should call getViewForContentType when the content-type is plaintext ', () => { + spyOn(component, 'getViewForContentType') + + component.currentMessage["headers"]["content-type"] = 'text/plain; charset="UTF-8"' + component.ngOnInit() + expect(component.getViewForContentType).toHaveBeenCalled() + }) + + it('should call getViewForContentType when the content-type is text/plain; charset="UTF-8"', () => { + spyOn(component, 'getViewForContentType') + + component.currentMessage["headers"]["content-type"] = 'text/plain; charset="UTF-8"' + component.ngOnInit() + expect(component.getViewForContentType).toHaveBeenCalled() + }) + + it('should call getViewForContentType when the content-type is unknown', () => { + spyOn(component, 'getViewForContentType') + + component.currentMessage["headers"]["content-type"] = 'unknown' + component.ngOnInit() + expect(component.getViewForContentType).toHaveBeenCalled() + }) + }) + + describe('addMessageText', () => { + it('should call addMessageText when the content-type is plaintext ', () => { + spyOn(component, 'addMessageText') + + component.currentMessage["headers"]["content-type"] = 'text/plain; charset="UTF-8"' + component.ngOnInit() + expect(component.addMessageText).toHaveBeenCalled() + }) + + it('should NOT call addMessageText when the content-type is text/html; charset="UTF-8" ', () => { + spyOn(component, 'addMessageText') + + component.currentMessage["headers"]["content-type"] = 'text/html; charset="UTF-8"' + component.ngOnInit() + expect(component.addMessageText).not.toHaveBeenCalled() + }) + + it('should call addMessageText when the content-type is unknown ', () => { + spyOn(component, 'addMessageText') + + component.currentMessage["headers"]["content-type"] = 'unknown' + component.ngOnInit() + expect(component.addMessageText).toHaveBeenCalled() + }) + + }) + describe('addMessageIframe', () => { + it('should NOT call addMessageIframe when the content-type is plaintext ', () => { + spyOn(component, 'addMessageIframe') + + component.currentMessage["headers"]["content-type"] = 'text/plain; charset="UTF-8"' + component.ngOnInit() + expect(component.addMessageIframe).not.toHaveBeenCalled() + }) + + it('should call addMessageIframe when the content-type is text/html; charset="UTF-8" ', () => { + spyOn(component, 'addMessageIframe') + + component.currentMessage["headers"]["content-type"] = 'text/html; charset="UTF-8"' + component.ngOnInit() + expect(component.addMessageIframe).toHaveBeenCalled() + }) + + it('should NOT call addMessageIframe when the content-type is unknown ', () => { + spyOn(component, 'addMessageIframe') + + component.currentMessage["headers"]["content-type"] = 'unknown' + component.ngOnInit() + expect(component.addMessageIframe).not.toHaveBeenCalled() + }) + + }) + + }); diff --git a/src/app/inbox/inbox-message/inbox-message.component.ts b/src/app/inbox/inbox-message/inbox-message.component.ts index 54416c4..9f3d89a 100644 --- a/src/app/inbox/inbox-message/inbox-message.component.ts +++ b/src/app/inbox/inbox-message/inbox-message.component.ts @@ -18,7 +18,6 @@ export class InboxMessageComponent implements OnInit { @Output() replyToMessage = new EventEmitter(); public messageNameRecords = {} - public viewForContentType = "plaintext" constructor( private nameserviceService: NameserviceService, @@ -33,7 +32,7 @@ export class InboxMessageComponent implements OnInit { ngOnInit() { this.resolveNamesFromMessage() - this.viewForContentType = this.getViewForContentType() + this.getViewForContentType() } /** @@ -86,9 +85,49 @@ export class InboxMessageComponent implements OnInit { /** * getViewForContentType: Returns correct view for content-type */ - private getViewForContentType() { + public getViewForContentType() { let ct = this.currentMessage.headers["content-type"] - return this.mailchainService.getContentTypeForView(ct) + + switch (ct) { + case 'plaintext': + this.addMessageText() + break; + case 'text/html; charset="UTF-8"': + this.addMessageIframe() + break; + default: + this.addMessageText() + break; + } + } + + /** addMessageIframe: Creates iframe containing message and adds it to message-frame */ + public addMessageIframe() { + var messageFrame = document.getElementById('message-frame') + + var ifrm = document.createElement("iframe"); + ifrm.setAttribute("srcdoc", this.currentMessage.body); + ifrm.setAttribute("frameborder", "0"); + ifrm.style.width = "100%"; + ifrm.style.height = "100%"; + ifrm.classList.add("message-body-html") + + messageFrame.appendChild(ifrm); + } + + /** Creates message div & pre containing message and adds it to message-frame */ + public addMessageText() { + var messageFrame = document.getElementById('message-frame') + + var divMessage = document.createElement('div') + divMessage.classList.add("message-body") + + var preMessage = document.createElement('pre') + divMessage.classList.add("pre-inherit") + divMessage.innerText = this.currentMessage.body + + divMessage.appendChild(preMessage) + messageFrame.appendChild(divMessage) } } diff --git a/src/app/services/mailchain/mailchain.service.spec.ts b/src/app/services/mailchain/mailchain.service.spec.ts index 22d5183..655ecc1 100644 --- a/src/app/services/mailchain/mailchain.service.spec.ts +++ b/src/app/services/mailchain/mailchain.service.spec.ts @@ -81,6 +81,14 @@ describe('MailchainService', () => { expect(response).toEqual(ethereumAccountAddress) }); + + it('should return a blank string if the Mailchain address is invalid', () => { + const mailchainAddress = "<0x@ropsten.ethereum>" + + let response = mailchainService.parseAddressFromMailchain(mailchainAddress) + + expect(response).toEqual('') + }); }) describe('dedupeMessagesByIds', () => { diff --git a/src/app/services/mailchain/mailchain.service.ts b/src/app/services/mailchain/mailchain.service.ts index c8ecf50..8694b17 100644 --- a/src/app/services/mailchain/mailchain.service.ts +++ b/src/app/services/mailchain/mailchain.service.ts @@ -50,6 +50,8 @@ export class MailchainService { var regexMailAddr = new RegExp('<0x[0-9a-fA-Z]{40}[@].+>$'); if (regexMailAddr.test(address)) { return address.substr(1, address.indexOf('@') - 1); + } else { + return '' } } @@ -175,7 +177,7 @@ export class MailchainService { * see tests for conditions */ public validateEnsName(value) { - let regex = new RegExp('^([0-9a-zA-Z][0-9a-zA-Z\-]{2,}[\.]){1,}[a-zA-Z]{2,}$') + let regex = new RegExp('^([0-9a-zA-Z]{1,}[0-9a-zA-Z\-]{0,}[\.]){1,}[a-zA-Z]{2,}$') return regex.test(value) };