diff --git a/js/src/modals/UpgradeParity/Upgrade/index.js b/js/src/modals/UpgradeParity/Updating/index.js
similarity index 95%
rename from js/src/modals/UpgradeParity/Upgrade/index.js
rename to js/src/modals/UpgradeParity/Updating/index.js
index ff2da57b5..59e363f11 100644
--- a/js/src/modals/UpgradeParity/Upgrade/index.js
+++ b/js/src/modals/UpgradeParity/Updating/index.js
@@ -14,4 +14,4 @@
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see .
-export default from './upgrade';
+export default from './updating';
diff --git a/js/src/modals/UpgradeParity/Upgrade/upgrade.js b/js/src/modals/UpgradeParity/Updating/updating.js
similarity index 87%
rename from js/src/modals/UpgradeParity/Upgrade/upgrade.js
rename to js/src/modals/UpgradeParity/Updating/updating.js
index 75637058c..f1bbc722a 100644
--- a/js/src/modals/UpgradeParity/Upgrade/upgrade.js
+++ b/js/src/modals/UpgradeParity/Updating/updating.js
@@ -17,17 +17,15 @@
import { observer } from 'mobx-react';
import React, { Component, PropTypes } from 'react';
-import styles from './.css';
-
@observer
-export default class Upgrade extends Component {
+export default class Updating extends Component {
static propTypes = {
store: PropTypes.object.isRequired
}
render () {
return (
-
hello
+
hello
);
}
}
diff --git a/js/src/modals/UpgradeParity/index.js b/js/src/modals/UpgradeParity/index.js
new file mode 100644
index 000000000..523e372fa
--- /dev/null
+++ b/js/src/modals/UpgradeParity/index.js
@@ -0,0 +1,17 @@
+// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+export default from './upgradeParity';
diff --git a/js/src/modals/UpgradeParity/modalStore.js b/js/src/modals/UpgradeParity/modalStore.js
new file mode 100644
index 000000000..d677aa01d
--- /dev/null
+++ b/js/src/modals/UpgradeParity/modalStore.js
@@ -0,0 +1,97 @@
+// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+import { action, computed, observable, transaction } from 'mobx';
+import store from 'store';
+
+const LS_UPDATE = '_parity::update';
+
+const A_DAY = 24 * 60 * 60 * 1000;
+
+const STEP_INFO = 1;
+const STEP_UPDATING = 2;
+const STEP_COMPLETED = 3;
+const STEP_ERROR = 4;
+
+export default class ModalStore {
+ @observable closed = false;
+ @observable error = null;
+ @observable step = 0;
+ @observable upgrade = null;
+
+ constructor (upgradeStore) {
+ this.upgrade = upgradeStore;
+
+ this.loadStorage();
+ }
+
+ @computed get showUpgrade () {
+ return !closed && Date.now() >= this.remindAt;
+ }
+
+ @action closeModal = () => {
+ transaction(() => {
+ this.closed = true;
+ this.setStep(STEP_INFO);
+ });
+ }
+
+ @action loadStorage = () => {
+ const values = store.get(LS_UPDATE) || {};
+
+ this.remindAt = values.remindAt ? values.remindAt : 0;
+
+ return values;
+ }
+
+ @action setStep = (step, error = null) => {
+ transaction(() => {
+ this.error = error;
+ this.setp = step;
+ });
+ }
+
+ @action snoozeTillTomorrow = () => {
+ this.remindAt = Date.now() + A_DAY;
+ store.set(LS_UPDATE, Object.assign(this.loadStorage(), { remindAt: this.remindAt }));
+ }
+
+ @action upgradeNow = () => {
+ this.setStep(STEP_UPDATING);
+
+ this.upgrade
+ .executeUpgrade()
+ .then((result) => {
+ if (!result) {
+ throw new Error('Unable to complete update');
+ }
+
+ this.setStep(STEP_COMPLETED);
+ })
+ .catch((error) => {
+ console.error('upgradeNow', error);
+
+ this.setStep(STEP_ERROR, error);
+ });
+ }
+}
+
+export {
+ STEP_COMPLETED,
+ STEP_ERROR,
+ STEP_INFO,
+ STEP_UPDATING
+};
diff --git a/js/src/modals/UpgradeParity/store.js b/js/src/modals/UpgradeParity/store.js
deleted file mode 100644
index 57446ead8..000000000
--- a/js/src/modals/UpgradeParity/store.js
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
-// This file is part of Parity.
-
-// Parity is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Parity is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Parity. If not, see .
-
-import { action, observable, transaction } from 'mobx';
-import store from 'store';
-
-const AN_HOUR = 60 * 60 * 1000;
-const A_DAY = 24 * AN_HOUR;
-const CHECK_INTERVAL = AN_HOUR;
-const LS_UPDATE = '_parity::update';
-
-export default class Store {
- @observable availableUpgrade = null;
- @observable remindAt = 0;
- @observable showUpgrade = false;
-
- constructor (api) {
- this._api = api;
-
- this.checkUpgrade();
- setInterval(this.pollUpgrade, CHECK_INTERVAL);
- }
-
- @action loadStorage () {
- const values = store.get(LS_UPDATE) || {};
-
- this.remindAt = values.remindAt ? values.remindAt : 0;
-
- return values;
- }
-
- @action setAvailableUpgrade (availableUpgrade, consensusCapability) {
- transaction(() => {
- this.setConsensusCapability(consensusCapability);
- this.availableUpgrade = availableUpgrade;
-
- if (availableUpgrade && Date.now() >= this.remindAt) {
- this.showUpgrade = true;
- }
- });
- }
-
- @action setConsensusCapability (consensusCapability) {
- this.consensusCapability = consensusCapability;
- }
-
- @action snoozeTillTomorrow () {
- store.set(LS_UPDATE, Object.assign(this.loadStorage(), {
- remindAt: Date.now() + A_DAY
- }));
- }
-
- checkUpgrade = () => {
- this.loadStorage();
-
- return Promise
- .all([
- this._api.parity.upgradeReady(),
- this._api.parity.consensusCapability()
- ])
- .then(([availableUpgrade, consensusCapability]) => {
- this.setAvailableUpgrade(availableUpgrade, consensusCapability);
- })
- .catch((error) => {
- console.warn('checkUpgrade', error);
- });
- }
-
- executeUpgrade = () => {
- return this._api.parity
- .executeUpgrade();
- }
-}
diff --git a/js/src/modals/UpgradeParity/upgradeParity.js b/js/src/modals/UpgradeParity/upgradeParity.js
index 41a28d666..4c4d9f1ef 100644
--- a/js/src/modals/UpgradeParity/upgradeParity.js
+++ b/js/src/modals/UpgradeParity/upgradeParity.js
@@ -16,10 +16,16 @@
import { observer } from 'mobx-react';
import React, { Component, PropTypes } from 'react';
+import { FormattedMessage } from 'react-intl';
import { Button, Modal } from '~/ui';
+import { CancelIcon, DoneIcon, NextIcon, SnoozeIcon } from '~/ui/Icons';
-import Store from './store';
+import Info from './Info';
+import Updating from './Updating';
+
+import ModalStore, { STEP_COMPLETED, STEP_ERROR, STEP_INFO, STEP_UPDATING } from './modalStore';
+import UpgradeStore from './upgradeStore';
@observer
export default class UpgradeParity extends Component {
@@ -27,21 +33,84 @@ export default class UpgradeParity extends Component {
api: PropTypes.object.isRequired
};
- store = new Store(this.context.api);
+ store = new ModalStore(new UpgradeStore(this.context.api));
render () {
- if (!this.store.showUpgrade) {
+ if (!this.store.upgrade.available || !this.store.showUpgrade) {
return null;
}
return (
- ] }
+ actions={ this.renderActions() }
visible>
-
+ { this.renderStep() }
);
}
+
+ renderActions () {
+ const closeButton =
+ }
+ label={
+
+ }
+ onClick={ this.store.closeModal } />;
+ const doneButton =
+ }
+ label={
+
+ }
+ onClick={ this.store.closeModal } />;
+
+ switch (this.store.step) {
+ case STEP_INFO:
+ return [
+ }
+ label={
+
+ }
+ onClick={ this.store.snoozeTillTomorrow } />,
+ }
+ label={
+
+ }
+ onClick={ this.store.upgradeNow } />,
+ closeButton
+ ];
+
+ case STEP_UPDATING:
+ return [
+ closeButton
+ ];
+
+ case STEP_COMPLETED:
+ case STEP_ERROR:
+ return [
+ doneButton
+ ];
+ }
+ }
+
+ renderStep () {
+ switch (this.store.step) {
+ case STEP_INFO:
+ return ;
+
+ case STEP_UPDATING:
+ return ;
+ }
+ }
}
diff --git a/js/src/modals/UpgradeParity/upgradeStore.js b/js/src/modals/UpgradeParity/upgradeStore.js
new file mode 100644
index 000000000..ea3dabbe2
--- /dev/null
+++ b/js/src/modals/UpgradeParity/upgradeStore.js
@@ -0,0 +1,57 @@
+// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+import { action, observable, transaction } from 'mobx';
+
+const CHECK_INTERVAL = 1 * 60 * 1000;
+
+export default class UpgradeStore {
+ @observable available = null;
+ @observable consensusCapability = null;
+
+ constructor (api) {
+ this._api = api;
+
+ this.checkUpgrade();
+ setInterval(this.checkUpgrade, CHECK_INTERVAL);
+ }
+
+ @action setAvailableUpgrade (available, consensusCapability) {
+ transaction(() => {
+ this.available = available;
+ this.consensusCapability = consensusCapability;
+ });
+ }
+
+ checkUpgrade = () => {
+ return Promise
+ .all([
+ this._api.parity.upgradeReady(),
+ this._api.parity.consensusCapability()
+ ])
+ .then(([available, consensusCapability]) => {
+ console.log('[checkUpgrade]', 'available:', available, 'consensusCapability:', consensusCapability);
+ this.setAvailableUpgrade(available, consensusCapability);
+ })
+ .catch((error) => {
+ console.warn('checkUpgrade', error);
+ });
+ }
+
+ executeUpgrade = () => {
+ return this._api.parity.executeUpgrade();
+ }
+}
diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js
index fd8e67aad..f41e9a3c4 100644
--- a/js/src/ui/Modal/modal.js
+++ b/js/src/ui/Modal/modal.js
@@ -42,11 +42,11 @@ class Modal extends Component {
className: PropTypes.string,
compact: PropTypes.bool,
current: PropTypes.number,
- waiting: PropTypes.array,
+ settings: PropTypes.object.isRequired,
steps: PropTypes.array,
title: nodeOrStringProptype(),
visible: PropTypes.bool.isRequired,
- settings: PropTypes.object.isRequired
+ waiting: PropTypes.array
}
render () {
@@ -65,13 +65,13 @@ class Modal extends Component {
return (