mirror of
https://github.com/mempool/mempool.git
synced 2024-12-28 01:04:28 +01:00
Refactor to use OnPush
This commit is contained in:
parent
c1caaa37aa
commit
bb6272469d
@ -1,7 +1,7 @@
|
|||||||
<div class="container-xl" *ngIf="mempoolBlock$ | async as mempoolBlock">
|
<div class="container-xl" *ngIf="mempoolBlock$ | async as mempoolBlock">
|
||||||
|
|
||||||
<div class="title-block">
|
<div class="title-block">
|
||||||
<h1 class="float-left">{{ ordinal }}</h1>
|
<h1 class="float-left">{{ ordinal$ | async }}</h1>
|
||||||
<button [routerLink]="['/' | relativeUrl]" class="btn btn-sm float-right mr-2 mt-2">✕</button>
|
<button [routerLink]="['/' | relativeUrl]" class="btn btn-sm float-right mr-2 mt-2">✕</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -32,7 +32,7 @@
|
|||||||
<td>Filled</td>
|
<td>Filled</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="progress position-relative">
|
<div class="progress position-relative">
|
||||||
<div class="progress-bar progress-mempool {{ network }}" role="progressbar" [ngStyle]="{'width': (mempoolBlock.blockVSize / 1000000) * 100 + '%' }"></div>
|
<div class="progress-bar progress-mempool {{ (network$ | async) }}" role="progressbar" [ngStyle]="{'width': (mempoolBlock.blockVSize / 1000000) * 100 + '%' }"></div>
|
||||||
<div class="progress-text">{{ mempoolBlock.blockSize | bytes: 2 }}</div>
|
<div class="progress-text">{{ mempoolBlock.blockSize | bytes: 2 }}</div>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
@ -1,22 +1,23 @@
|
|||||||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';
|
||||||
import { StateService } from 'src/app/services/state.service';
|
import { StateService } from 'src/app/services/state.service';
|
||||||
import { ActivatedRoute, ParamMap } from '@angular/router';
|
import { ActivatedRoute, ParamMap } from '@angular/router';
|
||||||
import { switchMap, map, tap, filter } from 'rxjs/operators';
|
import { switchMap, map, tap, filter } from 'rxjs/operators';
|
||||||
import { MempoolBlock } from 'src/app/interfaces/websocket.interface';
|
import { MempoolBlock } from 'src/app/interfaces/websocket.interface';
|
||||||
import { Observable } from 'rxjs';
|
import { Observable, BehaviorSubject } from 'rxjs';
|
||||||
import { SeoService } from 'src/app/services/seo.service';
|
import { SeoService } from 'src/app/services/seo.service';
|
||||||
import { env } from 'src/app/app.constants';
|
import { env } from 'src/app/app.constants';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-mempool-block',
|
selector: 'app-mempool-block',
|
||||||
templateUrl: './mempool-block.component.html',
|
templateUrl: './mempool-block.component.html',
|
||||||
styleUrls: ['./mempool-block.component.scss']
|
styleUrls: ['./mempool-block.component.scss'],
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
})
|
})
|
||||||
export class MempoolBlockComponent implements OnInit, OnDestroy {
|
export class MempoolBlockComponent implements OnInit, OnDestroy {
|
||||||
network = '';
|
network$: Observable<string>;
|
||||||
mempoolBlockIndex: number;
|
mempoolBlockIndex: number;
|
||||||
mempoolBlock$: Observable<MempoolBlock>;
|
mempoolBlock$: Observable<MempoolBlock>;
|
||||||
ordinal: string;
|
ordinal$: BehaviorSubject<string> = new BehaviorSubject('');
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
@ -30,47 +31,47 @@ export class MempoolBlockComponent implements OnInit, OnDestroy {
|
|||||||
switchMap((params: ParamMap) => {
|
switchMap((params: ParamMap) => {
|
||||||
this.mempoolBlockIndex = parseInt(params.get('id'), 10) || 0;
|
this.mempoolBlockIndex = parseInt(params.get('id'), 10) || 0;
|
||||||
return this.stateService.mempoolBlocks$
|
return this.stateService.mempoolBlocks$
|
||||||
.pipe(
|
.pipe(
|
||||||
map((blocks) => {
|
map((blocks) => {
|
||||||
if (!blocks.length) {
|
if (!blocks.length) {
|
||||||
return [{ index: 0, blockSize: 0, blockVSize: 0, feeRange: [0, 0], medianFee: 0, nTx: 0, totalFees: 0 }];
|
return [{ index: 0, blockSize: 0, blockVSize: 0, feeRange: [0, 0], medianFee: 0, nTx: 0, totalFees: 0 }];
|
||||||
}
|
}
|
||||||
return blocks;
|
return blocks;
|
||||||
}),
|
}),
|
||||||
filter((mempoolBlocks) => mempoolBlocks.length > 0),
|
filter((mempoolBlocks) => mempoolBlocks.length > 0),
|
||||||
map((mempoolBlocks) => {
|
map((mempoolBlocks) => {
|
||||||
while (!mempoolBlocks[this.mempoolBlockIndex]) {
|
while (!mempoolBlocks[this.mempoolBlockIndex]) {
|
||||||
this.mempoolBlockIndex--;
|
this.mempoolBlockIndex--;
|
||||||
}
|
}
|
||||||
this.setOrdinal(mempoolBlocks[this.mempoolBlockIndex]);
|
const ordinal = this.getOrdinal(mempoolBlocks[this.mempoolBlockIndex]);
|
||||||
this.seoService.setTitle(this.ordinal);
|
this.ordinal$.next(ordinal);
|
||||||
return mempoolBlocks[this.mempoolBlockIndex];
|
this.seoService.setTitle(ordinal);
|
||||||
})
|
return mempoolBlocks[this.mempoolBlockIndex];
|
||||||
);
|
})
|
||||||
|
);
|
||||||
}),
|
}),
|
||||||
tap(() => {
|
tap(() => {
|
||||||
this.stateService.markBlock$.next({ mempoolBlockIndex: this.mempoolBlockIndex });
|
this.stateService.markBlock$.next({ mempoolBlockIndex: this.mempoolBlockIndex });
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
this.stateService.networkChanged$
|
this.network$ = this.stateService.networkChanged$;
|
||||||
.subscribe((network) => this.network = network);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
this.stateService.markBlock$.next({});
|
this.stateService.markBlock$.next({});
|
||||||
}
|
}
|
||||||
|
|
||||||
setOrdinal(mempoolBlock: MempoolBlock) {
|
getOrdinal(mempoolBlock: MempoolBlock): string {
|
||||||
const blocksInBlock = Math.ceil(mempoolBlock.blockVSize / 1000000);
|
const blocksInBlock = Math.ceil(mempoolBlock.blockVSize / 1000000);
|
||||||
if (this.mempoolBlockIndex === 0) {
|
if (this.mempoolBlockIndex === 0) {
|
||||||
this.ordinal = 'Next block';
|
return 'Next block';
|
||||||
} else if (this.mempoolBlockIndex === env.KEEP_BLOCKS_AMOUNT - 1 && blocksInBlock > 1 ) {
|
} else if (this.mempoolBlockIndex === env.KEEP_BLOCKS_AMOUNT - 1 && blocksInBlock > 1 ) {
|
||||||
this.ordinal = `Stack of ${blocksInBlock} blocks`;
|
return `Stack of ${blocksInBlock} blocks`;
|
||||||
} else {
|
} else {
|
||||||
const s = ['th', 'st', 'nd', 'rd'];
|
const s = ['th', 'st', 'nd', 'rd'];
|
||||||
const v = this.mempoolBlockIndex + 1 % 100;
|
const v = this.mempoolBlockIndex + 1 % 100;
|
||||||
this.ordinal = this.mempoolBlockIndex + 1 + (s[(v - 20) % 10] || s[v] || s[0]) + ' next block';
|
return this.mempoolBlockIndex + 1 + (s[(v - 20) % 10] || s[v] || s[0]) + ' next block';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks" let-i="index" [ngForTrackBy]="trackByFn">
|
<ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks" let-i="index" [ngForTrackBy]="trackByFn">
|
||||||
<div class="bitcoin-block text-center mempool-block" id="mempool-block-{{ i }}" [ngStyle]="mempoolBlockStyles[i]">
|
<div class="bitcoin-block text-center mempool-block" id="mempool-block-{{ i }}" [ngStyle]="mempoolBlockStyles[i]">
|
||||||
<a [routerLink]="['/mempool-block/' | relativeUrl, i]" class="blockLink"> </a>
|
<a [routerLink]="['/mempool-block/' | relativeUrl, i]" class="blockLink"> </a>
|
||||||
<div class="block-body" *ngIf="mempoolBlocks?.length">
|
<div class="block-body">
|
||||||
<div class="fees">
|
<div class="fees">
|
||||||
~{{ projectedBlock.medianFee | number:'1.0-0' }} sat/vB
|
~{{ projectedBlock.medianFee | number:'1.0-0' }} sat/vB
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user