diff --git a/common/actions/rates/actionCreators.ts b/common/actions/rates/actionCreators.ts index 98f1e2e7..22b82167 100644 --- a/common/actions/rates/actionCreators.ts +++ b/common/actions/rates/actionCreators.ts @@ -1,12 +1,12 @@ import * as interfaces from './actionTypes'; import { TypeKeys } from './constants'; -import { fetchRates, CCResponse } from './actionPayloads'; +import { CCResponse } from 'api/rates'; -export type TFetchCCRates = typeof fetchCCRates; -export function fetchCCRates(symbols: string[] = []): interfaces.FetchCCRates { +export type TFetchCCRatesRequested = typeof fetchCCRatesRequested; +export function fetchCCRatesRequested(symbols: string[] = []): interfaces.FetchCCRatesRequested { return { - type: TypeKeys.RATES_FETCH_CC, - payload: fetchRates(symbols) + type: TypeKeys.RATES_FETCH_CC_REQUESTED, + payload: symbols }; } diff --git a/common/actions/rates/actionTypes.ts b/common/actions/rates/actionTypes.ts index f0d3ca4a..abd4d9eb 100644 --- a/common/actions/rates/actionTypes.ts +++ b/common/actions/rates/actionTypes.ts @@ -1,9 +1,9 @@ import { TypeKeys } from './constants'; -import { CCResponse } from './actionPayloads'; +import { CCResponse } from 'api/rates'; -export interface FetchCCRates { - type: TypeKeys.RATES_FETCH_CC; - payload: Promise; +export interface FetchCCRatesRequested { + type: TypeKeys.RATES_FETCH_CC_REQUESTED; + payload: string[]; } /*** Set rates ***/ @@ -17,4 +17,4 @@ export interface FetchCCRatesFailed { } /*** Union Type ***/ -export type RatesAction = FetchCCRates | FetchCCRatesSucceeded | FetchCCRatesFailed; +export type RatesAction = FetchCCRatesRequested | FetchCCRatesSucceeded | FetchCCRatesFailed; diff --git a/common/actions/rates/constants.ts b/common/actions/rates/constants.ts index 74999a17..419a1c30 100644 --- a/common/actions/rates/constants.ts +++ b/common/actions/rates/constants.ts @@ -1,5 +1,5 @@ export enum TypeKeys { - RATES_FETCH_CC = 'RATES_FETCH_CC', + RATES_FETCH_CC_REQUESTED = 'RATES_FETCH_CC_REQUESTED', RATES_FETCH_CC_FAILED = 'RATES_FETCH_CC_FAILED', RATES_FETCH_CC_SUCCEEDED = 'RATES_FETCH_CC_SUCCEEDED' } diff --git a/common/actions/rates/index.ts b/common/actions/rates/index.ts index 0028ed74..113dd69a 100644 --- a/common/actions/rates/index.ts +++ b/common/actions/rates/index.ts @@ -1,3 +1,2 @@ export * from './actionCreators'; export * from './actionTypes'; -export * from './actionPayloads'; diff --git a/common/actions/rates/actionPayloads.ts b/common/api/rates.ts similarity index 100% rename from common/actions/rates/actionPayloads.ts rename to common/api/rates.ts diff --git a/common/components/BalanceSidebar/EquivalentValues.tsx b/common/components/BalanceSidebar/EquivalentValues.tsx index f09a1154..9199f570 100644 --- a/common/components/BalanceSidebar/EquivalentValues.tsx +++ b/common/components/BalanceSidebar/EquivalentValues.tsx @@ -2,7 +2,8 @@ import React from 'react'; import translate from 'translations'; import { UnitDisplay, Spinner } from 'components/ui'; import Select from 'react-select'; -import { TFetchCCRates, fetchCCRates, rateSymbols } from 'actions/rates'; +import { TFetchCCRatesRequested, fetchCCRatesRequested } from 'actions/rates'; +import { rateSymbols } from 'api/rates'; import { chain, flatMap } from 'lodash'; import { TokenBalance, getShownTokenBalances } from 'selectors/wallet'; import { Balance } from 'libs/wallet'; @@ -43,7 +44,7 @@ interface StateProps { } interface DispatchProps { - fetchCCRates: TFetchCCRates; + fetchCCRates: TFetchCCRatesRequested; } type Props = StateProps & DispatchProps; @@ -266,4 +267,4 @@ function mapStateToProps(state: AppState): StateProps { }; } -export default connect(mapStateToProps, { fetchCCRates })(EquivalentValues); +export default connect(mapStateToProps, { fetchCCRates: fetchCCRatesRequested })(EquivalentValues); diff --git a/common/components/TXMetaDataPanel/TXMetaDataPanel.tsx b/common/components/TXMetaDataPanel/TXMetaDataPanel.tsx index 75d01ece..2efc5a00 100644 --- a/common/components/TXMetaDataPanel/TXMetaDataPanel.tsx +++ b/common/components/TXMetaDataPanel/TXMetaDataPanel.tsx @@ -12,7 +12,7 @@ import { reset, TReset } from 'actions/transaction'; -import { fetchCCRates, TFetchCCRates } from 'actions/rates'; +import { fetchCCRatesRequested, TFetchCCRatesRequested } from 'actions/rates'; import { getNetworkConfig, getOffline } from 'selectors/config'; import { AppState } from 'reducers'; import { Units } from 'libs/units'; @@ -32,7 +32,7 @@ interface StateProps { interface DispatchProps { inputGasPrice: TInputGasPrice; inputGasPriceIntent: TInputGasPriceIntent; - fetchCCRates: TFetchCCRates; + fetchCCRates: TFetchCCRatesRequested; getNonceRequested: TGetNonceRequested; reset: TReset; } @@ -144,7 +144,7 @@ function mapStateToProps(state: AppState): StateProps { export default connect(mapStateToProps, { inputGasPrice, inputGasPriceIntent, - fetchCCRates, + fetchCCRates: fetchCCRatesRequested, getNonceRequested, reset })(TXMetaDataPanel); diff --git a/common/reducers/rates.ts b/common/reducers/rates.ts index 731e4860..655fc852 100644 --- a/common/reducers/rates.ts +++ b/common/reducers/rates.ts @@ -1,4 +1,5 @@ -import { FetchCCRatesSucceeded, RatesAction, CCResponse } from 'actions/rates'; +import { FetchCCRatesSucceeded, RatesAction } from 'actions/rates'; +import { CCResponse } from 'api/rates'; import { TypeKeys } from 'actions/rates/constants'; // SYMBOL -> PRICE TO BUY 1 ETH diff --git a/common/sagas/index.ts b/common/sagas/index.ts index 3bc3e5a9..ac57d8ac 100644 --- a/common/sagas/index.ts +++ b/common/sagas/index.ts @@ -1,6 +1,7 @@ import configSaga from './config'; import deterministicWallets from './deterministicWallets'; import notifications from './notifications'; +import rates from './rates'; import { swapTimerSaga, pollBityOrderStatusSaga, @@ -31,5 +32,6 @@ export default { wallet, transaction, deterministicWallets, - swapProviderSaga + swapProviderSaga, + rates }; diff --git a/common/sagas/rates.ts b/common/sagas/rates.ts new file mode 100644 index 00000000..b56b9c39 --- /dev/null +++ b/common/sagas/rates.ts @@ -0,0 +1,19 @@ +import { fetchCCRatesSucceeded, fetchCCRatesFailed, FetchCCRatesRequested } from 'actions/rates'; +import { SagaIterator } from 'redux-saga'; +import { call, put, takeLatest } from 'redux-saga/effects'; +import { fetchRates, CCResponse } from 'api/rates'; +import { TypeKeys } from 'actions/rates/constants'; + +export function* fetchRatesSaga(action: FetchCCRatesRequested): SagaIterator { + try { + const rates: CCResponse = yield call(fetchRates, action.payload); + yield put(fetchCCRatesSucceeded(rates)); + } catch (e) { + yield put(fetchCCRatesFailed()); + return; + } +} + +export default function* ratesSaga(): SagaIterator { + yield takeLatest(TypeKeys.RATES_FETCH_CC_REQUESTED, fetchRatesSaga); +} diff --git a/common/store.ts b/common/store.ts index 958a1d1a..603a7d90 100644 --- a/common/store.ts +++ b/common/store.ts @@ -12,7 +12,6 @@ import { createLogger } from 'redux-logger'; import createSagaMiddleware from 'redux-saga'; import { loadStatePropertyOrEmptyObject, saveState } from 'utils/localStorage'; import RootReducer, { AppState } from './reducers'; -import promiseMiddleware from 'redux-promise-middleware'; import { getNodeConfigFromId } from 'utils/node'; import { getNetworkConfigFromId } from 'utils/network'; import { dedupeCustomTokens } from 'utils/tokens'; @@ -23,27 +22,15 @@ const configureStore = () => { collapsed: true }); const sagaMiddleware = createSagaMiddleware(); - const reduxPromiseMiddleWare = promiseMiddleware({ - promiseTypeSuffixes: ['REQUESTED', 'SUCCEEDED', 'FAILED'] - }); let middleware; let store; if (process.env.NODE_ENV !== 'production') { middleware = composeWithDevTools( - applyMiddleware( - sagaMiddleware, - logger, - reduxPromiseMiddleWare, - routerMiddleware(history as any) - ) + applyMiddleware(sagaMiddleware, logger, routerMiddleware(history as any)) ); } else { - middleware = applyMiddleware( - sagaMiddleware, - reduxPromiseMiddleWare, - routerMiddleware(history as any) - ); + middleware = applyMiddleware(sagaMiddleware, routerMiddleware(history as any)); } const localSwapState = loadStatePropertyOrEmptyObject('swap'); diff --git a/package.json b/package.json index a7683183..8ad678c6 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "react-transition-group": "2.2.1", "redux": "3.7.2", "redux-logger": "3.0.6", - "redux-promise-middleware": "4.4.2", "redux-saga": "0.16.0", "scryptsy": "2.0.0", "uuid": "3.2.1", @@ -68,7 +67,6 @@ "@types/react-router-redux": "5.0.11", "@types/react-select": "1.2.0", "@types/redux-logger": "3.0.5", - "@types/redux-promise-middleware": "0.0.9", "@types/uuid": "3.4.3", "@types/webpack-env": "1.13.4", "@types/zxcvbn": "4.4.0", diff --git a/spec/reducers/rates.spec.ts b/spec/reducers/rates.spec.ts index 70087860..925a440d 100644 --- a/spec/reducers/rates.spec.ts +++ b/spec/reducers/rates.spec.ts @@ -1,9 +1,10 @@ import { rates, INITIAL_STATE } from 'reducers/rates'; import * as ratesActions from 'actions/rates'; +import { CCResponse } from 'api/rates'; describe('rates reducer', () => { it('should handle RATES_FETCH_CC_SUCCEEDED', () => { - const fakeCCResp: ratesActions.CCResponse = { + const fakeCCResp: CCResponse = { ETH: { USD: 0, BTC: 1, diff --git a/spec/sagas/rates.spec.ts b/spec/sagas/rates.spec.ts new file mode 100644 index 00000000..3e4ba02d --- /dev/null +++ b/spec/sagas/rates.spec.ts @@ -0,0 +1,27 @@ +import { fetchRatesSaga } from 'sagas/rates'; +import { call, put } from 'redux-saga/effects'; +import { fetchCCRatesSucceeded, fetchCCRatesFailed, fetchCCRatesRequested } from 'actions/rates'; +import { fetchRates } from 'api/rates'; +describe('fetch rates saga success', () => { + const saga = fetchRatesSaga(fetchCCRatesRequested()); + it('should fetch the rates', () => { + expect(saga.next().value).toEqual(call(fetchRates, [])); + }); + it('should dispatch a success action', () => { + expect(saga.next({}).value).toEqual(put(fetchCCRatesSucceeded({}))); + }); + it('should be done', () => { + expect(saga.next().done).toEqual(true); + }); +}); + +describe('fetch rates saga failure', () => { + const saga = fetchRatesSaga(fetchCCRatesRequested()); + it('it should throw and dispatch a failure action', () => { + saga.next(); + expect(saga.throw!().value).toEqual(put(fetchCCRatesFailed())); + }); + it('should be done', () => { + expect(saga.next().done).toEqual(true); + }); +}); diff --git a/webpack_config/config.js b/webpack_config/config.js index b7a9576f..c39ee7d4 100644 --- a/webpack_config/config.js +++ b/webpack_config/config.js @@ -66,7 +66,6 @@ module.exports = { 'react-transition-group', 'redux', 'redux-logger', - 'redux-promise-middleware', 'redux-saga', 'scryptsy', 'uuid',