2024-05-26 20:38:28 +00:00
|
|
|
import { Component, ChangeDetectionStrategy, Input, OnChanges, SimpleChanges } from '@angular/core';
|
|
|
|
import { Transaction } from '../../../interfaces/electrs.interface';
|
|
|
|
import { Acceleration, SinglePoolStats } from '../../../interfaces/node-api.interface';
|
|
|
|
import { EChartsOption, PieSeriesOption } from '../../../graphs/echarts';
|
|
|
|
import { MiningStats } from '../../../services/mining.service';
|
|
|
|
|
|
|
|
|
|
|
|
@Component({
|
|
|
|
selector: 'app-active-acceleration-box',
|
|
|
|
templateUrl: './active-acceleration-box.component.html',
|
|
|
|
styleUrls: ['./active-acceleration-box.component.scss'],
|
|
|
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
|
|
})
|
|
|
|
export class ActiveAccelerationBox implements OnChanges {
|
|
|
|
@Input() tx: Transaction;
|
|
|
|
@Input() accelerationInfo: Acceleration;
|
|
|
|
@Input() miningStats: MiningStats;
|
|
|
|
|
|
|
|
acceleratedByPercentage: string = '';
|
|
|
|
|
|
|
|
chartOptions: EChartsOption = {};
|
|
|
|
chartInitOptions = {
|
|
|
|
renderer: 'svg',
|
|
|
|
};
|
|
|
|
timespan = '';
|
|
|
|
chartInstance: any = undefined;
|
|
|
|
|
|
|
|
constructor() {}
|
|
|
|
|
|
|
|
ngOnChanges(changes: SimpleChanges): void {
|
|
|
|
if (this.tx && (this.tx.acceleratedBy || this.accelerationInfo) && this.miningStats) {
|
|
|
|
this.prepareChartOptions();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
getChartData() {
|
|
|
|
const data: object[] = [];
|
|
|
|
const pools: { [id: number]: SinglePoolStats } = {};
|
|
|
|
for (const pool of this.miningStats.pools) {
|
|
|
|
pools[pool.poolUniqueId] = pool;
|
|
|
|
}
|
|
|
|
|
|
|
|
const getDataItem = (value, color, tooltip) => ({
|
|
|
|
value,
|
|
|
|
itemStyle: {
|
|
|
|
color,
|
|
|
|
borderColor: 'rgba(0,0,0,0)',
|
|
|
|
borderWidth: 1,
|
|
|
|
},
|
|
|
|
avoidLabelOverlap: false,
|
|
|
|
label: {
|
|
|
|
show: false,
|
|
|
|
},
|
|
|
|
labelLine: {
|
|
|
|
show: false
|
|
|
|
},
|
|
|
|
emphasis: {
|
|
|
|
disabled: true,
|
|
|
|
},
|
|
|
|
tooltip: {
|
|
|
|
show: true,
|
|
|
|
backgroundColor: 'rgba(17, 19, 31, 1)',
|
|
|
|
borderRadius: 4,
|
|
|
|
shadowColor: 'rgba(0, 0, 0, 0.5)',
|
|
|
|
textStyle: {
|
|
|
|
color: 'var(--tooltip-grey)',
|
|
|
|
},
|
|
|
|
borderColor: '#000',
|
|
|
|
formatter: () => {
|
|
|
|
return tooltip;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
let totalAcceleratedHashrate = 0;
|
|
|
|
for (const poolId of (this.accelerationInfo?.pools || this.tx.acceleratedBy || [])) {
|
|
|
|
const pool = pools[poolId];
|
|
|
|
if (!pool) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
totalAcceleratedHashrate += parseFloat(pool.lastEstimatedHashrate);
|
|
|
|
}
|
|
|
|
this.acceleratedByPercentage = ((totalAcceleratedHashrate / parseFloat(this.miningStats.lastEstimatedHashrate)) * 100).toFixed(1) + '%';
|
|
|
|
data.push(getDataItem(
|
|
|
|
totalAcceleratedHashrate,
|
2024-05-28 21:07:36 +00:00
|
|
|
'var(--mainnet-alt)',
|
2024-05-26 20:38:28 +00:00
|
|
|
`${this.acceleratedByPercentage} accelerating`,
|
|
|
|
) as PieSeriesOption);
|
|
|
|
const notAcceleratedByPercentage = ((1 - (totalAcceleratedHashrate / parseFloat(this.miningStats.lastEstimatedHashrate))) * 100).toFixed(1) + '%';
|
|
|
|
data.push(getDataItem(
|
|
|
|
(parseFloat(this.miningStats.lastEstimatedHashrate) - totalAcceleratedHashrate),
|
|
|
|
'rgba(127, 127, 127, 0.3)',
|
|
|
|
`${notAcceleratedByPercentage} not accelerating`,
|
|
|
|
) as PieSeriesOption);
|
|
|
|
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
prepareChartOptions() {
|
|
|
|
this.chartOptions = {
|
|
|
|
animation: false,
|
|
|
|
grid: {
|
|
|
|
top: 0,
|
|
|
|
right: 0,
|
|
|
|
bottom: 0,
|
|
|
|
left: 0,
|
|
|
|
},
|
|
|
|
tooltip: {
|
|
|
|
show: true,
|
|
|
|
trigger: 'item',
|
|
|
|
},
|
|
|
|
series: [
|
|
|
|
{
|
|
|
|
type: 'pie',
|
|
|
|
radius: '100%',
|
|
|
|
data: this.getChartData(),
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
onChartInit(ec) {
|
|
|
|
if (this.chartInstance !== undefined) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.chartInstance = ec;
|
|
|
|
}
|
|
|
|
}
|