@dialpad/dialtone
Version:
Dialpad's Dialtone design system monorepo
85 lines (84 loc) • 3.57 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const dateFns = require("date-fns");
const datepicker_constants = require("./datepicker_constants.cjs");
const _parsedGetDate = (value) => value ? new Date(value) : /* @__PURE__ */ new Date();
const getWeekDays = (startDay, month, selectedDay) => {
const startDate = _parsedGetDate(JSON.parse(JSON.stringify(startDay)));
const dates = [];
for (let i = 0; i < 7; i++) {
const next = dateFns.addDays(startDate, i);
const isNext = dateFns.getMonth(next) !== month;
dates.push({
text: next.getDate(),
value: next,
currentMonth: !isNext,
isFirstDayOfMonth: next.getDate() === 1 && !isNext,
// will be selected if the date is the same as the selected day and is from the current month
selected: selectedDay ? next.getDate() === selectedDay && !isNext : false
});
}
return dates;
};
const isDateEqual = (date, dateToCompare) => {
if (!date || !dateToCompare) {
return false;
}
return dateFns.isEqual(date, dateToCompare);
};
const getCalendarDays = (month, year, selectedDay) => {
const weeks = [];
const firstDate = _parsedGetDate(new Date(year, month));
const lastDate = _parsedGetDate(new Date(year, month + 1, 0));
const weekStartsOn = datepicker_constants.WEEK_START;
const firstDateInCalendar = dateFns.startOfWeek(firstDate, { weekStartsOn });
const addDaysToWeek = (date) => {
const days = getWeekDays(date, month, selectedDay);
weeks.push({ days });
if (!weeks[weeks.length - 1].days.some(
(day) => isDateEqual(day.value, lastDate)
)) {
const nextDate = dateFns.addDays(date, 7);
addDaysToWeek(nextDate);
}
};
addDaysToWeek(firstDateInCalendar);
return weeks;
};
const getWeekDayNames = (locale, weekStart) => {
const days = [1, 2, 3, 4, 5, 6, 7].map((day) => {
return new Intl.DateTimeFormat(locale, { weekday: "short", timeZone: "UTC" }).format(/* @__PURE__ */ new Date(`2017-01-0${day}T00:00:00+00:00`)).slice(0, 2);
});
const beforeWeekStart = days.slice(0, weekStart);
const afterWeekStart = days.slice(weekStart + 1, days.length);
return [days[weekStart]].concat(...afterWeekStart).concat(...beforeWeekStart);
};
const formatMonth = (month, monthFormat, locale) => {
return new Intl.DateTimeFormat(locale, { month: monthFormat }).format(new Date(2e3, month, 1));
};
const calculateNextFocusDate = (currentDate) => {
const date = new Date(currentDate);
const currentWeekday = dateFns.getDay(date);
const nextMonthDate = dateFns.addMonths(date, 1);
const nextMonthStart = dateFns.startOfMonth(nextMonthDate);
const nextMonthStartWeekday = dateFns.getDay(nextMonthStart);
const dayDifference = (currentWeekday - nextMonthStartWeekday + 7) % 7;
const focusDate = dateFns.addDays(nextMonthStart, dayDifference);
return dateFns.getDate(focusDate);
};
const calculatePrevFocusDate = (currentDate) => {
const date = new Date(currentDate);
const currentWeekday = dateFns.getDay(date);
const lastDayOfPrevMonth = dateFns.endOfMonth(dateFns.subMonths(date, 1));
let focusDate = lastDayOfPrevMonth;
while (dateFns.getDay(focusDate) !== currentWeekday) {
focusDate = dateFns.addDays(focusDate, -1);
}
return dateFns.getDate(focusDate);
};
exports.calculateNextFocusDate = calculateNextFocusDate;
exports.calculatePrevFocusDate = calculatePrevFocusDate;
exports.formatMonth = formatMonth;
exports.getCalendarDays = getCalendarDays;
exports.getWeekDayNames = getWeekDayNames;
//# sourceMappingURL=utils.cjs.map