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%;
 | 
			
		||||
  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 { observer } from 'mobx-react';
 | 
			
		||||
import { FormattedMessage } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
import DappsStore from '../Dapps/dappsStore';
 | 
			
		||||
 | 
			
		||||
@ -25,21 +26,71 @@ import styles from './dapp.css';
 | 
			
		||||
export default class Dapp extends Component {
 | 
			
		||||
  static contextTypes = {
 | 
			
		||||
    api: PropTypes.object.isRequired
 | 
			
		||||
  }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  static propTypes = {
 | 
			
		||||
    params: PropTypes.object
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  state = {
 | 
			
		||||
    app: null,
 | 
			
		||||
    loading: true
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  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 () {
 | 
			
		||||
    const { dappsUrl } = this.context.api;
 | 
			
		||||
    const { id } = this.props.params;
 | 
			
		||||
    const app = this.store.apps.find((app) => app.id === id);
 | 
			
		||||
    const { app, loading } = this.state;
 | 
			
		||||
 | 
			
		||||
    if (loading) {
 | 
			
		||||
      return (
 | 
			
		||||
        <div className={ styles.full }>
 | 
			
		||||
          <div className={ styles.text }>
 | 
			
		||||
            <FormattedMessage
 | 
			
		||||
              id='dapp.loading'
 | 
			
		||||
              defaultMessage='Loading'
 | 
			
		||||
            />
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
@ -45,6 +45,10 @@ class Dapps extends Component {
 | 
			
		||||
  store = DappsStore.get(this.context.api);
 | 
			
		||||
  permissionStore = new PermissionStore(this.context.api);
 | 
			
		||||
 | 
			
		||||
  componentWillMount () {
 | 
			
		||||
    this.store.loadAllApps();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  render () {
 | 
			
		||||
    let externalOverlay = null;
 | 
			
		||||
    if (this.store.externalOverlayVisible) {
 | 
			
		||||
 | 
			
		||||
@ -48,17 +48,43 @@ export default class DappsStore {
 | 
			
		||||
 | 
			
		||||
    this.readDisplayApps();
 | 
			
		||||
    this.loadExternalOverlay();
 | 
			
		||||
    this.loadApps();
 | 
			
		||||
    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();
 | 
			
		||||
 | 
			
		||||
    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([
 | 
			
		||||
        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))
 | 
			
		||||
      ])
 | 
			
		||||
      .then(this.writeDisplayApps);
 | 
			
		||||
@ -67,8 +93,6 @@ export default class DappsStore {
 | 
			
		||||
  static get (api) {
 | 
			
		||||
    if (!instance) {
 | 
			
		||||
      instance = new DappsStore(api);
 | 
			
		||||
    } else {
 | 
			
		||||
      instance.loadApps();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return instance;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user