From 9797950f32176b2a23eaa3df8d4cf675c4c6d08c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 31 May 2023 12:36:52 +0200 Subject: [PATCH] Use memoize in formatDateNumeric (#16686) --- src/common/datetime/format_date.ts | 89 +++++++++++++++++------------- 1 file changed, 50 insertions(+), 39 deletions(-) diff --git a/src/common/datetime/format_date.ts b/src/common/datetime/format_date.ts index 761d53703d..cb6893a625 100644 --- a/src/common/datetime/format_date.ts +++ b/src/common/datetime/format_date.ts @@ -31,52 +31,63 @@ const formatDateMem = memoizeOne( ); // 10/08/2021 -export const formatDateNumeric = (dateObj: Date, locale: FrontendLocaleData) => - formatDateNumericMem(locale, dateObj); +export const formatDateNumeric = ( + dateObj: Date, + locale: FrontendLocaleData +) => { + const formatter = formatDateNumericMem(locale); -const formatDateNumericMem = memoizeOne( - (locale: FrontendLocaleData, dateObj: Date) => { - const localeString = - locale.date_format === DateFormat.system ? undefined : locale.language; + if ( + locale.date_format === DateFormat.language || + locale.date_format === DateFormat.system + ) { + return formatter.format(dateObj); + } - if ( - locale.date_format === DateFormat.language || - locale.date_format === DateFormat.system - ) { - return new Intl.DateTimeFormat(localeString, { - year: "numeric", - month: "numeric", - day: "numeric", - }).format(dateObj); - } + const parts = formatter.formatToParts(dateObj); - const parts = new Intl.DateTimeFormat(localeString, { + const literal = parts.find((value) => value.type === "literal")?.value; + const day = parts.find((value) => value.type === "day")?.value; + const month = parts.find((value) => value.type === "month")?.value; + const year = parts.find((value) => value.type === "year")?.value; + + const lastPart = parts.at(parts.length - 1); + let lastLiteral = lastPart?.type === "literal" ? lastPart?.value : ""; + + if (locale.language === "bg" && locale.date_format === DateFormat.YMD) { + lastLiteral = ""; + } + + const formats = { + [DateFormat.DMY]: `${day}${literal}${month}${literal}${year}${lastLiteral}`, + [DateFormat.MDY]: `${month}${literal}${day}${literal}${year}${lastLiteral}`, + [DateFormat.YMD]: `${year}${literal}${month}${literal}${day}${lastLiteral}`, + }; + + return formats[locale.date_format]; +}; + +const formatDateNumericMem = memoizeOne((locale: FrontendLocaleData) => { + const localeString = + locale.date_format === DateFormat.system ? undefined : locale.language; + + if ( + locale.date_format === DateFormat.language || + locale.date_format === DateFormat.system + ) { + return new Intl.DateTimeFormat(localeString, { year: "numeric", month: "numeric", day: "numeric", - }).formatToParts(dateObj); - - const literal = parts.find((value) => value.type === "literal")?.value; - const day = parts.find((value) => value.type === "day")?.value; - const month = parts.find((value) => value.type === "month")?.value; - const year = parts.find((value) => value.type === "year")?.value; - - const lastPart = parts.at(parts.length - 1); - let lastLiteral = lastPart?.type === "literal" ? lastPart?.value : ""; - - if (localeString === "bg" && locale.date_format === DateFormat.YMD) { - lastLiteral = ""; - } - - const formats = { - [DateFormat.DMY]: `${day}${literal}${month}${literal}${year}${lastLiteral}`, - [DateFormat.MDY]: `${month}${literal}${day}${literal}${year}${lastLiteral}`, - [DateFormat.YMD]: `${year}${literal}${month}${literal}${day}${lastLiteral}`, - }; - - return formats[locale.date_format]; + }); } -); + + return new Intl.DateTimeFormat(localeString, { + year: "numeric", + month: "numeric", + day: "numeric", + }); +}); // Aug 10 export const formatDateShort = (dateObj: Date, locale: FrontendLocaleData) =>