diff --git a/src/components/views/globals/NewVersionBar.js b/src/components/views/globals/NewVersionBar.js
index 90b30f72..3ae95804 100644
--- a/src/components/views/globals/NewVersionBar.js
+++ b/src/components/views/globals/NewVersionBar.js
@@ -19,6 +19,7 @@ limitations under the License.
var React = require('react');
var sdk = require('matrix-react-sdk');
import Modal from 'matrix-react-sdk/lib/Modal';
+import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
/**
* Check a version string is compatible with the Changelog
@@ -31,30 +32,50 @@ function checkVersion(ver) {
export default function NewVersionBar(props) {
const onChangelogClicked = () => {
- const ChangelogDialog = sdk.getComponent('dialogs.ChangelogDialog');
-
- Modal.createDialog(ChangelogDialog, {
- version: props.version,
- newVersion: props.newVersion,
- onFinished: (update) => {
- if(update) {
- window.location.reload();
+ if (props.releaseNotes) {
+ const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog');
+ Modal.createDialog(QuestionDialog, {
+ title: "What's New",
+ description:
{props.releaseNotes}
,
+ button: "Update",
+ onFinished: (update) => {
+ if(update && PlatformPeg.get()) {
+ PlatformPeg.get().installUpdate();
+ }
}
- }
- });
+ });
+ } else {
+ const ChangelogDialog = sdk.getComponent('dialogs.ChangelogDialog');
+ Modal.createDialog(ChangelogDialog, {
+ version: props.version,
+ newVersion: props.newVersion,
+ releaseNotes: releaseNotes,
+ onFinished: (update) => {
+ if(update && PlatformPeg.get()) {
+ PlatformPeg.get().installUpdate();
+ }
+ }
+ });
+ }
};
- let changelog_button;
- if (checkVersion(props.version) && checkVersion(props.newVersion)) {
- changelog_button = ;
+ const onUpdateClicked = () => {
+ PlatformPeg.get().installUpdate();
+ };
+
+ let action_button;
+ if (props.releaseNotes || (checkVersion(props.version) && checkVersion(props.newVersion))) {
+ action_button = ;
+ } else if (PlatformPeg.get()) {
+ action_button = ;
}
return (
- A new version of Riot is available. Refresh your browser.
+ A new version of Riot is available.
- {changelog_button}
+ {action_button}
);
}
@@ -62,4 +83,5 @@ export default function NewVersionBar(props) {
NewVersionBar.propTypes = {
version: React.PropTypes.string.isRequired,
newVersion: React.PropTypes.string.isRequired,
+ releaseNotes: React.PropTypes.string,
};
diff --git a/src/vector/index.js b/src/vector/index.js
index f260ac01..affa5042 100644
--- a/src/vector/index.js
+++ b/src/vector/index.js
@@ -113,10 +113,6 @@ function onHashChange(ev) {
routeUrl(window.location);
}
-function onVersion(current, latest) {
- window.matrixChat.onVersion(current, latest);
-}
-
var loaded = false;
var lastLoadedScreen = null;
@@ -165,8 +161,7 @@ window.onload = function() {
if (!validBrowser) {
return;
}
- UpdateChecker.setVersionListener(onVersion);
- UpdateChecker.run();
+ UpdateChecker.start();
routeUrl(window.location);
loaded = true;
if (lastLoadedScreen) {
diff --git a/src/vector/platform/WebPlatform.js b/src/vector/platform/WebPlatform.js
index 7ef2b6b8..c521cf60 100644
--- a/src/vector/platform/WebPlatform.js
+++ b/src/vector/platform/WebPlatform.js
@@ -18,12 +18,14 @@ limitations under the License.
import BasePlatform from 'matrix-react-sdk/lib/BasePlatform';
import Favico from 'favico.js';
+import request from 'browser-request';
import dis from 'matrix-react-sdk/lib/dispatcher.js';
import q from 'q';
export default class WebPlatform extends BasePlatform {
constructor() {
super();
+ this.runningVersion = null;
// The 'animations' are really low framerate and look terrible.
// Also it re-starts the animationb every time you set the badge,
// and we set the state each time, even if the value hasn't changed,
@@ -88,4 +90,42 @@ export default class WebPlatform extends BasePlatform {
notification.close();
}, 5 * 1000);
}
+
+ _getVersion() {
+ const deferred = q.defer();
+ request(
+ { method: "GET", url: "version" },
+ (err, response, body) => {
+ if (err || response.status < 200 || response.status >= 300) {
+ if (err == null) err = { status: response.status };
+ deferred.reject(err);
+ return;
+ }
+
+ const ver = body.trim();
+ deferred.resolve(ver);
+ }
+ );
+ return deferred.promise;
+ }
+
+ pollForUpdate() {
+ this._getVersion().done((ver) => {
+ if (this.runningVersion == null) {
+ this.runningVersion = ver;
+ } else if (this.runningVersion != ver) {
+ dis.dispatch({
+ action: 'new_version',
+ currentVersion: this.runningVersion,
+ newVersion: ver,
+ });
+ }
+ }, (err) => {
+ console.error("Failed to poll for update", err);
+ });
+ }
+
+ installUpdate() {
+ window.location.reload();
+ }
}
diff --git a/src/vector/updater.js b/src/vector/updater.js
index e8d6830d..19d40b4f 100644
--- a/src/vector/updater.js
+++ b/src/vector/updater.js
@@ -13,48 +13,18 @@ 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.
*/
+
+import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
+
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;
+ start: function() {
+ module.exports.poll();
+ setInterval(module.exports.poll, POKE_RATE_MS);
},
- 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);
- }
- }
- });
- var cacheBuster = "?ts=" + new Date().getTime();
- req.open("GET", "version" + cacheBuster);
- 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);
+ poll: function() {
+ PlatformPeg.get().pollForUpdate();
}
};