@dialpad/dialtone
Version:
Dialpad's Dialtone design system monorepo
118 lines (117 loc) • 3.79 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const vue = require("vue");
const utils = require("../utils.cjs");
const datepicker_constants = require("../datepicker_constants.cjs");
const dateFns = require("date-fns");
const common_utils = require("../../../common/utils.cjs");
function useCalendar(props, emits) {
const selectedDay = vue.ref(null);
const focusDay = vue.ref(0);
const daysRef = vue.ref([]);
const weekDays = vue.computed(() => {
return utils.getWeekDayNames(props.locale, datepicker_constants.WEEK_START);
});
vue.watch(() => props.calendarDays, () => {
focusDay.value = 0;
daysRef.value = [];
selectedDay.value = null;
});
function dayAriaLabel(day) {
return `${props.selectDayLabel} ${day.text} ${dateFns.format(day.value, datepicker_constants.MONTH_FORMAT)} ${dateFns.getYear(day.value)}`;
}
function setDayRef(el, day) {
if (!daysRef.value.some((day2) => day2.el === el) && day.currentMonth) {
daysRef.value.push({ el, day });
}
}
function handleKeyDown(event) {
switch (event.key) {
case "ArrowUp":
event.preventDefault();
focusDay.value -= 7;
try {
common_utils.returnFirstEl(daysRef.value[focusDay.value].el.$el).focus();
} catch (error) {
const prevFocusDate = utils.calculatePrevFocusDate(daysRef.value[focusDay.value + 7].day.value);
emits("go-to-prev-month");
vue.nextTick(() => {
common_utils.returnFirstEl(daysRef.value[prevFocusDate - 1].el.$el).focus();
focusDay.value += prevFocusDate - 1;
});
}
break;
case "ArrowDown":
event.preventDefault();
focusDay.value += 7;
try {
common_utils.returnFirstEl(daysRef.value[focusDay.value].el.$el).focus();
} catch (error) {
const nextFocusDate = utils.calculateNextFocusDate(daysRef.value[focusDay.value - 7].day.value);
emits("go-to-next-month");
vue.nextTick(() => {
common_utils.returnFirstEl(daysRef.value[nextFocusDate - 1].el.$el).focus();
focusDay.value += nextFocusDate - 1;
});
}
break;
case "ArrowLeft":
event.preventDefault();
if (focusDay.value > 0) {
focusDay.value -= 1;
common_utils.returnFirstEl(daysRef.value[focusDay.value].el.$el).focus();
} else {
emits("go-to-prev-month");
focusLastDay();
}
break;
case "ArrowRight":
event.preventDefault();
if (focusDay.value < daysRef.value.length - 1) {
focusDay.value += 1;
common_utils.returnFirstEl(daysRef.value[focusDay.value].el.$el).focus();
} else {
emits("go-to-next-month");
focusFirstDay();
}
break;
case "Tab":
event.preventDefault();
emits("focus-month-year-picker");
break;
case "Escape":
emits("close-datepicker");
break;
}
}
function focusFirstDay() {
focusDay.value = 0;
vue.nextTick(() => {
common_utils.returnFirstEl(daysRef.value[focusDay.value].el.$el).focus();
});
}
function focusLastDay() {
vue.nextTick(() => {
focusDay.value = daysRef.value.length - 1;
common_utils.returnFirstEl(daysRef.value[focusDay.value].el.$el).focus();
});
}
function selectDay(day) {
if (!day.currentMonth) {
return;
}
selectedDay.value = day.text;
emits("select-date", day.value);
}
return {
selectedDay,
weekDays,
dayAriaLabel,
setDayRef,
handleKeyDown,
focusFirstDay,
selectDay
};
}
exports.useCalendar = useCalendar;
//# sourceMappingURL=useCalendar.cjs.map