website refactor
This commit is contained in:
37
apps/website/lib/display-objects/RelativeTimeDisplay.ts
Normal file
37
apps/website/lib/display-objects/RelativeTimeDisplay.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* RelativeTimeDisplay
|
||||
*
|
||||
* Deterministic relative time formatting.
|
||||
*/
|
||||
|
||||
export class RelativeTimeDisplay {
|
||||
/**
|
||||
* Formats a date relative to "now".
|
||||
* "now" must be passed as an argument for determinism.
|
||||
*/
|
||||
static format(date: string | Date, now: Date): string {
|
||||
const d = typeof date === 'string' ? new Date(date) : date;
|
||||
const diffMs = d.getTime() - now.getTime();
|
||||
const diffHours = Math.floor(Math.abs(diffMs) / (1000 * 60 * 60));
|
||||
const diffDays = Math.floor(Math.abs(diffMs) / (1000 * 60 * 60 * 24));
|
||||
|
||||
if (diffMs < 0) {
|
||||
if (diffHours < 1) return 'Just now';
|
||||
if (diffHours < 24) return `${diffHours}h ago`;
|
||||
if (diffDays === 1) return 'Yesterday';
|
||||
if (diffDays < 7) return `${diffDays}d ago`;
|
||||
return this.formatAbsolute(d);
|
||||
} else {
|
||||
if (diffHours < 1) return 'Starting soon';
|
||||
if (diffHours < 24) return `In ${diffHours}h`;
|
||||
if (diffDays === 1) return 'Tomorrow';
|
||||
if (diffDays < 7) return `In ${diffDays} days`;
|
||||
return this.formatAbsolute(d);
|
||||
}
|
||||
}
|
||||
|
||||
private static formatAbsolute(date: Date): string {
|
||||
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
||||
return `${months[date.getUTCMonth()]} ${date.getUTCDate()}`;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user