App.js 2.41 KiB
Newer Older
Amaury Martiny's avatar
Amaury Martiny committed
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
// This file is part of Parity.
Amaury Martiny's avatar
Amaury Martiny committed
//
Amaury Martiny's avatar
Amaury Martiny committed
// SPDX-License-Identifier: BSD-3-Clause
Axel Chalon's avatar
Axel Chalon committed
import React, { Component } from "react";
import {
  BrowserRouter,
  MemoryRouter,
  Redirect,
  Route,
  Switch
Axel Chalon's avatar
Axel Chalon committed
} from "react-router-dom";
import { inject, observer } from "mobx-react";
import isElectron from "is-electron";
import ReactResizeDetector from "react-resize-detector";
Axel Chalon's avatar
Axel Chalon committed
import Accounts from "../Accounts";
import Onboarding from "../Onboarding";
import Overlay from "../Overlay";
import Send from "../Send";
import { STATUS } from "../stores/healthStore";
import Tokens from "../Tokens";
import Whitelist from "../Whitelist";
Amaury Martiny's avatar
Amaury Martiny committed
// Use MemoryRouter for production viewing in file:// protocol
// https://github.com/facebook/create-react-app/issues/3591
const Router =
Axel Chalon's avatar
Axel Chalon committed
  process.env.NODE_ENV === "production" ? MemoryRouter : BrowserRouter;
const electron = isElectron() ? window.require("electron") : null;
Axel Chalon's avatar
Axel Chalon committed
@inject("healthStore", "onboardingStore")
Amaury Martiny's avatar
Amaury Martiny committed
@observer
class App extends Component {
Amaury Martiny's avatar
Amaury Martiny committed
  handleResize = (_, height) => {
    if (!electron) {
      return;
    }
    // Send height to main process
Axel Chalon's avatar
Axel Chalon committed
    electron.ipcRenderer.send("asynchronous-message", "app-resize", height);
Axel Chalon's avatar
Axel Chalon committed
  render() {
    return (
Amaury Martiny's avatar
Amaury Martiny committed
      <ReactResizeDetector handleHeight onResize={this.handleResize}>
        <Router>
Axel Chalon's avatar
Axel Chalon committed
          <div className="content">{this.renderScreen()}</div>
Amaury Martiny's avatar
Amaury Martiny committed
        </Router>
      </ReactResizeDetector>
Amaury Martiny's avatar
Amaury Martiny committed

  /**
   * Decide which screen to render.
   */
Axel Chalon's avatar
Axel Chalon committed
  renderScreen() {
Amaury Martiny's avatar
Amaury Martiny committed
    const {
Amaury Martiny's avatar
Amaury Martiny committed
      onboardingStore: { isFirstRun },
Amaury Martiny's avatar
Amaury Martiny committed
      healthStore: {
        health: { status }
      }
    } = this.props;

Amaury Martiny's avatar
Amaury Martiny committed
    if (isFirstRun) {
Axel Chalon's avatar
Axel Chalon committed
        <div className="window">
          <Onboarding />
        </div>
      );
Amaury Martiny's avatar
Amaury Martiny committed
    return (
Axel Chalon's avatar
Axel Chalon committed
      <div className="window">
Amaury Martiny's avatar
Amaury Martiny committed
        {status !== STATUS.GOOD && <Overlay />}
        <Switch>
Amaury Martiny's avatar
Amaury Martiny committed
          {/* The next line is the hoempage */}
Axel Chalon's avatar
Axel Chalon committed
          <Redirect exact from="/" to="/accounts" />{" "}
          {/* todo redirect to latest account localstorage ? */}
          <Route path="/accounts" component={Accounts} />
          <Route path="/onboarding" component={Onboarding} />
          <Route path="/send" component={Send} />
          <Route path="/whitelist" component={Whitelist} />
          <Route path="/tokens/:accountAddress" component={Tokens} />
          <Redirect from="*" to="/" />
        </Switch>
      </div>
}

export default App;