106 lines
3.7 KiB
TypeScript
106 lines
3.7 KiB
TypeScript
import { Component, OnInit, OnDestroy } from '@angular/core';
|
|
import { BisqBlock } from '../../bisq/bisq.interfaces';
|
|
import { Location } from '@angular/common';
|
|
import { BisqApiService } from '../bisq-api.service';
|
|
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
|
|
import { Subscription, of } from 'rxjs';
|
|
import { switchMap, catchError } from 'rxjs/operators';
|
|
import { SeoService } from '../../services/seo.service';
|
|
import { ElectrsApiService } from '../../services/electrs-api.service';
|
|
import { HttpErrorResponse } from '@angular/common/http';
|
|
import { WebsocketService } from '../../services/websocket.service';
|
|
|
|
@Component({
|
|
selector: 'app-bisq-block',
|
|
templateUrl: './bisq-block.component.html',
|
|
styleUrls: ['./bisq-block.component.scss']
|
|
})
|
|
export class BisqBlockComponent implements OnInit, OnDestroy {
|
|
block: BisqBlock;
|
|
subscription: Subscription;
|
|
blockHash = '';
|
|
blockHeight = 0;
|
|
isLoading = true;
|
|
error: HttpErrorResponse | null;
|
|
|
|
constructor(
|
|
private websocketService: WebsocketService,
|
|
private bisqApiService: BisqApiService,
|
|
private route: ActivatedRoute,
|
|
private seoService: SeoService,
|
|
private electrsApiService: ElectrsApiService,
|
|
private router: Router,
|
|
private location: Location,
|
|
) { }
|
|
|
|
ngOnInit(): void {
|
|
this.websocketService.want(['blocks']);
|
|
|
|
this.subscription = this.route.paramMap
|
|
.pipe(
|
|
switchMap((params: ParamMap) => {
|
|
const blockHash = params.get('id') || '';
|
|
document.body.scrollTo(0, 0);
|
|
this.isLoading = true;
|
|
this.error = null;
|
|
if (history.state.data && history.state.data.blockHeight) {
|
|
this.blockHeight = history.state.data.blockHeight;
|
|
}
|
|
if (history.state.data && history.state.data.block) {
|
|
this.blockHeight = history.state.data.block.height;
|
|
return of(history.state.data.block);
|
|
}
|
|
|
|
let isBlockHeight = false;
|
|
if (/^[0-9]+$/.test(blockHash)) {
|
|
isBlockHeight = true;
|
|
} else {
|
|
this.blockHash = blockHash;
|
|
}
|
|
|
|
if (isBlockHeight) {
|
|
return this.electrsApiService.getBlockHashFromHeight$(parseInt(blockHash, 10))
|
|
.pipe(
|
|
switchMap((hash) => {
|
|
if (!hash) {
|
|
return;
|
|
}
|
|
this.blockHash = hash;
|
|
this.location.replaceState(
|
|
this.router.createUrlTree(['/bisq/block/', hash]).toString()
|
|
);
|
|
return this.bisqApiService.getBlock$(this.blockHash)
|
|
.pipe(catchError(this.caughtHttpError.bind(this)));
|
|
}),
|
|
catchError(this.caughtHttpError.bind(this))
|
|
);
|
|
}
|
|
|
|
return this.bisqApiService.getBlock$(this.blockHash)
|
|
.pipe(catchError(this.caughtHttpError.bind(this)));
|
|
})
|
|
)
|
|
.subscribe((block: BisqBlock) => {
|
|
if (!block) {
|
|
this.seoService.logSoft404();
|
|
return;
|
|
}
|
|
this.isLoading = false;
|
|
this.blockHeight = block.height;
|
|
this.seoService.setTitle($localize`:@@bisq-block.component.browser-title:Block ${block.height}:BLOCK_HEIGHT:: ${block.hash}:BLOCK_HASH:`);
|
|
this.seoService.setDescription($localize`:@@meta.description.bisq.block:See all BSQ transactions in Bitcoin block ${block.height}:BLOCK_HEIGHT: (block hash ${block.hash}:BLOCK_HASH:).`);
|
|
this.block = block;
|
|
});
|
|
}
|
|
|
|
ngOnDestroy() {
|
|
this.subscription.unsubscribe();
|
|
}
|
|
|
|
caughtHttpError(err: HttpErrorResponse){
|
|
this.error = err;
|
|
this.seoService.logSoft404();
|
|
return of(null);
|
|
}
|
|
}
|