react-day-picker 9.0.4 → 9.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,7 +11,7 @@ DayPicker is a [React](https://react.dev) component to create date pickers, cale
11
11
  - 📅 Supports [selections](./docs/selection-modes.mdx) of single day, multiple days, ranges of days, or [custom selections](./guides/custom-selections.mdx).
12
12
  - 🌍 Can be [localized](./docs/localization.mdx) into any language, supports [ISO 8601 dates](./docs/localization.mdx#iso-week-dates), [UTC dates](./docs/localization.mdx#utc-dates), and [Jalali calendar](./docs/localization.mdx#jalali-calendar).
13
13
  - 🦮 Complies with WCAG 2.1 AA requirements for [accessibility](./docs/accessibility.mdx).
14
- - ⚙️ [Customizable components](./guides/custom-components.mdx) for more complex use cases.
14
+ - ⚙️ [Customizable components](./guides/custom-components.mdx) to extend the rendered elements.
15
15
  - 🔤 Easy integration [with input fields](./guides/input-fields.mdx).
16
16
 
17
17
  DayPicker is written in TypeScript and compiled to CommonJS and ESM. It relies on [date-fns](https://date-fns.org) for date manipulation and formatting.
@@ -9,7 +9,6 @@ const index_js_1 = require("../utils/index.js");
9
9
  const rangeIncludesDate_js_1 = require("../utils/rangeIncludesDate.js");
10
10
  function useRange(props, dateLib) {
11
11
  const { mode, disabled, excludeDisabled, selected: initiallySelected, required, onSelect } = props;
12
- const { differenceInCalendarDays } = dateLib;
13
12
  const [selected, setSelected] = react_1.default.useState(initiallySelected);
14
13
  // Update the selected date if the required flag is set.
15
14
  react_1.default.useEffect(() => {
@@ -23,26 +22,10 @@ function useRange(props, dateLib) {
23
22
  }, [initiallySelected]);
24
23
  const isSelected = (date) => selected && (0, rangeIncludesDate_js_1.rangeIncludesDate)(selected, date, false, dateLib);
25
24
  const select = (triggerDate, modifiers, e) => {
25
+ const { min, max } = props;
26
26
  const newRange = triggerDate
27
- ? (0, index_js_1.addToRange)(triggerDate, selected, dateLib)
27
+ ? (0, index_js_1.addToRange)(triggerDate, selected, min, max, required, dateLib)
28
28
  : undefined;
29
- const { min, max } = props;
30
- if (min) {
31
- if (newRange?.from &&
32
- newRange.to &&
33
- differenceInCalendarDays(newRange.to, newRange.from) < min - 1) {
34
- newRange.from = triggerDate;
35
- newRange.to = undefined;
36
- }
37
- }
38
- if (max) {
39
- if (newRange?.from &&
40
- newRange.to &&
41
- differenceInCalendarDays(newRange.to, newRange.from) >= max) {
42
- newRange.from = triggerDate;
43
- newRange.to = undefined;
44
- }
45
- }
46
29
  if (newRange?.from && newRange.to) {
47
30
  let newDate = newRange.from;
48
31
  while (dateLib.differenceInCalendarDays(newRange.to, newDate) > 0) {
@@ -50,6 +33,7 @@ function useRange(props, dateLib) {
50
33
  if (excludeDisabled &&
51
34
  disabled &&
52
35
  (0, index_js_1.dateMatchModifiers)(newDate, disabled, dateLib)) {
36
+ // if a disabled days is found, the range is reset
53
37
  newRange.from = triggerDate;
54
38
  newRange.to = undefined;
55
39
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":";;;;;AAaA,4BAsEC;AAnFD,kDAA0B;AAU1B,gDAAmE;AACnE,wEAAkE;AAElE,SAAgB,QAAQ,CACtB,KAAQ,EACR,OAAgB;IAEhB,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EACR,QAAQ,EACT,GAAG,KAAmB,CAAC;IAExB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,eAAK,CAAC,QAAQ,CAC5C,iBAAiB,CAClB,CAAC;IAEF,wDAAwD;IACxD,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,2DAA2D;IAC3D,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAChC,QAAQ,IAAI,IAAA,wCAAiB,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,CACb,WAAiB,EACjB,SAAoB,EACpB,CAAyC,EACzC,EAAE;QACF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAmB,CAAC;QACzC,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,IAAA,qBAAU,EAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;YAChE,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,OAAO,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtC,IACE,eAAe;oBACf,QAAQ;oBACR,IAAA,6BAAkB,EAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC9C,CAAC;oBACD,kDAAkD;oBAClD,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;oBAC5B,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAEhD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,MAAM;QACN,UAAU;KACK,CAAC;AACpB,CAAC"}
@@ -7,6 +7,10 @@ import type { DateRange, DateLib } from "../types/index.js";
7
7
  *
8
8
  * @group Utilities
9
9
  */
10
- export declare function addToRange(date: Date, range: DateRange | undefined,
10
+ export declare function addToRange(
11
+ /** The date to add to the range. */
12
+ date: Date,
13
+ /** The range where to add `date`. */
14
+ initialRange: DateRange | undefined, min?: number, max?: number, required?: boolean,
11
15
  /** @ignore */
12
- dateLib?: DateLib): DateRange;
16
+ dateLib?: DateLib): DateRange | undefined;
@@ -10,41 +10,85 @@ const index_js_1 = require("../lib/index.js");
10
10
  *
11
11
  * @group Utilities
12
12
  */
13
- function addToRange(date, range,
13
+ function addToRange(
14
+ /** The date to add to the range. */
15
+ date,
16
+ /** The range where to add `date`. */
17
+ initialRange, min = 0, max = 0, required = false,
14
18
  /** @ignore */
15
19
  dateLib = index_js_1.dateLib) {
16
- const { from, to } = range || {};
20
+ const { from, to } = initialRange || {};
17
21
  const { isSameDay, isAfter, isBefore } = dateLib;
18
- if (from && to) {
19
- if (isSameDay(to, date) && isSameDay(from, date)) {
20
- return { from: undefined, to: undefined };
21
- }
22
- if (isSameDay(to, date)) {
23
- return { from: to, to: undefined };
24
- }
22
+ let range;
23
+ if (!from && !to) {
24
+ // the range is empty, add the date
25
+ range = { from: date, to: min > 0 ? undefined : date };
26
+ }
27
+ else if (from && !to) {
28
+ // adding date to an incomplete range
25
29
  if (isSameDay(from, date)) {
26
- return { from: undefined, to: undefined };
30
+ // adding a date equal to the start of the range
31
+ if (required) {
32
+ range = { from, to: undefined };
33
+ }
34
+ else {
35
+ range = undefined;
36
+ }
27
37
  }
28
- if (isAfter(from, date)) {
29
- return { from: date, to };
38
+ else if (isBefore(date, from)) {
39
+ // adding a date before the start of the range
40
+ range = { from: date, to: from };
41
+ }
42
+ else {
43
+ // adding a date after the start of the range
44
+ range = { from, to: date };
30
45
  }
31
- return { from, to: date };
32
46
  }
33
- if (to) {
34
- if (isAfter(date, to)) {
35
- return { from: to, to: date };
47
+ else if (from && to) {
48
+ // adding date to a complete range
49
+ if (isSameDay(from, date) && isSameDay(to, date)) {
50
+ // adding a date that is equal to both start and end of the range
51
+ if (required) {
52
+ range = { from, to };
53
+ }
54
+ else {
55
+ range = undefined;
56
+ }
57
+ }
58
+ else if (isSameDay(from, date)) {
59
+ // adding a date equal to the the start of the range
60
+ range = { from, to: min > 0 ? undefined : date };
61
+ }
62
+ else if (isSameDay(to, date)) {
63
+ // adding a dare equal to the end of the range
64
+ range = { from: date, to: min > 0 ? undefined : date };
65
+ }
66
+ else if (isBefore(date, from)) {
67
+ // adding a date before the start of the range
68
+ range = { from: date, to: to };
69
+ }
70
+ else if (isAfter(date, from)) {
71
+ // adding a date after the start of the range
72
+ range = { from, to: date };
73
+ }
74
+ else if (isAfter(date, to)) {
75
+ // adding a date after the end of the range
76
+ range = { from, to: date };
77
+ }
78
+ else {
79
+ throw new Error("Invalid range");
36
80
  }
37
- return { from: date, to };
38
81
  }
39
- if (from) {
40
- if (isBefore(date, from)) {
41
- return { from: date, to: from };
82
+ // check for min / max
83
+ if (range?.from && range?.to) {
84
+ const diff = dateLib.differenceInCalendarDays(range.to, range.from);
85
+ if (max > 0 && diff > max) {
86
+ range = { from: date, to: undefined };
42
87
  }
43
- if (isSameDay(date, from)) {
44
- return { from: undefined, to: undefined };
88
+ else if (min > 1 && diff < min) {
89
+ range = { from: date, to: undefined };
45
90
  }
46
- return { from, to: date };
47
91
  }
48
- return { from: date, to: undefined };
92
+ return range;
49
93
  }
50
94
  //# sourceMappingURL=addToRange.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":";;AAWA,gCAuCC;AAlDD,8CAA4D;AAG5D;;;;;;;GAOG;AACH,SAAgB,UAAU,CACxB,IAAU,EACV,KAA4B;AAC5B,cAAc;AACd,UAAmB,kBAAc;IAEjC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACjD,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,EAAE,EAAE,CAAC;QACP,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,6 @@ import { addToRange, dateMatchModifiers } from "../utils/index.js";
3
3
  import { rangeIncludesDate } from "../utils/rangeIncludesDate.js";
4
4
  export function useRange(props, dateLib) {
5
5
  const { mode, disabled, excludeDisabled, selected: initiallySelected, required, onSelect } = props;
6
- const { differenceInCalendarDays } = dateLib;
7
6
  const [selected, setSelected] = React.useState(initiallySelected);
8
7
  // Update the selected date if the required flag is set.
9
8
  React.useEffect(() => {
@@ -17,26 +16,10 @@ export function useRange(props, dateLib) {
17
16
  }, [initiallySelected]);
18
17
  const isSelected = (date) => selected && rangeIncludesDate(selected, date, false, dateLib);
19
18
  const select = (triggerDate, modifiers, e) => {
19
+ const { min, max } = props;
20
20
  const newRange = triggerDate
21
- ? addToRange(triggerDate, selected, dateLib)
21
+ ? addToRange(triggerDate, selected, min, max, required, dateLib)
22
22
  : undefined;
23
- const { min, max } = props;
24
- if (min) {
25
- if (newRange?.from &&
26
- newRange.to &&
27
- differenceInCalendarDays(newRange.to, newRange.from) < min - 1) {
28
- newRange.from = triggerDate;
29
- newRange.to = undefined;
30
- }
31
- }
32
- if (max) {
33
- if (newRange?.from &&
34
- newRange.to &&
35
- differenceInCalendarDays(newRange.to, newRange.from) >= max) {
36
- newRange.from = triggerDate;
37
- newRange.to = undefined;
38
- }
39
- }
40
23
  if (newRange?.from && newRange.to) {
41
24
  let newDate = newRange.from;
42
25
  while (dateLib.differenceInCalendarDays(newRange.to, newDate) > 0) {
@@ -44,6 +27,7 @@ export function useRange(props, dateLib) {
44
27
  if (excludeDisabled &&
45
28
  disabled &&
46
29
  dateMatchModifiers(newDate, disabled, dateLib)) {
30
+ // if a disabled days is found, the range is reset
47
31
  newRange.from = triggerDate;
48
32
  newRange.to = undefined;
49
33
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,UAAU,QAAQ,CACtB,KAAQ,EACR,OAAgB;IAEhB,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EACR,QAAQ,EACT,GAAG,KAAmB,CAAC;IAExB,MAAM,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC5C,iBAAiB,CAClB,CAAC;IAEF,wDAAwD;IACxD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,2DAA2D;IAC3D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAChC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,CACb,WAAiB,EACjB,SAAoB,EACpB,CAAyC,EACzC,EAAE;QACF,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAmB,CAAC;QAEzC,IAAI,GAAG,EAAE,CAAC;YACR,IACE,QAAQ,EAAE,IAAI;gBACd,QAAQ,CAAC,EAAE;gBACX,wBAAwB,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAC9D,CAAC;gBACD,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;gBAC5B,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,IACE,QAAQ,EAAE,IAAI;gBACd,QAAQ,CAAC,EAAE;gBACX,wBAAwB,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,EAC3D,CAAC;gBACD,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;gBAC5B,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,OAAO,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtC,IACE,eAAe;oBACf,QAAQ;oBACR,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC9C,CAAC;oBACD,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;oBAC5B,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAEhD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,MAAM;QACN,UAAU;KACK,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,UAAU,QAAQ,CACtB,KAAQ,EACR,OAAgB;IAEhB,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EACR,QAAQ,EACT,GAAG,KAAmB,CAAC;IAExB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC5C,iBAAiB,CAClB,CAAC;IAEF,wDAAwD;IACxD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,2DAA2D;IAC3D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAChC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,CACb,WAAiB,EACjB,SAAoB,EACpB,CAAyC,EACzC,EAAE;QACF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAmB,CAAC;QACzC,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;YAChE,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,OAAO,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtC,IACE,eAAe;oBACf,QAAQ;oBACR,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC9C,CAAC;oBACD,kDAAkD;oBAClD,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;oBAC5B,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAEhD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,MAAM;QACN,UAAU;KACK,CAAC;AACpB,CAAC"}
@@ -7,6 +7,10 @@ import type { DateRange, DateLib } from "../types/index.js";
7
7
  *
8
8
  * @group Utilities
9
9
  */
10
- export declare function addToRange(date: Date, range: DateRange | undefined,
10
+ export declare function addToRange(
11
+ /** The date to add to the range. */
12
+ date: Date,
13
+ /** The range where to add `date`. */
14
+ initialRange: DateRange | undefined, min?: number, max?: number, required?: boolean,
11
15
  /** @ignore */
12
- dateLib?: DateLib): DateRange;
16
+ dateLib?: DateLib): DateRange | undefined;
@@ -7,41 +7,85 @@ import { dateLib as defaultDateLib } from "../lib/index.js";
7
7
  *
8
8
  * @group Utilities
9
9
  */
10
- export function addToRange(date, range,
10
+ export function addToRange(
11
+ /** The date to add to the range. */
12
+ date,
13
+ /** The range where to add `date`. */
14
+ initialRange, min = 0, max = 0, required = false,
11
15
  /** @ignore */
12
16
  dateLib = defaultDateLib) {
13
- const { from, to } = range || {};
17
+ const { from, to } = initialRange || {};
14
18
  const { isSameDay, isAfter, isBefore } = dateLib;
15
- if (from && to) {
16
- if (isSameDay(to, date) && isSameDay(from, date)) {
17
- return { from: undefined, to: undefined };
18
- }
19
- if (isSameDay(to, date)) {
20
- return { from: to, to: undefined };
21
- }
19
+ let range;
20
+ if (!from && !to) {
21
+ // the range is empty, add the date
22
+ range = { from: date, to: min > 0 ? undefined : date };
23
+ }
24
+ else if (from && !to) {
25
+ // adding date to an incomplete range
22
26
  if (isSameDay(from, date)) {
23
- return { from: undefined, to: undefined };
27
+ // adding a date equal to the start of the range
28
+ if (required) {
29
+ range = { from, to: undefined };
30
+ }
31
+ else {
32
+ range = undefined;
33
+ }
24
34
  }
25
- if (isAfter(from, date)) {
26
- return { from: date, to };
35
+ else if (isBefore(date, from)) {
36
+ // adding a date before the start of the range
37
+ range = { from: date, to: from };
38
+ }
39
+ else {
40
+ // adding a date after the start of the range
41
+ range = { from, to: date };
27
42
  }
28
- return { from, to: date };
29
43
  }
30
- if (to) {
31
- if (isAfter(date, to)) {
32
- return { from: to, to: date };
44
+ else if (from && to) {
45
+ // adding date to a complete range
46
+ if (isSameDay(from, date) && isSameDay(to, date)) {
47
+ // adding a date that is equal to both start and end of the range
48
+ if (required) {
49
+ range = { from, to };
50
+ }
51
+ else {
52
+ range = undefined;
53
+ }
54
+ }
55
+ else if (isSameDay(from, date)) {
56
+ // adding a date equal to the the start of the range
57
+ range = { from, to: min > 0 ? undefined : date };
58
+ }
59
+ else if (isSameDay(to, date)) {
60
+ // adding a dare equal to the end of the range
61
+ range = { from: date, to: min > 0 ? undefined : date };
62
+ }
63
+ else if (isBefore(date, from)) {
64
+ // adding a date before the start of the range
65
+ range = { from: date, to: to };
66
+ }
67
+ else if (isAfter(date, from)) {
68
+ // adding a date after the start of the range
69
+ range = { from, to: date };
70
+ }
71
+ else if (isAfter(date, to)) {
72
+ // adding a date after the end of the range
73
+ range = { from, to: date };
74
+ }
75
+ else {
76
+ throw new Error("Invalid range");
33
77
  }
34
- return { from: date, to };
35
78
  }
36
- if (from) {
37
- if (isBefore(date, from)) {
38
- return { from: date, to: from };
79
+ // check for min / max
80
+ if (range?.from && range?.to) {
81
+ const diff = dateLib.differenceInCalendarDays(range.to, range.from);
82
+ if (max > 0 && diff > max) {
83
+ range = { from: date, to: undefined };
39
84
  }
40
- if (isSameDay(date, from)) {
41
- return { from: undefined, to: undefined };
85
+ else if (min > 1 && diff < min) {
86
+ range = { from: date, to: undefined };
42
87
  }
43
- return { from, to: date };
44
88
  }
45
- return { from: date, to: undefined };
89
+ return range;
46
90
  }
47
91
  //# sourceMappingURL=addToRange.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACxB,IAAU,EACV,KAA4B;AAC5B,cAAc;AACd,UAAmB,cAAc;IAEjC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACjD,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,EAAE,EAAE,CAAC;QACP,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU;AACxB,oCAAoC;AACpC,IAAU;AACV,qCAAqC;AACrC,YAAmC,EACnC,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,EACP,QAAQ,GAAG,KAAK;AAChB,cAAc;AACd,UAAmB,cAAc;IAEjC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,YAAY,IAAI,EAAE,CAAC;IACxC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEjD,IAAI,KAA4B,CAAC;IAEjC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACjB,mCAAmC;QACnC,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;SAAM,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACvB,qCAAqC;QACrC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1B,gDAAgD;YAChD,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,8CAA8C;YAC9C,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QACtB,kCAAkC;QAClC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACjD,iEAAiE;YACjE,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,oDAAoD;YACpD,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,CAAC;aAAM,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/B,8CAA8C;YAC9C,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,8CAA8C;YAC9C,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/B,6CAA6C;YAC7C,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7B,2CAA2C;YAC3C,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;YAC1B,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;aAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;YACjC,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+
3
+ import { DayPicker } from "react-day-picker";
4
+
5
+ export function MultipleRequired() {
6
+ return <DayPicker mode="multiple" required selected={[new Date()]} />;
7
+ }
@@ -8,6 +8,11 @@ import { user } from "@/test/user";
8
8
 
9
9
  import { RangeMinMax } from "./RangeMinMax";
10
10
 
11
+ const today = new Date(2022, 8, 12);
12
+
13
+ beforeAll(() => jest.setSystemTime(today));
14
+ afterAll(() => jest.useRealTimers());
15
+
11
16
  beforeEach(() => render(<RangeMinMax />));
12
17
 
13
18
  describe("when a day is clicked", () => {
@@ -18,22 +23,6 @@ describe("when a day is clicked", () => {
18
23
  test("should be selected", () => {
19
24
  expect(gridcell(firstDay, true)).toHaveAttribute("aria-selected", "true");
20
25
  });
21
- describe("when the day before min is clicked", () => {
22
- const dayAfter = addDays(firstDay, 1);
23
- beforeEach(async () => {
24
- await user.click(dateButton(dayAfter));
25
- });
26
- test("the first day should not be selected", () => {
27
- expect(gridcell(firstDay, true)).not.toHaveAttribute(
28
- "aria-selected",
29
- "true"
30
- );
31
- });
32
- test("the day after should be selected", () => {
33
- expect(gridcell(dayAfter, true)).toHaveAttribute("aria-selected", "true");
34
- });
35
- });
36
-
37
26
  describe("when the day after min is clicked", () => {
38
27
  const dayAfter = addDays(firstDay, 4);
39
28
  beforeEach(async () => {
@@ -9,20 +9,19 @@ export function RangeMinMax() {
9
9
  let footer = `Please pick the first day.`;
10
10
  if (range?.from) {
11
11
  if (!range.to) {
12
- footer = format(range.from, "PPP");
12
+ footer = `${format(range.from, "PPP")}—`;
13
13
  } else if (range.to) {
14
- footer = `${format(range.from, "PPP")}–${format(range.to, "PPP")}`;
14
+ footer = `${format(range.from, "PPP")}—${format(range.to, "PPP")}`;
15
15
  }
16
16
  }
17
17
 
18
18
  return (
19
19
  <div>
20
- <p>Select a range between 3 and 9 days.</p>
20
+ <p>Select up to 6 nights.</p>
21
21
  <DayPicker
22
- defaultMonth={new Date(2022, 8)}
23
22
  mode="range"
24
- min={3}
25
- max={9}
23
+ min={1}
24
+ max={6}
26
25
  selected={range}
27
26
  onSelect={setRange}
28
27
  footer={footer}
@@ -0,0 +1,30 @@
1
+ import React, { useState } from "react";
2
+
3
+ import { addDays, format, startOfMonth } from "date-fns";
4
+ import { DateRange, DayPicker } from "react-day-picker";
5
+
6
+ export function RangeRequired() {
7
+ const [range, setRange] = useState<DateRange>({
8
+ from: startOfMonth(new Date()),
9
+ to: addDays(startOfMonth(new Date()), 4)
10
+ });
11
+
12
+ let footer = `Please pick the first day.`;
13
+ if (range?.from) {
14
+ if (!range.to) {
15
+ footer = `${format(range.from, "PPP")}—`;
16
+ } else if (range.to) {
17
+ footer = `${format(range.from, "PPP")}—${format(range.to, "PPP")}`;
18
+ }
19
+ }
20
+
21
+ return (
22
+ <DayPicker
23
+ mode="range"
24
+ required
25
+ selected={range}
26
+ onSelect={setRange}
27
+ footer={footer}
28
+ />
29
+ );
30
+ }
@@ -13,9 +13,7 @@ function DayWithShiftKey(props: DayButtonProps) {
13
13
 
14
14
  const handleClick: MouseEventHandler<HTMLButtonElement> = (e) => {
15
15
  const requireShiftKey =
16
- selected?.from &&
17
- !selected.to &&
18
- !isSameDay(props.day.date, selected.from);
16
+ selected?.from && !isSameDay(props.day.date, selected.from);
19
17
 
20
18
  if (!e.shiftKey && requireShiftKey) {
21
19
  return;
package/examples/index.ts CHANGED
@@ -38,6 +38,7 @@ export * from "./ModifiersStyle";
38
38
  export * from "./ModifiersToday";
39
39
  export * from "./Multiple";
40
40
  export * from "./MultipleMinMax";
41
+ export * from "./MultipleRequired";
41
42
  export * from "./MultipleMonths";
42
43
  export * from "./MultipleMonthsPaged";
43
44
  export * from "./NumberingSystem";
@@ -45,6 +46,7 @@ export * from "./OutsideDays";
45
46
  export * from "./Range";
46
47
  export * from "./RangeExcludeDisabled";
47
48
  export * from "./RangeMinMax";
49
+ export * from "./RangeRequired";
48
50
  export * from "./RangeShiftKey";
49
51
  export * from "./Rtl";
50
52
  export * from "./Single";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-day-picker",
3
- "version": "9.0.4",
3
+ "version": "9.0.5",
4
4
  "description": "Customizable Date Picker for React",
5
5
  "author": "Giampaolo Bellavite <io@gpbl.dev>",
6
6
  "homepage": "https://daypicker.dev",
@@ -144,7 +144,7 @@
144
144
  "@types/node": "^20.14.10",
145
145
  "@types/react": "^18.3.3",
146
146
  "@types/react-dom": "^18.3.0",
147
- "@typescript-eslint/eslint-plugin": "^7.16.1",
147
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
148
148
  "@typescript-eslint/parser": "^7.16.0",
149
149
  "date-fns": "^3.6.0",
150
150
  "date-fns-jalali": "3.6.0-1",
@@ -169,7 +169,7 @@
169
169
  "ts-jest": "^29.2.3",
170
170
  "ts-node": "^10.9.2",
171
171
  "tslib": "^2.6.3",
172
- "typescript": "~5.5.3",
172
+ "typescript": "~5.5.4",
173
173
  "typescript-css-modules": "^1.0.4"
174
174
  },
175
175
  "peerDependencies": {
@@ -90,7 +90,7 @@ describe("useRange", () => {
90
90
 
91
91
  expect(result.current.selected).toEqual({
92
92
  from: new Date(2023, 6, 10),
93
- to: undefined
93
+ to: new Date(2023, 6, 10)
94
94
  });
95
95
  });
96
96
 
@@ -135,7 +135,7 @@ describe("useRange", () => {
135
135
 
136
136
  expect(result.current.selected).toEqual({
137
137
  from: new Date(2023, 6, 10),
138
- to: undefined
138
+ to: new Date(2023, 6, 10)
139
139
  });
140
140
  });
141
141
  });
@@ -24,7 +24,6 @@ export function useRange<T extends DayPickerProps>(
24
24
  onSelect
25
25
  } = props as PropsRange;
26
26
 
27
- const { differenceInCalendarDays } = dateLib;
28
27
  const [selected, setSelected] = React.useState<DateRange | undefined>(
29
28
  initiallySelected
30
29
  );
@@ -49,32 +48,10 @@ export function useRange<T extends DayPickerProps>(
49
48
  modifiers: Modifiers,
50
49
  e: React.MouseEvent | React.KeyboardEvent
51
50
  ) => {
51
+ const { min, max } = props as PropsRange;
52
52
  const newRange = triggerDate
53
- ? addToRange(triggerDate, selected, dateLib)
53
+ ? addToRange(triggerDate, selected, min, max, required, dateLib)
54
54
  : undefined;
55
- const { min, max } = props as PropsRange;
56
-
57
- if (min) {
58
- if (
59
- newRange?.from &&
60
- newRange.to &&
61
- differenceInCalendarDays(newRange.to, newRange.from) < min - 1
62
- ) {
63
- newRange.from = triggerDate;
64
- newRange.to = undefined;
65
- }
66
- }
67
-
68
- if (max) {
69
- if (
70
- newRange?.from &&
71
- newRange.to &&
72
- differenceInCalendarDays(newRange.to, newRange.from) >= max
73
- ) {
74
- newRange.from = triggerDate;
75
- newRange.to = undefined;
76
- }
77
- }
78
55
 
79
56
  if (newRange?.from && newRange.to) {
80
57
  let newDate = newRange.from;
@@ -85,6 +62,7 @@ export function useRange<T extends DayPickerProps>(
85
62
  disabled &&
86
63
  dateMatchModifiers(newDate, disabled, dateLib)
87
64
  ) {
65
+ // if a disabled days is found, the range is reset
88
66
  newRange.from = triggerDate;
89
67
  newRange.to = undefined;
90
68
  break;