Address widget timespans
This commit is contained in:
parent
6eb21ffd24
commit
ccb27dbdb9
@ -24,7 +24,8 @@
|
|||||||
{
|
{
|
||||||
"component": "address",
|
"component": "address",
|
||||||
"props": {
|
"props": {
|
||||||
"address": "32ixEdVJWo3kmvJGMTZq5jAQVZZeuwnqzo"
|
"address": "32ixEdVJWo3kmvJGMTZq5jAQVZZeuwnqzo",
|
||||||
|
"period": "1m"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,15 @@ import { Router } from '@angular/router';
|
|||||||
import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe';
|
import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe';
|
||||||
import { StateService } from '../../services/state.service';
|
import { StateService } from '../../services/state.service';
|
||||||
|
|
||||||
|
const periodSeconds = {
|
||||||
|
'1d': (60 * 60 * 24),
|
||||||
|
'3d': (60 * 60 * 24 * 3),
|
||||||
|
'1w': (60 * 60 * 24 * 7),
|
||||||
|
'1m': (60 * 60 * 24 * 30),
|
||||||
|
'6m': (60 * 60 * 24 * 180),
|
||||||
|
'1y': (60 * 60 * 24 * 365),
|
||||||
|
};
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-address-graph',
|
selector: 'app-address-graph',
|
||||||
templateUrl: './address-graph.component.html',
|
templateUrl: './address-graph.component.html',
|
||||||
@ -27,6 +36,7 @@ export class AddressGraphComponent implements OnChanges {
|
|||||||
@Input() address: string;
|
@Input() address: string;
|
||||||
@Input() isPubkey: boolean = false;
|
@Input() isPubkey: boolean = false;
|
||||||
@Input() stats: ChainStats;
|
@Input() stats: ChainStats;
|
||||||
|
@Input() period: '1d' | '3d' | '1w' | '1m' | '6m' | '1y' | 'all' = 'all';
|
||||||
@Input() height: number = 200;
|
@Input() height: number = 200;
|
||||||
@Input() right: number | string = 10;
|
@Input() right: number | string = 10;
|
||||||
@Input() left: number | string = 70;
|
@Input() left: number | string = 70;
|
||||||
@ -84,7 +94,24 @@ export class AddressGraphComponent implements OnChanges {
|
|||||||
return [d.time * 1000, balance, d];
|
return [d.time * 1000, balance, d];
|
||||||
}).reverse();
|
}).reverse();
|
||||||
|
|
||||||
const maxValue = this.data.reduce((acc, d) => Math.max(acc, Math.abs(d[1])), 0);
|
if (this.period !== 'all') {
|
||||||
|
const now = Date.now();
|
||||||
|
const start = now - (periodSeconds[this.period] * 1000);
|
||||||
|
this.data = this.data.filter(d => d[0] >= start);
|
||||||
|
this.data.push(
|
||||||
|
{value: [now, this.stats.funded_txo_sum - this.stats.spent_txo_sum], symbol: 'none', tooltip: { show: false }}
|
||||||
|
);
|
||||||
|
|
||||||
|
// [now, this.stats.funded_txo_sum - this.stats.spent_txo_sum, {
|
||||||
|
// txid: null,
|
||||||
|
// height: null,
|
||||||
|
// value: this.stats.funded_txo_sum - this.stats.spent_txo_sum,
|
||||||
|
// time: Math.floor(now / 1000),
|
||||||
|
// }]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const maxValue = this.data.reduce((acc, d) => Math.max(acc, Math.abs(d[1] || d.value[1])), 0);
|
||||||
|
const minValue = this.data.reduce((acc, d) => Math.min(acc, Math.abs(d[1] || d.value[1])), maxValue);
|
||||||
|
|
||||||
this.chartOptions = {
|
this.chartOptions = {
|
||||||
color: [
|
color: [
|
||||||
@ -115,6 +142,9 @@ export class AddressGraphComponent implements OnChanges {
|
|||||||
},
|
},
|
||||||
borderColor: '#000',
|
borderColor: '#000',
|
||||||
formatter: function (data): string {
|
formatter: function (data): string {
|
||||||
|
if (!data?.length || !data[0]?.data?.[2]?.txid) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
const header = data.length === 1
|
const header = data.length === 1
|
||||||
? `${data[0].data[2].txid.slice(0, 6)}...${data[0].data[2].txid.slice(-6)}`
|
? `${data[0].data[2].txid.slice(0, 6)}...${data[0].data[2].txid.slice(-6)}`
|
||||||
: `${data.length} transactions`;
|
: `${data.length} transactions`;
|
||||||
@ -148,13 +178,17 @@ export class AddressGraphComponent implements OnChanges {
|
|||||||
axisLabel: {
|
axisLabel: {
|
||||||
color: 'rgb(110, 112, 121)',
|
color: 'rgb(110, 112, 121)',
|
||||||
formatter: (val): string => {
|
formatter: (val): string => {
|
||||||
if (maxValue > 1_000_000_000) {
|
let valSpan = maxValue - (this.period === 'all' ? 0 : minValue);
|
||||||
|
if (valSpan > 100_000_000_000) {
|
||||||
return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 0)} BTC`;
|
return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 0)} BTC`;
|
||||||
} else if (maxValue > 100_000_000) {
|
}
|
||||||
|
else if (valSpan > 1_000_000_000) {
|
||||||
|
return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 2)} BTC`;
|
||||||
|
} else if (valSpan > 100_000_000) {
|
||||||
return `${(val / 100_000_000).toFixed(1)} BTC`;
|
return `${(val / 100_000_000).toFixed(1)} BTC`;
|
||||||
} else if (maxValue > 10_000_000) {
|
} else if (valSpan > 10_000_000) {
|
||||||
return `${(val / 100_000_000).toFixed(2)} BTC`;
|
return `${(val / 100_000_000).toFixed(2)} BTC`;
|
||||||
} else if (maxValue > 1_000_000) {
|
} else if (valSpan > 1_000_000) {
|
||||||
return `${(val / 100_000_000).toFixed(3)} BTC`;
|
return `${(val / 100_000_000).toFixed(3)} BTC`;
|
||||||
} else {
|
} else {
|
||||||
return `${this.amountShortenerPipe.transform(val, 0)} sats`;
|
return `${this.amountShortenerPipe.transform(val, 0)} sats`;
|
||||||
@ -164,6 +198,7 @@ export class AddressGraphComponent implements OnChanges {
|
|||||||
splitLine: {
|
splitLine: {
|
||||||
show: false,
|
show: false,
|
||||||
},
|
},
|
||||||
|
min: this.period === 'all' ? 0 : 'dataMin'
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
series: [
|
series: [
|
||||||
|
@ -45,7 +45,6 @@ export class BalanceWidgetComponent implements OnInit, OnChanges {
|
|||||||
}),
|
}),
|
||||||
).subscribe(addressSummary => {
|
).subscribe(addressSummary => {
|
||||||
if (addressSummary) {
|
if (addressSummary) {
|
||||||
console.log('got address summary!');
|
|
||||||
this.error = null;
|
this.error = null;
|
||||||
this.calculateStats(addressSummary);
|
this.calculateStats(addressSummary);
|
||||||
}
|
}
|
||||||
@ -67,6 +66,5 @@ export class BalanceWidgetComponent implements OnInit, OnChanges {
|
|||||||
}
|
}
|
||||||
this.delta7d = weekTotal;
|
this.delta7d = weekTotal;
|
||||||
this.delta30d = monthTotal;
|
this.delta30d = monthTotal;
|
||||||
console.log('calculated address stats: ', weekTotal, monthTotal);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,7 +234,7 @@
|
|||||||
<div class="card graph-card">
|
<div class="card graph-card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="card-title mb-4" i18n="dashboard.balance-history">Balance History</h5>
|
<h5 class="card-title mb-4" i18n="dashboard.balance-history">Balance History</h5>
|
||||||
<app-address-graph [address]="widget.props.address" [stats]="address?.chain_stats" [widget]="true" [height]="graphHeight"></app-address-graph>
|
<app-address-graph [address]="widget.props.address" [period]="widget.props.period || 'all'" [stats]="address?.chain_stats" [widget]="true" [height]="graphHeight"></app-address-graph>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -290,9 +290,6 @@ export class CustomDashboardComponent implements OnInit, OnDestroy, AfterViewIni
|
|||||||
: this.electrsApiService.getAddress$(addressString)
|
: this.electrsApiService.getAddress$(addressString)
|
||||||
).pipe(
|
).pipe(
|
||||||
catchError((err) => {
|
catchError((err) => {
|
||||||
// this.isLoadingAddress = false;
|
|
||||||
// this.error = err;
|
|
||||||
// this.seoService.logSoft404();
|
|
||||||
console.log(err);
|
console.log(err);
|
||||||
return of(null);
|
return of(null);
|
||||||
}),
|
}),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user