diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index d49aa5d90..8225eb10f 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -17,6 +17,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import { observer } from 'mobx-react'; import Connection from '../Connection'; import ParityBar from '../ParityBar'; @@ -25,13 +26,14 @@ import Container from './Container'; import DappContainer from './DappContainer'; import FrameError from './FrameError'; import Status from './Status'; +import Store from './store'; import TabBar from './TabBar'; import styles from './application.css'; const inFrame = window.parent !== window && window.parent.frames.length !== 0; -const showFirstRun = window.localStorage.getItem('showFirstRun') === '1'; +@observer class Application extends Component { static contextTypes = { api: PropTypes.object.isRequired, @@ -46,13 +48,7 @@ class Application extends Component { blockNumber: PropTypes.object } - state = { - showFirstRun: false - } - - componentWillMount () { - this.checkAccounts(); - } + store = new Store(this.context.api); render () { const [root] = (window.location.hash || '').replace('#/', '').split('/'); @@ -75,12 +71,11 @@ class Application extends Component { renderApp () { const { children, pending, netChain, isTest, blockNumber } = this.props; - const { showFirstRun } = this.state; return ( + showFirstRun={ this.store.firstrunVisible } + onCloseFirstRun={ this.store.closeFirstrun }> ); } - - checkAccounts () { - const { api } = this.context; - - api.eth - .accounts() - .then((accounts) => { - this.setState({ - showFirstRun: showFirstRun || accounts.length === 0 - }); - }) - .catch((error) => { - console.error('checkAccounts', error); - }); - } - - onCloseFirstRun = () => { - window.localStorage.setItem('showFirstRun', '0'); - this.setState({ - showFirstRun: false - }); - } } function mapStateToProps (state) { diff --git a/js/src/views/Application/store.js b/js/src/views/Application/store.js new file mode 100644 index 000000000..4ea0faf3d --- /dev/null +++ b/js/src/views/Application/store.js @@ -0,0 +1,51 @@ +// Copyright 2015, 2016 Ethcore (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 } from 'mobx'; + +const showFirstRun = window.localStorage.getItem('showFirstRun') !== '0'; + +export default class Store { + @observable firstrunVisible = showFirstRun; + + constructor (api) { + this._api = api; + + this._checkAccounts(); + } + + @action closeFirstrun = () => { + this.toggleFirstrun(false); + } + + @action toggleFirstrun = (visible = false) => { + this.firstrunVisible = visible; + window.localStorage.setItem('showFirstRun', visible ? '1' : '0'); + } + + _checkAccounts () { + this._api.parity + .accountsInfo() + .then((info) => { + const accounts = Object.keys(info).filter((address) => info[address].uuid); + + this.toggleFirstrun(this.firstrunVisible || !accounts || !accounts.length); + }) + .catch((error) => { + console.error('checkAccounts', error); + }); + } +}