TeaWeb/shared/js/utils/DateUtils.ts

115 lines
3.8 KiB
TypeScript

import {Settings, settings} from "../settings";
import { tr } from "tc-shared/i18n/localize";
export enum ColloquialFormat {
YESTERDAY,
TODAY,
GENERAL
}
function dateEqual(a: Date, b: Date) {
return a.getUTCFullYear() === b.getUTCFullYear() &&
a.getUTCMonth() === b.getUTCMonth() &&
a.getUTCDate() === b.getUTCDate();
}
export function same_day(a: number | Date, b: number | Date) {
a = a instanceof Date ? a : new Date(a);
b = b instanceof Date ? b : new Date(b);
if(a.getDate() !== b.getDate())
return false;
if(a.getMonth() !== b.getMonth())
return false;
return a.getFullYear() === b.getFullYear();
}
export function date_format(date: Date, now: Date, ignore_settings?: boolean) : ColloquialFormat {
if(!ignore_settings && !settings.getValue(Settings.KEY_CHAT_COLLOQUIAL_TIMESTAMPS))
return ColloquialFormat.GENERAL;
if(dateEqual(date, now))
return ColloquialFormat.TODAY;
date = new Date(date.getTime());
date.setDate(date.getDate() + 1);
if(dateEqual(date, now))
return ColloquialFormat.YESTERDAY;
return ColloquialFormat.GENERAL;
}
export function formatDayTime(date: Date) {
return ("0" + date.getHours()).substr(-2) + ":" + ("0" + date.getMinutes()).substr(-2);
}
export function format_date_general(date: Date, hours?: boolean) : string {
return ('00' + date.getDate()).substr(-2) + "."
+ ('00' + date.getMonth()).substr(-2) + "."
+ date.getFullYear() +
(typeof(hours) === "undefined" || hours ? " at "
+ ('00' + date.getHours()).substr(-2) + ":"
+ ('00' + date.getMinutes()).substr(-2)
: "");
}
export function format_date_colloquial(date: Date, current_timestamp: Date) : { result: string; format: ColloquialFormat } {
const format = date_format(date, current_timestamp);
if(format == ColloquialFormat.GENERAL) {
return {
result: format_date_general(date),
format: format
};
} else {
let hrs = date.getHours();
let time = "AM";
if(hrs > 12) {
hrs -= 12;
time = "PM";
}
return {
result: (format == ColloquialFormat.YESTERDAY ? tr("Yesterday at") : tr("Today at")) + " " + ("0" + hrs).substr(-2) + ":" + ("0" + date.getMinutes()).substr(-2) + " " + time,
format: format
};
}
}
export function format_chat_time(date: Date) : {
result: string,
next_update: number /* in MS */
} {
const timestamp = date.getTime();
const current_timestamp = new Date();
const result = {
result: "",
next_update: 0
};
if(settings.getValue(Settings.KEY_CHAT_FIXED_TIMESTAMPS)) {
const format = format_date_colloquial(date, current_timestamp);
result.result = format.result;
result.next_update = 0; /* TODO: Update on day change? */
} else {
const delta = current_timestamp.getTime() - timestamp;
if(delta < 2000) {
result.result = "now";
result.next_update = 2500 - delta; /* update after two seconds */
} else if(delta < 30000) { /* 30 seconds */
result.result = Math.floor(delta / 1000) + " " + tr("seconds ago");
result.next_update = 1000; /* update every second */
} else if(delta < 30 * 60 * 1000) { /* 30 minutes */
if(delta < 120 * 1000)
result.result = tr("one minute ago");
else
result.result = Math.floor(delta / (1000 * 60)) + " " + tr("minutes ago");
result.next_update = 60000; /* updater after a minute */
} else {
result.result = format_date_colloquial(date, current_timestamp).result;
result.next_update = 0; /* TODO: Update on day change? */
}
}
return result;
}