diff --git a/src/lib/utils.js b/src/lib/utils.js index f513ced6..a8421f2a 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -2,23 +2,24 @@ // Make shortcut icon appear with a green dot + show unread count in title. export function updateFavicon(count) { - var oldIcon = document.getElementById('shortcut-icon'); + const oldIcon = document.getElementById('shortcut-icon'); + const head = document.head || document.getElementsByTagName('head')[0]; + const newIcon = document.createElement('link'); + newIcon.type = 'image/png'; + newIcon.id = 'shortcut-icon'; + newIcon.rel = 'shortcut icon'; + newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png'; if (oldIcon) { - var head = document.head || document.getElementsByTagName('head')[0]; - var newIcon = document.createElement('link'); - newIcon.type = 'image/png'; - newIcon.id = 'shortcut-icon'; - newIcon.rel = 'shortcut icon'; - newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png'; head.removeChild(oldIcon); - head.appendChild(newIcon); } + head.appendChild(newIcon); + document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode'; } // Create VCard which represents topic 'public' info export function vcard(fn, imageDataUrl) { - var card = null; + const card = null; if ((fn && fn.trim()) || imageDataUrl) { card = {}; @@ -26,7 +27,7 @@ export function vcard(fn, imageDataUrl) { card.fn = fn.trim(); } if (imageDataUrl) { - var dataStart = imageDataUrl.indexOf(','); + const dataStart = imageDataUrl.indexOf(','); card.photo = { data: imageDataUrl.substring(dataStart+1), type: 'jpg' @@ -38,6 +39,14 @@ export function vcard(fn, imageDataUrl) { // Deep-shallow compare two arrays: shallow compare each element. export function arrayEqual(a, b) { + if (a === b) { + return true; + } + + if (!Array.isArray(a) || !Array.isArray(b)) { + return false; + } + // Compare lengths first. if (a.length != b.length) { return false; @@ -45,7 +54,7 @@ export function arrayEqual(a, b) { // Order of elements is ignored. a.sort(); b.sort(); - for (var i = 0, l = a.length; i < l; i++) { + for (let i = 0, l = a.length; i < l; i++) { if (a[i] !== b[i]) { return false; } diff --git a/src/views/edit-account-view.jsx b/src/views/edit-account-view.jsx index 15e00661..5b8e50f7 100644 --- a/src/views/edit-account-view.jsx +++ b/src/views/edit-account-view.jsx @@ -60,7 +60,7 @@ export default class EditAccountView extends React.Component { handleFullNameUpdate(fn) { this.setState({fullName: fn}); - this.props.onUpdateAccount(undefined, vcard(fn, this.state.avatar)); + this.props.onUpdateAccount(undefined, vcard(fn, null)); } handlePasswordUpdate(pwd) { @@ -70,7 +70,7 @@ export default class EditAccountView extends React.Component { handleImageChanged(img) { this.setState({avatar: img}); - this.props.onUpdateAccount(undefined, vcard(this.state.fullName, img)); + this.props.onUpdateAccount(undefined, vcard(null, img)); } handleCheckboxClick(what, checked) { diff --git a/src/views/info-view.jsx b/src/views/info-view.jsx index be946fe1..eaaf15c1 100644 --- a/src/views/info-view.jsx +++ b/src/views/info-view.jsx @@ -220,26 +220,20 @@ class InfoView extends React.Component { fn = fn.trim(); if (this.state.fullName !== fn) { this.setState({fullName: fn}); - this.props.onTopicDescUpdate(this.props.topic, - vcard(fn, this.state.avatar), - null); + this.props.onTopicDescUpdate(this.props.topic, vcard(fn, null), null); } } handlePrivateUpdate(priv) { if (this.state.priv !== priv) { this.setState({private: priv}); - this.props.onTopicDescUpdate(this.props.topic, - null, - priv || Tinode.DEL_CHAR); + this.props.onTopicDescUpdate(this.props.topic, null, priv || Tinode.DEL_CHAR); } } handleImageChanged(img) { this.setState({avatar: img}); - this.props.onTopicDescUpdate(this.props.topic, - vcard(this.state.fullName, img), - null); + this.props.onTopicDescUpdate(this.props.topic, vcard(null, img), null); } handleMuted(ignored, checked) {