44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import { type ClassValue, clsx } from "clsx";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs));
|
|
}
|
|
|
|
/**
|
|
* Format a date as relative time (e.g., "2 minutes ago", "1 hour ago")
|
|
*/
|
|
export function formatRelativeTime(dateString: string): string {
|
|
const date = new Date(dateString);
|
|
const now = new Date();
|
|
const diffInMs = now.getTime() - date.getTime();
|
|
const diffInSeconds = Math.floor(diffInMs / 1000);
|
|
|
|
if (diffInSeconds < 60) {
|
|
return diffInSeconds <= 1 ? "just now" : `${diffInSeconds} seconds ago`;
|
|
}
|
|
|
|
const diffInMinutes = Math.floor(diffInSeconds / 60);
|
|
if (diffInMinutes < 60) {
|
|
return diffInMinutes === 1 ? "1 minute ago" : `${diffInMinutes} minutes ago`;
|
|
}
|
|
|
|
const diffInHours = Math.floor(diffInMinutes / 60);
|
|
if (diffInHours < 24) {
|
|
return diffInHours === 1 ? "1 hour ago" : `${diffInHours} hours ago`;
|
|
}
|
|
|
|
const diffInDays = Math.floor(diffInHours / 24);
|
|
if (diffInDays < 30) {
|
|
return diffInDays === 1 ? "1 day ago" : `${diffInDays} days ago`;
|
|
}
|
|
|
|
const diffInMonths = Math.floor(diffInDays / 30);
|
|
if (diffInMonths < 12) {
|
|
return diffInMonths === 1 ? "1 month ago" : `${diffInMonths} months ago`;
|
|
}
|
|
|
|
const diffInYears = Math.floor(diffInMonths / 12);
|
|
return diffInYears === 1 ? "1 year ago" : `${diffInYears} years ago`;
|
|
}
|