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" ||