From f86645b50cdf1de369f1aec78bdfe50ec1c06834 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 21 Jul 2023 14:13:18 +0900 Subject: [PATCH] Add latest block accelerations list --- .../accelerations-list.component.scss | 2 +- .../accelerations-list.component.ts | 11 +++- .../accelerator-dashboard.component.html | 29 +++++++++-- .../accelerator-dashboard.component.scss | 29 +++++++++++ .../accelerator-dashboard.component.ts | 51 +++++++++++++++++++ 5 files changed, 115 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/components/accelerations-list/accelerations-list.component.scss b/frontend/src/app/components/accelerations-list/accelerations-list.component.scss index 9fd978341..d49ac2609 100644 --- a/frontend/src/app/components/accelerations-list/accelerations-list.component.scss +++ b/frontend/src/app/components/accelerations-list/accelerations-list.component.scss @@ -22,7 +22,7 @@ tr, td, th { border: 0px; padding-top: 0.65rem !important; - padding-bottom: 0.7rem !important; + padding-bottom: 0.8rem !important; .difference { margin-left: 0.5em; diff --git a/frontend/src/app/components/accelerations-list/accelerations-list.component.ts b/frontend/src/app/components/accelerations-list/accelerations-list.component.ts index 10c14a2ad..0b1cdd3ba 100644 --- a/frontend/src/app/components/accelerations-list/accelerations-list.component.ts +++ b/frontend/src/app/components/accelerations-list/accelerations-list.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, ChangeDetectionStrategy, Input, ChangeDetectorRef } from '@angular/core'; -import { Observable, catchError, of } from 'rxjs'; +import { Observable, catchError, of, switchMap } from 'rxjs'; import { Acceleration, BlockExtended } from '../../interfaces/node-api.interface'; import { ApiService } from '../../services/api.service'; import { StateService } from '../../services/state.service'; @@ -39,7 +39,14 @@ export class AccelerationsListComponent implements OnInit { this.skeletonLines = this.widget === true ? [...Array(6).keys()] : [...Array(15).keys()]; this.paginationMaxSize = window.matchMedia('(max-width: 670px)').matches ? 3 : 5; - this.accelerations$ = this.apiService.getAccelerations$().pipe( + this.accelerations$ = this.apiService.getAccelerations$('24h').pipe( + switchMap(accelerations => { + if (this.widget) { + return of(accelerations.slice(0, 6)); + } else { + return of(accelerations); + } + }), catchError((err) => { this.isLoading = false; return of([]); diff --git a/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.html b/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.html index 7a6060500..71baeceb9 100644 --- a/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.html +++ b/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.html @@ -58,16 +58,37 @@ - +
- -
Adjustments
+
+
Latest blocks
 
- + + + + + + + + + + + + + + + +
HeightPoolMedian feeAccelerations
{{ block.height }} + + + {{ block.extras.pool.name }} + + {{ block.accelerationCount | number }}
diff --git a/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.scss b/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.scss index 4f01f7cad..1171846fe 100644 --- a/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.scss +++ b/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.scss @@ -100,3 +100,32 @@ text-decoration: none; color: inherit; } + +.lastest-blocks-table { + width: 100%; + text-align: left; + tr, td, th { + border: 0px; + padding-top: 0.65rem !important; + padding-bottom: 0.8rem !important; + } + .table-cell-height { + width: 25%; + } + .table-cell-fee { + width: 25%; + text-align: right; + } + .table-cell-pool { + text-align: left; + width: 30%; + + .pool-name { + margin-left: 1em; + } + } + .table-cell-acceleration-count { + text-align: right; + width: 20%; + } +} \ No newline at end of file diff --git a/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.ts b/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.ts index edae81aa1..499984d2e 100644 --- a/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.ts +++ b/frontend/src/app/components/accelerator-dashboard/accelerator-dashboard.component.ts @@ -1,6 +1,14 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; 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, catchError, combineLatest, of, switchMap } from 'rxjs'; +import { ApiService } from '../../services/api.service'; + +interface AccelerationBlock extends BlockExtended { + accelerationCount: number, +} @Component({ selector: 'app-accelerator-dashboard', @@ -9,14 +17,57 @@ import { WebsocketService } from '../../services/websocket.service'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class AcceleratorDashboardComponent implements OnInit { + blocks$: Observable; + + loadingBlocks: boolean = true; + constructor( private seoService: SeoService, private websocketService: WebsocketService, + private apiService: ApiService, + private stateService: StateService, ) { this.seoService.setTitle($localize`:@@a681a4e2011bb28157689dbaa387de0dd0aa0c11:Accelerator Dashboard`); } ngOnInit(): void { this.websocketService.want(['blocks', 'mempool-blocks', 'stats']); + + this.blocks$ = combineLatest([ + 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[]); + }) + ), + this.apiService.getAccelerations$('24h').pipe( + catchError((err) => { + this.loadingBlocks = false; + return of([]); + }) + ) + ]).pipe( + switchMap(([blocks, accelerations]) => { + const accelerationsByBlock: { [ hash: string ]: Acceleration[] } = {}; + for (const acceleration of accelerations) { + if (acceleration.mined && !accelerationsByBlock[acceleration.block_hash]) { + accelerationsByBlock[acceleration.block_hash] = []; + } + if (acceleration.mined) { + accelerationsByBlock[acceleration.block_hash].push(acceleration); + } + } + return of(blocks.slice(0, 6).map(block => { + block.accelerationCount = (accelerationsByBlock[block.id] || []).length; + return block; + })); + }) + ); } }