Only fetch App when necessary (#4023)
* Only fetch App when necessary. Show loadings + 404 #3914 * PR Grumble
This commit is contained in:
		
							parent
							
								
									cc8e200ed5
								
							
						
					
					
						commit
						71e7a429d7
					
				@ -20,3 +20,23 @@
 | 
				
			|||||||
  height: 100%;
 | 
					  height: 100%;
 | 
				
			||||||
  width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.full {
 | 
				
			||||||
 | 
					  width: 100vw;
 | 
				
			||||||
 | 
					  height: 100vh;
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  background: white;
 | 
				
			||||||
 | 
					  font-family: 'Roboto', sans-serif;
 | 
				
			||||||
 | 
					  font-size: 16px;
 | 
				
			||||||
 | 
					  font-weight: 300;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .text {
 | 
				
			||||||
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					    padding: 5em;
 | 
				
			||||||
 | 
					    font-size: 2em;
 | 
				
			||||||
 | 
					    color: #999;
 | 
				
			||||||
 | 
					    overflow: hidden;
 | 
				
			||||||
 | 
					    text-overflow: ellipsis;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import React, { Component, PropTypes } from 'react';
 | 
					import React, { Component, PropTypes } from 'react';
 | 
				
			||||||
import { observer } from 'mobx-react';
 | 
					import { observer } from 'mobx-react';
 | 
				
			||||||
 | 
					import { FormattedMessage } from 'react-intl';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import DappsStore from '../Dapps/dappsStore';
 | 
					import DappsStore from '../Dapps/dappsStore';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,21 +26,71 @@ import styles from './dapp.css';
 | 
				
			|||||||
export default class Dapp extends Component {
 | 
					export default class Dapp extends Component {
 | 
				
			||||||
  static contextTypes = {
 | 
					  static contextTypes = {
 | 
				
			||||||
    api: PropTypes.object.isRequired
 | 
					    api: PropTypes.object.isRequired
 | 
				
			||||||
  }
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propTypes = {
 | 
					  static propTypes = {
 | 
				
			||||||
    params: PropTypes.object
 | 
					    params: PropTypes.object
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  state = {
 | 
				
			||||||
 | 
					    app: null,
 | 
				
			||||||
 | 
					    loading: true
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  store = DappsStore.get(this.context.api);
 | 
					  store = DappsStore.get(this.context.api);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  componentWillMount () {
 | 
				
			||||||
 | 
					    const { id } = this.props.params;
 | 
				
			||||||
 | 
					    this.loadApp(id);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  componentWillReceiveProps (nextProps) {
 | 
				
			||||||
 | 
					    if (nextProps.params.id !== this.props.params.id) {
 | 
				
			||||||
 | 
					      this.loadApp(nextProps.params.id);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  loadApp (id) {
 | 
				
			||||||
 | 
					    this.setState({ loading: true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.store
 | 
				
			||||||
 | 
					      .loadApp(id)
 | 
				
			||||||
 | 
					      .then((app) => {
 | 
				
			||||||
 | 
					        this.setState({ loading: false, app });
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .catch(() => {
 | 
				
			||||||
 | 
					        this.setState({ loading: false });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { dappsUrl } = this.context.api;
 | 
					    const { dappsUrl } = this.context.api;
 | 
				
			||||||
    const { id } = this.props.params;
 | 
					    const { app, loading } = this.state;
 | 
				
			||||||
    const app = this.store.apps.find((app) => app.id === id);
 | 
					
 | 
				
			||||||
 | 
					    if (loading) {
 | 
				
			||||||
 | 
					      return (
 | 
				
			||||||
 | 
					        <div className={ styles.full }>
 | 
				
			||||||
 | 
					          <div className={ styles.text }>
 | 
				
			||||||
 | 
					            <FormattedMessage
 | 
				
			||||||
 | 
					              id='dapp.loading'
 | 
				
			||||||
 | 
					              defaultMessage='Loading'
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!app) {
 | 
					    if (!app) {
 | 
				
			||||||
      return null;
 | 
					      return (
 | 
				
			||||||
 | 
					        <div className={ styles.full }>
 | 
				
			||||||
 | 
					          <div className={ styles.text }>
 | 
				
			||||||
 | 
					            <FormattedMessage
 | 
				
			||||||
 | 
					              id='dapp.unavailable'
 | 
				
			||||||
 | 
					              defaultMessage='The dapp cannot be reached'
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let src = null;
 | 
					    let src = null;
 | 
				
			||||||
 | 
				
			|||||||
@ -45,6 +45,10 @@ class Dapps extends Component {
 | 
				
			|||||||
  store = DappsStore.get(this.context.api);
 | 
					  store = DappsStore.get(this.context.api);
 | 
				
			||||||
  permissionStore = new PermissionStore(this.context.api);
 | 
					  permissionStore = new PermissionStore(this.context.api);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  componentWillMount () {
 | 
				
			||||||
 | 
					    this.store.loadAllApps();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    let externalOverlay = null;
 | 
					    let externalOverlay = null;
 | 
				
			||||||
    if (this.store.externalOverlayVisible) {
 | 
					    if (this.store.externalOverlayVisible) {
 | 
				
			||||||
 | 
				
			|||||||
@ -48,17 +48,43 @@ export default class DappsStore {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    this.readDisplayApps();
 | 
					    this.readDisplayApps();
 | 
				
			||||||
    this.loadExternalOverlay();
 | 
					    this.loadExternalOverlay();
 | 
				
			||||||
    this.loadApps();
 | 
					 | 
				
			||||||
    this.subscribeToChanges();
 | 
					    this.subscribeToChanges();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  loadApps () {
 | 
					  /**
 | 
				
			||||||
 | 
					   * Try to find the app from the local (local or builtin)
 | 
				
			||||||
 | 
					   * apps, else fetch from the node
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  loadApp (id) {
 | 
				
			||||||
    const { dappReg } = Contracts.get();
 | 
					    const { dappReg } = Contracts.get();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Promise
 | 
					    return this
 | 
				
			||||||
 | 
					      .loadLocalApps()
 | 
				
			||||||
 | 
					      .then(() => {
 | 
				
			||||||
 | 
					        const app = this.apps.find((app) => app.id === id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (app) {
 | 
				
			||||||
 | 
					          return app;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return this.fetchRegistryApp(dappReg, id, true);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  loadLocalApps () {
 | 
				
			||||||
 | 
					    return Promise
 | 
				
			||||||
      .all([
 | 
					      .all([
 | 
				
			||||||
        this.fetchBuiltinApps().then((apps) => this.addApps(apps)),
 | 
					        this.fetchBuiltinApps().then((apps) => this.addApps(apps)),
 | 
				
			||||||
        this.fetchLocalApps().then((apps) => this.addApps(apps)),
 | 
					        this.fetchLocalApps().then((apps) => this.addApps(apps))
 | 
				
			||||||
 | 
					      ]);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  loadAllApps () {
 | 
				
			||||||
 | 
					    const { dappReg } = Contracts.get();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Promise
 | 
				
			||||||
 | 
					      .all([
 | 
				
			||||||
 | 
					        this.loadLocalApps(),
 | 
				
			||||||
        this.fetchRegistryApps(dappReg).then((apps) => this.addApps(apps))
 | 
					        this.fetchRegistryApps(dappReg).then((apps) => this.addApps(apps))
 | 
				
			||||||
      ])
 | 
					      ])
 | 
				
			||||||
      .then(this.writeDisplayApps);
 | 
					      .then(this.writeDisplayApps);
 | 
				
			||||||
@ -67,8 +93,6 @@ export default class DappsStore {
 | 
				
			|||||||
  static get (api) {
 | 
					  static get (api) {
 | 
				
			||||||
    if (!instance) {
 | 
					    if (!instance) {
 | 
				
			||||||
      instance = new DappsStore(api);
 | 
					      instance = new DappsStore(api);
 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      instance.loadApps();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return instance;
 | 
					    return instance;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user