You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
4.5 KiB
181 lines
4.5 KiB
import { createSelector } from 'reselect'
|
|
import { requestTickers } from 'lib/utils/api'
|
|
import { currencies, getDefaultCurrency } from 'lib/i18n'
|
|
import db from 'store/db'
|
|
import { infoSelectors } from './info'
|
|
|
|
// ------------------------------------
|
|
// Constants
|
|
// ------------------------------------
|
|
export const SET_CURRENCY = 'SET_CURRENCY'
|
|
export const SET_CRYPTO = 'SET_CRYPTO'
|
|
export const SET_FIAT_TICKER = 'SET_FIAT_TICKER'
|
|
export const GET_TICKERS = 'GET_TICKERS'
|
|
export const RECIEVE_TICKERS = 'RECIEVE_TICKERS'
|
|
|
|
// Map for crypto codes to crypto tickers
|
|
const cryptoTickers = {
|
|
bitcoin: 'btc',
|
|
litecoin: 'ltc'
|
|
}
|
|
|
|
// Map for crypto names to crypto tickers
|
|
const cryptoNames = {
|
|
bitcoin: 'Bitcoin',
|
|
litecoin: 'Litecoin'
|
|
}
|
|
|
|
// ------------------------------------
|
|
// Actions
|
|
// ------------------------------------
|
|
export function setCurrency(currency) {
|
|
return {
|
|
type: SET_CURRENCY,
|
|
currency
|
|
}
|
|
}
|
|
|
|
export function setCrypto(crypto) {
|
|
return {
|
|
type: SET_CRYPTO,
|
|
crypto
|
|
}
|
|
}
|
|
|
|
export function setFiatTicker(fiatTicker) {
|
|
// Persist the new fiatTicker in our ticker store
|
|
db.settings.put({ key: 'fiatTicker', value: fiatTicker })
|
|
|
|
return {
|
|
type: SET_FIAT_TICKER,
|
|
fiatTicker
|
|
}
|
|
}
|
|
|
|
export function getTickers() {
|
|
return {
|
|
type: GET_TICKERS
|
|
}
|
|
}
|
|
|
|
export function recieveTickers({ btcTicker, ltcTicker }) {
|
|
return {
|
|
type: RECIEVE_TICKERS,
|
|
btcTicker,
|
|
ltcTicker
|
|
}
|
|
}
|
|
|
|
export const fetchTicker = () => async dispatch => {
|
|
dispatch(getTickers())
|
|
const tickers = await requestTickers(['btc', 'ltc'])
|
|
dispatch(recieveTickers(tickers))
|
|
|
|
return tickers
|
|
}
|
|
|
|
// Receive IPC event for receiveCryptocurrency
|
|
export const receiveCryptocurrency = (event, currency) => dispatch => {
|
|
dispatch({ type: SET_CURRENCY, currency: cryptoTickers[currency] })
|
|
dispatch({ type: SET_CRYPTO, crypto: currency })
|
|
}
|
|
|
|
// ------------------------------------
|
|
// Action Handlers
|
|
// ------------------------------------
|
|
const ACTION_HANDLERS = {
|
|
[SET_CURRENCY]: (state, { currency }) => ({ ...state, fromCurrency: state.currency, currency }),
|
|
[SET_CRYPTO]: (state, { crypto }) => ({ ...state, crypto }),
|
|
[SET_FIAT_TICKER]: (state, { fiatTicker }) => ({ ...state, fiatTicker }),
|
|
[GET_TICKERS]: state => ({ ...state, tickerLoading: true }),
|
|
[RECIEVE_TICKERS]: (state, { btcTicker, ltcTicker }) => ({
|
|
...state,
|
|
tickerLoading: false,
|
|
btcTicker,
|
|
ltcTicker
|
|
})
|
|
}
|
|
|
|
// Selectors
|
|
const tickerSelectors = {}
|
|
const cryptoSelector = state => state.ticker.crypto
|
|
const currencySelector = state => state.ticker.currency
|
|
const currencyFiltersSelector = state => state.ticker.currencyFilters
|
|
const bitcoinTickerSelector = state => state.ticker.btcTicker
|
|
const litecoinTickerSelector = state => state.ticker.ltcTicker
|
|
const tickerLoadingSelector = state => state.ticker.tickerLoading
|
|
|
|
tickerSelectors.currency = currencySelector
|
|
tickerSelectors.tickerLoading = tickerLoadingSelector
|
|
|
|
tickerSelectors.currentTicker = createSelector(
|
|
cryptoSelector,
|
|
bitcoinTickerSelector,
|
|
litecoinTickerSelector,
|
|
(crypto, btcTicker, ltcTicker) => (crypto === 'bitcoin' ? btcTicker : ltcTicker)
|
|
)
|
|
|
|
tickerSelectors.cryptoName = createSelector(cryptoSelector, crypto => cryptoNames[crypto])
|
|
|
|
tickerSelectors.currencyFilters = createSelector(
|
|
infoSelectors.networkSelector,
|
|
currencyFiltersSelector,
|
|
(network, currencyFilters = []) => {
|
|
if (!network || !network.unitPrefix) {
|
|
return currencyFilters
|
|
}
|
|
return currencyFilters.map(item => {
|
|
item.name = `${network.unitPrefix}${item.name}`
|
|
return item
|
|
})
|
|
}
|
|
)
|
|
|
|
tickerSelectors.currencyName = createSelector(
|
|
currencySelector,
|
|
tickerSelectors.currencyFilters,
|
|
(currency, currencyFilters = []) => {
|
|
let unit = currency
|
|
const selectedCurrency = currencyFilters.find(c => c.key === currency)
|
|
if (selectedCurrency) {
|
|
unit = selectedCurrency.name
|
|
}
|
|
return unit
|
|
}
|
|
)
|
|
|
|
export { tickerSelectors }
|
|
|
|
// ------------------------------------
|
|
// Reducer
|
|
// ------------------------------------
|
|
const initialState = {
|
|
tickerLoading: false,
|
|
currency: null,
|
|
fromCurrency: null,
|
|
crypto: null,
|
|
btcTicker: null,
|
|
ltcTicker: null,
|
|
fiatTicker: getDefaultCurrency(),
|
|
fiatTickers: currencies,
|
|
currencyFilters: [
|
|
{
|
|
key: 'btc',
|
|
name: 'BTC'
|
|
},
|
|
{
|
|
key: 'bits',
|
|
name: 'bits'
|
|
},
|
|
{
|
|
key: 'sats',
|
|
name: 'satoshis'
|
|
}
|
|
]
|
|
}
|
|
|
|
export default function tickerReducer(state = initialState, action) {
|
|
const handler = ACTION_HANDLERS[action.type]
|
|
|
|
return handler ? handler(state, action) : state
|
|
}
|
|
|