UNPKG

@vaadin/hilla-react-crud

Version:

Hilla CRUD utils for React

112 lines 3.87 kB
import { DatePickerElement } from '@vaadin/react-components/DatePicker.js'; import { DateTimePickerElement } from '@vaadin/react-components/DateTimePicker.js'; import { createContext, useContext, useMemo } from 'react'; export const LocaleContext = createContext(navigator.language); function getFormatRegex(format) { const sampleDate = new Date(1234, 5 - 1, 6); const formattedSample = format.format(sampleDate); const pattern = formattedSample .replace('1234', '(?<year>\\d+)') .replace('05', '(?<month>\\d+)') .replace('5', '(?<month>\\d+)') .replace('06', '(?<day>\\d+)') .replace('6', '(?<day>\\d+)'); return new RegExp(pattern, 'u'); } function tryFormatDate(formatter, value) { try { return value ? formatter.format(new Date(value)) : ''; } catch { return ''; } } export class LocaleFormatter { #date; #localTime; #localDateTime; #integer; #decimal; #parsePattern; constructor(locale) { this.#date = new Intl.DateTimeFormat(locale); this.#localTime = new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: 'numeric', }); this.#localDateTime = new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric', }); this.#integer = new Intl.NumberFormat(locale, { maximumFractionDigits: 0, }); this.#decimal = new Intl.NumberFormat(locale, { maximumFractionDigits: 2, minimumFractionDigits: 2, }); this.#parsePattern = getFormatRegex(this.#date); } formatDate(value) { if (typeof value === 'object') { const { year, month, day } = value; const date = new Date(); date.setFullYear(year, month, day); return this.#date.format(date); } return tryFormatDate(this.#date, value); } formatLocalTime(value) { return tryFormatDate(this.#localTime, `2000-01-01T${value}`); } formatLocalDateTime(value) { return tryFormatDate(this.#localDateTime, value); } formatInteger(value) { return value && Number.isFinite(value) ? this.#integer.format(value) : ''; } formatDecimal(value) { return value && Number.isFinite(value) ? this.#decimal.format(value) : ''; } parse(dateString) { const match = this.#parsePattern.exec(dateString); const year = Number(match?.groups?.year); const month = Number(match?.groups?.month) - 1; const day = Number(match?.groups?.day); const dateInstance = new Date(); dateInstance.setFullYear(year, month, day); if (dateInstance.getFullYear() !== year || dateInstance.getMonth() !== month || dateInstance.getDate() !== day) { return undefined; } return { year, month, day }; } } export function useLocaleFormatter() { const locale = useContext(LocaleContext); return useMemo(() => new LocaleFormatter(locale), [locale]); } const defaultDatePickerI18n = new DatePickerElement().i18n; export function useDatePickerI18n() { const formatter = useLocaleFormatter(); return useMemo(() => ({ ...defaultDatePickerI18n, formatDate(value) { return formatter.formatDate(value); }, parseDate(value) { return formatter.parse(value); }, }), [formatter]); } const defaultDateTimePickerI18n = new DateTimePickerElement().i18n; export function useDateTimePickerI18n() { const datePickerI18n = useDatePickerI18n(); return useMemo(() => ({ ...defaultDateTimePickerI18n, ...datePickerI18n, }), [datePickerI18n]); } //# sourceMappingURL=locale.js.map