utils.ts
1 import { clsx, type ClassValue } from 'clsx' 2 import { twMerge } from 'tailwind-merge' 3 4 export function cn(...inputs: ClassValue[]) { 5 return twMerge(clsx(inputs)) 6 } 7 8 export function formatTimeAgo(dateString: string | null | undefined): string { 9 if (!dateString) return '-' 10 const date = new Date(dateString) 11 const now = new Date() 12 const seconds = Math.floor((now.getTime() - date.getTime()) / 1000) 13 14 if (seconds < 60) return 'just now' 15 if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago` 16 if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago` 17 if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago` 18 19 return date.toLocaleDateString('en-US', { 20 month: 'short', 21 day: 'numeric', 22 hour: '2-digit', 23 minute: '2-digit', 24 }) 25 } 26 27 export function formatDuration(seconds: number | null | undefined): string { 28 if (!seconds || seconds <= 0) return '-' 29 if (seconds < 60) return `${seconds}s` 30 if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s` 31 const hours = Math.floor(seconds / 3600) 32 const mins = Math.floor((seconds % 3600) / 60) 33 return `${hours}h ${mins}m` 34 } 35 36 export function getStatClass(percent: number): string { 37 if (percent >= 90) return 'stat-critical' 38 if (percent >= 75) return 'stat-warning' 39 return 'stat-normal' 40 } 41 42 export function getSwapClass(percent: number): string { 43 if (percent >= 50) return 'stat-critical' 44 if (percent >= 10) return 'stat-warning' 45 return 'stat-normal' 46 } 47 48 export function getPressureClass(pressure: number): string { 49 if (pressure >= 20) return 'stat-critical' 50 if (pressure >= 5) return 'stat-warning' 51 return 'stat-normal' 52 }