UNPKG

@bpanel/price

Version:

Fetch BTC-fiat exchange rate and add to app store.

327 lines (259 loc) 8.91 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.middleware = exports.pluginReducers = exports.metadata = undefined; var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _isNan = require('babel-runtime/core-js/number/is-nan'); var _isNan2 = _interopRequireDefault(_isNan); var _feeds = require('./feeds'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable no-console */ /* Imports */ var _require = require('@bpanel/bpanel-utils'), CURRENCY_UNITS = _require.CURRENCY_UNITS; /* Constants */ var fiatSymbols = { USD: '$', AUD: '$', NZD: '$', BRL: 'R$', GBP: '£', EUR: '€', JPY: '¥', CNY: '¥', CAD: '$', INR: '₹', KRW: '₩', THB: '฿', RUB: '₽' }; /* Utility */ function getTickerFromChain(chain) { var unit = CURRENCY_UNITS[chain].unit; return unit.toUpperCase(); } function isFloat(x) { return !(0, _isNan2.default)(parseFloat(x)); } /* Actions and Reducers */ var initState = { price: 0, fiat: 'USD', fiatSymbol: '$', crypto: '', feed: (0, _keys2.default)(_feeds.feeds)[0], availableFeeds: (0, _keys2.default)(_feeds.feeds), availableFiats: ['USD'] }; // TODO: check value before setting state in case of ignorant plugin function priceReducer() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initState; var action = arguments[1]; var newState = (0, _extends3.default)({}, state); switch (action.type) { case 'UPDATE_PRICE': { var newPrice = action.payload; if (!isFloat(newPrice)) { newPrice = 0; console.log('Price feed API error: not a valid price'); } newState.price = newPrice; return newState; } case 'UPDATE_FIAT': { var newFiat = action.payload; if (!state.availableFiats.includes(newFiat)) throw new Error('Selected fiat currency is not available'); newState.fiat = newFiat; newState.fiatSymbol = fiatSymbols[action.payload] || ''; return newState; } case 'UPDATE_CRYPTO': { newState.crypto = action.payload; return newState; } case 'SET_FEED': { var newFeed = action.payload; if (!state.availableFeeds.includes(newFeed)) throw new Error('Selected API feed is not available'); newState.feed = newFeed; return newState; } case 'UPDATE_AVAIL_FIATS': { newState.availableFiats = action.payload; return newState; } default: return state; } } var updatePrice = function updatePrice(price) { return { type: 'UPDATE_PRICE', payload: price }; }; var updateCrypto = function updateCrypto(crypto) { return { type: 'UPDATE_CRYPTO', payload: crypto }; }; var updateAvailFiats = function updateAvailFiats(fiats) { return { type: 'UPDATE_AVAIL_FIATS', payload: fiats }; }; var setFeed = function setFeed(feed) { return { type: 'SET_FEED', payload: feed }; }; var updateFiat = function updateFiat(fiat) { return { type: 'UPDATE_FIAT', payload: fiat }; }; var refreshPrice = function refreshPrice() { return { type: 'REFRESH_PRICE', payload: {} }; }; /* Exports */ var metadata = exports.metadata = { name: 'price', pathName: 'Price', displayName: 'Price', author: 'Matthew Zipkin', description: 'Fetch BTC-fiat exchange rate and add to app store.', version: require('../package.json').version }; var pluginReducers = exports.pluginReducers = { price: priceReducer }; var middleware = exports.middleware = function middleware(store) { return function (next) { return function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(action) { var dispatch, getState, priceState, currentFeed, currentFiat, price, chain, ticker, newPriceState, newFeed, availableFiats, feedObject, _availableFiats; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: dispatch = store.dispatch, getState = store.getState; priceState = getState().plugins.price; currentFeed = _feeds.feeds[priceState.feed]; currentFiat = priceState.fiat; price = void 0; _context.t0 = action.type; _context.next = _context.t0 === 'SET_LOADING' ? 8 : _context.t0 === 'STATE_REFRESHED' ? 8 : _context.t0 === 'REFRESH_PRICE' ? 38 : _context.t0 === 'UPDATE_FEED' ? 50 : 66; break; case 8: if (!(action.type === 'SET_LOADING' && action.payload)) { _context.next = 10; break; } return _context.abrupt('break', 66); case 10: // Get current chain and update to new crypto chain = getState().clients.currentClient.chain; ticker = getTickerFromChain(chain); dispatch(updateCrypto(ticker)); // now that crypto has been updated in state, get price and fiat options newPriceState = getState().plugins.price; newFeed = _feeds.feeds[newPriceState.feed]; _context.prev = 15; _context.next = 18; return newFeed.getPrice(newPriceState); case 18: price = _context.sent; dispatch(updatePrice(price)); _context.next = 26; break; case 22: _context.prev = 22; _context.t1 = _context['catch'](15); console.log('Error updating price: ', _context.t1); dispatch(updatePrice(0)); case 26: _context.prev = 26; _context.next = 29; return newFeed.getFiats(); case 29: availableFiats = _context.sent; dispatch(updateAvailFiats(availableFiats)); _context.next = 37; break; case 33: _context.prev = 33; _context.t2 = _context['catch'](26); console.log('Error updating fiats: ', _context.t2); dispatch(updateAvailFiats([])); case 37: return _context.abrupt('break', 66); case 38: _context.prev = 38; _context.next = 41; return currentFeed.getPrice(priceState); case 41: price = _context.sent; dispatch(updatePrice(price)); _context.next = 49; break; case 45: _context.prev = 45; _context.t3 = _context['catch'](38); console.log('Error updating price: ', _context.t3); dispatch(updatePrice(0)); case 49: return _context.abrupt('break', 66); case 50: dispatch(setFeed(action.payload)); feedObject = _feeds.feeds[action.payload]; _context.prev = 52; _context.next = 55; return feedObject.getFiats(); case 55: _availableFiats = _context.sent; dispatch(updateAvailFiats(_availableFiats)); if (!_availableFiats.includes(currentFiat)) dispatch(updateFiat(_availableFiats[0])); _context.next = 64; break; case 60: _context.prev = 60; _context.t4 = _context['catch'](52); console.log('Error updating fiats: ', _context.t4); dispatch(updateAvailFiats([])); case 64: dispatch(refreshPrice()); return _context.abrupt('break', 66); case 66: return _context.abrupt('return', next(action)); case 67: case 'end': return _context.stop(); } } }, _callee, undefined, [[15, 22], [26, 33], [38, 45], [52, 60]]); })); return function (_x2) { return _ref.apply(this, arguments); }; }(); }; };