From dbedf1dbe8254ef21ea9ef6032d6d973606c6fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Fri, 12 Jan 2024 14:48:59 +0300 Subject: [PATCH] Use new balance APIs from akkounts * Use sats integer values instead of floats * Add lightning Network account balance * Use icons and titles/descriptions to discern between balance types * Use more flexible config for balances (to add e.g. RBTC or BTC ecash later) --- app/components/budget-balances/component.js | 7 ++-- app/components/budget-balances/template.hbs | 16 ++++++--- app/helpers/fmt-number.js | 6 ++++ app/services/community-funds.js | 34 ++++++++++++++------ app/services/exchange-rates.js | 6 ++++ app/styles/components/_budget-balances.scss | 11 ++++++- config/environment.js | 20 +++++++++++- public/img/icon-btc-lightning.png | Bin 0 -> 17997 bytes public/img/icon-btc.png | Bin 0 -> 6180 bytes 9 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 app/helpers/fmt-number.js create mode 100644 public/img/icon-btc-lightning.png create mode 100644 public/img/icon-btc.png diff --git a/app/components/budget-balances/component.js b/app/components/budget-balances/component.js index 39b6aa0..26d6264 100644 --- a/app/components/budget-balances/component.js +++ b/app/components/budget-balances/component.js @@ -1,10 +1,13 @@ import Component from '@glimmer/component'; import { inject as service } from '@ember/service'; -import { alias } from '@ember/object/computed'; export default class BudgetBalancesComponent extends Component { @service communityFunds; - @alias('communityFunds.balances') balances; + + get balancesSorted () { + return this.communityFunds.balances + .sortBy('confirmed_balance').reverse(); + } get loading () { return !this.communityFunds.balancesLoaded; diff --git a/app/components/budget-balances/template.hbs b/app/components/budget-balances/template.hbs index 745ad63..2e4c228 100644 --- a/app/components/budget-balances/template.hbs +++ b/app/components/budget-balances/template.hbs @@ -7,11 +7,19 @@ - {{#each this.balances as |balance|}} + {{#each this.balancesSorted as |balance|}} - {{balance.token.symbol}} - {{balance.confirmed_balance}} - ~{{balance.balanceUSD}} USD + + {{balance.token.description}} + + + {{fmt-number balance.confirmed_balance}} sats + + + ~{{balance.balanceUSD}} USD + {{/each}} diff --git a/app/helpers/fmt-number.js b/app/helpers/fmt-number.js new file mode 100644 index 0000000..7fecc81 --- /dev/null +++ b/app/helpers/fmt-number.js @@ -0,0 +1,6 @@ +import { helper } from '@ember/component/helper'; + +export default helper(function fmtNumber(number) { + const lang = navigator.language || navigator.userLanguage; + return number.toLocaleString(lang); +}); diff --git a/app/services/community-funds.js b/app/services/community-funds.js index e431149..ff49fc3 100644 --- a/app/services/community-funds.js +++ b/app/services/community-funds.js @@ -1,7 +1,7 @@ -import Service, { inject as service } from '@ember/service'; -import { tracked } from '@glimmer/tracking'; import { A } from '@ember/array'; import { task } from 'ember-concurrency-decorators'; +import { tracked } from '@glimmer/tracking'; +import Service, { inject as service } from '@ember/service'; import config from 'kredits-web/config/environment'; export default class CommunityFundsService extends Service { @@ -12,9 +12,20 @@ export default class CommunityFundsService extends Service { @task *fetchBalances () { - yield fetch(config.btcBalanceAPI).then(res => res.json()) - .then(res => { - return this.processBalances(res); + const promises = []; + const balances = config.communityFundsAPI.balances; + + for (const item of Object.keys(balances)) { + const c = balances[item]; + promises.push( + this.fetchBalance(c.url) + .then(res => { return this.processBalance(res, c) }) + ) + } + + yield Promise.all(promises) + .then(() => { + this.balancesLoaded = true; }) .catch(err => { console.log(`[community-funds] Fetching balances failed:`); @@ -22,18 +33,21 @@ export default class CommunityFundsService extends Service { }); } - async processBalances (res) { + async fetchBalance(url) { + return fetch(url).then(res => res.json()); + } + + async processBalance (res, config) { await this.exchangeRates.fetchRates(); + // Format and round the approximate USD value const lang = navigator.language || navigator.userLanguage; - const balanceUSD = res.confirmed_balance * this.exchangeRates.btcusd; + const balanceUSD = (res.confirmed_balance / 100000000) * this.exchangeRates.btcusd; res.balanceUSD = Math.round(balanceUSD).toLocaleString(lang); this.balances.pushObject({ ...res, - ...{ token: { name: 'BTC', symbol: 'BTC'} } + ...{ token: { icon: `/img/${config.icon}`, symbol: config.symbol, description: config.description } } }); - - this.balancesLoaded = true; } } diff --git a/app/services/exchange-rates.js b/app/services/exchange-rates.js index f56547f..03d6b7a 100644 --- a/app/services/exchange-rates.js +++ b/app/services/exchange-rates.js @@ -19,7 +19,13 @@ export default class ExchangeRatesService extends Service { @tracked btceur = 0; @tracked btcusd = 0; + get exchangeRatesLoaded () { + return (this.btceur !== 0) && (this.btcusd !== 0); + } + async fetchRates (source='bitstamp') { + if (this.exchangeRatesLoaded) return; + switch(source) { case 'bitstamp': this.btceur = await fetchFromBitstamp('btceur'); diff --git a/app/styles/components/_budget-balances.scss b/app/styles/components/_budget-balances.scss index 3a8263d..1357e7a 100644 --- a/app/styles/components/_budget-balances.scss +++ b/app/styles/components/_budget-balances.scss @@ -16,8 +16,12 @@ section#funds { } th, td { - font-size: 1.2rem; vertical-align: text-bottom; + + img { + max-height: 1.5rem; + max-width: 1.5rem; + } } th { @@ -35,8 +39,13 @@ section#funds { } &.fiat-amount { + font-size: 1.2rem; color: rgba(255,255,255,0.8); } + + span.unit { + font-size: 1.5rem; + } } } } diff --git a/config/environment.js b/config/environment.js index 15321bf..8cc5959 100644 --- a/config/environment.js +++ b/config/environment.js @@ -45,7 +45,22 @@ module.exports = function(environment) { 'BTC': '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599' }, - btcBalanceAPI: 'https://api.kosmos.org/kredits/onchain_btc_balance', + communityFundsAPI: { + balances: { + onchain: { + icon: 'icon-btc.png', + symbol: 'BTC', + description: 'BTC on chain', + url: 'https://api.kosmos.org/btcpay/onchain_btc_balance' + }, + lightning: { + icon: 'icon-btc-lightning.png', + symbol: 'BTC', + description: 'BTC on Lightning Network', + url: 'https://api.kosmos.org/btcpay/lightning_btc_balance' + } + } + }, corsProxy: 'https://cors.5apps.com/?uri=' }; @@ -66,6 +81,9 @@ module.exports = function(environment) { protocol: 'http', gatewayUrl: 'http://localhost:8080/ipfs' }; + + ENV.communityFundsAPI.balances.onchain.url = 'http://localhost:3000/api/btcpay/onchain_btc_balance'; + ENV.communityFundsAPI.balances.lightning.url = 'http://localhost:3000/api/btcpay/lightning_btc_balance'; } if (environment === 'test') { diff --git a/public/img/icon-btc-lightning.png b/public/img/icon-btc-lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..1deb8c55970fb3392b4a8b728b32772df269401e GIT binary patch literal 17997 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 JR?8v!{{chSnuY)X literal 0 HcmV?d00001 diff --git a/public/img/icon-btc.png b/public/img/icon-btc.png new file mode 100644 index 0000000000000000000000000000000000000000..70694134da2c0ae57c74d9fa2f12068e6ea88e9c GIT binary patch literal 6180 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