@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
160 lines (159 loc) • 4.97 kB
JavaScript
"use client";
import React, { useCallback, useContext, useMemo } from 'react';
import { isValid, format, differenceInCalendarDays, isAfter } from 'date-fns';
import SharedContext from "../../shared/Context.js";
import { correctV1Format, isDisabled } from "./DatePickerCalc.js";
import DatePickerContext from "./DatePickerContext.js";
import useViews from "./hooks/useViews.js";
import useDates from "./hooks/useDates.js";
import useLastEventCallCache from "./hooks/useLastEventCallCache.js";
import useHoverDate from "./hooks/useHoverDate.js";
import useSubmittedDates from "./hooks/useSubmittedDates.js";
function DatePickerProvider(props) {
const sharedContext = useContext(SharedContext);
const {
returnFormat: defaultReturnFormat,
dateFormat: defaultDateFormat
} = sharedContext.translation.DatePicker;
const {
date,
startDate,
endDate,
startMonth,
endMonth,
minDate,
maxDate,
dateFormat = defaultDateFormat,
range,
attributes,
returnFormat: returnFormatProp,
children,
onChange,
setReturnObject,
hidePicker,
correctInvalidDate
} = props;
const returnFormat = useMemo(() => correctV1Format(returnFormatProp || defaultReturnFormat), [returnFormatProp, defaultReturnFormat]);
const {
dates,
updateDates,
previousDateProps
} = useDates({
date,
startDate,
endDate,
startMonth,
endMonth,
minDate,
maxDate
}, {
dateFormat,
isRange: range,
shouldCorrectDate: correctInvalidDate
});
const {
views,
setViews,
setHasClickedCalendarDay
} = useViews({
startMonth: dates.startMonth,
endMonth: dates.endMonth,
isRange: range
});
const [lastEventCallCache, setLastEventCallCache] = useLastEventCallCache({
startDate: dates.startDate,
endDate: dates.endDate
});
const {
hoverDate,
setHoverDate
} = useHoverDate();
const {
submittedDatesRef,
setSubmittedDates
} = useSubmittedDates();
const getReturnObject = useCallback(({
event = null,
...rest
} = {}) => {
const {
startDate,
endDate,
partialStartDate,
partialEndDate,
invalidStartDate,
invalidEndDate
} = {
...views,
...dates,
...rest
};
const startDateIsValid = Boolean(startDate && isValid(startDate));
const endDateIsValid = Boolean(endDate && isValid(endDate));
const hasMinOrMaxDates = minDate || maxDate;
const returnObject = {
event,
attributes: attributes || {}
};
if (range) {
return {
...returnObject,
days_between: startDateIsValid && endDateIsValid ? differenceInCalendarDays(endDate, startDate) : null,
start_date: startDateIsValid ? format(startDate, returnFormat) : null,
end_date: endDateIsValid ? format(endDate, returnFormat) : null,
is_valid_start_date: startDateIsValid && endDateIsValid && isAfter(startDate, endDate) || hasMinOrMaxDates && startDateIsValid && isDisabled(startDate, dates.minDate, dates.maxDate) ? false : startDateIsValid,
is_valid_end_date: startDateIsValid && endDateIsValid && isAfter(startDate, endDate) || hasMinOrMaxDates && endDateIsValid && isDisabled(endDate, dates.minDate, dates.maxDate) ? false : endDateIsValid,
partialStartDate,
partialEndDate,
invalidStartDate,
invalidEndDate
};
}
return {
...returnObject,
date: startDateIsValid ? format(startDate, returnFormat) : null,
partialDate: partialStartDate,
partialStartDate,
invalidDate: invalidStartDate,
is_valid: hasMinOrMaxDates && startDateIsValid && isDisabled(startDate, dates.minDate, dates.maxDate) ? false : startDateIsValid
};
}, [dates, views, attributes, maxDate, minDate, range, returnFormat]);
const callOnChangeHandler = useCallback(event => {
if (lastEventCallCache && lastEventCallCache.startDate === event.startDate && lastEventCallCache.endDate === event.endDate) {
return;
}
onChange === null || onChange === void 0 || onChange(getReturnObject({
...dates,
...event
}));
setLastEventCallCache({
startDate: event.startDate,
endDate: event.endDate
});
}, [getReturnObject, dates, onChange, lastEventCallCache, setLastEventCallCache]);
if (typeof setReturnObject === 'function') {
setReturnObject(getReturnObject);
}
return React.createElement(DatePickerContext.Provider, {
value: {
translation: sharedContext.translation,
updateDates,
getReturnObject,
callOnChangeHandler,
hidePicker: hidePicker,
props,
dateFormat,
...dates,
previousDateProps,
submittedDates: submittedDatesRef.current,
setSubmittedDates,
views,
setViews,
setHasClickedCalendarDay,
hoverDate,
setHoverDate
}
}, children);
}
export default DatePickerProvider;
//# sourceMappingURL=DatePickerProvider.js.map