UNPKG

@kelvininc/ui-components

Version:
111 lines (110 loc) 5.51 kB
import dayjs from "dayjs"; import advancedFormat from "dayjs/plugin/advancedFormat"; import customParseFormat from "dayjs/plugin/customParseFormat"; import localeData from "dayjs/plugin/localeData"; import objectSupport from "dayjs/plugin/objectSupport"; import timezone from "dayjs/plugin/timezone"; import isBetween from "dayjs/plugin/isBetween"; import quarterOfYear from "dayjs/plugin/quarterOfYear"; import utc from "dayjs/plugin/utc"; import { TIMEZONES } from "./date.config"; dayjs.extend(quarterOfYear); dayjs.extend(advancedFormat); dayjs.extend(customParseFormat); dayjs.extend(localeData); dayjs.extend(objectSupport); dayjs.extend(timezone); dayjs.extend(isBetween); dayjs.extend(utc); /** * Helper methods for date type display, parse, calculate and manipulation. * * @note The month number should be a number between 1 and 12, where 1 corresponds to January and 12 December. */ export const newDate = (date) => dayjs(date); export const newTimezoneDate = (timezone, date) => dayjs.tz(date, timezone); export const newTimezoneDateFromFormat = (timezone, format, date) => dayjs.tz(date, format, timezone); // Constructors export const fromISO = (date) => newDate(date); export const fromDateFields = (day, month, year) => newDate({ day, month: month - 1, year }); export const fromDateInput = (date) => newDate(date); // Months export const getMonthName = (month) => `${dayjs() .month(month - 1) .format('MMMM')}`; export const getNumberOfDaysInMonth = (month, year) => dayjs() .month(month - 1) .year(year) .daysInMonth(); // Weekdays export const getWeekdaysNames = () => dayjs.weekdaysMin(); export const getFirstWeekdayIndexOfMonth = (month, year) => Number.parseInt(newDate({ month: month - 1, year }) .startOf('month') .format('d')); // Dates export const isDateBefore = (dateA, dateB) => newDate(dateA).isBefore(dateB, 'days'); export const isDateTimeBefore = (dateA, dateB) => newDate(dateA).isBefore(dateB); export const isDateTimeAfter = (dateA, dateB) => newDate(dateA).isAfter(dateB); export const isDateAfter = (dateA, dateB) => newDate(dateA).isAfter(dateB, 'days'); export const isDateSame = (dateA, dateB) => newDate(dateA).isSame(dateB, 'days'); export const isDateInRange = (date, rangeStartDate, rangeEndDate, inclusive = true) => { const daysOffset = inclusive ? 1 : 0; const rangeStartDateInstance = newDate(rangeStartDate).subtract(daysOffset, 'days'); const rangeEndDateInstance = newDate(rangeEndDate).add(daysOffset, 'days'); return isDateAfter(date, rangeStartDateInstance) && isDateBefore(date, rangeEndDateInstance); }; export const isDateInArray = (date, array = []) => array.some(arrayDate => newDate(date).isSame(arrayDate, 'days')); export const getDateMonth = (date) => newDate(date).month() + 1; export const getDateYear = (date) => newDate(date).year(); export const getDatesBetweenRange = (dateRangeStart, dateRangeEnd, inclusive = true) => { const daysOffset = inclusive ? 1 : 0; const rangeStartDateInstance = newDate(dateRangeStart).subtract(daysOffset, 'days'); const rangeEndDateInstance = newDate(dateRangeEnd).add(daysOffset, 'days'); const dates = []; for (let indexDate = rangeStartDateInstance.add(1, 'days'); indexDate.diff(rangeEndDateInstance, 'days') < 0; indexDate = indexDate.add(1, 'days')) { dates.push(formatDate(indexDate)); } return dates; }; // Timezones export const getTimezonesNames = () => { var _a, _b, _c; return (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.Intl) === null || _a === void 0 ? void 0 : _a.supportedValuesOf) === null || _b === void 0 ? void 0 : _b.call(_a, 'timeZone')) !== null && _c !== void 0 ? _c : TIMEZONES; }; export const getDefaultTimezone = () => { var _a; return (_a = dayjs.tz.guess()) !== null && _a !== void 0 ? _a : 'UTC'; }; export const getTimezoneOffset = (zone) => newDate().tz(zone).utcOffset(); // Formatters export const formatDateTime = (date, mask = 'YYYY-MM-DD HH:mm:ss') => fromDateInput(date).format(mask); export const formatDate = (date, mask = 'YYYY-MM-DD') => newDate(date).format(mask); export const formatTimezoneName = (timezone, date = dayjs()) => `(${newDate(date).tz(timezone).format('Z')}) ${timezone.replace(/_+/g, ' ')}`; export const formatForTimezone = (timezone, date) => newTimezoneDate(timezone, date).format(); // Utils export const areDatesValid = (dates) => { return dates.find(date => !isDateValid(date)) === undefined; }; export const isDateValid = (date) => { if (date === undefined) { return false; } return newDate(date).isValid(); }; export const calculateOffsetDate = (date, offset = 0, unit = 'days') => { if (['quarter', 'quarters', 'Q'].includes(unit)) { return newDate(date).add(offset, 'quarter'); } return newDate(date).add(offset, unit); }; export const getMonthAndYearTitle = (month, year) => `${getMonthName(month)} ${year}`; export const getDefaultTimezoneSettings = (timezone) => { const defaultTimezone = timezone !== null && timezone !== void 0 ? timezone : getDefaultTimezone(); return { name: defaultTimezone, offset: getTimezoneOffset(defaultTimezone) }; }; export const buildTimezoneByOffset = (timezones) => { return timezones .map(name => { const offset = getTimezoneOffset(name); const label = formatTimezoneName(name); return { offset, name, label }; }) .sort((name1, name2) => name1.offset - name2.offset); };