2020-03-22 17:44:36 +07:00
|
|
|
import { Component, OnInit, OnDestroy } from '@angular/core';
|
2020-03-17 21:53:20 +07:00
|
|
|
import { StateService } from 'src/app/services/state.service';
|
|
|
|
import { ActivatedRoute, ParamMap } from '@angular/router';
|
2020-06-10 23:52:14 +07:00
|
|
|
import { switchMap, map, tap, filter } from 'rxjs/operators';
|
2020-03-17 21:53:20 +07:00
|
|
|
import { MempoolBlock } from 'src/app/interfaces/websocket.interface';
|
2020-03-23 01:43:03 +07:00
|
|
|
import { Observable } from 'rxjs';
|
2020-03-24 00:52:08 +07:00
|
|
|
import { SeoService } from 'src/app/services/seo.service';
|
2020-07-21 13:20:17 +07:00
|
|
|
import { env } from 'src/app/app.constants';
|
2020-03-17 21:53:20 +07:00
|
|
|
|
|
|
|
@Component({
|
|
|
|
selector: 'app-mempool-block',
|
|
|
|
templateUrl: './mempool-block.component.html',
|
|
|
|
styleUrls: ['./mempool-block.component.scss']
|
|
|
|
})
|
2020-03-22 17:44:36 +07:00
|
|
|
export class MempoolBlockComponent implements OnInit, OnDestroy {
|
2020-05-09 20:37:50 +07:00
|
|
|
network = '';
|
2020-03-17 21:53:20 +07:00
|
|
|
mempoolBlockIndex: number;
|
2020-03-23 01:43:03 +07:00
|
|
|
mempoolBlock$: Observable<MempoolBlock>;
|
2020-07-21 13:20:17 +07:00
|
|
|
ordinal: string;
|
2020-03-17 21:53:20 +07:00
|
|
|
|
|
|
|
constructor(
|
|
|
|
private route: ActivatedRoute,
|
|
|
|
private stateService: StateService,
|
2020-03-24 00:52:08 +07:00
|
|
|
private seoService: SeoService,
|
2020-03-17 21:53:20 +07:00
|
|
|
) { }
|
|
|
|
|
|
|
|
ngOnInit(): void {
|
2020-03-23 01:43:03 +07:00
|
|
|
this.mempoolBlock$ = this.route.paramMap
|
|
|
|
.pipe(
|
|
|
|
switchMap((params: ParamMap) => {
|
|
|
|
this.mempoolBlockIndex = parseInt(params.get('id'), 10) || 0;
|
|
|
|
return this.stateService.mempoolBlocks$
|
2020-03-25 03:59:30 +07:00
|
|
|
.pipe(
|
2020-07-24 14:11:49 +07:00
|
|
|
map((blocks) => {
|
|
|
|
if (!blocks.length) {
|
|
|
|
return [{ index: 0, blockSize: 0, blockVSize: 0, feeRange: [0, 0], medianFee: 0, nTx: 0, totalFees: 0 }];
|
|
|
|
}
|
|
|
|
return blocks;
|
|
|
|
}),
|
2020-06-10 23:52:14 +07:00
|
|
|
filter((mempoolBlocks) => mempoolBlocks.length > 0),
|
2020-03-25 03:59:30 +07:00
|
|
|
map((mempoolBlocks) => {
|
|
|
|
while (!mempoolBlocks[this.mempoolBlockIndex]) {
|
|
|
|
this.mempoolBlockIndex--;
|
|
|
|
}
|
2020-07-21 13:20:17 +07:00
|
|
|
this.setOrdinal(mempoolBlocks[this.mempoolBlockIndex]);
|
|
|
|
this.seoService.setTitle(this.ordinal);
|
2020-03-25 03:59:30 +07:00
|
|
|
return mempoolBlocks[this.mempoolBlockIndex];
|
|
|
|
})
|
|
|
|
);
|
2020-03-23 01:43:03 +07:00
|
|
|
}),
|
|
|
|
tap(() => {
|
|
|
|
this.stateService.markBlock$.next({ mempoolBlockIndex: this.mempoolBlockIndex });
|
|
|
|
})
|
|
|
|
);
|
2020-05-09 20:37:50 +07:00
|
|
|
|
|
|
|
this.stateService.networkChanged$
|
|
|
|
.subscribe((network) => this.network = network);
|
2020-03-17 21:53:20 +07:00
|
|
|
}
|
|
|
|
|
2020-03-22 17:44:36 +07:00
|
|
|
ngOnDestroy(): void {
|
|
|
|
this.stateService.markBlock$.next({});
|
|
|
|
}
|
|
|
|
|
2020-07-21 13:20:17 +07:00
|
|
|
setOrdinal(mempoolBlock: MempoolBlock) {
|
|
|
|
const blocksInBlock = Math.ceil(mempoolBlock.blockVSize / 1000000);
|
2020-03-25 03:59:30 +07:00
|
|
|
if (this.mempoolBlockIndex === 0) {
|
2020-07-21 13:20:17 +07:00
|
|
|
this.ordinal = 'Next block';
|
|
|
|
} else if (this.mempoolBlockIndex === env.KEEP_BLOCKS_AMOUNT - 1 && blocksInBlock > 1 ) {
|
|
|
|
this.ordinal = `Stack of ${blocksInBlock} blocks`;
|
|
|
|
} else {
|
|
|
|
const s = ['th', 'st', 'nd', 'rd'];
|
|
|
|
const v = this.mempoolBlockIndex + 1 % 100;
|
|
|
|
this.ordinal = this.mempoolBlockIndex + 1 + (s[(v - 20) % 10] || s[v] || s[0]) + ' next block';
|
2020-03-25 03:59:30 +07:00
|
|
|
}
|
|
|
|
}
|
2020-03-17 21:53:20 +07:00
|
|
|
}
|