| 472 | } |
| 473 | |
| 474 | function formatRelativeTime(timestamp: number): string { |
| 475 | if (!timestamp) { |
| 476 | return "never"; |
| 477 | } |
| 478 | const now = Date.now(); |
| 479 | const diffInSeconds = Math.floor((now - timestamp) / 1000); |
| 480 | const diffInMinutes = Math.floor(diffInSeconds / 60); |
| 481 | const diffInHours = Math.floor(diffInMinutes / 60); |
| 482 | const diffInDays = Math.floor(diffInHours / 24); |
| 483 | |
| 484 | if (diffInMinutes <= 0) { |
| 485 | return "Just now"; |
| 486 | } else if (diffInMinutes < 60) { |
| 487 | return `${diffInMinutes} min${diffInMinutes !== 1 ? "s" : ""} ago`; |
| 488 | } else if (diffInHours < 24) { |
| 489 | return `${diffInHours} hr${diffInHours !== 1 ? "s" : ""} ago`; |
| 490 | } else if (diffInDays < 7) { |
| 491 | return `${diffInDays} day${diffInDays !== 1 ? "s" : ""} ago`; |
| 492 | } else { |
| 493 | return new Date(timestamp).toLocaleDateString(); |
| 494 | } |
| 495 | } |
| 496 | |
| 497 | /** |
| 498 | * Sort objects by display:order (ascending) and display:name (alphabetically) |