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