react-day-picker
Version:
Customizable Date Picker for React
87 lines • 3.54 kB
JavaScript
import { DayFlag } from "./UI.js";
import { dateMatchModifiers } from "./utils/dateMatchModifiers.js";
/**
* Return a function to get the modifiers for a given day.
*
* NOTE: this is not an hook, but a factory for `getModifiers`.
*
* @private
*/
export function useGetModifiers(days, props, dateLib) {
const { disabled, hidden, modifiers, showOutsideDays, broadcastCalendar, today } = props;
const { isSameDay, isSameMonth, startOfMonth, isBefore, endOfMonth, isAfter } = dateLib;
const startMonth = props.startMonth && startOfMonth(props.startMonth);
const endMonth = props.endMonth && endOfMonth(props.endMonth);
const internalModifiersMap = {
[DayFlag.focused]: [],
[DayFlag.outside]: [],
[DayFlag.disabled]: [],
[DayFlag.hidden]: [],
[DayFlag.today]: []
};
const customModifiersMap = {};
for (const day of days) {
const { date, displayMonth } = day;
const isOutside = Boolean(displayMonth && !isSameMonth(date, displayMonth));
const isBeforeStartMonth = Boolean(startMonth && isBefore(date, startMonth));
const isAfterEndMonth = Boolean(endMonth && isAfter(date, endMonth));
const isDisabled = Boolean(disabled && dateMatchModifiers(date, disabled, dateLib));
const isHidden = Boolean(hidden && dateMatchModifiers(date, hidden, dateLib)) ||
isBeforeStartMonth ||
isAfterEndMonth ||
// Broadcast calendar will show outside days as default
(!broadcastCalendar && !showOutsideDays && isOutside) ||
(broadcastCalendar && showOutsideDays === false && isOutside);
const isToday = isSameDay(date, today ?? dateLib.today());
if (isOutside)
internalModifiersMap.outside.push(day);
if (isDisabled)
internalModifiersMap.disabled.push(day);
if (isHidden)
internalModifiersMap.hidden.push(day);
if (isToday)
internalModifiersMap.today.push(day);
// Add custom modifiers
if (modifiers) {
Object.keys(modifiers).forEach((name) => {
const modifierValue = modifiers?.[name];
const isMatch = modifierValue
? dateMatchModifiers(date, modifierValue, dateLib)
: false;
if (!isMatch)
return;
if (customModifiersMap[name]) {
customModifiersMap[name].push(day);
}
else {
customModifiersMap[name] = [day];
}
});
}
}
return (day) => {
// Initialize all the modifiers to false
const dayFlags = {
[DayFlag.focused]: false,
[DayFlag.disabled]: false,
[DayFlag.hidden]: false,
[DayFlag.outside]: false,
[DayFlag.today]: false
};
const customModifiers = {};
// Find the modifiers for the given day
for (const name in internalModifiersMap) {
const days = internalModifiersMap[name];
dayFlags[name] = days.some((d) => d === day);
}
for (const name in customModifiersMap) {
customModifiers[name] = customModifiersMap[name].some((d) => d === day);
}
return {
...dayFlags,
// custom modifiers should override all the previous ones
...customModifiers
};
};
}
//# sourceMappingURL=useGetModifiers.js.map