import {Component, EventEmitter, Input, OnChanges, OnInit, Output} from '@angular/core'; import {BASE_PATH, HistoryService, PunishmentHistoryInner} from '../../../api'; import {map, Observable, shareReplay} from 'rxjs'; import {NgForOf, NgIf, NgOptimizedImage} from '@angular/common'; import {CookieService} from 'ngx-cookie-service'; @Component({ selector: 'app-history', imports: [ NgIf, NgForOf, NgOptimizedImage ], templateUrl: './history.component.html', styleUrl: './history.component.scss', providers: [ CookieService, {provide: BASE_PATH, useValue: 'http://localhost:8080/'} ], }) export class HistoryComponent implements OnInit, OnChanges { @Input() userType: 'player' | 'staff' = "player"; @Input() punishmentType: 'all' | 'ban' | 'mute' | 'kick' | 'warn' = "all"; @Input() page: number = 0; @Input() searchTerm: string = ''; @Output() pageChange = new EventEmitter(); private uuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/; public history: PunishmentHistoryInner[] = [] constructor(private historyApi: HistoryService) { } ngOnChanges(): void { this.reloadHistory(); this.pageChange.emit(this.history.length); } ngOnInit(): void { this.reloadHistory(); } private reloadHistory(): void { let historyObservable: Observable; if (this.searchTerm.length === 0) { historyObservable = this.historyApi.getHistoryForAll(this.userType, this.punishmentType, this.page); } else { if (this.uuidRegex.test(this.searchTerm)) { historyObservable = this.historyApi.getHistoryForUuid(this.userType, this.punishmentType, this.searchTerm, this.page); } else { historyObservable = this.historyApi.getHistoryForUsers(this.userType, this.punishmentType, this.searchTerm, this.page) } } historyObservable.pipe( map(history => { this.history = history; }), shareReplay(1) ).subscribe(); } public getPunishmentTime(entry: PunishmentHistoryInner) { const date = new Date(entry.punishmentTime); return date.toLocaleString(navigator.language, { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', hour12: false }); } public getType(entry: PunishmentHistoryInner) { return entry.type.charAt(0).toUpperCase() + entry.type.slice(1); } public getExpiredTime(entry: PunishmentHistoryInner) { if (entry.expiryTime === 0) { return "Permanent " + this.getType(entry); } const date = new Date(entry.expiryTime); return date.toLocaleString(navigator.language, { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', hour12: false }); } public getAvatarUrl(entry: string): string { let uuid = entry.replace('-', ''); if (uuid === 'C') { return '/public/img/random/console.png'; } return `https://crafatar.com/avatars/${uuid}?size=25&overlay`; } }