From a06298afa106a1610c0b6704df9c090a5e5a5be8 Mon Sep 17 00:00:00 2001 From: Daniel Ternyak Date: Tue, 3 Oct 2017 21:37:06 -0700 Subject: [PATCH] Refresh on Network Change (#261) * configure gitignore * create CONFIG_NODE_CHANGE_INTENT action, action creator, and type * pass changeNodeIntent intstead of changeNode to Header * create saga for handling node changes that will refresh only when network changes --- .gitignore | 3 +++ common/actions/config/actionCreators.ts | 10 ++++++++++ common/actions/config/actionTypes.ts | 10 +++++++++- common/actions/config/constants.ts | 1 + common/components/Header/index.tsx | 12 ++++++++---- common/containers/TabSection/index.tsx | 12 ++++++------ common/sagas/config.ts | 17 +++++++++++++++-- 7 files changed, 52 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 39bf79fb..48b0195e 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ dll webpack_config/server.key webpack_config/server.crt webpack_config/server.csr + + +v8-compile-cache-0/ diff --git a/common/actions/config/actionCreators.ts b/common/actions/config/actionCreators.ts index 60aa0cd3..97d6aadb 100644 --- a/common/actions/config/actionCreators.ts +++ b/common/actions/config/actionCreators.ts @@ -24,3 +24,13 @@ export function changeGasPrice(value: number): interfaces.ChangeGasPriceAction { value }; } + +export type TChangeNodeIntent = typeof changeNodeIntent; +export function changeNodeIntent( + payload: string +): interfaces.ChangeNodeIntentAction { + return { + type: TypeKeys.CONFIG_NODE_CHANGE_INTENT, + payload + }; +} diff --git a/common/actions/config/actionTypes.ts b/common/actions/config/actionTypes.ts index 571227f8..355b39ee 100644 --- a/common/actions/config/actionTypes.ts +++ b/common/actions/config/actionTypes.ts @@ -1,4 +1,5 @@ import { TypeKeys } from './constants'; + /*** Change Language ***/ export interface ChangeLanguageAction { type: TypeKeys.CONFIG_LANGUAGE_CHANGE; @@ -18,8 +19,15 @@ export interface ChangeGasPriceAction { value: number; } +/*** Change Node ***/ +export interface ChangeNodeIntentAction { + type: TypeKeys.CONFIG_NODE_CHANGE_INTENT; + payload: string; +} + /*** Union Type ***/ export type ConfigAction = | ChangeNodeAction | ChangeLanguageAction - | ChangeGasPriceAction; + | ChangeGasPriceAction + | ChangeNodeIntentAction; diff --git a/common/actions/config/constants.ts b/common/actions/config/constants.ts index 33afe1ba..d851672a 100644 --- a/common/actions/config/constants.ts +++ b/common/actions/config/constants.ts @@ -1,5 +1,6 @@ export enum TypeKeys { CONFIG_LANGUAGE_CHANGE = 'CONFIG_LANGUAGE_CHANGE', CONFIG_NODE_CHANGE = 'CONFIG_NODE_CHANGE', + CONFIG_NODE_CHANGE_INTENT = 'CONFIG_NODE_CHANGE_INTENT', CONFIG_GAS_PRICE = 'CONFIG_GAS_PRICE' } diff --git a/common/components/Header/index.tsx b/common/components/Header/index.tsx index 85918477..9d2ed562 100644 --- a/common/components/Header/index.tsx +++ b/common/components/Header/index.tsx @@ -1,4 +1,8 @@ -import { TChangeGasPrice, TChangeLanguage, TChangeNode } from 'actions/config'; +import { + TChangeGasPrice, + TChangeLanguage, + TChangeNodeIntent +} from 'actions/config'; import logo from 'assets/images/logo-myetherwallet.svg'; import { Dropdown, ColorDropdown } from 'components/ui'; import React, { Component } from 'react'; @@ -22,13 +26,13 @@ interface Props { gasPriceGwei: number; changeLanguage: TChangeLanguage; - changeNode: TChangeNode; + changeNodeIntent: TChangeNodeIntent; changeGasPrice: TChangeGasPrice; } export default class Header extends Component { public render() { - const { languageSelection, changeNode, nodeSelection } = this.props; + const { languageSelection, changeNodeIntent, nodeSelection } = this.props; const selectedLanguage = languageSelection; const selectedNode = NODES[nodeSelection]; const selectedNetwork = NETWORKS[selectedNode.network]; @@ -114,7 +118,7 @@ export default class Header extends Component { Add Custom Node } - onChange={changeNode} + onChange={changeNodeIntent} size="smr" color="white" /> diff --git a/common/containers/TabSection/index.tsx b/common/containers/TabSection/index.tsx index 1f88d344..335d79d7 100644 --- a/common/containers/TabSection/index.tsx +++ b/common/containers/TabSection/index.tsx @@ -1,10 +1,10 @@ import { changeGasPrice as dChangeGasPrice, changeLanguage as dChangeLanguage, - changeNode as dChangeNode, + changeNodeIntent as dChangeNodeIntent, TChangeGasPrice, TChangeLanguage, - TChangeNode + TChangeNodeIntent } from 'actions/config'; import { AlphaAgreement, Footer, Header } from 'components'; import React, { Component } from 'react'; @@ -21,7 +21,7 @@ interface Props { gasPriceGwei: number; changeLanguage: TChangeLanguage; - changeNode: TChangeNode; + changeNodeIntent: TChangeNodeIntent; changeGasPrice: TChangeGasPrice; } class TabSection extends Component { @@ -34,7 +34,7 @@ class TabSection extends Component { gasPriceGwei, changeLanguage, - changeNode, + changeNodeIntent, changeGasPrice } = this.props; @@ -44,7 +44,7 @@ class TabSection extends Component { gasPriceGwei, changeLanguage, - changeNode, + changeNodeIntent, changeGasPrice }; @@ -73,5 +73,5 @@ function mapStateToProps(state: AppState) { export default connect(mapStateToProps, { changeGasPrice: dChangeGasPrice, changeLanguage: dChangeLanguage, - changeNode: dChangeNode + changeNodeIntent: dChangeNodeIntent })(TabSection); diff --git a/common/sagas/config.ts b/common/sagas/config.ts index d76c04a2..12e75117 100644 --- a/common/sagas/config.ts +++ b/common/sagas/config.ts @@ -1,13 +1,26 @@ import { SagaIterator } from 'redux-saga'; -import { takeEvery } from 'redux-saga/effects'; +import { call, put, select, takeEvery } from 'redux-saga/effects'; +import { changeNode } from 'actions/config'; +import { NODES } from 'config/data'; +import { getNodeConfig } from 'selectors/config'; // @HACK For now we reload the app when doing a language swap to force non-connected // data to reload. Also the use of timeout to avoid using additional actions for now. function* reload(): SagaIterator { setTimeout(() => location.reload(), 250); } +function* handleNodeChangeIntent(action): SagaIterator { + const nodeConfig = yield select(getNodeConfig); + const currentNetwork = nodeConfig.network; + const actionNetwork = NODES[action.payload].network; + yield put(changeNode(action.payload)); + if (currentNetwork !== actionNetwork) { + yield call(reload); + } +} + export default function* handleConfigChanges(): SagaIterator { - yield takeEvery('CONFIG_NODE_CHANGE', reload); + yield takeEvery('CONFIG_NODE_CHANGE_INTENT', handleNodeChangeIntent); yield takeEvery('CONFIG_LANGUAGE_CHANGE', reload); }