@navikt/ds-react
Version:
React components from the Norwegian Labour and Welfare Administration.
80 lines (73 loc) • 1.8 kB
text/typescript
import {
differenceInCalendarDays,
isDate,
isSameDay,
isSameMonth,
} from "date-fns";
import {
DateRange,
Matcher,
isDateAfterType,
isDateBeforeType,
isDateRange,
} from "../Date.typeutils";
function isDateType(value: unknown): value is Date {
return isDate(value);
}
function isArrayOfDates(value: unknown): value is Date[] {
return Array.isArray(value) && value.every(isDate);
}
export function isMatch(day: Date, matchers: Matcher[]): boolean {
return matchers.some((matcher: Matcher) => {
if (isDateType(matcher)) {
return isSameMonth(day, matcher);
}
if (isArrayOfDates(matcher)) {
return matcher.some((matcherDay) => {
return isSameMonth(matcherDay, day);
});
}
if (isDateRange(matcher)) {
return isDateInRange(day, matcher);
}
if (isDateAfterType(matcher)) {
return (
isSameMonth(day, matcher.after) ||
differenceInCalendarDays(day, matcher.after) > 0
);
}
if (isDateBeforeType(matcher)) {
return (
isSameMonth(day, matcher.before) ||
differenceInCalendarDays(matcher.before, day) > 0
);
}
if (typeof matcher === "function") {
return matcher(day);
}
return false;
});
}
export function isDateInRange(date: Date, range: DateRange): boolean {
let { from, to } = range;
if (!from) {
return false;
}
if (!to && isSameDay(from, date)) {
return true;
}
if (!to) {
return false;
}
const isToBeforeFrom = differenceInCalendarDays(to, from) < 0;
if (to && isToBeforeFrom) {
[from, to] = [to, from];
}
if (isSameMonth(from, date) || isSameMonth(to, date)) {
return true;
}
return (
differenceInCalendarDays(date, from) >= 0 &&
differenceInCalendarDays(to, date) >= 0
);
}