diff --git a/src/component-index.js b/src/component-index.js index 3a9042df..b25b5ef9 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 00000000..83dccf5d --- /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 9585f686..1d845adf 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 onVersion(current, latest) { + window.matrixChat.onVersion(current, latest); +} + var loaded = false; var lastLoadedScreen = null; @@ -138,6 +143,8 @@ window.onload = function() { if (!validBrowser) { return; } + UpdateChecker.setVersionListener(onVersion); + 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 00000000..0daba728 --- /dev/null +++ b/src/vector/updater.js @@ -0,0 +1,59 @@ +/* +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 = { + setVersionListener: function(fn) { // invoked with fn(currentVer, newVer) + listener = fn; + }, + + run: function() { + var req = new XMLHttpRequest(); + req.addEventListener("load", function() { + if (!req.responseText) { + return; + } + var ver = req.responseText.trim(); + if (!currentVersion) { + currentVersion = ver; + listener(currentVersion, currentVersion); + } + + if (ver !== latestVersion) { + latestVersion = ver; + 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); + } +};