UNPKG

@rehookify/datepicker

Version:

The ultimate tool to create a date, range and time picker in your React applications.

1 lines 72.1 kB
{"version":3,"file":"index.esm.mjs","sources":["../src/utils/date.ts","../src/utils/excluded.ts","../src/utils/get-calendar-month-params.ts","../src/utils/predicates.ts","../src/utils/config.ts","../src/utils/get-date-range-state.ts","../src/utils/create-calendars.ts","../src/utils/create-weekdays.ts","../src/use-calendars.ts","../src/utils/call-all.ts","../src/utils/create-prop-getter.ts","../src/state-reducer.ts","../src/utils/offset.ts","../src/use-date-picker-offset.ts","../src/utils/get-calendar-start-date.ts","../src/utils/get-current-year-position.ts","../src/utils/create-initial-state.ts","../src/use-date-picker-state.ts","../src/utils/get-multiple-dates.ts","../src/use-days.ts","../src/utils/create-months.ts","../src/use-months.ts","../src/utils/create-time.ts","../src/use-time.ts","../src/utils/create-years.ts","../src/use-years.ts","../src/use-date-picker.ts","../src/date-picker-provider.tsx","../src/date-picker-state-provider.tsx","../src/use-context-hooks.ts"],"sourcesContent":["import type {\n DPDatePart,\n DPDateParts,\n DPLocaleConfig,\n DPTimeLimit,\n} from '../types';\n\n// Year and Month is a minimum required arguments for creating a date\n// == null is intentional to check also for undefined\nexport const newDate = (Y?: number, M?: number, ...rest: number[]): Date =>\n !Y || M == null ? new Date() : new Date(Y, M, ...rest);\n\nexport const getDateParts = (d: Date): DPDateParts => ({\n D: d.getDate(),\n M: d.getMonth(),\n Y: d.getFullYear(),\n});\n\n// Days in order sun = 0 ... sat = 6\nexport const getDay = (d: Date): number => d.getDay();\n\n/*\n * We need this function to eliminate time from the comparison.\n * All date that comes to DP should go through this function.\n */\nexport const getCleanDate = (d: Date): Date =>\n newDate(getDateParts(d).Y, getDateParts(d).M, getDateParts(d).D);\n\nexport const daysInMonth = (d: Date): number =>\n newDate(getDateParts(d).Y, getDateParts(d).M + 1, 0).getDate();\n\nexport const addToDate = (d: Date, value: number, part: DPDatePart): Date => {\n const { Y, M, D } = getDateParts(d);\n // Cover case when offsetDate is 31 and next month doesn't have 31 days\n // More details here https://github.com/rehookify/datepicker/issues/10\n const nextDate =\n part === 'date'\n ? D + value\n : part === 'month' && D > daysInMonth(newDate(Y, M + value, 1))\n ? daysInMonth(newDate(Y, M + value, 1))\n : D;\n\n return newDate(\n Y + (part === 'year' ? value : 0),\n M + (part === 'month' ? value : 0),\n nextDate,\n );\n};\n\nexport const subtractFromDate = (\n d: Date,\n value: number,\n part: DPDatePart,\n): Date => addToDate(d, 0 - value, part);\n\nexport const sortDatesAsc = (a: Date, b: Date): number => +a - +b;\n\nexport const toLocaleDateString = (\n d: Date,\n locale?: Intl.LocalesArgument,\n options?: Intl.DateTimeFormatOptions,\n): string => d.toLocaleDateString(locale, options);\n\nexport const formatMonthName = (\n d: Date,\n { locale, monthName }: DPLocaleConfig,\n): string => toLocaleDateString(d, locale, { month: monthName });\n\nexport const formatDate = (\n d: Date,\n { locale, options }: DPLocaleConfig,\n): string => toLocaleDateString(d, locale, options);\n\nexport const getTimeDate = (\n Y: number,\n M: number,\n D: number,\n t?: DPTimeLimit,\n): Date | undefined =>\n t && t.h != null && t.m != null ? newDate(Y, M, D, t.h, t.m) : undefined;\n\nexport const formatLocaleTime = (\n d: Date,\n { locale, hour, minute, second, hour12 }: DPLocaleConfig,\n): string =>\n d.toLocaleTimeString(locale, {\n hour,\n minute,\n second,\n hour12,\n });\n\nconst addLeadingZero = (n: number): string => `${n < 10 ? 0 : ''}${n}`;\n\nconst convertTo12H = (h: number, m: number): string => {\n const median = h >= 12 ? 'pm' : 'am';\n\n return `${addLeadingZero(h % 12 || 12)}:${addLeadingZero(m)} ${median}`;\n};\n\nexport const formatTime = (d: Date, { hour12 }: DPLocaleConfig): string => {\n const h = d.getHours();\n const m = d.getMinutes();\n\n return hour12\n ? convertTo12H(h, m)\n : `${addLeadingZero(h)}:${addLeadingZero(m)}`;\n};\n\nexport const addAndSortAsc = (dates: Date[], d: Date): Date[] =>\n dates.concat(d).sort(sortDatesAsc);\n\nexport const sortMinMax = <T>(\n min: T | undefined,\n max: T | undefined,\n sortFunction: (a: T, b: T) => number,\n): (T | undefined)[] => {\n let [mN, mX] = [min, max];\n if (min && max) {\n [mN, mX] = [min, max].sort(sortFunction);\n }\n\n return [mN, mX];\n};\n","import type { DPDayInteger, DPExcludeConfig } from '../types';\nimport { getDateParts } from './date';\n\nexport const isExcludedDay = (d: number, eDays?: DPDayInteger[]): boolean =>\n eDays ? eDays.includes(d as DPDayInteger) : false;\n\nexport const isExcludedDate = (d: Date, dates: Date[] = []): boolean => {\n const { M, D } = getDateParts(d);\n return dates.some((date: Date) => {\n const { M: md, D: dd } = getDateParts(date);\n return M === md && D === dd;\n });\n};\n\nexport const isExcluded = (\n d: Date,\n { day, date }: DPExcludeConfig = {},\n): boolean => isExcludedDay(d.getDay(), day) || isExcludedDate(d, date);\n","import type { DPCalendarConfig } from '../types';\nimport { daysInMonth, getDay, newDate } from './date';\n\nvar NUMBER_OF_STATIC_CALENDAR_DAYS = 42;\n\nfunction getStartOffset(d: Date, startDay: number): number {\n return (getDay(d) + 7 - startDay) % 7;\n}\n\nexport function getCalendarMonthParams(\n month: number,\n year: number,\n { mode, startDay }: DPCalendarConfig,\n): {\n start: number;\n length: number;\n} {\n const firstMonthDay = newDate(year, month, 1);\n const lastDay = daysInMonth(firstMonthDay);\n\n const startOffset = getStartOffset(firstMonthDay, startDay);\n\n const length =\n mode === 'static'\n ? NUMBER_OF_STATIC_CALENDAR_DAYS\n : startOffset +\n lastDay +\n 6 -\n getStartOffset(newDate(year, month, lastDay), startDay);\n\n return {\n start: startOffset,\n length,\n };\n}\n","import { getCleanDate, getDateParts } from './date';\n\n// Converting Date to Number is equal of calling Date.getTime\nexport const isSame = (d1: Date, d2: Date): boolean => +d1 === +d2;\n\nexport const isBefore = (d1: Date, d2: Date): boolean => d1 < d2;\n\nexport const isAfter = (d1: Date, d2: Date): boolean => d1 > d2;\n\nexport const isBetween = (start: Date, d: Date, end: Date): boolean =>\n (isAfter(d, start) && isBefore(d, end)) ||\n (isBefore(d, start) && isAfter(d, end));\n\nexport const maxDateAndAfter = (\n maxDate: Date | undefined,\n date: Date,\n): boolean => !!maxDate && isAfter(date, maxDate);\n\nexport const minDateAndBefore = (\n minDate: Date | undefined,\n date: Date,\n): boolean => !!minDate && isBefore(date, minDate);\n\nexport const includeDate = (dates: Date[], d: Date): boolean =>\n dates.some((date) => isSame(getCleanDate(date), getCleanDate(d)));\n\nexport const isBeforeMinMonth = (month: number, minDate?: Date): boolean =>\n !!minDate && month < getDateParts(minDate).M;\n\nexport const isBeforeMinYear = (year: number, minDate?: Date): boolean =>\n !!minDate && year < getDateParts(minDate).Y;\n\nexport const isAfterMaxMonth = (month: number, maxDate?: Date): boolean =>\n !!maxDate && month > getDateParts(maxDate).M;\n\nexport const isAfterMaxYear = (year: number, maxDate?: Date): boolean =>\n !!maxDate && year > getDateParts(maxDate).Y;\n\nexport const isSameOrAfterMaxYear = (year: number, maxDate?: Date): boolean =>\n !!maxDate && year >= getDateParts(maxDate).Y;\n\nexport const isSameOrBeforeMinYear = (year: number, minDate?: Date): boolean =>\n !!minDate && year <= getDateParts(minDate).Y;\n","import type {\n DPCalendarConfig,\n DPConfig,\n DPDatesConfig,\n DPDatesMode,\n DPLocaleConfig,\n DPTimeConfig,\n DPUserConfig,\n DPYearsConfig,\n} from '../types';\nimport { getCleanDate, sortDatesAsc, sortMinMax } from './date';\nimport { includeDate } from './predicates';\n\nvar DEFAULT_CALENDAR_CONFIG: DPCalendarConfig = {\n mode: 'static',\n offsets: [0],\n startDay: 0,\n};\n\nvar DEFAULT_YEARS_CONFIG: DPYearsConfig = {\n mode: 'decade',\n /*\n * The default value for the numberOfYears is 12\n * it consists of 10 years + 1 year before + 1 year after\n */\n numberOfYears: 12,\n step: 10,\n};\n\nvar DEFAULT_DATES_CONFIG: Pick<\n DPDatesConfig,\n 'mode' | 'toggle' | 'selectSameDate'\n> = {\n mode: 'single',\n toggle: false,\n selectSameDate: false,\n};\n\nvar DEFAULT_TIME_CONFIG: Pick<DPTimeConfig, 'interval' | 'useLocales'> = {\n interval: 30,\n useLocales: false,\n};\n\nvar DEFAULT_LOCALE_CONFIG: DPLocaleConfig = {\n locale: 'en-GB',\n day: '2-digit',\n year: 'numeric',\n weekday: 'short',\n monthName: 'long',\n hour: '2-digit',\n minute: '2-digit',\n hour12: undefined,\n second: undefined,\n};\n\nexport function createConfig({\n selectedDates = [],\n onDatesChange,\n focusDate,\n offsetDate,\n onOffsetChange,\n calendar = {},\n dates = {},\n locale,\n time = {},\n exclude = {},\n years,\n}: DPUserConfig): DPConfig {\n const { minDate, maxDate, ...restDates } = dates;\n const { offsets = [], ...restCalendarParams } = calendar;\n const { minTime, maxTime, ...restTime } = time;\n\n const [minD, maxD] = sortMinMax(minDate, maxDate, sortDatesAsc);\n const [minT, maxT] = sortMinMax(minTime, maxTime, (a, b) => a.h - b.h);\n\n const focus =\n focusDate && includeDate(selectedDates, focusDate) ? focusDate : undefined;\n\n return {\n selectedDates,\n onDatesChange,\n offsetDate,\n onOffsetChange,\n focusDate: focus,\n calendar: {\n ...DEFAULT_CALENDAR_CONFIG,\n ...restCalendarParams,\n offsets: DEFAULT_CALENDAR_CONFIG.offsets.concat(offsets),\n },\n years: { ...DEFAULT_YEARS_CONFIG, ...years },\n dates: {\n ...DEFAULT_DATES_CONFIG,\n ...restDates,\n minDate: minD && getCleanDate(minD),\n maxDate: maxD && getCleanDate(maxD),\n },\n locale: {\n ...DEFAULT_LOCALE_CONFIG,\n ...locale,\n },\n time: {\n ...DEFAULT_TIME_CONFIG,\n minTime: minT,\n maxTime: maxT,\n ...restTime,\n },\n exclude,\n };\n}\n\nexport function isRange(mode: DPDatesMode): boolean {\n return mode === 'range';\n}\n","import type { DPDatesMode, DPDayRange } from '../types';\nimport { isRange } from './config';\nimport { getCleanDate } from './date';\nimport { isBefore, isBetween, isSame } from './predicates';\n\nconst RANGE_START = 'range-start';\nconst RANGE_END = 'range-end';\nconst WILL_BE_IN_RANGE_START = 'will-be-range-start';\nconst WILL_BE_IN_RANGE_END = 'will-be-range-end';\n\nexport const getDateRangeState = (\n date: Date,\n rangeEnd: Date | null,\n selectedDates: Date[],\n mode: DPDatesMode,\n): DPDayRange => {\n if (!isRange(mode) || selectedDates.length === 0) return '';\n const [start, end] = selectedDates;\n\n // We have completed range\n if (start && end) {\n if (isSame(date, getCleanDate(start))) {\n return isSame(getCleanDate(start), getCleanDate(end))\n ? `${RANGE_START} ${RANGE_END}`\n : RANGE_START;\n }\n if (isSame(date, getCleanDate(end))) return RANGE_END;\n return isBetween(getCleanDate(start), date, getCleanDate(end))\n ? 'in-range'\n : '';\n }\n\n // We have 1 date and rangeEnd date\n if (!end && rangeEnd) {\n if (isBetween(getCleanDate(start), date, rangeEnd))\n return 'will-be-in-range';\n // rangeEnd is before start\n if (isBefore(rangeEnd, getCleanDate(start))) {\n if (isSame(date, rangeEnd)) return WILL_BE_IN_RANGE_START;\n return isSame(date, getCleanDate(start)) ? WILL_BE_IN_RANGE_END : '';\n }\n\n // rangeEnd is after start;\n if (isSame(date, getCleanDate(start))) return WILL_BE_IN_RANGE_START;\n return isSame(date, rangeEnd) ? WILL_BE_IN_RANGE_END : '';\n }\n\n return '';\n};\n","import type {\n DPCalendar,\n DPConfig,\n DPDay,\n DPReducerState,\n DPState,\n} from '../types';\nimport {\n addToDate,\n formatMonthName,\n getCleanDate,\n getDateParts,\n newDate,\n toLocaleDateString,\n} from './date';\nimport { isExcluded } from './excluded';\nimport { getCalendarMonthParams } from './get-calendar-month-params';\nimport { getDateRangeState } from './get-date-range-state';\nimport {\n includeDate,\n isSame,\n maxDateAndAfter,\n minDateAndBefore,\n} from './predicates';\n\nconst createCalendar = (\n offsetDate: Date,\n calendarStartDate: Date,\n selectedDates: Date[],\n { rangeEnd }: DPReducerState,\n config: DPConfig,\n): DPCalendar => {\n const {\n dates: { mode, minDate, maxDate },\n locale,\n calendar,\n exclude,\n } = config;\n const { locale: localeStr, day, year } = locale;\n const { M, Y } = getDateParts(calendarStartDate);\n const { start, length } = getCalendarMonthParams(M, Y, calendar);\n\n const days: DPDay[] = Array(length)\n .fill(0)\n .map((_, i) => {\n const $date = newDate(Y, M, i + 1 - start);\n\n return {\n $date,\n active: isSame(offsetDate, $date),\n day: toLocaleDateString($date, localeStr, { day }),\n now: isSame(getCleanDate(newDate()), $date),\n range: getDateRangeState($date, rangeEnd, selectedDates, mode),\n disabled:\n minDateAndBefore(minDate, $date) ||\n maxDateAndAfter(maxDate, $date) ||\n isExcluded($date, exclude),\n selected: includeDate(selectedDates, $date),\n inCurrentMonth: getDateParts($date).M === M,\n };\n });\n\n return {\n year: toLocaleDateString(calendarStartDate, localeStr, { year }),\n month: formatMonthName(calendarStartDate, locale),\n days,\n };\n};\n\nexport const createCalendars = ({\n selectedDates,\n state,\n config,\n offsetDate,\n}: DPState): DPCalendar[] => {\n return config.calendar.offsets.map((offset) =>\n createCalendar(\n offsetDate,\n addToDate(offsetDate, offset, 'month'),\n selectedDates,\n state,\n config,\n ),\n );\n};\n","import type { DPCalendar, DPConfig } from '../types';\nimport { toLocaleDateString } from './date';\n\nexport var createWeekdays = (\n { days }: DPCalendar,\n { locale: { locale, weekday } }: DPConfig,\n): string[] =>\n [0, 1, 2, 3, 4, 5, 6].map((day: number) =>\n toLocaleDateString(days[day].$date, locale, { weekday }),\n );\n","import { useMemo } from 'react';\n\nimport type { DPUseCalendars } from './types';\nimport { createCalendars } from './utils/create-calendars';\nimport { createWeekdays } from './utils/create-weekdays';\n\nexport const useCalendars: DPUseCalendars = (state) => {\n const calendars = createCalendars(state);\n\n return useMemo(\n () => ({\n calendars,\n weekDays: createWeekdays(calendars[0], state.config),\n }),\n [calendars, state.config],\n );\n};\n","export const callAll =\n <Args extends readonly unknown[]>(\n ...fns: readonly (((...args: Args) => void) | undefined)[]\n ) =>\n (...args: Args): void =>\n fns.forEach((fn) => fn?.(...args));\n\nexport const skipFirst =\n <Arg1, Arg2>(fn: (arg: Arg2) => void) =>\n (_arg1: Arg1, arg2: Arg2) =>\n fn(arg2);\n\nexport const skipAll =\n (fn: () => void) =>\n (..._: unknown[]) => {\n fn();\n void _;\n };\n","import { MouseEvent } from 'react';\n\nimport type { DPPropGetter, DPPropsGetterConfig } from '../types';\n\nexport const createPropGetter = (\n isDisabled: boolean,\n action: (evt: MouseEvent<HTMLElement>) => void,\n props: DPPropsGetterConfig = {},\n selected = false,\n): DPPropGetter => ({\n role: 'button',\n tabIndex: 0,\n ...(isDisabled\n ? {\n disabled: true,\n 'aria-disabled': true,\n }\n : {\n onClick(evt: MouseEvent<HTMLElement>) {\n action(evt);\n },\n }),\n ...(selected ? { 'aria-selected': true } : {}),\n ...props,\n});\n","import { Dispatch } from 'react';\n\nimport type {\n DPReducerAction,\n DPReducerState,\n DPSetFocusDate,\n DPSetOffsetDate,\n DPSetRangeEndAction,\n DPSetYearAction,\n} from './types';\n\nvar SET_FOCUS_DATE_ACTION = 'SET_FOCUS_DATE' as const;\nvar SET_OFFSET_DATE_ACTION = 'SET_OFFSET_DATE' as const;\nvar SET_RANGE_END_ACTION = 'SET_RANGE_END' as const;\nvar SET_YEAR_ACTION = 'SET_YEAR' as const;\n\nexport var stateReducer = (\n state: DPReducerState,\n action: DPReducerAction,\n): DPReducerState => {\n switch (action.type) {\n case SET_FOCUS_DATE_ACTION:\n return {\n ...state,\n focusDate: action.date,\n };\n case SET_OFFSET_DATE_ACTION:\n return {\n ...state,\n offsetDate: action.date,\n };\n case SET_RANGE_END_ACTION:\n return {\n ...state,\n rangeEnd: action.date,\n };\n case SET_YEAR_ACTION:\n return {\n ...state,\n offsetYear: action.year,\n };\n default:\n return state;\n }\n};\n\nexport var setFocus = (\n dispatch: Dispatch<DPSetFocusDate>,\n date: DPReducerState['focusDate'],\n): void => {\n dispatch({ type: SET_FOCUS_DATE_ACTION, date });\n};\n\nexport var setOffset = (\n dispatch: Dispatch<DPSetOffsetDate>,\n date: Date,\n): void => {\n dispatch({ type: SET_OFFSET_DATE_ACTION, date });\n};\n\nexport var setRangeEnd = (\n dispatch: Dispatch<DPSetRangeEndAction>,\n date: DPReducerState['rangeEnd'],\n): void => {\n dispatch({ type: SET_RANGE_END_ACTION, date });\n};\n\nexport var setYear = (\n dispatch: Dispatch<DPSetYearAction>,\n year: number,\n): void => {\n dispatch({ type: SET_YEAR_ACTION, year });\n};\n","import { setOffset } from '../state-reducer';\nimport { DPOffsetValue, DPState } from '../types';\nimport { addToDate, subtractFromDate } from './date';\nimport { isSame, maxDateAndAfter, minDateAndBefore } from './predicates';\n\nexport const setDPOffset =\n ({ dispatch, config: { onOffsetChange, offsetDate } }: DPState) =>\n (d: Date): void => {\n // Prevent to call reducer action if offsetDate is external\n if (!onOffsetChange && !offsetDate) setOffset(dispatch, d);\n if (onOffsetChange) onOffsetChange(d);\n };\n\nexport const getNextOffsetDate = (\n d: Date,\n { days, months, years }: DPOffsetValue,\n): Date => {\n let nextDate = d;\n if (days && days !== 0) {\n nextDate = addToDate(nextDate, days, 'date');\n }\n if (months && months !== 0) {\n nextDate = addToDate(nextDate, months, 'month');\n }\n if (years && years !== 0) {\n nextDate = addToDate(nextDate, years, 'year');\n }\n return nextDate;\n};\n\nexport const getEdgedOffsetDate = (\n offsetDate: Date,\n { days = 0, months = 0, years = 0 }: DPOffsetValue,\n dateEdge?: Date,\n): Date => {\n if (!dateEdge) return offsetDate;\n if (isSame(offsetDate, dateEdge)) return offsetDate;\n if (days !== 0) {\n return calculateNewDateWithOffset(offsetDate, dateEdge, days, 'date');\n }\n if (months !== 0) {\n return calculateNewDateWithOffset(offsetDate, dateEdge, months, 'month');\n }\n if (years !== 0) {\n return calculateNewDateWithOffset(offsetDate, dateEdge, years, 'year');\n }\n\n return offsetDate;\n};\n\nexport const calculateNewDateWithOffset = (\n offsetDate: Date,\n dateEdge: Date,\n offsetValue: number,\n unit: 'date' | 'month' | 'year',\n): Date => {\n const newDate = addToDate(offsetDate, offsetValue, unit);\n const isPositiveOffsetValue = offsetValue > 0;\n if (isPositiveOffsetValue) {\n const isMaxDateAfterNewDate = maxDateAndAfter(dateEdge, newDate);\n return isMaxDateAfterNewDate\n ? subtractFromDate(dateEdge, offsetValue, unit)\n : offsetDate;\n }\n const isMinDateBeforeNewDate = minDateAndBefore(dateEdge, newDate);\n return isMinDateBeforeNewDate\n ? subtractFromDate(dateEdge, offsetValue, unit)\n : offsetDate;\n};\n","import { useCallback } from 'react';\n\nimport {\n DPOffsetValue,\n DPPropsGetterConfig,\n DPUseDatePickerOffsetPropGetters,\n} from './types';\nimport { callAll, skipFirst } from './utils/call-all';\nimport { createPropGetter } from './utils/create-prop-getter';\nimport {\n getEdgedOffsetDate,\n getNextOffsetDate,\n setDPOffset,\n} from './utils/offset';\nimport { maxDateAndAfter, minDateAndBefore } from './utils/predicates';\n\nexport const useDatePickerOffsetPropGetters: DPUseDatePickerOffsetPropGetters =\n (state) => {\n const {\n config: { dates },\n } = state;\n const { minDate, maxDate } = dates;\n\n const addOffset = useCallback(\n (\n offsetValue: DPOffsetValue,\n { disabled, onClick, ...rest }: DPPropsGetterConfig = {},\n ) => {\n const offsetDate = getEdgedOffsetDate(\n state.offsetDate,\n offsetValue,\n maxDate,\n );\n const nextDate = getNextOffsetDate(offsetDate, offsetValue);\n\n const isDisabled = !!disabled || maxDateAndAfter(maxDate, nextDate);\n\n return createPropGetter(\n isDisabled,\n (evt) =>\n callAll(onClick, skipFirst(setDPOffset(state)))(evt, nextDate),\n rest,\n );\n },\n [maxDate, state],\n );\n\n const subtractOffset = useCallback(\n (\n { days = 0, months = 0, years = 0 }: DPOffsetValue,\n { disabled, onClick, ...rest }: DPPropsGetterConfig = {},\n ) => {\n const negativeOffsetValue = {\n days: -days,\n months: -months,\n years: -years,\n };\n\n const offsetDate = getEdgedOffsetDate(\n state.offsetDate,\n negativeOffsetValue,\n minDate,\n );\n const nextDate = getNextOffsetDate(offsetDate, negativeOffsetValue);\n\n const isDisabled = !!disabled || minDateAndBefore(minDate, nextDate);\n\n return createPropGetter(\n isDisabled,\n (evt) =>\n callAll(onClick, skipFirst(setDPOffset(state)))(evt, nextDate),\n rest,\n );\n },\n [minDate, state],\n );\n\n const setOffset = useCallback(\n (d: Date, { disabled, onClick, ...rest }: DPPropsGetterConfig = {}) => {\n const isDisabled =\n !!disabled ||\n minDateAndBefore(minDate, d) ||\n maxDateAndAfter(maxDate, d);\n\n return createPropGetter(\n isDisabled,\n (evt) => callAll(onClick, skipFirst(setDPOffset(state)))(evt, d),\n rest,\n );\n },\n [state, maxDate, minDate],\n );\n\n return {\n addOffset,\n setOffset,\n subtractOffset,\n };\n };\n","import { maxDateAndAfter, minDateAndBefore } from './predicates';\n\nexport const getCalendarStartDate = (\n minDate: Date | undefined,\n maxDate: Date | undefined,\n NOW: Date,\n): Date => {\n if (maxDateAndAfter(maxDate, NOW)) return maxDate as Date;\n if (minDateAndBefore(minDate, NOW)) return minDate as Date;\n return NOW;\n};\n","import type { DPYearsConfig, DPYearsMode } from '../types';\n\n/*\n * Default behavior years collection\n * It get start of the decade -1\n * It really comfortable to navigate through years\n * because you have links to the previous and next decade\n * 2019 2020 2021\n * 2022 2023 2024\n * 2025 2026 2027\n * 2028 2029 2030\n */\nexport const getStartDecadePosition = (year: number): number =>\n year - (year % 10) - 1;\n\n/*\n * If number of the year is default = 12 and current year is 2022\n * It will show this matrix\n * 2017 2018 2019\n * 2020 2021 2022 👌\n * 2023 2024 2025\n * 2026 2027 2028\n * I think it is nicer to look at the future more ;)\n */\nexport const getFluidYearPosition = (\n year: number,\n numberOfYears: number,\n): number => year - (numberOfYears / 2 - (numberOfYears % 2 === 0 ? 1 : 0));\n\n/*\n * It will place offsetYear at the end of the collection\n * 2015 2016 2017\n * 2012 2013 2014\n * 2018 2019 2020\n * 2021 2022 2023\n */\nexport const getStartExactPosition = (\n year: number,\n numberOfYears: number,\n): number => year - numberOfYears + 1;\n\nexport const isExactMode = (mode: DPYearsMode): boolean => mode === 'exact';\n\nexport const getCurrentYearPosition = (\n year: number,\n { mode, numberOfYears }: DPYearsConfig,\n): number => {\n if (isExactMode(mode)) return getStartExactPosition(year, numberOfYears);\n return mode === 'decade'\n ? getStartDecadePosition(year)\n : getFluidYearPosition(year, numberOfYears);\n};\n","import type { DPConfig, DPReducerState } from '../types';\nimport { getCleanDate, getDateParts, newDate } from './date';\nimport { getCalendarStartDate } from './get-calendar-start-date';\nimport { getCurrentYearPosition } from './get-current-year-position';\n\nexport const createInitialState = (config: DPConfig): DPReducerState => {\n const {\n selectedDates,\n offsetDate,\n focusDate,\n dates: { minDate, maxDate },\n years,\n } = config;\n\n const oDate = offsetDate\n ? offsetDate\n : selectedDates.length > 0\n ? selectedDates[selectedDates.length - 1]\n : getCalendarStartDate(minDate, maxDate, getCleanDate(newDate()));\n\n return {\n focusDate,\n rangeEnd: null,\n offsetDate: oDate,\n offsetYear: getCurrentYearPosition(getDateParts(oDate).Y, years),\n };\n};\n","import { useReducer } from 'react';\n\nimport { stateReducer } from './state-reducer';\nimport type { DPState, DPUserConfig } from './types';\nimport { createConfig } from './utils/config';\nimport { createInitialState } from './utils/create-initial-state';\n\nexport const useDatePickerState = (config: DPUserConfig): DPState => {\n const dpConfig = createConfig(config);\n\n const [state, dispatch] = useReducer(\n stateReducer,\n createInitialState(dpConfig),\n );\n\n return {\n dispatch,\n selectedDates: dpConfig.selectedDates,\n offsetDate: dpConfig.offsetDate || state.offsetDate,\n state,\n config: dpConfig,\n };\n};\n","import type { DPDatesConfig } from '../types';\nimport { isRange } from './config';\nimport { addAndSortAsc, getCleanDate } from './date';\nimport { includeDate, isSame } from './predicates';\n\nexport const getMultipleDates = (\n selectedDates: Date[],\n date: Date,\n { mode, toggle, limit }: DPDatesConfig,\n): Date[] => {\n // If toggle is active and we have already selected this date\n // Then filter it out in all modes\n if (toggle && includeDate(selectedDates, date))\n return selectedDates.filter((d) => !isSame(getCleanDate(d), date));\n\n if (mode === 'multiple')\n return !limit || selectedDates.length < limit\n ? addAndSortAsc(selectedDates, date)\n : selectedDates;\n\n if (isRange(mode))\n return selectedDates.length === 2\n ? [date]\n : addAndSortAsc(selectedDates, date);\n\n // mode === 'single'\n return [date];\n};\n","import { useCallback, useMemo } from 'react';\n\nimport { setFocus, setRangeEnd as setRangeEndAction } from './state-reducer';\nimport type {\n DPDay,\n DPPropsGetterConfig,\n DPUseDays,\n DPUseDaysPropGetters,\n} from './types';\nimport { callAll, skipFirst } from './utils/call-all';\nimport { isRange } from './utils/config';\nimport { createPropGetter } from './utils/create-prop-getter';\nimport { formatDate, getCleanDate } from './utils/date';\nimport { getMultipleDates } from './utils/get-multiple-dates';\nimport { includeDate, isSame } from './utils/predicates';\n\nexport const useDays: DPUseDays = ({ selectedDates, config: { locale } }) =>\n useMemo(\n () => ({\n selectedDates,\n formattedDates: selectedDates.map((d: Date) => formatDate(d, locale)),\n }),\n [selectedDates, locale],\n );\n\nexport const useDaysPropGetters: DPUseDaysPropGetters = ({\n config,\n selectedDates,\n dispatch,\n}) => {\n const {\n onDatesChange,\n dates: { mode, toggle, selectSameDate },\n } = config;\n\n const dayButton = useCallback(\n (\n { $date, selected, disabled, active }: DPDay,\n { onClick, disabled: disabledProps, ...rest }: DPPropsGetterConfig = {},\n ) =>\n createPropGetter(\n disabled || !!disabledProps,\n (evt) => {\n if (selected && !toggle) {\n selectedDates.forEach((d) => {\n if (isSame(getCleanDate(d), $date)) setFocus(dispatch, d);\n });\n\n // Handle case when user could select same date in range mode\n if (!isRange(mode) || !selectSameDate) return;\n }\n if (isRange(mode) && selectedDates.length === 1) {\n setRangeEndAction(dispatch, null);\n }\n callAll(\n onClick,\n skipFirst((d: Date) => {\n const nextSelectedDates = getMultipleDates(\n selectedDates,\n d,\n config.dates,\n );\n setFocus(\n dispatch,\n includeDate(nextSelectedDates, d) ? d : undefined,\n );\n onDatesChange(nextSelectedDates);\n }),\n )(evt, $date);\n },\n {\n ...rest,\n ...(isRange(mode) &&\n selectedDates.length === 1 && {\n onMouseEnter() {\n setRangeEndAction(dispatch, $date);\n },\n }),\n tabIndex: active ? 0 : -1,\n },\n selected,\n ),\n [\n mode,\n toggle,\n config.dates,\n onDatesChange,\n selectedDates,\n dispatch,\n selectSameDate,\n ],\n );\n\n return { dayButton };\n};\n","import type { DPDatesConfig, DPLocaleConfig, DPMonth } from '../types';\nimport { daysInMonth, formatMonthName, getDateParts, newDate } from './date';\nimport {\n isAfterMaxMonth,\n isBeforeMinMonth,\n isSameOrAfterMaxYear,\n isSameOrBeforeMinYear,\n} from './predicates';\n\nexport var createMonths = (\n offsetDate: Date,\n selectedDates: Date[],\n locale: DPLocaleConfig,\n { minDate, maxDate }: DPDatesConfig,\n): DPMonth[] => {\n const { M, Y, D } = getDateParts(offsetDate);\n const { Y: nY, M: nM } = getDateParts(newDate());\n\n // 12 is a number of months in the year\n return Array(12)\n .fill(0)\n .map((_, i) => {\n // Prevent situation when previous month has less days than current March -> February\n const maxMonthDate = daysInMonth(newDate(Y, i, 1));\n const $date = newDate(Y, i, D > maxMonthDate ? maxMonthDate : D);\n\n return {\n $date,\n month: formatMonthName($date, locale),\n selected: selectedDates.some((d) => {\n const { M: dM, Y: dY } = getDateParts(d);\n return dY === Y && dM === i;\n }),\n active: M === i,\n now: i === nM && Y === nY,\n disabled:\n (isBeforeMinMonth(i, minDate) && isSameOrBeforeMinYear(Y, minDate)) ||\n (isAfterMaxMonth(i, maxDate) && isSameOrAfterMaxYear(Y, maxDate)),\n };\n });\n};\n","import { useCallback, useMemo } from 'react';\n\nimport type {\n DPMonth,\n DPPropsGetterConfig,\n DPUseMonths,\n DPUseMonthsPropGetters,\n} from './types';\nimport { callAll, skipFirst } from './utils/call-all';\nimport { createMonths } from './utils/create-months';\nimport { createPropGetter } from './utils/create-prop-getter';\nimport { setDPOffset } from './utils/offset';\n\nexport const useMonths: DPUseMonths = ({\n selectedDates,\n offsetDate,\n config: { locale, dates },\n}) =>\n useMemo(\n () => ({\n months: createMonths(offsetDate, selectedDates, locale, dates),\n }),\n [dates, locale, offsetDate, selectedDates],\n );\n\nexport const useMonthsPropGetters: DPUseMonthsPropGetters = (dpState) => {\n const monthButton = useCallback(\n (\n { $date, disabled, selected, active }: DPMonth,\n { onClick, disabled: disabledProps, ...rest }: DPPropsGetterConfig = {},\n ) =>\n createPropGetter(\n !!disabledProps || disabled,\n (evt) => callAll(onClick, skipFirst(setDPOffset(dpState)))(evt, $date),\n {\n ...rest,\n tabIndex: active ? 0 : -1,\n },\n selected,\n ),\n [dpState],\n );\n\n return { monthButton };\n};\n","import type { DPConfig, DPTime } from '../types';\nimport {\n formatLocaleTime,\n formatTime,\n getDateParts,\n getTimeDate,\n newDate,\n} from './date';\nimport { isSame, maxDateAndAfter, minDateAndBefore } from './predicates';\n\nexport var createTime = (\n d: Date | undefined,\n { time, locale }: DPConfig,\n): DPTime[] => {\n const NOW = newDate();\n const { interval, minTime, maxTime, useLocales } = time;\n const { Y, M, D } = getDateParts(d || NOW);\n // 1440 is a number of minutes in the day 60 * 24\n const segments = 1440 / interval;\n\n const minDate = getTimeDate(Y, M, D, minTime);\n const maxDate = getTimeDate(Y, M, D, maxTime);\n\n return Array(segments)\n .fill(0)\n .map((_, i) => {\n const $date = newDate(Y, M, D, 0, i * interval);\n const disabled =\n !d ||\n minDateAndBefore(minDate, $date) ||\n maxDateAndAfter(maxDate, $date);\n\n return {\n $date,\n disabled,\n now: isSame($date, NOW),\n selected: d ? isSame(d, $date) : false,\n time: useLocales\n ? formatLocaleTime($date, locale)\n : formatTime($date, locale),\n };\n });\n};\n","import { useCallback, useMemo } from 'react';\n\nimport { setFocus } from './state-reducer';\nimport type {\n DPPropsGetterConfig,\n DPTime,\n DPUseTime,\n DPUseTimePropGetter,\n} from './types';\nimport { callAll, skipFirst } from './utils/call-all';\nimport { createPropGetter } from './utils/create-prop-getter';\nimport { createTime } from './utils/create-time';\nimport { isSame } from './utils/predicates';\n\nexport const useTime: DPUseTime = ({ state: { focusDate }, config }) =>\n useMemo(\n () => ({\n time: createTime(focusDate, config),\n }),\n [focusDate, config],\n );\n\nexport const useTimePropGetter: DPUseTimePropGetter = ({\n selectedDates,\n state: { focusDate },\n config: { onDatesChange },\n dispatch,\n}) => {\n const timeButton = useCallback(\n (\n { $date, selected, disabled, now }: DPTime,\n { onClick, disabled: disabledProps, ...rest }: DPPropsGetterConfig = {},\n ) =>\n createPropGetter(\n disabled || !!disabledProps,\n (evt) => {\n if (selected) return;\n callAll(\n onClick,\n skipFirst((d: Date) => {\n const newSelected = selectedDates.map((selected) => {\n return isSame(focusDate as Date, selected) ? d : selected;\n });\n setFocus(dispatch, d);\n onDatesChange(newSelected);\n }),\n )(evt, $date);\n },\n {\n ...rest,\n tabIndex: selected || now ? 0 : -1,\n },\n selected,\n ),\n [selectedDates, onDatesChange, dispatch, focusDate],\n );\n\n return { timeButton };\n};\n","import type { DPDatesConfig, DPYear, DPYearsConfig } from '../types';\nimport { getDateParts, newDate } from './date';\nimport { isAfterMaxYear, isBeforeMinYear } from './predicates';\n\nexport const createYears = (\n currentYear: number,\n offsetDate: Date,\n selectedDates: Date[],\n { numberOfYears }: DPYearsConfig,\n { minDate, maxDate }: DPDatesConfig,\n): DPYear[] => {\n const { Y, M, D } = getDateParts(offsetDate);\n const { Y: nY } = getDateParts(newDate());\n\n return Array(numberOfYears)\n .fill(0)\n .map((_, i) => {\n const year = currentYear + i;\n const $date = newDate(year, M, D);\n\n return {\n $date,\n active: Y === year,\n disabled:\n isBeforeMinYear(year, minDate) || isAfterMaxYear(year, maxDate),\n now: year === nY,\n selected: selectedDates.some((d) => getDateParts(d).Y === year),\n year,\n };\n });\n};\n","import { useCallback, useMemo } from 'react';\n\nimport { setYear } from './state-reducer';\nimport type {\n DPPropsGetterConfig,\n DPUseYears,\n DPUseYearsPropGetters,\n DPYear,\n} from './types';\nimport { callAll, skipAll, skipFirst } from './utils/call-all';\nimport { createPropGetter } from './utils/create-prop-getter';\nimport { createYears } from './utils/create-years';\nimport { getDateParts, newDate } from './utils/date';\nimport { isExactMode } from './utils/get-current-year-position';\nimport { setDPOffset } from './utils/offset';\nimport { isSame, maxDateAndAfter, minDateAndBefore } from './utils/predicates';\n\nexport const useYears: DPUseYears = ({\n selectedDates,\n offsetDate,\n state: { offsetYear },\n config: { years, dates },\n}) =>\n useMemo(\n () => ({\n years: createYears(offsetYear, offsetDate, selectedDates, years, dates),\n }),\n [offsetDate, offsetYear, selectedDates, years, dates],\n );\n\nexport const useYearsPropGetters: DPUseYearsPropGetters = (dpState) => {\n const {\n offsetDate,\n state: { offsetYear },\n config: { dates, years: yearsConfig },\n dispatch,\n } = dpState;\n const { minDate, maxDate } = dates;\n const { step, numberOfYears, mode } = yearsConfig;\n const { D, M } = getDateParts(offsetDate);\n\n const yearButton = useCallback(\n (\n { $date, disabled, selected, active }: DPYear,\n { onClick, disabled: disabledProps, ...rest }: DPPropsGetterConfig = {},\n ) =>\n createPropGetter(\n !!disabledProps || disabled,\n (evt) => callAll(onClick, skipFirst(setDPOffset(dpState)))(evt, $date),\n {\n ...rest,\n tabIndex: active ? 0 : -1,\n },\n selected,\n ),\n [dpState],\n );\n\n const nextYearsButton = useCallback(\n ({ onClick, disabled, ...rest }: DPPropsGetterConfig = {}) => {\n const endYearDate = newDate(offsetYear + numberOfYears - 1, M, D);\n const isDisabled =\n !!disabled ||\n maxDateAndAfter(maxDate, endYearDate) ||\n (isExactMode(mode) && !!maxDate && isSame(maxDate, endYearDate));\n\n return createPropGetter(\n isDisabled,\n (evt) =>\n callAll(\n onClick,\n skipAll(() => setYear(dispatch, offsetYear + step)),\n )(evt),\n rest,\n );\n },\n [maxDate, dispatch, offsetYear, step, D, M, numberOfYears, mode],\n );\n\n const previousYearsButton = useCallback(\n ({ onClick, disabled, ...rest }: DPPropsGetterConfig = {}) => {\n const isDisabled =\n !!disabled || minDateAndBefore(minDate, newDate(offsetYear, M, D));\n\n return createPropGetter(\n isDisabled,\n (evt) =>\n callAll(\n onClick,\n skipAll(() => setYear(dispatch, offsetYear - step)),\n )(evt),\n rest,\n );\n },\n [minDate, dispatch, offsetYear, step, M, D],\n );\n\n return {\n yearButton,\n nextYearsButton,\n previousYearsButton,\n };\n};\n","import type { DPUseDatePicker } from './types';\nimport { useCalendars } from './use-calendars';\nimport { useDatePickerOffsetPropGetters } from './use-date-picker-offset';\nimport { useDatePickerState } from './use-date-picker-state';\nimport { useDays, useDaysPropGetters } from './use-days';\nimport { useMonths, useMonthsPropGetters } from './use-months';\nimport { useTime, useTimePropGetter } from './use-time';\nimport { useYears, useYearsPropGetters } from './use-years';\n\nexport const useDatePicker: DPUseDatePicker = (config) => {\n const dpState = useDatePickerState(config);\n\n return {\n data: {\n ...useCalendars(dpState),\n ...useDays(dpState),\n ...useMonths(dpState),\n ...useTime(dpState),\n ...useYears(dpState),\n },\n propGetters: {\n ...useDaysPropGetters(dpState),\n ...useMonthsPropGetters(dpState),\n ...useTimePropGetter(dpState),\n ...useYearsPropGetters(dpState),\n ...useDatePickerOffsetPropGetters(dpState),\n },\n };\n};\n","import React, { createContext, FC, useContext } from 'react';\n\nimport { DatePickerContextValue, DatePickerProviderProps } from './types';\nimport { useDatePicker } from './use-date-picker';\n\nvar DatePickerContext = createContext<DatePickerContextValue>(\n {} as DatePickerContextValue,\n);\n\nexport var useDatePickerContext = () => useContext(DatePickerContext);\n\nexport var DatePickerProvider: FC<DatePickerProviderProps> = ({\n children,\n config,\n}) => {\n return (\n <DatePickerContext.Provider value={useDatePicker(config)}>\n {children}\n </DatePickerContext.Provider>\n );\n};\n","import React, { createContext, FC, useContext } from 'react';\n\nimport type { DatePickerProviderProps, DPState } from './types';\nimport { useDatePickerState } from './use-date-picker-state';\n\nvar DatePickerStateContext = createContext<DPState>({} as DPState);\n\nexport var useDatePickerStateContext = () => useContext(DatePickerStateContext);\n\nexport var DatePickerStateProvider: FC<DatePickerProviderProps> = ({\n children,\n config,\n}) => {\n return (\n <DatePickerStateContext.Provider value={useDatePickerState(config)}>\n {children}\n </DatePickerStateContext.Provider>\n );\n};\n","import { useDatePickerStateContext } from './date-picker-state-provider';\nimport type {\n DPUseContextCalendars,\n DPUseContextDatePickerOffsetPropGetters,\n DPUseContextDays,\n DPUseContextDaysPropGetters,\n DPUseContextMonths,\n DPUseContextMonthsPropGetters,\n DPUseContextTime,\n DPUseContextTimePropGetters,\n DPUseContextYears,\n DPUseContextYearsPropGetters,\n} from './types';\nimport { useCalendars } from './use-calendars';\nimport { useDatePickerOffsetPropGetters } from './use-date-picker-offset';\nimport { useDays, useDaysPropGetters } from './use-days';\nimport { useMonths, useMonthsPropGetters } from './use-months';\nimport { useTime, useTimePropGetter } from './use-time';\nimport { useYears, useYearsPropGetters } from './use-years';\n\nexport const useContextCalendars: DPUseContextCalendars = () =>\n useCalendars(useDatePickerStateContext());\n\nexport const useContextDays: DPUseContextDays = () =>\n useDays(useDatePickerStateContext());\n\nexport const useContextDaysPropGetters: DPUseContextDaysPropGetters = () =>\n useDaysPropGetters(useDatePickerStateContext());\n\nexport const useContextMonths: DPUseContextMonths = () =>\n useMonths(useDatePickerStateContext());\n\nexport const useContextMonthsPropGetters: DPUseContextMonthsPropGetters = () =>\n useMonthsPropGetters(useDatePickerStateContext());\n\nexport const useContextTime: DPUseContextTime = () =>\n useTime(useDatePickerStateContext());\n\nexport const useContextTimePropGetters: DPUseContextTimePropGetters = () =>\n useTimePropGetter(useDatePickerStateContext());\n\nexport const useContextYears: DPUseContextYears = () =>\n useYears(useDatePickerStateContext());\n\nexport const useContextYearsPropGetters: DPUseContextYearsPropGetters = () =>\n useYearsPropGetters(useDatePickerStateContext());\n\nexport const useContextDatePickerOffsetPropGetters: DPUseContextDatePickerOffsetPropGetters =\n () => useDatePickerOffsetPropGetters(useDatePickerStateContext());\n"],"names":["setRangeEndAction"],"mappings":"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