Feature: Reflect difficulty estimation into mempool blocks. (#637)
* Add time until to mempool blocks. Reflect difficulty estimate time. * Fix estimate calculation. Turn off the auto refresh. * Change Math.floor to Math.round.
This commit is contained in:
parent
95436d398d
commit
1ba0075829
@ -1,5 +1,5 @@
|
|||||||
<div class="mempool-blocks-container" *ngIf="(isLoading$ | async) === false">
|
<div class="mempool-blocks-container" *ngIf="(isLoading$ | async) === false">
|
||||||
<div class="flashing">
|
<div class="flashing" *ngIf="(timeAvg$ | async) as timeAvg;">
|
||||||
<ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks$ | async" let-i="index" [ngForTrackBy]="trackByFn">
|
<ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks$ | async" 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>
|
||||||
@ -18,10 +18,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="time-difference" *ngIf="projectedBlock.blockVSize <= 1000000; else mergedBlock">
|
<div class="time-difference" *ngIf="projectedBlock.blockVSize <= 1000000; else mergedBlock">
|
||||||
<ng-template [ngIf]="network === 'liquid'" [ngIfElse]="timeDiffMainnet">
|
<ng-template [ngIf]="network === 'liquid'" [ngIfElse]="timeDiffMainnet">
|
||||||
<ng-container *ngTemplateOutlet="1 * i + 1 === 1 ? nextBlockEta : nextBlockEtaPlural; context:{ $implicit: 1 * i + 1 }"></ng-container>
|
<app-time-until [time]="(1 * i) + now + 61000" [fastRender]="false" [fixedRender]="true"></app-time-until>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template #timeDiffMainnet>
|
<ng-template #timeDiffMainnet>
|
||||||
<ng-container *ngTemplateOutlet="nextBlockEtaPlural; context:{ $implicit: 10 * i + 10 }"></ng-container>
|
<app-time-until [time]="(timeAvg * i) + now + timeAvg" [fastRender]="false" [fixedRender]="true"></app-time-until>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</div>
|
</div>
|
||||||
<ng-template #mergedBlock>
|
<ng-template #mergedBlock>
|
||||||
@ -38,10 +38,6 @@
|
|||||||
<div *ngIf="arrowVisible" id="arrow-up" [ngStyle]="{'right': rightPosition + 75 + 'px', transition: transition }"></div>
|
<div *ngIf="arrowVisible" id="arrow-up" [ngStyle]="{'right': rightPosition + 75 + 'px', transition: transition }"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ng-template let-i #nextBlockEtaPlural i18n="mempool-blocks.eta-of-next-block-plural|Block Frequency (plural)">In ~{{ i }} minutes</ng-template>
|
|
||||||
|
|
||||||
<ng-template let-i #nextBlockEta i18n="mempool-blocks.eta-of-next-block|Block Frequency">In ~{{ i }} minute</ng-template>
|
|
||||||
|
|
||||||
<div class="mempool-blocks-container" *ngIf="(isLoading$ | async) === true">
|
<div class="mempool-blocks-container" *ngIf="(isLoading$ | async) === true">
|
||||||
<div class="flashing">
|
<div class="flashing">
|
||||||
<ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks" let-i="index" [ngForTrackBy]="trackByFn">
|
<ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks" let-i="index" [ngForTrackBy]="trackByFn">
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Input } from '@angular/core';
|
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Input } from '@angular/core';
|
||||||
import { Subscription, Observable, fromEvent, merge, of } from 'rxjs';
|
import { Subscription, Observable, fromEvent, merge, of, combineLatest, timer } from 'rxjs';
|
||||||
import { MempoolBlock } from 'src/app/interfaces/websocket.interface';
|
import { MempoolBlock } from 'src/app/interfaces/websocket.interface';
|
||||||
import { StateService } from 'src/app/services/state.service';
|
import { StateService } from 'src/app/services/state.service';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
@ -17,6 +17,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
mempoolBlocks: MempoolBlock[] = this.mountEmptyBlocks();
|
mempoolBlocks: MempoolBlock[] = this.mountEmptyBlocks();
|
||||||
mempoolBlocks$: Observable<MempoolBlock[]>;
|
mempoolBlocks$: Observable<MempoolBlock[]>;
|
||||||
|
timeAvg$: Observable<number>;
|
||||||
|
|
||||||
mempoolBlocksFull: MempoolBlock[] = this.mountEmptyBlocks();
|
mempoolBlocksFull: MempoolBlock[] = this.mountEmptyBlocks();
|
||||||
mempoolBlockStyles = [];
|
mempoolBlockStyles = [];
|
||||||
@ -24,6 +25,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy {
|
|||||||
blockSubscription: Subscription;
|
blockSubscription: Subscription;
|
||||||
networkSubscription: Subscription;
|
networkSubscription: Subscription;
|
||||||
network = '';
|
network = '';
|
||||||
|
now = new Date().getTime();
|
||||||
|
|
||||||
blockWidth = 125;
|
blockWidth = 125;
|
||||||
blockPadding = 30;
|
blockPadding = 30;
|
||||||
@ -75,10 +77,39 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy {
|
|||||||
this.mempoolBlocks = this.reduceMempoolBlocksToFitScreen(JSON.parse(stringifiedBlocks));
|
this.mempoolBlocks = this.reduceMempoolBlocksToFitScreen(JSON.parse(stringifiedBlocks));
|
||||||
this.updateMempoolBlockStyles();
|
this.updateMempoolBlockStyles();
|
||||||
this.calculateTransactionPosition();
|
this.calculateTransactionPosition();
|
||||||
|
this.now = new Date().getTime();
|
||||||
return this.mempoolBlocks;
|
return this.mempoolBlocks;
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
this.timeAvg$ = timer(0, 1000)
|
||||||
|
.pipe(
|
||||||
|
switchMap(() => combineLatest([
|
||||||
|
this.stateService.blocks$.pipe(map(([block]) => block)),
|
||||||
|
this.stateService.lastDifficultyAdjustment$
|
||||||
|
])),
|
||||||
|
map(([block, DATime]) => {
|
||||||
|
const now = new Date().getTime() / 1000;
|
||||||
|
const diff = now - DATime;
|
||||||
|
const blocksInEpoch = block.height % 2016;
|
||||||
|
let difficultyChange = 0;
|
||||||
|
if (blocksInEpoch > 0) {
|
||||||
|
difficultyChange = (600 / (diff / blocksInEpoch ) - 1) * 100;
|
||||||
|
}
|
||||||
|
const timeAvgDiff = difficultyChange * 0.1;
|
||||||
|
|
||||||
|
let timeAvgMins = 10;
|
||||||
|
if (timeAvgDiff > 0 ){
|
||||||
|
timeAvgMins -= Math.abs(timeAvgDiff);
|
||||||
|
} else {
|
||||||
|
timeAvgMins += Math.abs(timeAvgDiff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return timeAvgMins * 60 * 1000;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
this.markBlocksSubscription = this.stateService.markBlock$
|
this.markBlocksSubscription = this.stateService.markBlock$
|
||||||
.subscribe((state) => {
|
.subscribe((state) => {
|
||||||
this.markIndex = undefined;
|
this.markIndex = undefined;
|
||||||
|
@ -69,8 +69,8 @@ export class TimeSinceComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
case 'week': return $localize`:@@time-since:${dateStrings.i18nWeek}:DATE: ago`; break;
|
case 'week': return $localize`:@@time-since:${dateStrings.i18nWeek}:DATE: ago`; break;
|
||||||
case 'day': return $localize`:@@time-since:${dateStrings.i18nDay}:DATE: ago`; break;
|
case 'day': return $localize`:@@time-since:${dateStrings.i18nDay}:DATE: ago`; break;
|
||||||
case 'hour': return $localize`:@@time-since:${dateStrings.i18nHour}:DATE: ago`; break;
|
case 'hour': return $localize`:@@time-since:${dateStrings.i18nHour}:DATE: ago`; break;
|
||||||
case 'minute': return $localize`:@@time-since:${dateStrings.i18nMinute}:DATE: ago`;
|
case 'minute': return $localize`:@@time-since:${dateStrings.i18nMinute}:DATE: ago`; break;
|
||||||
case 'second': return $localize`:@@time-since:${dateStrings.i18nSecond}:DATE: ago`;
|
case 'second': return $localize`:@@time-since:${dateStrings.i18nSecond}:DATE: ago`; break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (i) { // plural (2 days)
|
switch (i) { // plural (2 days)
|
||||||
@ -79,8 +79,8 @@ export class TimeSinceComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
case 'week': return $localize`:@@time-since:${dateStrings.i18nWeeks}:DATE: ago`; break;
|
case 'week': return $localize`:@@time-since:${dateStrings.i18nWeeks}:DATE: ago`; break;
|
||||||
case 'day': return $localize`:@@time-since:${dateStrings.i18nDays}:DATE: ago`; break;
|
case 'day': return $localize`:@@time-since:${dateStrings.i18nDays}:DATE: ago`; break;
|
||||||
case 'hour': return $localize`:@@time-since:${dateStrings.i18nHours}:DATE: ago`; break;
|
case 'hour': return $localize`:@@time-since:${dateStrings.i18nHours}:DATE: ago`; break;
|
||||||
case 'minute': return $localize`:@@time-since:${dateStrings.i18nMinutes}:DATE: ago`;
|
case 'minute': return $localize`:@@time-since:${dateStrings.i18nMinutes}:DATE: ago`; break;
|
||||||
case 'second': return $localize`:@@time-since:${dateStrings.i18nSeconds}:DATE: ago`;
|
case 'second': return $localize`:@@time-since:${dateStrings.i18nSeconds}:DATE: ago`; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,8 +69,8 @@ export class TimeSpanComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
case 'week': return $localize`:@@time-span:After ${dateStrings.i18nWeek}:DATE:`; break;
|
case 'week': return $localize`:@@time-span:After ${dateStrings.i18nWeek}:DATE:`; break;
|
||||||
case 'day': return $localize`:@@time-span:After ${dateStrings.i18nDay}:DATE:`; break;
|
case 'day': return $localize`:@@time-span:After ${dateStrings.i18nDay}:DATE:`; break;
|
||||||
case 'hour': return $localize`:@@time-span:After ${dateStrings.i18nHour}:DATE:`; break;
|
case 'hour': return $localize`:@@time-span:After ${dateStrings.i18nHour}:DATE:`; break;
|
||||||
case 'minute': return $localize`:@@time-span:After ${dateStrings.i18nMinute}:DATE:`;
|
case 'minute': return $localize`:@@time-span:After ${dateStrings.i18nMinute}:DATE:`; break;
|
||||||
case 'second': return $localize`:@@time-span:After ${dateStrings.i18nSecond}:DATE:`;
|
case 'second': return $localize`:@@time-span:After ${dateStrings.i18nSecond}:DATE:`; break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (i) { // plural (2 days)
|
switch (i) { // plural (2 days)
|
||||||
@ -79,8 +79,8 @@ export class TimeSpanComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
case 'week': return $localize`:@@time-span:After ${dateStrings.i18nWeeks}:DATE:`; break;
|
case 'week': return $localize`:@@time-span:After ${dateStrings.i18nWeeks}:DATE:`; break;
|
||||||
case 'day': return $localize`:@@time-span:After ${dateStrings.i18nDays}:DATE:`; break;
|
case 'day': return $localize`:@@time-span:After ${dateStrings.i18nDays}:DATE:`; break;
|
||||||
case 'hour': return $localize`:@@time-span:After ${dateStrings.i18nHours}:DATE:`; break;
|
case 'hour': return $localize`:@@time-span:After ${dateStrings.i18nHours}:DATE:`; break;
|
||||||
case 'minute': return $localize`:@@time-span:After ${dateStrings.i18nMinutes}:DATE:`;
|
case 'minute': return $localize`:@@time-span:After ${dateStrings.i18nMinutes}:DATE:`; break;
|
||||||
case 'second': return $localize`:@@time-span:After ${dateStrings.i18nSeconds}:DATE:`;
|
case 'second': return $localize`:@@time-span:After ${dateStrings.i18nSeconds}:DATE:`; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ export class TimeUntilComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
|
|
||||||
@Input() time: number;
|
@Input() time: number;
|
||||||
@Input() fastRender = false;
|
@Input() fastRender = false;
|
||||||
|
@Input() fixedRender = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private ref: ChangeDetectorRef,
|
private ref: ChangeDetectorRef,
|
||||||
@ -31,6 +32,11 @@ export class TimeUntilComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
if(this.fixedRender){
|
||||||
|
this.text = this.calculate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.stateService.isBrowser) {
|
if (!this.stateService.isBrowser) {
|
||||||
this.text = this.calculate();
|
this.text = this.calculate();
|
||||||
this.ref.markForCheck();
|
this.ref.markForCheck();
|
||||||
@ -55,12 +61,13 @@ export class TimeUntilComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
const seconds = Math.floor((+new Date(this.time) - +new Date()) / 1000);
|
const seconds = Math.floor((+new Date(this.time) - +new Date()) / 1000);
|
||||||
|
|
||||||
if (seconds < 60) {
|
if (seconds < 60) {
|
||||||
return $localize`:@@date-base.minute:${1}:DATE: minute`;
|
const dateStrings = dates(1);
|
||||||
|
return $localize`:@@time-until:In ~${dateStrings.i18nMinute}:DATE:`;
|
||||||
}
|
}
|
||||||
let counter;
|
let counter;
|
||||||
for (const i in this.intervals) {
|
for (const i in this.intervals) {
|
||||||
if (this.intervals.hasOwnProperty(i)) {
|
if (this.intervals.hasOwnProperty(i)) {
|
||||||
counter = Math.floor(seconds / this.intervals[i]);
|
counter = Math.round(seconds / this.intervals[i]);
|
||||||
const dateStrings = dates(counter);
|
const dateStrings = dates(counter);
|
||||||
if (counter > 0) {
|
if (counter > 0) {
|
||||||
if (counter === 1) {
|
if (counter === 1) {
|
||||||
@ -80,8 +87,8 @@ export class TimeUntilComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
case 'week': return $localize`:@@time-until:In ~${dateStrings.i18nWeeks}:DATE:`; break;
|
case 'week': return $localize`:@@time-until:In ~${dateStrings.i18nWeeks}:DATE:`; break;
|
||||||
case 'day': return $localize`:@@time-until:In ~${dateStrings.i18nDays}:DATE:`; break;
|
case 'day': return $localize`:@@time-until:In ~${dateStrings.i18nDays}:DATE:`; break;
|
||||||
case 'hour': return $localize`:@@time-until:In ~${dateStrings.i18nHours}:DATE:`; break;
|
case 'hour': return $localize`:@@time-until:In ~${dateStrings.i18nHours}:DATE:`; break;
|
||||||
case 'minute': return $localize`:@@time-until:In ~${dateStrings.i18nMinutes}:DATE:`;
|
case 'minute': return $localize`:@@time-until:In ~${dateStrings.i18nMinutes}:DATE:`; break;
|
||||||
case 'second': return $localize`:@@time-until:In ~${dateStrings.i18nSeconds}:DATE:`;
|
case 'second': return $localize`:@@time-until:In ~${dateStrings.i18nSeconds}:DATE:`; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user