diff --git a/src/public/app/utils/formatters.js b/src/public/app/utils/formatters.ts similarity index 59% rename from src/public/app/utils/formatters.js rename to src/public/app/utils/formatters.ts index 638404c89..398aa678b 100644 --- a/src/public/app/utils/formatters.js +++ b/src/public/app/utils/formatters.ts @@ -1,17 +1,16 @@ +type DateTimeStyle = "full" | "long" | "medium" | "short" | "none" | undefined; + /** * Formats the given date and time to a string based on the current locale. - * @param {string | Date | number} date - * @param {"full" | "long" | "medium" | "short" | "none" | undefined} dateStyle - * @param {"full" | "long" | "medium" | "short" | "none" | undefined} timeStyle */ -export function formatDateTime(date, dateStyle = "medium", timeStyle = "medium") { +export function formatDateTime(date: string | Date | number, dateStyle: DateTimeStyle = "medium", timeStyle: DateTimeStyle = "medium") { const locale = navigator.language; let parsedDate; - if (typeof date === "string") { + if (typeof date === "string" || typeof date === "number") { // Parse the given string as a date parsedDate = new Date(date); - } else if (typeof date === "number" || date instanceof Date) { + } else if (date instanceof Date) { // The given date is already a Date instance or a number parsedDate = date; } else { @@ -19,16 +18,18 @@ export function formatDateTime(date, dateStyle = "medium", timeStyle = "medium") throw new TypeError(`Invalid type for the "date" argument.`); }; - if (timeStyle === "none") { - // Format only the date - return parsedDate.toLocaleDateString(locale, {dateStyle}); - } else if (dateStyle === "none") { - // Format only the time - return parsedDate.toLocaleTimeString(locale, {timeStyle}); - } else { + if (timeStyle !== "none" && dateStyle !== "none") { // Format the date and time const formatter = new Intl.DateTimeFormat(navigator.language, {dateStyle, timeStyle}); return formatter.format(parsedDate); + } else if (timeStyle === "none" && dateStyle !== "none") { + // Format only the date + return parsedDate.toLocaleDateString(locale, {dateStyle}); + } else if (dateStyle === "none" && timeStyle !== "none") { + // Format only the time + return parsedDate.toLocaleTimeString(locale, {timeStyle}); } + + throw new Error("Incorrect state."); }