mempool/frontend/src/app/components/time-since/time-since.component.ts

87 lines
2.1 KiB
TypeScript
Raw Normal View History

2020-11-06 22:30:52 +01:00
import { isPlatformBrowser } from '@angular/common';
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, ChangeDetectorRef, OnChanges, PLATFORM_ID, Inject } from '@angular/core';
@Component({
selector: 'app-time-since',
2020-02-29 17:42:50 +01:00
template: `{{ text }}`,
changeDetection: ChangeDetectionStrategy.OnPush
})
2020-03-25 12:41:16 +01:00
export class TimeSinceComponent implements OnInit, OnChanges, OnDestroy {
2020-11-06 22:30:52 +01:00
isBrowser: boolean = isPlatformBrowser(this.platformId);
interval: number;
2020-02-29 17:42:50 +01:00
text: string;
intervals = {};
@Input() time: number;
@Input() fastRender = false;
constructor(
2020-11-06 22:30:52 +01:00
private ref: ChangeDetectorRef,
@Inject(PLATFORM_ID) private platformId: any,
) {
if (document.body.clientWidth < 768) {
this.intervals = {
year: 31536000,
month: 2592000,
week: 604800,
day: 86400,
hour: 3600,
min: 60,
sec: 1
};
} else {
this.intervals = {
year: 31536000,
month: 2592000,
week: 604800,
day: 86400,
hour: 3600,
minute: 60,
second: 1
};
}
}
ngOnInit() {
2020-11-06 22:30:52 +01:00
if (!this.isBrowser) {
this.text = this.calculate();
this.ref.markForCheck();
return;
}
this.interval = window.setInterval(() => {
2020-02-29 17:42:50 +01:00
this.text = this.calculate();
this.ref.markForCheck();
}, 1000 * (this.fastRender ? 1 : 60));
}
2020-03-25 12:41:16 +01:00
ngOnChanges() {
this.text = this.calculate();
this.ref.markForCheck();
}
ngOnDestroy() {
clearInterval(this.interval);
}
2020-02-29 17:42:50 +01:00
calculate() {
const seconds = Math.floor((+new Date() - +new Date(this.time * 1000)) / 1000);
if (seconds < 60) {
return '< 1 minute';
2020-02-29 17:42:50 +01:00
}
let counter;
for (const i in this.intervals) {
if (this.intervals.hasOwnProperty(i)) {
counter = Math.floor(seconds / this.intervals[i]);
2020-02-29 17:42:50 +01:00
if (counter > 0) {
if (counter === 1) {
return counter + ' ' + i; // singular (1 day ago)
} else {
return counter + ' ' + i + 's'; // plural (2 days ago)
}
}
}
}
}
}