diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index bf21d15587..9fed0e7d5b 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -65,11 +65,10 @@ export default React.createClass({ this._scalarClient = new ScalarAuthClient(); this._scalarClient.getScalarToken().done((token) => { // Append scalar_token as a query param - let u = url.parse(this.props.url); + const u = url.parse(this.props.url); if (!u.search) { u.search = "?scalar_token=" + encodeURIComponent(token); - } - else { + } else { u.search += "&scalar_token=" + encodeURIComponent(token); } @@ -127,8 +126,7 @@ export default React.createClass({ appTileBody = (
Loading...
); - } - else { + } else { appTileBody = (
diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 190b1341c3..2c50a94a6a 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -143,9 +143,15 @@ module.exports = React.createClass({ if (this.props.showUrlPreview && !this.state.links.length) { var links = this.findLinks(this.refs.content.children); if (links.length) { - this.setState({ links: links.map((link)=>{ - return link.getAttribute("href"); - })}); + // de-dup the links (but preserve ordering) + const seen = new Set(); + links = links.filter((link) => { + if (seen.has(link)) return false; + seen.add(link); + return true; + }); + + this.setState({ links: links }); // lazy-load the hidden state of the preview widget from localstorage if (global.localStorage) { @@ -158,12 +164,13 @@ module.exports = React.createClass({ findLinks: function(nodes) { var links = []; + for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; if (node.tagName === "A" && node.getAttribute("href")) { if (this.isLinkPreviewable(node)) { - links.push(node); + links.push(node.getAttribute("href")); } } else if (node.tagName === "PRE" || node.tagName === "CODE" ||