@bpanel/price
Version:
Fetch BTC-fiat exchange rate and add to app store.
327 lines (259 loc) • 8.91 kB
JavaScript
;
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);
};
}();
};
};