cjs • Lines: 349var $8b8d004404afcaba$exports = require("./utils.cjs");
var $14cedf286405cc4b$exports = require("../utils/useControlledState.cjs");
var $9I0if$internationalizeddate = require("@internationalized/date");
var $9I0if$react = require("react");
function $parcel$export(e, n, v, s) {
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
}
$parcel$export(module.exports, "useCalendarState", function () { return $e247a673010dfa8e$export$6d095e787d2b5e1f; });
/*
* Copyright 2020 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
function $e247a673010dfa8e$export$6d095e787d2b5e1f(props) {
let defaultFormatter = (0, $9I0if$react.useMemo)(()=>new (0, $9I0if$internationalizeddate.DateFormatter)(props.locale), [
props.locale
]);
let resolvedOptions = (0, $9I0if$react.useMemo)(()=>defaultFormatter.resolvedOptions(), [
defaultFormatter
]);
let { locale: locale, createCalendar: createCalendar, visibleDuration: visibleDuration = {
months: 1
}, minValue: minValue, maxValue: maxValue, selectionAlignment: selectionAlignment, isDateUnavailable: isDateUnavailable, pageBehavior: pageBehavior = 'visible', selectionMode: selectionMode = 'single', firstDayOfWeek: firstDayOfWeek, weeksInMonth: weeksInMonth } = props;
let calendar = (0, $9I0if$react.useMemo)(()=>createCalendar(resolvedOptions.calendar), [
createCalendar,
resolvedOptions.calendar
]);
let [value, setControlledValue] = (0, $14cedf286405cc4b$exports.useControlledState)(props.value, props.defaultValue ?? null, props.onChange);
let calendarDateValue = (0, $9I0if$react.useMemo)(()=>{
if (Array.isArray(value)) return value.map((value)=>(0, $9I0if$internationalizeddate.toCalendar)((0, $9I0if$internationalizeddate.toCalendarDate)(value), calendar));
else return value ? (0, $9I0if$internationalizeddate.toCalendar)((0, $9I0if$internationalizeddate.toCalendarDate)(value), calendar) : null;
}, [
value,
calendar
]);
let timeZone = (0, $9I0if$react.useMemo)(()=>{
let val = Array.isArray(value) ? value[0] : value;
return val && 'timeZone' in val ? val.timeZone : resolvedOptions.timeZone;
}, [
value,
resolvedOptions.timeZone
]);
let focusedCalendarDate = (0, $9I0if$react.useMemo)(()=>props.focusedValue ? (0, $8b8d004404afcaba$exports.constrainValue)((0, $9I0if$internationalizeddate.toCalendar)((0, $9I0if$internationalizeddate.toCalendarDate)(props.focusedValue), calendar), minValue, maxValue) : undefined, [
props.focusedValue,
calendar,
minValue,
maxValue
]);
let defaultFocusedCalendarDate = (0, $9I0if$react.useMemo)(()=>{
if (props.defaultFocusedValue) return (0, $8b8d004404afcaba$exports.constrainValue)((0, $9I0if$internationalizeddate.toCalendar)((0, $9I0if$internationalizeddate.toCalendarDate)(props.defaultFocusedValue), calendar), minValue, maxValue);
if (calendarDateValue) return (0, $8b8d004404afcaba$exports.constrainValue)(Array.isArray(calendarDateValue) ? calendarDateValue[0] : calendarDateValue, minValue, maxValue);
return (0, $8b8d004404afcaba$exports.constrainValue)((0, $9I0if$internationalizeddate.toCalendar)((0, $9I0if$internationalizeddate.today)(timeZone), calendar), minValue, maxValue);
}, [
props.defaultFocusedValue,
calendarDateValue,
timeZone,
calendar,
minValue,
maxValue
]);
let [focusedDate, setFocusedDate] = (0, $14cedf286405cc4b$exports.useControlledState)(focusedCalendarDate, defaultFocusedCalendarDate, props.onFocusChange);
let getStartDate = ()=>{
switch(selectionAlignment){
case 'start':
return (0, $8b8d004404afcaba$exports.alignStart)(focusedDate, visibleDuration, locale, minValue, maxValue);
case 'end':
return (0, $8b8d004404afcaba$exports.alignEnd)(focusedDate, visibleDuration, locale, minValue, maxValue);
case 'center':
default:
return (0, $8b8d004404afcaba$exports.alignCenter)(focusedDate, visibleDuration, locale, minValue, maxValue);
}
};
let [startDate, setStartDate] = (0, $9I0if$react.useState)(getStartDate);
let [isFocused, setFocused] = (0, $9I0if$react.useState)(props.autoFocus || false);
let [lastVisibleDuration, setLastVisibleDuration] = (0, $9I0if$react.useState)(visibleDuration);
if (!(0, $8b8d004404afcaba$exports.isEqualDuration)(visibleDuration, lastVisibleDuration)) {
setLastVisibleDuration(visibleDuration);
setStartDate(getStartDate());
}
let endDate = (0, $9I0if$react.useMemo)(()=>{
let duration = {
...visibleDuration
};
if (duration.days) duration.days--;
else duration.days = -1;
return startDate.add(duration);
}, [
startDate,
visibleDuration
]);
// Reset focused date and visible range when calendar changes.
let [lastCalendar, setLastCalendar] = (0, $9I0if$react.useState)(calendar);
if (!(0, $9I0if$internationalizeddate.isEqualCalendar)(calendar, lastCalendar)) {
let newFocusedDate = (0, $9I0if$internationalizeddate.toCalendar)(focusedDate, calendar);
setStartDate((0, $8b8d004404afcaba$exports.alignCenter)(newFocusedDate, visibleDuration, locale, minValue, maxValue));
setFocusedDate(newFocusedDate);
setLastCalendar(calendar);
}
if ((0, $8b8d004404afcaba$exports.isInvalid)(focusedDate, minValue, maxValue)) // If the focused date was moved to an invalid value, it can't be focused, so constrain it.
setFocusedDate((0, $8b8d004404afcaba$exports.constrainValue)(focusedDate, minValue, maxValue));
else if (focusedDate.compare(startDate) < 0) setStartDate((0, $8b8d004404afcaba$exports.alignEnd)(focusedDate, visibleDuration, locale, minValue, maxValue));
else if (focusedDate.compare(endDate) > 0) setStartDate((0, $8b8d004404afcaba$exports.alignStart)(focusedDate, visibleDuration, locale, minValue, maxValue));
// Sets focus to a specific cell date
function focusCell(date) {
date = (0, $8b8d004404afcaba$exports.constrainValue)(date, minValue, maxValue);
setFocusedDate(date);
}
function normalizeValue(newValue) {
let constrained = (0, $8b8d004404afcaba$exports.constrainValue)(newValue, minValue, maxValue);
let prev = (0, $8b8d004404afcaba$exports.previousAvailableDate)(constrained, startDate, isDateUnavailable);
if (!prev) return null;
// The display calendar should not have any effect on the emitted value.
// Emit dates in the same calendar as the original value, if any, otherwise gregorian.
let baseValue = Array.isArray(value) ? value[0] : value;
let calendarValue = (0, $9I0if$internationalizeddate.toCalendar)(prev, baseValue?.calendar || new (0, $9I0if$internationalizeddate.GregorianCalendar)());
// Preserve time if the input value had one.
if (baseValue && 'hour' in baseValue) return baseValue.set(calendarValue);
return calendarValue;
}
function setValue(newValue) {
if (!props.isDisabled && !props.isReadOnly) {
if (newValue === null) {
setControlledValue(selectionMode === 'multiple' ? [] : null);
return;
}
if (Array.isArray(newValue)) setControlledValue(newValue.map(normalizeValue).filter(Boolean));
else {
let localValue = normalizeValue(newValue);
if (localValue) setControlledValue(localValue);
}
}
}
let isUnavailable = (0, $9I0if$react.useMemo)(()=>{
if (!calendarDateValue) return false;
if (Array.isArray(calendarDateValue)) return calendarDateValue.some((date)=>isDateUnavailable?.(date) || (0, $8b8d004404afcaba$exports.isInvalid)(date, minValue, maxValue));
return isDateUnavailable?.(calendarDateValue) || (0, $8b8d004404afcaba$exports.isInvalid)(calendarDateValue, minValue, maxValue);
}, [
calendarDateValue,
isDateUnavailable,
minValue,
maxValue
]);
let isValueInvalid = props.isInvalid || props.validationState === 'invalid' || isUnavailable;
let validationState = isValueInvalid ? 'invalid' : null;
let pageDuration = (0, $9I0if$react.useMemo)(()=>{
if (pageBehavior === 'visible') return visibleDuration;
return $e247a673010dfa8e$var$unitDuration(visibleDuration);
}, [
pageBehavior,
visibleDuration
]);
return {
isDisabled: props.isDisabled ?? false,
isReadOnly: props.isReadOnly ?? false,
value: calendarDateValue,
setValue: setValue,
selectionMode: selectionMode,
visibleDuration: visibleDuration,
visibleRange: {
start: startDate,
end: endDate
},
minValue: minValue,
maxValue: maxValue,
focusedDate: focusedDate,
timeZone: timeZone,
validationState: validationState,
isValueInvalid: isValueInvalid,
setFocusedDate (date) {
focusCell(date);
},
focusNextDay () {
focusCell(focusedDate.add({
days: 1
}));
},
focusPreviousDay () {
focusCell(focusedDate.subtract({
days: 1
}));
},
focusNextRow () {
if (visibleDuration.days) this.focusNextPage();
else if (visibleDuration.weeks || visibleDuration.months || visibleDuration.years) focusCell(focusedDate.add({
weeks: 1
}));
},
focusPreviousRow () {
if (visibleDuration.days) this.focusPreviousPage();
else if (visibleDuration.weeks || visibleDuration.months || visibleDuration.years) focusCell(focusedDate.subtract({
weeks: 1
}));
},
focusNextPage () {
let start = startDate.add(pageDuration);
setFocusedDate((0, $8b8d004404afcaba$exports.constrainValue)(focusedDate.add(pageDuration), minValue, maxValue));
setStartDate((0, $8b8d004404afcaba$exports.alignStart)((0, $8b8d004404afcaba$exports.constrainStart)(focusedDate, start, pageDuration, locale, minValue, maxValue), pageDuration, locale));
},
focusPreviousPage () {
let start = startDate.subtract(pageDuration);
setFocusedDate((0, $8b8d004404afcaba$exports.constrainValue)(focusedDate.subtract(pageDuration), minValue, maxValue));
setStartDate((0, $8b8d004404afcaba$exports.alignStart)((0, $8b8d004404afcaba$exports.constrainStart)(focusedDate, start, pageDuration, locale, minValue, maxValue), pageDuration, locale));
},
focusSectionStart () {
if (visibleDuration.days) focusCell(startDate);
else if (visibleDuration.weeks) focusCell((0, $9I0if$internationalizeddate.startOfWeek)(focusedDate, locale));
else if (visibleDuration.months || visibleDuration.years) focusCell((0, $9I0if$internationalizeddate.startOfMonth)(focusedDate));
},
focusSectionEnd () {
if (visibleDuration.days) focusCell(endDate);
else if (visibleDuration.weeks) focusCell((0, $9I0if$internationalizeddate.endOfWeek)(focusedDate, locale));
else if (visibleDuration.months || visibleDuration.years) focusCell((0, $9I0if$internationalizeddate.endOfMonth)(focusedDate));
},
focusNextSection (larger) {
if (!larger && !visibleDuration.days) {
focusCell(focusedDate.add($e247a673010dfa8e$var$unitDuration(visibleDuration)));
return;
}
if (visibleDuration.days) this.focusNextPage();
else if (visibleDuration.weeks) focusCell(focusedDate.add({
months: 1
}));
else if (visibleDuration.months || visibleDuration.years) focusCell(focusedDate.add({
years: 1
}));
},
focusPreviousSection (larger) {
if (!larger && !visibleDuration.days) {
focusCell(focusedDate.subtract($e247a673010dfa8e$var$unitDuration(visibleDuration)));
return;
}
if (visibleDuration.days) this.focusPreviousPage();
else if (visibleDuration.weeks) focusCell(focusedDate.subtract({
months: 1
}));
else if (visibleDuration.months || visibleDuration.years) focusCell(focusedDate.subtract({
years: 1
}));
},
selectFocusedDate () {
if (!(isDateUnavailable && isDateUnavailable(focusedDate))) this.selectDate(focusedDate);
},
selectDate (date) {
if (props.isDisabled || props.isReadOnly) return;
if (selectionMode === 'multiple' && date != null) {
let newDate = normalizeValue(date);
if (!newDate) return;
let baseValue = [];
if (Array.isArray(value)) baseValue = value;
else if (value != null) baseValue = [
value
];
let index = baseValue.findIndex((value)=>(0, $9I0if$internationalizeddate.isSameDay)(value, newDate));
let newValue = index >= 0 ? baseValue.slice(0, index).concat(baseValue.slice(index + 1)) : [
...baseValue,
newDate
];
setControlledValue(newValue);
} else setValue(date);
},
isFocused: isFocused,
setFocused: setFocused,
isInvalid (date) {
return (0, $8b8d004404afcaba$exports.isInvalid)(date, minValue, maxValue);
},
isSelected (date) {
if (!calendarDateValue || this.isCellDisabled(date) || this.isCellUnavailable(date)) return false;
return Array.isArray(calendarDateValue) ? calendarDateValue.some((value)=>(0, $9I0if$internationalizeddate.isSameDay)(value, date)) : (0, $9I0if$internationalizeddate.isSameDay)(date, calendarDateValue);
},
isCellFocused (date) {
return isFocused && focusedDate && (0, $9I0if$internationalizeddate.isSameDay)(date, focusedDate);
},
isCellDisabled (date) {
return props.isDisabled || date.compare(startDate) < 0 || date.compare(endDate) > 0 || this.isInvalid(date);
},
isCellUnavailable (date) {
return props.isDateUnavailable ? props.isDateUnavailable(date) : false;
},
isPreviousVisibleRangeInvalid () {
let prev = startDate.subtract({
days: 1
});
return (0, $9I0if$internationalizeddate.isSameDay)(prev, startDate) || this.isInvalid(prev);
},
isNextVisibleRangeInvalid () {
// Adding may return the same date if we reached the end of time
// according to the calendar system (e.g. 9999-12-31).
let next = endDate.add({
days: 1
});
return (0, $9I0if$internationalizeddate.isSameDay)(next, endDate) || this.isInvalid(next);
},
getDatesInWeek (weekIndex, from = startDate) {
let date = from.add({
weeks: weekIndex
});
let dates = [];
let days = visibleDuration.days && visibleDuration.days < 7 ? visibleDuration.days : 7;
if (days === 7) {
date = (0, $9I0if$internationalizeddate.startOfWeek)(date, locale, firstDayOfWeek);
// startOfWeek will clamp dates within the calendar system's valid range, which may
// start in the middle of a week. In this case, add null placeholders.
let dayOfWeek = (0, $9I0if$internationalizeddate.getDayOfWeek)(date, locale, firstDayOfWeek);
for(let i = 0; i < dayOfWeek; i++)dates.push(null);
}
while(dates.length < days){
dates.push(date);
let nextDate = date.add({
days: 1
});
if ((0, $9I0if$internationalizeddate.isSameDay)(date, nextDate)) break;
date = nextDate;
}
// Add null placeholders if at the end of the calendar system.
while(dates.length < days)dates.push(null);
return dates;
},
getWeeksInMonth (date = startDate) {
let weeks = weeksInMonth || (0, $9I0if$internationalizeddate.getWeeksInMonth)(date, locale, firstDayOfWeek);
if (visibleDuration.weeks || visibleDuration.days) {
weeks = visibleDuration.weeks ?? 0;
if (visibleDuration.days) weeks += Math.ceil(visibleDuration.days / 7);
}
return weeks;
}
};
}
function $e247a673010dfa8e$var$unitDuration(duration) {
let unit = {
...duration
};
for(let key in duration)unit[key] = 1;
return unit;
}
//# sourceMappingURL=useCalendarState.cjs.map