UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

160 lines (159 loc) 4.97 kB
"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