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);
+ }
+};