@mantine/dates
Version:
Calendars, date and time pickers based on Mantine components
1 lines • 8.08 kB
Source Map (JSON)
{"version":3,"file":"use-dates-state.mjs","names":[],"sources":["../../../src/hooks/use-dates-state/use-dates-state.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useEffect, useState } from 'react';\nimport { DatePickerType, DateStringValue, PickerBaseProps } from '../../types';\nimport { useUncontrolledDates } from '../use-uncontrolled-dates/use-uncontrolled-dates';\nimport { isInRange } from './is-in-range/is-in-range';\n\ninterface UseDatesRangeInput<\n Type extends DatePickerType = 'default',\n> extends PickerBaseProps<Type> {\n level: 'year' | 'month' | 'day';\n type: Type;\n onMouseLeave?: (event: React.MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function useDatesState<Type extends DatePickerType = 'default'>({\n type,\n level,\n value,\n defaultValue,\n onChange,\n allowSingleDateInRange,\n allowDeselect,\n onMouseLeave,\n}: UseDatesRangeInput<Type>) {\n const [_value, setValue] = useUncontrolledDates({\n type,\n value,\n defaultValue,\n onChange,\n });\n\n const [pickedDate, setPickedDate] = useState<DateStringValue | null>(\n type === 'range' ? (_value[0] && !_value[1] ? _value[0] : null) : null\n );\n const [hoveredDate, setHoveredDate] = useState<DateStringValue | null>(null);\n\n const onDateChange = (date: DateStringValue) => {\n if (type === 'range') {\n if (pickedDate && !_value[1]) {\n if (dayjs(date).isSame(pickedDate, level) && !allowSingleDateInRange) {\n setPickedDate(null);\n setHoveredDate(null);\n setValue([null, null]);\n return;\n }\n\n const result: [DateStringValue, DateStringValue] = [date, pickedDate];\n result.sort((a, b) => (dayjs(a).isAfter(dayjs(b)) ? 1 : -1));\n setValue(result);\n setHoveredDate(null);\n setPickedDate(null);\n return;\n }\n\n if (\n _value[0] &&\n !_value[1] &&\n dayjs(date).isSame(_value[0], level) &&\n !allowSingleDateInRange\n ) {\n setPickedDate(null);\n setHoveredDate(null);\n setValue([null, null]);\n return;\n }\n\n setValue([date, null]);\n setHoveredDate(null);\n setPickedDate(date);\n return;\n }\n\n if (type === 'multiple') {\n if (_value.some((selected: Date) => dayjs(selected).isSame(date, level))) {\n setValue(_value.filter((selected: Date) => !dayjs(selected).isSame(date, level)));\n } else {\n setValue([..._value, date]);\n }\n\n return;\n }\n\n if (_value && allowDeselect && dayjs(date).isSame(_value, level)) {\n setValue(null);\n } else {\n setValue(date);\n }\n };\n\n const isDateInRange = (date: DateStringValue) => {\n if (pickedDate && hoveredDate) {\n return isInRange(date, [hoveredDate, pickedDate]);\n }\n\n if (_value[0] && _value[1]) {\n return isInRange(date, _value);\n }\n\n return false;\n };\n\n const onRootMouseLeave =\n type === 'range'\n ? (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseLeave?.(event);\n setHoveredDate(null);\n }\n : onMouseLeave;\n\n const isFirstInRange = (date: DateStringValue) => {\n if (!_value[0]) {\n return false;\n }\n\n if (dayjs(date).isSame(_value[0], level)) {\n return !(hoveredDate && dayjs(hoveredDate).isBefore(_value[0]));\n }\n\n return false;\n };\n\n const isLastInRange = (date: DateStringValue) => {\n if (_value[1]) {\n return dayjs(date).isSame(_value[1], level);\n }\n\n if (!_value[0] || !hoveredDate) {\n return false;\n }\n\n return dayjs(hoveredDate).isBefore(_value[0]) && dayjs(date).isSame(_value[0], level);\n };\n\n const getControlProps = (date: DateStringValue) => {\n if (type === 'range') {\n return {\n selected: _value.some(\n (selection: DateStringValue) => selection && dayjs(selection).isSame(date, level)\n ),\n inRange: isDateInRange(date),\n firstInRange: isFirstInRange(date),\n lastInRange: isLastInRange(date),\n 'data-autofocus': (!!_value[0] && dayjs(_value[0]).isSame(date, level)) || undefined,\n };\n }\n\n if (type === 'multiple') {\n return {\n selected: _value.some(\n (selection: DateStringValue) => selection && dayjs(selection).isSame(date, level)\n ),\n 'data-autofocus': (!!_value[0] && dayjs(_value[0]).isSame(date, level)) || undefined,\n };\n }\n\n const selected = dayjs(_value).isSame(date, level);\n return { selected, 'data-autofocus': selected || undefined };\n };\n\n const onHoveredDateChange = type === 'range' && pickedDate ? setHoveredDate : () => {};\n\n useEffect(() => {\n if (type !== 'range') {\n return;\n }\n\n if (_value[0] && !_value[1]) {\n setPickedDate(_value[0]);\n } else {\n const isNeitherSelected = _value[0] == null && _value[1] == null;\n const isBothSelected = _value[0] != null && _value[1] != null;\n if (isNeitherSelected || isBothSelected) {\n setPickedDate(null);\n setHoveredDate(null);\n }\n }\n }, [_value]);\n\n return {\n onDateChange,\n onRootMouseLeave,\n onHoveredDateChange,\n getControlProps,\n _value,\n setValue,\n };\n}\n"],"mappings":";;;;;;AAcA,SAAgB,cAAuD,EACrE,MACA,OACA,OACA,cACA,UACA,wBACA,eACA,gBAC2B;CAC3B,MAAM,CAAC,QAAQ,YAAY,qBAAqB;EAC9C;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,CAAC,YAAY,iBAAiB,SAClC,SAAS,UAAW,OAAO,MAAM,CAAC,OAAO,KAAK,OAAO,KAAK,OAAQ,IACpE;CACA,MAAM,CAAC,aAAa,kBAAkB,SAAiC,IAAI;CAE3E,MAAM,gBAAgB,SAA0B;EAC9C,IAAI,SAAS,SAAS;GACpB,IAAI,cAAc,CAAC,OAAO,IAAI;IAC5B,IAAI,MAAM,IAAI,CAAC,CAAC,OAAO,YAAY,KAAK,KAAK,CAAC,wBAAwB;KACpE,cAAc,IAAI;KAClB,eAAe,IAAI;KACnB,SAAS,CAAC,MAAM,IAAI,CAAC;KACrB;IACF;IAEA,MAAM,SAA6C,CAAC,MAAM,UAAU;IACpE,OAAO,MAAM,GAAG,MAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,IAAI,IAAI,EAAG;IAC3D,SAAS,MAAM;IACf,eAAe,IAAI;IACnB,cAAc,IAAI;IAClB;GACF;GAEA,IACE,OAAO,MACP,CAAC,OAAO,MACR,MAAM,IAAI,CAAC,CAAC,OAAO,OAAO,IAAI,KAAK,KACnC,CAAC,wBACD;IACA,cAAc,IAAI;IAClB,eAAe,IAAI;IACnB,SAAS,CAAC,MAAM,IAAI,CAAC;IACrB;GACF;GAEA,SAAS,CAAC,MAAM,IAAI,CAAC;GACrB,eAAe,IAAI;GACnB,cAAc,IAAI;GAClB;EACF;EAEA,IAAI,SAAS,YAAY;GACvB,IAAI,OAAO,MAAM,aAAmB,MAAM,QAAQ,CAAC,CAAC,OAAO,MAAM,KAAK,CAAC,GACrE,SAAS,OAAO,QAAQ,aAAmB,CAAC,MAAM,QAAQ,CAAC,CAAC,OAAO,MAAM,KAAK,CAAC,CAAC;QAEhF,SAAS,CAAC,GAAG,QAAQ,IAAI,CAAC;GAG5B;EACF;EAEA,IAAI,UAAU,iBAAiB,MAAM,IAAI,CAAC,CAAC,OAAO,QAAQ,KAAK,GAC7D,SAAS,IAAI;OAEb,SAAS,IAAI;CAEjB;CAEA,MAAM,iBAAiB,SAA0B;EAC/C,IAAI,cAAc,aAChB,OAAO,UAAU,MAAM,CAAC,aAAa,UAAU,CAAC;EAGlD,IAAI,OAAO,MAAM,OAAO,IACtB,OAAO,UAAU,MAAM,MAAM;EAG/B,OAAO;CACT;CAEA,MAAM,mBACJ,SAAS,WACJ,UAA4C;EAC3C,eAAe,KAAK;EACpB,eAAe,IAAI;CACrB,IACA;CAEN,MAAM,kBAAkB,SAA0B;EAChD,IAAI,CAAC,OAAO,IACV,OAAO;EAGT,IAAI,MAAM,IAAI,CAAC,CAAC,OAAO,OAAO,IAAI,KAAK,GACrC,OAAO,EAAE,eAAe,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE;EAG/D,OAAO;CACT;CAEA,MAAM,iBAAiB,SAA0B;EAC/C,IAAI,OAAO,IACT,OAAO,MAAM,IAAI,CAAC,CAAC,OAAO,OAAO,IAAI,KAAK;EAG5C,IAAI,CAAC,OAAO,MAAM,CAAC,aACjB,OAAO;EAGT,OAAO,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,OAAO,IAAI,KAAK;CACtF;CAEA,MAAM,mBAAmB,SAA0B;EACjD,IAAI,SAAS,SACX,OAAO;GACL,UAAU,OAAO,MACd,cAA+B,aAAa,MAAM,SAAS,CAAC,CAAC,OAAO,MAAM,KAAK,CAClF;GACA,SAAS,cAAc,IAAI;GAC3B,cAAc,eAAe,IAAI;GACjC,aAAa,cAAc,IAAI;GAC/B,kBAAmB,CAAC,CAAC,OAAO,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,KAAM,KAAA;EAC7E;EAGF,IAAI,SAAS,YACX,OAAO;GACL,UAAU,OAAO,MACd,cAA+B,aAAa,MAAM,SAAS,CAAC,CAAC,OAAO,MAAM,KAAK,CAClF;GACA,kBAAmB,CAAC,CAAC,OAAO,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,KAAM,KAAA;EAC7E;EAGF,MAAM,WAAW,MAAM,MAAM,CAAC,CAAC,OAAO,MAAM,KAAK;EACjD,OAAO;GAAE;GAAU,kBAAkB,YAAY,KAAA;EAAU;CAC7D;CAEA,MAAM,sBAAsB,SAAS,WAAW,aAAa,uBAAuB,CAAC;CAErF,gBAAgB;EACd,IAAI,SAAS,SACX;EAGF,IAAI,OAAO,MAAM,CAAC,OAAO,IACvB,cAAc,OAAO,EAAE;OAClB;GACL,MAAM,oBAAoB,OAAO,MAAM,QAAQ,OAAO,MAAM;GAC5D,MAAM,iBAAiB,OAAO,MAAM,QAAQ,OAAO,MAAM;GACzD,IAAI,qBAAqB,gBAAgB;IACvC,cAAc,IAAI;IAClB,eAAe,IAAI;GACrB;EACF;CACF,GAAG,CAAC,MAAM,CAAC;CAEX,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}