mirror of
https://github.com/tale/headplane.git
synced 2026-08-31 17:28:14 +00:00
refactor: move formatTimeDelta to shared utils
Moves the formatTimeDelta helper function to app/utils/time.ts for reusability across the codebase, as requested in PR review.
This commit is contained in:
@@ -13,52 +13,10 @@ import type { User } from '~/types';
|
|||||||
import cn from '~/utils/cn';
|
import cn from '~/utils/cn';
|
||||||
import * as hinfo from '~/utils/host-info';
|
import * as hinfo from '~/utils/host-info';
|
||||||
import { PopulatedNode } from '~/utils/node-info';
|
import { PopulatedNode } from '~/utils/node-info';
|
||||||
|
import { formatTimeDelta } from '~/utils/time';
|
||||||
import toast from '~/utils/toast';
|
import toast from '~/utils/toast';
|
||||||
import MenuOptions from './menu';
|
import MenuOptions from './menu';
|
||||||
|
|
||||||
/**
|
|
||||||
* Formats the time delta since last seen into a human-readable string.
|
|
||||||
* - Under 1 hour: "X minutes ago"
|
|
||||||
* - Under 1 day: "X hours, Y minutes ago"
|
|
||||||
* - Under 1 month: "X days, Y hours ago"
|
|
||||||
* - Over 1 month: "X months, Y days ago"
|
|
||||||
*/
|
|
||||||
function formatTimeDelta(lastSeen: Date): string {
|
|
||||||
const now = new Date();
|
|
||||||
const diffMs = now.getTime() - lastSeen.getTime();
|
|
||||||
|
|
||||||
const minutes = Math.floor(diffMs / (1000 * 60));
|
|
||||||
const hours = Math.floor(diffMs / (1000 * 60 * 60));
|
|
||||||
const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
||||||
const months = Math.floor(days / 30);
|
|
||||||
|
|
||||||
if (minutes < 60) {
|
|
||||||
return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hours < 24) {
|
|
||||||
const remainingMinutes = minutes % 60;
|
|
||||||
if (remainingMinutes === 0) {
|
|
||||||
return `${hours} hour${hours !== 1 ? 's' : ''} ago`;
|
|
||||||
}
|
|
||||||
return `${hours} hour${hours !== 1 ? 's' : ''}, ${remainingMinutes} minute${remainingMinutes !== 1 ? 's' : ''} ago`;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (days < 30) {
|
|
||||||
const remainingHours = hours % 24;
|
|
||||||
if (remainingHours === 0) {
|
|
||||||
return `${days} day${days !== 1 ? 's' : ''} ago`;
|
|
||||||
}
|
|
||||||
return `${days} day${days !== 1 ? 's' : ''}, ${remainingHours} hour${remainingHours !== 1 ? 's' : ''} ago`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const remainingDays = days % 30;
|
|
||||||
if (remainingDays === 0) {
|
|
||||||
return `${months} month${months !== 1 ? 's' : ''} ago`;
|
|
||||||
}
|
|
||||||
return `${months} month${months !== 1 ? 's' : ''}, ${remainingDays} day${remainingDays !== 1 ? 's' : ''} ago`;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
node: PopulatedNode;
|
node: PopulatedNode;
|
||||||
users: User[];
|
users: User[];
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* Formats the time delta since a given date into a human-readable string.
|
||||||
|
* - Under 1 hour: "X minutes ago"
|
||||||
|
* - Under 1 day: "X hours, Y minutes ago"
|
||||||
|
* - Under 1 month: "X days, Y hours ago"
|
||||||
|
* - Over 1 month: "X months, Y days ago"
|
||||||
|
*/
|
||||||
|
export function formatTimeDelta(date: Date): string {
|
||||||
|
const now = new Date();
|
||||||
|
const diffMs = now.getTime() - date.getTime();
|
||||||
|
|
||||||
|
const minutes = Math.floor(diffMs / (1000 * 60));
|
||||||
|
const hours = Math.floor(diffMs / (1000 * 60 * 60));
|
||||||
|
const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
||||||
|
const months = Math.floor(days / 30);
|
||||||
|
|
||||||
|
if (minutes < 60) {
|
||||||
|
return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hours < 24) {
|
||||||
|
const remainingMinutes = minutes % 60;
|
||||||
|
if (remainingMinutes === 0) {
|
||||||
|
return `${hours} hour${hours !== 1 ? 's' : ''} ago`;
|
||||||
|
}
|
||||||
|
return `${hours} hour${hours !== 1 ? 's' : ''}, ${remainingMinutes} minute${remainingMinutes !== 1 ? 's' : ''} ago`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (days < 30) {
|
||||||
|
const remainingHours = hours % 24;
|
||||||
|
if (remainingHours === 0) {
|
||||||
|
return `${days} day${days !== 1 ? 's' : ''} ago`;
|
||||||
|
}
|
||||||
|
return `${days} day${days !== 1 ? 's' : ''}, ${remainingHours} hour${remainingHours !== 1 ? 's' : ''} ago`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const remainingDays = days % 30;
|
||||||
|
if (remainingDays === 0) {
|
||||||
|
return `${months} month${months !== 1 ? 's' : ''} ago`;
|
||||||
|
}
|
||||||
|
return `${months} month${months !== 1 ? 's' : ''}, ${remainingDays} day${remainingDays !== 1 ? 's' : ''} ago`;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user