Newer
Older
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
Axel Chalon
committed
import React, { Component } from 'react';
import {
BrowserRouter,
MemoryRouter,
Redirect,
Route,
Switch
Axel Chalon
committed
} from 'react-router-dom';
import { inject, observer } from 'mobx-react';
import { Modal } from 'fether-ui';
import semver from 'semver';
import { version } from '../../package.json';
import i18n, { packageNS } from '../i18n';
Axel Chalon
committed
import Accounts from '../Accounts';
import BackupAccount from '../BackupAccount';
import DeleteAccount from '../DeleteAccount';
Axel Chalon
committed
import Onboarding from '../Onboarding';
import * as postMessage from '../utils/postMessage';
import RequireParityVersion from '../RequireParityVersion';
import RequireHealthOverlay from '../RequireHealthOverlay';
Axel Chalon
committed
import Tokens from '../Tokens';
const currentVersion = version;
// Use MemoryRouter for production viewing in file:// protocol
// https://github.com/facebook/create-react-app/issues/3591
const Router =
process.env.NODE_ENV === 'production' ? MemoryRouter : BrowserRouter;
currentLanguage: undefined,
newRelease: false // false | {name, url, ignore}
};
postMessage.send('SET_LANGUAGE_REQUEST');
postMessage.listen$('SET_LANGUAGE_RESPONSE').subscribe(newLanguage => {
i18n.changeLanguage(newLanguage);
// Reload whole app when we change language
if (
this.state.currentLanguage &&
this.state.currentLanguage !== newLanguage
) {
window.location.reload();
} else {
this.setState({ currentLanguage: newLanguage });
}
window.addEventListener('contextmenu', this.handleRightClick);
window
.fetch('https://api.github.com/repos/paritytech/fether/releases/latest')
.then(j => j.json())
.then(({ name, html_url: url, tag_name: tag }) => {
const latestVersion = tag.match(/v(\d+\.\d+(\.\d+)?)/)[1];
if (semver.gt(latestVersion, currentVersion)) {
this.setState({
newRelease: {
name,
url,
ignore: false
}
});
}
})
.catch(e => {
console.error('Error while checking for a new version of Fether:', e);
});
componentWillUnmount () {
window.removeEventListener('contextmenu', this.handleRightClick);
}
renderModalLinks = () => {
return (
<nav className='form-nav -binary'>
<button className='button -back' onClick={this.hideNewReleaseModal}>
Remind me later
</button>
<button className='button' onClick={this.openNewReleaseUrl}>
Download
</button>
</nav>
);
};
hideNewReleaseModal = () => {
this.setState({
newRelease: { ...this.state.newRelease, ignore: true }
});
};
openNewReleaseUrl = () => {
window.open(this.state.newRelease.url, '_blank', 'noopener noreferrer');
postMessage.send('APP_RIGHT_CLICK_REQUEST');
onboardingStore: { isFirstRun },
parityStore: { api }
const { newRelease } = this.state;
Axel Chalon
committed
<div className='window'>
<Onboarding />
</div>
);
// The child components make use of light.js and light.js needs to be passed
// an API first, otherwise it will throw an error.
// We set parityStore.api right after we set the API for light.js, so we
// verify here that parityStore.api is defined, and if not we don't render
// the children, just a <RequireHealthOverlay />.
<RequireHealthOverlay fullscreen require='node'>
{/* Adding these components to have minimum height on window */}
<div className='content'>
<div className='window' />
</div>
</RequireHealthOverlay>
<div className='content'>
<div className='window'>
title={i18n.t(`${packageNS}:releases.new_release_title`)}
description={
newRelease
? i18n.t(`${packageNS}:releases.new_release_description`, {
release_name: newRelease.name
})
: ''
}
visible={newRelease && !newRelease.ignore}
buttons={this.renderModalLinks()}
>
<Router>
<Switch>
{/* The next line is the homepage */}
<Redirect exact from='/' to='/accounts' />
<Route path='/accounts' component={Accounts} />
<Route path='/onboarding' component={Onboarding} />
<Route path='/tokens/:accountAddress' component={Tokens} />
<Route
path='/whitelist/:accountAddress'
component={Whitelist}
/>
<Route
path='/backup/:accountAddress'
component={BackupAccount}
/>
<Route
path='/delete/:accountAddress'
component={DeleteAccount}
/>
<Route
path='/send/:tokenAddress/from/:accountAddress'
component={Send}
/>
<Redirect from='*' to='/' />
</Switch>
</Router>
</Modal>
</RequireParityVersion>