import { Component, Input, Inject, LOCALE_ID, ChangeDetectionStrategy, OnInit } from '@angular/core'; import { EChartsOption } from 'echarts'; import { OnChanges } from '@angular/core'; import { StorageService } from 'src/app/services/storage.service'; import { formatterXAxis, formatterXAxisLabel } from 'src/app/shared/graphs.utils'; @Component({ selector: 'app-incoming-transactions-graph', templateUrl: './incoming-transactions-graph.component.html', styles: [` .loadingGraphs { position: absolute; top: 50%; left: calc(50% - 16px); z-index: 100; } `], changeDetection: ChangeDetectionStrategy.OnPush, }) export class IncomingTransactionsGraphComponent implements OnInit, OnChanges { @Input() data: any; @Input() theme: string; @Input() height: number | string = '200'; @Input() right: number | string = '10'; @Input() top: number | string = '20'; @Input() left: number | string = '0'; @Input() template: ('widget' | 'advanced') = 'widget'; @Input() windowPreferenceOverride: string; isLoading = true; mempoolStatsChartOption: EChartsOption = {}; mempoolStatsChartInitOption = { renderer: 'svg' }; windowPreference: string; constructor( @Inject(LOCALE_ID) private locale: string, private storageService: StorageService, ) { } ngOnInit() { this.isLoading = true; } ngOnChanges(): void { if (!this.data) { return; } this.windowPreference = this.windowPreferenceOverride ? this.windowPreferenceOverride : this.storageService.getValue('graphWindowPreference'); this.mountChart(); } rendered() { if (!this.data) { return; } this.isLoading = false; } mountChart(): void { this.mempoolStatsChartOption = { grid: { height: this.height, right: this.right, top: this.top, left: this.left, }, animation: false, dataZoom: [{ type: 'inside', realtime: true, zoomOnMouseWheel: (this.template === 'advanced') ? true : false, maxSpan: 100, minSpan: 10, }, { show: (this.template === 'advanced') ? true : false, type: 'slider', brushSelect: false, realtime: true, bottom: 0, selectedDataBackground: { lineStyle: { color: '#fff', opacity: 0.45, }, areaStyle: { opacity: 0, } }, }], tooltip: { trigger: 'axis', position: (pos, params, el, elRect, size) => { const obj = { top: -20 }; obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 80; return obj; }, extraCssText: `width: ${(['2h', '24h'].includes(this.windowPreference) || this.template === 'widget') ? '125px' : '135px'}; background: transparent; border: none; box-shadow: none;`, axisPointer: { type: 'line', }, formatter: (params: any) => { const axisValueLabel: string = formatterXAxis(this.locale, this.windowPreference, params[0].axisValue); const colorSpan = (color: string) => ``; let itemFormatted = '
' + axisValueLabel + '
'; params.map((item: any, index: number) => { if (index < 26) { itemFormatted += `
${colorSpan(item.color)}
${item.value[1]} vB/s
`; } }); return `
${itemFormatted}
`; } }, xAxis: [ { name: formatterXAxisLabel(this.locale, this.windowPreference), nameLocation: 'middle', nameTextStyle: { padding: [20, 0, 0, 0], }, type: 'time', axisLabel: { margin: 20, align: 'center', fontSize: 11, lineHeight: 12, hideOverlap: true, padding: [0, 5], }, } ], yAxis: { type: 'value', axisLabel: { fontSize: 11, }, splitLine: { lineStyle: { type: 'dotted', color: '#ffffff66', opacity: 0.25, } } }, series: [ { data: this.data.series[0], type: 'line', smooth: false, showSymbol: false, lineStyle: { width: 3, }, markLine: { silent: true, symbol: 'none', lineStyle: { color: '#fff', opacity: 1, width: 2, }, data: [{ yAxis: 1667, label: { show: false, color: '#ffffff', } }], } }, ], visualMap: { show: false, top: 50, right: 10, pieces: [{ gt: 0, lte: 1667, color: '#7CB342' }, { gt: 1667, lte: 2000, color: '#FDD835' }, { gt: 2000, lte: 2500, color: '#FFB300' }, { gt: 2500, lte: 3000, color: '#FB8C00' }, { gt: 3000, lte: 3500, color: '#F4511E' }, { gt: 3500, color: '#D81B60' }], outOfRange: { color: '#999' } }, }; } }