mempool/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts

87 lines
3.2 KiB
TypeScript
Raw Normal View History

2023-07-20 16:26:42 +09:00
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
2023-12-07 08:26:32 +00:00
import { SeoService } from '../../../services/seo.service';
import { WebsocketService } from '../../../services/websocket.service';
import { Acceleration, BlockExtended } from '../../../interfaces/node-api.interface';
import { StateService } from '../../../services/state.service';
import { Observable, Subject, catchError, combineLatest, distinctUntilChanged, of, share, switchMap, tap } from 'rxjs';
import { ApiService } from '../../../services/api.service';
2023-07-21 14:13:18 +09:00
interface AccelerationBlock extends BlockExtended {
accelerationCount: number,
}
2023-07-20 16:26:42 +09:00
@Component({
selector: 'app-accelerator-dashboard',
templateUrl: './accelerator-dashboard.component.html',
styleUrls: ['./accelerator-dashboard.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AcceleratorDashboardComponent implements OnInit {
2023-07-21 14:13:18 +09:00
blocks$: Observable<AccelerationBlock[]>;
2023-12-07 08:26:32 +00:00
accelerations$: Observable<Acceleration[]>;
2023-07-21 14:13:18 +09:00
loadingBlocks: boolean = true;
2023-07-20 16:26:42 +09:00
constructor(
private seoService: SeoService,
private websocketService: WebsocketService,
2023-07-21 14:13:18 +09:00
private apiService: ApiService,
private stateService: StateService,
2023-07-20 16:26:42 +09:00
) {
this.seoService.setTitle($localize`:@@a681a4e2011bb28157689dbaa387de0dd0aa0c11:Accelerator Dashboard`);
}
ngOnInit(): void {
this.websocketService.want(['blocks', 'mempool-blocks', 'stats']);
2023-07-21 14:13:18 +09:00
2023-12-07 08:26:32 +00:00
this.accelerations$ = this.stateService.chainTip$.pipe(
distinctUntilChanged(),
switchMap((chainTip) => {
return this.apiService.getAccelerationHistory$({ timeframe: '1w' });
}),
catchError((e) => {
return of([]);
}),
share(),
);
2023-07-21 14:13:18 +09:00
this.blocks$ = combineLatest([
2023-12-07 08:26:32 +00:00
this.accelerations$,
2023-07-21 14:13:18 +09:00
this.stateService.blocks$.pipe(
switchMap((blocks) => {
if (this.stateService.env.MINING_DASHBOARD === true) {
for (const block of blocks) {
// @ts-ignore: Need to add an extra field for the template
block.extras.pool.logo = `/resources/mining-pools/` +
block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg';
}
}
return of(blocks as AccelerationBlock[]);
2023-12-07 08:26:32 +00:00
}),
tap(() => {
2023-07-21 14:13:18 +09:00
this.loadingBlocks = false;
})
)
]).pipe(
2023-12-07 08:26:32 +00:00
switchMap(([accelerations, blocks]) => {
const blockMap = {};
for (const block of blocks) {
blockMap[block.id] = block;
}
2023-07-21 14:13:18 +09:00
const accelerationsByBlock: { [ hash: string ]: Acceleration[] } = {};
for (const acceleration of accelerations) {
if (['mined', 'completed'].includes(acceleration.status) && acceleration.pools.includes(blockMap[acceleration.blockHash]?.extras.pool.id)) {
if (!accelerationsByBlock[acceleration.blockHash]) {
accelerationsByBlock[acceleration.blockHash] = [];
}
accelerationsByBlock[acceleration.blockHash].push(acceleration);
2023-07-21 14:13:18 +09:00
}
}
return of(blocks.slice(0, 6).map(block => {
block.accelerationCount = (accelerationsByBlock[block.id] || []).length;
return block;
}));
})
);
2023-07-20 16:26:42 +09:00
}
}