From 5eed734325b0871c3b4cbf39118f536ed4622dea Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 3 Feb 2016 16:16:14 +0000 Subject: [PATCH 1/3] Add a version update checker and NewVersionBar to show on the UI. --- src/component-index.js | 1 + src/components/views/globals/NewVersionBar.js | 36 ++++++++++++ src/vector/index.js | 7 +++ src/vector/updater.js | 57 +++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 src/components/views/globals/NewVersionBar.js create mode 100644 src/vector/updater.js diff --git a/src/component-index.js b/src/component-index.js index 3a9042df06..b25b5ef94c 100644 --- a/src/component-index.js +++ b/src/component-index.js @@ -34,6 +34,7 @@ module.exports.components['views.elements.ImageView'] = require('./components/vi module.exports.components['views.elements.Spinner'] = require('./components/views/elements/Spinner'); module.exports.components['views.globals.GuestWarningBar'] = require('./components/views/globals/GuestWarningBar'); module.exports.components['views.globals.MatrixToolbar'] = require('./components/views/globals/MatrixToolbar'); +module.exports.components['views.globals.NewVersionBar'] = require('./components/views/globals/NewVersionBar'); module.exports.components['views.login.VectorCustomServerDialog'] = require('./components/views/login/VectorCustomServerDialog'); module.exports.components['views.login.VectorLoginFooter'] = require('./components/views/login/VectorLoginFooter'); module.exports.components['views.login.VectorLoginHeader'] = require('./components/views/login/VectorLoginHeader'); diff --git a/src/components/views/globals/NewVersionBar.js b/src/components/views/globals/NewVersionBar.js new file mode 100644 index 0000000000..83dccf5d0e --- /dev/null +++ b/src/components/views/globals/NewVersionBar.js @@ -0,0 +1,36 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +'use strict'; + +var React = require('react'); +var sdk = require('matrix-react-sdk') + +module.exports = React.createClass({ + displayName: 'NewVersionBar', + + render: function() { + return ( +
+ /!\ +
+ A new version of Vector is available. Refresh your browser. +
+
+ ); + } +}); + diff --git a/src/vector/index.js b/src/vector/index.js index 9585f686da..552f0c24b4 100644 --- a/src/vector/index.js +++ b/src/vector/index.js @@ -30,6 +30,7 @@ var sdk = require("matrix-react-sdk"); sdk.loadSkin(require('../component-index')); var VectorConferenceHandler = require('../VectorConferenceHandler'); var configJson = require("../../config.json"); +var UpdateChecker = require("./updater"); var qs = require("querystring"); @@ -105,6 +106,10 @@ function onHashChange(ev) { routeUrl(window.location); } +function onNewVersion(current, latest) { + window.matrixChat.onNewVersion(current, latest); +} + var loaded = false; var lastLoadedScreen = null; @@ -138,6 +143,8 @@ window.onload = function() { if (!validBrowser) { return; } + UpdateChecker.setNewVersionListener(onNewVersion); + UpdateChecker.run(); routeUrl(window.location); loaded = true; if (lastLoadedScreen) { diff --git a/src/vector/updater.js b/src/vector/updater.js new file mode 100644 index 0000000000..b258882fc2 --- /dev/null +++ b/src/vector/updater.js @@ -0,0 +1,57 @@ +/* +Copyright 2016 OpenMarket Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +var POKE_RATE_MS = 10 * 60 * 1000; // 10 min +var currentVersion = null; +var latestVersion = null; +var listener = function(){}; // NOP + +module.exports = { + setNewVersionListener: function(fn) { // invoked with fn(currentVer, newVer) + listener = fn; + }, + + run: function() { + var req = new XMLHttpRequest(); + req.addEventListener("load", function() { + if (!req.responseText) { + return; + } + if (!currentVersion) { + currentVersion = req.responseText.trim(); + } + + if (req.responseText !== latestVersion) { + latestVersion = req.responseText.trim(); + if (module.exports.hasNewVersion()) { + console.log("Current=%s Latest=%s", currentVersion, latestVersion); + listener(currentVersion, latestVersion); + } + } + }); + req.open("GET", "version"); + req.send(); // can't suppress 404s from being logged. + + setTimeout(module.exports.run, POKE_RATE_MS); + }, + + getCurrentVersion: function() { + return currentVersion; + }, + + hasNewVersion: function() { + return currentVersion && latestVersion && (currentVersion !== latestVersion); + } +}; From 4628cf82a71ad0a4f63f521098dd58ef88c6a42f Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 3 Feb 2016 16:23:17 +0000 Subject: [PATCH 2/3] Split out response text to its own var to prevent trim() messing up comparisons --- src/vector/updater.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vector/updater.js b/src/vector/updater.js index b258882fc2..a818bd3f72 100644 --- a/src/vector/updater.js +++ b/src/vector/updater.js @@ -29,12 +29,13 @@ module.exports = { if (!req.responseText) { return; } + var ver = req.responseText.trim(); if (!currentVersion) { - currentVersion = req.responseText.trim(); + currentVersion = ver; } - if (req.responseText !== latestVersion) { - latestVersion = req.responseText.trim(); + if (ver !== latestVersion) { + latestVersion = ver; if (module.exports.hasNewVersion()) { console.log("Current=%s Latest=%s", currentVersion, latestVersion); listener(currentVersion, latestVersion); From b307a6d64e85eec70d1a5054cf5778bec712b9a7 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 3 Feb 2016 16:50:05 +0000 Subject: [PATCH 3/3] Invoke onVersion when we know the current version even if there is no new version (for settings) --- src/vector/index.js | 6 +++--- src/vector/updater.js | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vector/index.js b/src/vector/index.js index 552f0c24b4..1d845adf06 100644 --- a/src/vector/index.js +++ b/src/vector/index.js @@ -106,8 +106,8 @@ function onHashChange(ev) { routeUrl(window.location); } -function onNewVersion(current, latest) { - window.matrixChat.onNewVersion(current, latest); +function onVersion(current, latest) { + window.matrixChat.onVersion(current, latest); } var loaded = false; @@ -143,7 +143,7 @@ window.onload = function() { if (!validBrowser) { return; } - UpdateChecker.setNewVersionListener(onNewVersion); + UpdateChecker.setVersionListener(onVersion); UpdateChecker.run(); routeUrl(window.location); loaded = true; diff --git a/src/vector/updater.js b/src/vector/updater.js index a818bd3f72..0daba7285d 100644 --- a/src/vector/updater.js +++ b/src/vector/updater.js @@ -19,7 +19,7 @@ var latestVersion = null; var listener = function(){}; // NOP module.exports = { - setNewVersionListener: function(fn) { // invoked with fn(currentVer, newVer) + setVersionListener: function(fn) { // invoked with fn(currentVer, newVer) listener = fn; }, @@ -32,6 +32,7 @@ module.exports = { var ver = req.responseText.trim(); if (!currentVersion) { currentVersion = ver; + listener(currentVersion, currentVersion); } if (ver !== latestVersion) {