react-dates
Version:
A responsive and accessible date range picker component built with React
42 lines (31 loc) • 1.58 kB
JavaScript
import moment from 'moment';
import isBeforeDay from './isBeforeDay';
import isAfterDay from './isAfterDay';
import toISOMonthString from './toISOMonthString';
var startCacheOutsideDays = new Map();
var endCacheOutsideDays = new Map();
var startCacheInsideDays = new Map();
var endCacheInsideDays = new Map();
export default function isDayVisible(day, month, numberOfMonths, enableOutsideDays) {
if (!moment.isMoment(day)) return false; // Cloning is a little expensive, so we want to do it as little as possible.
var startKey = toISOMonthString(month); // eslint-disable-next-line prefer-template
var endKey = startKey + '+' + numberOfMonths;
if (enableOutsideDays) {
if (!startCacheOutsideDays.has(startKey)) {
startCacheOutsideDays.set(startKey, month.clone().startOf('month').startOf('week'));
}
if (isBeforeDay(day, startCacheOutsideDays.get(startKey))) return false;
if (!endCacheOutsideDays.has(endKey)) {
endCacheOutsideDays.set(endKey, month.clone().endOf('week').add(numberOfMonths - 1, 'months').endOf('month').endOf('week'));
}
return !isAfterDay(day, endCacheOutsideDays.get(endKey));
} // !enableOutsideDays
if (!startCacheInsideDays.has(startKey)) {
startCacheInsideDays.set(startKey, month.clone().startOf('month'));
}
if (isBeforeDay(day, startCacheInsideDays.get(startKey))) return false;
if (!endCacheInsideDays.has(endKey)) {
endCacheInsideDays.set(endKey, month.clone().add(numberOfMonths - 1, 'months').endOf('month'));
}
return !isAfterDay(day, endCacheInsideDays.get(endKey));
}