import { Component, inject, signal, OnInit, OnDestroy } from '@angular/core'; import { ApiService } from '../../core/services/api.service'; import { ITrafficStats } from '../../core/types/api.types'; import { CardComponent, CardHeaderComponent, CardTitleComponent, CardDescriptionComponent, CardContentComponent, } from '../../ui/card/card.component'; import { SkeletonComponent } from '../../ui/skeleton/skeleton.component'; @Component({ selector: 'app-traffic-card', standalone: true, imports: [ CardComponent, CardHeaderComponent, CardTitleComponent, CardDescriptionComponent, CardContentComponent, SkeletonComponent, ], template: ` Traffic (Last Hour) Request metrics from access logs @if (loading() && !stats()) { } @else if (stats()) {
Requests {{ formatNumber(stats()!.requestCount) }}
Errors {{ stats()!.errorCount }} ({{ stats()!.errorRate }}%)
Avg Response {{ stats()!.avgResponseTime }}ms
Req/min {{ stats()!.requestsPerMinute }}
@if (getStatusPercent('2xx') > 0) {
} @if (getStatusPercent('3xx') > 0) {
} @if (getStatusPercent('4xx') > 0) {
} @if (getStatusPercent('5xx') > 0) {
}
2xx 3xx 4xx 5xx
} @else {
No traffic data available
}
`, }) export class TrafficCardComponent implements OnInit, OnDestroy { private api = inject(ApiService); stats = signal(null); loading = signal(false); private refreshInterval: any; ngOnInit(): void { this.loadStats(); // Refresh every 30 seconds this.refreshInterval = setInterval(() => this.loadStats(), 30000); } ngOnDestroy(): void { if (this.refreshInterval) { clearInterval(this.refreshInterval); } } async loadStats(): Promise { this.loading.set(true); try { const response = await this.api.getTrafficStats(60); if (response.success && response.data) { this.stats.set(response.data); } } catch (err) { console.error('Failed to load traffic stats:', err); } finally { this.loading.set(false); } } formatNumber(num: number): string { if (num >= 1000000) { return (num / 1000000).toFixed(1) + 'M'; } if (num >= 1000) { return (num / 1000).toFixed(1) + 'K'; } return num.toString(); } getStatusPercent(status: string): number { const s = this.stats(); if (!s || s.requestCount === 0) return 0; const count = s.statusCounts[status] || 0; return (count / s.requestCount) * 100; } }