UNPKG

react-calendar

Version:

Ultimate calendar for your React app.

106 lines (105 loc) 3.65 kB
import { getRange } from './dates.js'; /** * Returns a value no smaller than min and no larger than max. * * @param {Date} value Value to return. * @param {Date} min Minimum return value. * @param {Date} max Maximum return value. * @returns {Date} Value between min and max. */ export function between(value, min, max) { if (min && min > value) { return min; } if (max && max < value) { return max; } return value; } export function isValueWithinRange(value, range) { return range[0] <= value && range[1] >= value; } export function isRangeWithinRange(greaterRange, smallerRange) { return greaterRange[0] <= smallerRange[0] && greaterRange[1] >= smallerRange[1]; } export function doRangesOverlap(range1, range2) { return isValueWithinRange(range1[0], range2) || isValueWithinRange(range1[1], range2); } function getRangeClassNames(valueRange, dateRange, baseClassName) { var isRange = doRangesOverlap(dateRange, valueRange); var classes = []; if (isRange) { classes.push(baseClassName); var isRangeStart = isValueWithinRange(valueRange[0], dateRange); var isRangeEnd = isValueWithinRange(valueRange[1], dateRange); if (isRangeStart) { classes.push("".concat(baseClassName, "Start")); } if (isRangeEnd) { classes.push("".concat(baseClassName, "End")); } if (isRangeStart && isRangeEnd) { classes.push("".concat(baseClassName, "BothEnds")); } } return classes; } function isCompleteValue(value) { if (Array.isArray(value)) { return value[0] !== null && value[1] !== null; } return value !== null; } export function getTileClasses(args) { if (!args) { throw new Error('args is required'); } var value = args.value, date = args.date, hover = args.hover; var className = 'react-calendar__tile'; var classes = [className]; if (!date) { return classes; } var now = new Date(); var dateRange = (function () { if (Array.isArray(date)) { return date; } var dateType = args.dateType; if (!dateType) { throw new Error('dateType is required when date is not an array of two dates'); } return getRange(dateType, date); })(); if (isValueWithinRange(now, dateRange)) { classes.push("".concat(className, "--now")); } if (!value || !isCompleteValue(value)) { return classes; } var valueRange = (function () { if (Array.isArray(value)) { return value; } var valueType = args.valueType; if (!valueType) { throw new Error('valueType is required when value is not an array of two dates'); } return getRange(valueType, value); })(); if (isRangeWithinRange(valueRange, dateRange)) { classes.push("".concat(className, "--active")); } else if (doRangesOverlap(valueRange, dateRange)) { classes.push("".concat(className, "--hasActive")); } var valueRangeClassNames = getRangeClassNames(valueRange, dateRange, "".concat(className, "--range")); classes.push.apply(classes, valueRangeClassNames); var valueArray = Array.isArray(value) ? value : [value]; if (hover && valueArray.length === 1) { var hoverRange = hover > valueRange[0] ? [valueRange[0], hover] : [hover, valueRange[0]]; var hoverRangeClassNames = getRangeClassNames(hoverRange, dateRange, "".concat(className, "--hover")); classes.push.apply(classes, hoverRangeClassNames); } return classes; }