BlueWallet/currency.js

114 lines
3.4 KiB
JavaScript
Raw Normal View History

2018-07-06 16:38:42 +01:00
import Frisbee from 'frisbee';
import { AsyncStorage } from 'react-native';
import { AppStorage } from './class';
2018-12-24 01:14:53 -05:00
import { FiatUnit } from './models/fiatUnit';
let BigNumber = require('bignumber.js');
2018-12-24 01:14:53 -05:00
let preferredFiatCurrency = FiatUnit.USD;
2018-07-06 16:38:42 +01:00
let lang = {};
// let btcusd = 6500; // default
const STRUCT = {
LAST_UPDATED: 'LAST_UPDATED',
BTC_USD: 'BTC_USD',
2018-12-24 01:14:53 -05:00
BTC_EUR: 'BTC_EUR',
2018-07-06 16:38:42 +01:00
};
async function updateExchangeRate() {
let preferredFiatCurrency;
try {
preferredFiatCurrency = JSON.parse(await AsyncStorage.getItem(AppStorage.PREFERREDCURRENCY));
if (preferredFiatCurrency === null) {
throw Error();
}
} catch (_error) {
preferredFiatCurrency = FiatUnit.USD;
}
2018-07-06 16:38:42 +01:00
if (+new Date() - lang[STRUCT.LAST_UPDATED] <= 30 * 60 * 1000) {
// not updating too often
return;
}
let json;
try {
const api = new Frisbee({
baseURI: 'https://www.bitstamp.net',
});
2018-12-24 01:14:53 -05:00
let response = await api.get('/api/v2/ticker/' + preferredFiatCurrency.endPointKey);
2018-07-06 16:38:42 +01:00
json = response.body;
if (typeof json === 'undefined' || typeof json.last === 'undefined') {
throw new Error('Could not update currency rate: ' + response.err);
}
} catch (Err) {
console.warn(Err);
2018-10-10 19:52:26 +01:00
return;
2018-07-06 16:38:42 +01:00
}
lang[STRUCT.LAST_UPDATED] = +new Date();
2018-12-24 01:14:53 -05:00
lang[STRUCT[preferredFiatCurrency.storageKey]] = json.last * 1;
2018-07-06 16:38:42 +01:00
await AsyncStorage.setItem(AppStorage.CURRENCY, JSON.stringify(lang));
}
2018-12-24 01:14:53 -05:00
async function startUpdater(force = false) {
if (force) {
const lang = JSON.parse(await AsyncStorage.getItem(AppStorage.CURRENCY));
delete lang[STRUCT.LAST_UPDATED];
2018-12-24 01:14:53 -05:00
await AsyncStorage.setItem(AppStorage.CURRENCY, JSON.stringify(lang));
try {
preferredFiatCurrency = JSON.parse(await AsyncStorage.getItem(AppStorage.PREFERREDCURRENCY));
if (preferredFiatCurrency === null) {
throw Error();
}
} catch (_error) {
preferredFiatCurrency = FiatUnit.USD;
}
2018-12-24 01:14:53 -05:00
}
2018-07-06 16:38:42 +01:00
lang = await AsyncStorage.getItem(AppStorage.CURRENCY);
try {
lang = JSON.parse(lang);
} catch (Err) {
lang = {};
}
lang = lang || {};
lang[STRUCT.LAST_UPDATED] = lang[STRUCT.LAST_UPDATED] || 0;
2018-12-24 01:14:53 -05:00
lang[STRUCT[preferredFiatCurrency.storageKey]] = lang[STRUCT[preferredFiatCurrency.storageKey]] || 6500;
setInterval(() => updateExchangeRate(), 2 * 60 * 100);
2018-07-06 16:38:42 +01:00
return updateExchangeRate();
}
function satoshiToLocalCurrency(satoshi) {
2018-12-24 01:14:53 -05:00
if (!lang[STRUCT[preferredFiatCurrency.storageKey]]) return satoshi;
let b = new BigNumber(satoshi);
b = b
.dividedBy(100000000)
2018-12-24 01:14:53 -05:00
.multipliedBy(lang[STRUCT[preferredFiatCurrency.storageKey]])
.toString(10);
b = parseFloat(b).toFixed(2);
2018-12-24 01:14:53 -05:00
const formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: preferredFiatCurrency.formatterValue,
minimumFractionDigits: 2,
});
return formatter.format(b);
}
2018-12-23 00:43:50 -05:00
function BTCToLocalCurrency(bitcoin) {
2018-12-24 18:12:09 +00:00
let sat = new BigNumber(bitcoin);
sat = sat.multipliedBy(100000000).toNumber();
2018-12-23 00:43:50 -05:00
2018-12-24 18:12:09 +00:00
return satoshiToLocalCurrency(sat);
2018-12-23 00:43:50 -05:00
}
function satoshiToBTC(satoshi) {
let b = new BigNumber(satoshi);
b = b.dividedBy(100000000);
return b.toString(10) + ' BTC';
}
2018-07-06 16:38:42 +01:00
module.exports.updateExchangeRate = updateExchangeRate;
module.exports.startUpdater = startUpdater;
module.exports.STRUCT = STRUCT;
module.exports.satoshiToLocalCurrency = satoshiToLocalCurrency;
module.exports.satoshiToBTC = satoshiToBTC;
2018-12-23 00:53:26 -05:00
module.exports.BTCToLocalCurrency = BTCToLocalCurrency;