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