@react-stately/calendar 3.5.0 → 3.5.2

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/dist/utils.mjs CHANGED
@@ -36,21 +36,33 @@ function $f62d864046160412$export$530edbfc915b2b04(date, duration, locale, minVa
36
36
  ...duration
37
37
  };
38
38
  // subtract 1 from the smallest unit
39
- if (duration.days) d.days--;
40
- else if (duration.weeks) d.weeks--;
41
- else if (duration.months) d.months--;
42
- else if (duration.years) d.years--;
39
+ if (d.days) d.days--;
40
+ else if (d.weeks) d.weeks--;
41
+ else if (d.months) d.months--;
42
+ else if (d.years) d.years--;
43
43
  let aligned = $f62d864046160412$export$144a00ba6044eb9(date, duration, locale).subtract(d);
44
44
  return $f62d864046160412$export$5bb865b12696a77d(date, aligned, duration, locale, minValue, maxValue);
45
45
  }
46
46
  function $f62d864046160412$export$5bb865b12696a77d(date, aligned, duration, locale, minValue, maxValue) {
47
- if (minValue && date.compare(minValue) >= 0) aligned = (0, $k1D4u$maxDate)(aligned, $f62d864046160412$export$144a00ba6044eb9((0, $k1D4u$toCalendarDate)(minValue), duration, locale));
48
- if (maxValue && date.compare(maxValue) <= 0) aligned = (0, $k1D4u$minDate)(aligned, $f62d864046160412$export$530edbfc915b2b04((0, $k1D4u$toCalendarDate)(maxValue), duration, locale));
47
+ if (minValue && date.compare(minValue) >= 0) {
48
+ let newDate = (0, $k1D4u$maxDate)(aligned, $f62d864046160412$export$144a00ba6044eb9((0, $k1D4u$toCalendarDate)(minValue), duration, locale));
49
+ if (newDate) aligned = newDate;
50
+ }
51
+ if (maxValue && date.compare(maxValue) <= 0) {
52
+ let newDate = (0, $k1D4u$minDate)(aligned, $f62d864046160412$export$530edbfc915b2b04((0, $k1D4u$toCalendarDate)(maxValue), duration, locale));
53
+ if (newDate) aligned = newDate;
54
+ }
49
55
  return aligned;
50
56
  }
51
57
  function $f62d864046160412$export$4f5203c0d889109e(date, minValue, maxValue) {
52
- if (minValue) date = (0, $k1D4u$maxDate)(date, (0, $k1D4u$toCalendarDate)(minValue));
53
- if (maxValue) date = (0, $k1D4u$minDate)(date, (0, $k1D4u$toCalendarDate)(maxValue));
58
+ if (minValue) {
59
+ let newDate = (0, $k1D4u$maxDate)(date, (0, $k1D4u$toCalendarDate)(minValue));
60
+ if (newDate) date = newDate;
61
+ }
62
+ if (maxValue) {
63
+ let newDate = (0, $k1D4u$minDate)(date, (0, $k1D4u$toCalendarDate)(maxValue));
64
+ if (newDate) date = newDate;
65
+ }
54
66
  return date;
55
67
  }
56
68
  function $f62d864046160412$export$a1d3911297b952d7(date, minValue, isDateUnavailable) {
@@ -59,8 +71,9 @@ function $f62d864046160412$export$a1d3911297b952d7(date, minValue, isDateUnavail
59
71
  days: 1
60
72
  });
61
73
  if (date.compare(minValue) >= 0) return date;
74
+ return null;
62
75
  }
63
76
 
64
77
 
65
78
  export {$f62d864046160412$export$eac50920cf2fd59a as isInvalid, $f62d864046160412$export$f4a51ff076cc9a09 as alignCenter, $f62d864046160412$export$144a00ba6044eb9 as alignStart, $f62d864046160412$export$5bb865b12696a77d as constrainStart, $f62d864046160412$export$530edbfc915b2b04 as alignEnd, $f62d864046160412$export$4f5203c0d889109e as constrainValue, $f62d864046160412$export$a1d3911297b952d7 as previousAvailableDate};
66
- //# sourceMappingURL=utils.mjs.map
79
+ //# sourceMappingURL=utils.module.js.map
@@ -36,21 +36,33 @@ function $f62d864046160412$export$530edbfc915b2b04(date, duration, locale, minVa
36
36
  ...duration
37
37
  };
38
38
  // subtract 1 from the smallest unit
39
- if (duration.days) d.days--;
40
- else if (duration.weeks) d.weeks--;
41
- else if (duration.months) d.months--;
42
- else if (duration.years) d.years--;
39
+ if (d.days) d.days--;
40
+ else if (d.weeks) d.weeks--;
41
+ else if (d.months) d.months--;
42
+ else if (d.years) d.years--;
43
43
  let aligned = $f62d864046160412$export$144a00ba6044eb9(date, duration, locale).subtract(d);
44
44
  return $f62d864046160412$export$5bb865b12696a77d(date, aligned, duration, locale, minValue, maxValue);
45
45
  }
46
46
  function $f62d864046160412$export$5bb865b12696a77d(date, aligned, duration, locale, minValue, maxValue) {
47
- if (minValue && date.compare(minValue) >= 0) aligned = (0, $k1D4u$maxDate)(aligned, $f62d864046160412$export$144a00ba6044eb9((0, $k1D4u$toCalendarDate)(minValue), duration, locale));
48
- if (maxValue && date.compare(maxValue) <= 0) aligned = (0, $k1D4u$minDate)(aligned, $f62d864046160412$export$530edbfc915b2b04((0, $k1D4u$toCalendarDate)(maxValue), duration, locale));
47
+ if (minValue && date.compare(minValue) >= 0) {
48
+ let newDate = (0, $k1D4u$maxDate)(aligned, $f62d864046160412$export$144a00ba6044eb9((0, $k1D4u$toCalendarDate)(minValue), duration, locale));
49
+ if (newDate) aligned = newDate;
50
+ }
51
+ if (maxValue && date.compare(maxValue) <= 0) {
52
+ let newDate = (0, $k1D4u$minDate)(aligned, $f62d864046160412$export$530edbfc915b2b04((0, $k1D4u$toCalendarDate)(maxValue), duration, locale));
53
+ if (newDate) aligned = newDate;
54
+ }
49
55
  return aligned;
50
56
  }
51
57
  function $f62d864046160412$export$4f5203c0d889109e(date, minValue, maxValue) {
52
- if (minValue) date = (0, $k1D4u$maxDate)(date, (0, $k1D4u$toCalendarDate)(minValue));
53
- if (maxValue) date = (0, $k1D4u$minDate)(date, (0, $k1D4u$toCalendarDate)(maxValue));
58
+ if (minValue) {
59
+ let newDate = (0, $k1D4u$maxDate)(date, (0, $k1D4u$toCalendarDate)(minValue));
60
+ if (newDate) date = newDate;
61
+ }
62
+ if (maxValue) {
63
+ let newDate = (0, $k1D4u$minDate)(date, (0, $k1D4u$toCalendarDate)(maxValue));
64
+ if (newDate) date = newDate;
65
+ }
54
66
  return date;
55
67
  }
56
68
  function $f62d864046160412$export$a1d3911297b952d7(date, minValue, isDateUnavailable) {
@@ -59,6 +71,7 @@ function $f62d864046160412$export$a1d3911297b952d7(date, minValue, isDateUnavail
59
71
  days: 1
60
72
  });
61
73
  if (date.compare(minValue) >= 0) return date;
74
+ return null;
62
75
  }
63
76
 
64
77
 
@@ -1 +1 @@
1
- {"mappings":";;AAAA;;;;;;;;;;CAUC;AAaM,SAAS,0CAAU,IAAe,EAAE,QAAmB,EAAE,QAAmB;IACjF,OAAO,AAAC,YAAY,QAAQ,KAAK,OAAO,CAAC,YAAY,KAClD,YAAY,QAAQ,KAAK,OAAO,CAAC,YAAY;AAClD;AAEO,SAAS,0CAAY,IAAkB,EAAE,QAAsB,EAAE,MAAc,EAAE,QAAoB,EAAE,QAAoB;IAChI,IAAI,eAA6B,CAAC;IAClC,IAAK,IAAI,OAAO,SAAU;QACxB,YAAY,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG;QAC/C,IAAI,YAAY,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC,IAAI,GAAG,MAAM,GACjD,YAAY,CAAC,IAAI;IAErB;IAEA,IAAI,UAAU,yCAAW,MAAM,UAAU,QAAQ,QAAQ,CAAC;IAC1D,OAAO,0CAAe,MAAM,SAAS,UAAU,QAAQ,UAAU;AACnE;AAEO,SAAS,yCAAW,IAAkB,EAAE,QAAsB,EAAE,MAAc,EAAE,QAAoB,EAAE,QAAoB;IAC/H,yCAAyC;IACzC,IAAI,UAAU;IACd,IAAI,SAAS,KAAK,EAChB,UAAU,CAAA,GAAA,kBAAU,EAAE;SACjB,IAAI,SAAS,MAAM,EACxB,UAAU,CAAA,GAAA,mBAAW,EAAE;SAClB,IAAI,SAAS,KAAK,EACvB,UAAU,CAAA,GAAA,kBAAU,EAAE,MAAM;IAG9B,OAAO,0CAAe,MAAM,SAAS,UAAU,QAAQ,UAAU;AACnE;AAEO,SAAS,0CAAS,IAAkB,EAAE,QAAsB,EAAE,MAAc,EAAE,QAAoB,EAAE,QAAoB;IAC7H,IAAI,IAAI;QAAC,GAAG,QAAQ;IAAA;IACpB,oCAAoC;IACpC,IAAI,SAAS,IAAI,EACf,EAAE,IAAI;SACD,IAAI,SAAS,KAAK,EACvB,EAAE,KAAK;SACF,IAAI,SAAS,MAAM,EACxB,EAAE,MAAM;SACH,IAAI,SAAS,KAAK,EACvB,EAAE,KAAK;IAGT,IAAI,UAAU,yCAAW,MAAM,UAAU,QAAQ,QAAQ,CAAC;IAC1D,OAAO,0CAAe,MAAM,SAAS,UAAU,QAAQ,UAAU;AACnE;AAEO,SAAS,0CACd,IAAkB,EAClB,OAAqB,EACrB,QAAsB,EACtB,MAAc,EACd,QAAmB,EACnB,QAAmB;IACnB,IAAI,YAAY,KAAK,OAAO,CAAC,aAAa,GACxC,UAAU,CAAA,GAAA,cAAM,EACd,SACA,yCAAW,CAAA,GAAA,qBAAa,EAAE,WAAW,UAAU;IAInD,IAAI,YAAY,KAAK,OAAO,CAAC,aAAa,GACxC,UAAU,CAAA,GAAA,cAAM,EACd,SACA,0CAAS,CAAA,GAAA,qBAAa,EAAE,WAAW,UAAU;IAIjD,OAAO;AACT;AAEO,SAAS,0CAAe,IAAkB,EAAE,QAAmB,EAAE,QAAmB;IACzF,IAAI,UACF,OAAO,CAAA,GAAA,cAAM,EAAE,MAAM,CAAA,GAAA,qBAAa,EAAE;IAGtC,IAAI,UACF,OAAO,CAAA,GAAA,cAAM,EAAE,MAAM,CAAA,GAAA,qBAAa,EAAE;IAGtC,OAAO;AACT;AAEO,SAAS,0CAAsB,IAAkB,EAAE,QAAmB,EAAE,iBAAkD;IAC/H,IAAI,CAAC,mBACH,OAAO;IAGT,MAAO,KAAK,OAAO,CAAC,aAAa,KAAK,kBAAkB,MACtD,OAAO,KAAK,QAAQ,CAAC;QAAC,MAAM;IAAC;IAG/B,IAAI,KAAK,OAAO,CAAC,aAAa,GAC5B,OAAO;AAEX","sources":["packages/@react-stately/calendar/src/utils.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n CalendarDate,\n DateDuration,\n maxDate,\n minDate,\n startOfMonth,\n startOfWeek,\n startOfYear,\n toCalendarDate\n} from '@internationalized/date';\nimport {DateValue} from '@react-types/calendar';\n\nexport function isInvalid(date: DateValue, minValue: DateValue, maxValue: DateValue) {\n return (minValue != null && date.compare(minValue) < 0) ||\n (maxValue != null && date.compare(maxValue) > 0);\n}\n\nexport function alignCenter(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue, maxValue?: DateValue) {\n let halfDuration: DateDuration = {};\n for (let key in duration) {\n halfDuration[key] = Math.floor(duration[key] / 2);\n if (halfDuration[key] > 0 && duration[key] % 2 === 0) {\n halfDuration[key]--;\n }\n }\n\n let aligned = alignStart(date, duration, locale).subtract(halfDuration);\n return constrainStart(date, aligned, duration, locale, minValue, maxValue);\n}\n\nexport function alignStart(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue, maxValue?: DateValue) {\n // align to the start of the largest unit\n let aligned = date;\n if (duration.years) {\n aligned = startOfYear(date);\n } else if (duration.months) {\n aligned = startOfMonth(date);\n } else if (duration.weeks) {\n aligned = startOfWeek(date, locale);\n }\n\n return constrainStart(date, aligned, duration, locale, minValue, maxValue);\n}\n\nexport function alignEnd(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue, maxValue?: DateValue) {\n let d = {...duration};\n // subtract 1 from the smallest unit\n if (duration.days) {\n d.days--;\n } else if (duration.weeks) {\n d.weeks--;\n } else if (duration.months) {\n d.months--;\n } else if (duration.years) {\n d.years--;\n }\n\n let aligned = alignStart(date, duration, locale).subtract(d);\n return constrainStart(date, aligned, duration, locale, minValue, maxValue);\n}\n\nexport function constrainStart(\n date: CalendarDate,\n aligned: CalendarDate,\n duration: DateDuration,\n locale: string,\n minValue: DateValue,\n maxValue: DateValue) {\n if (minValue && date.compare(minValue) >= 0) {\n aligned = maxDate(\n aligned,\n alignStart(toCalendarDate(minValue), duration, locale)\n );\n }\n\n if (maxValue && date.compare(maxValue) <= 0) {\n aligned = minDate(\n aligned,\n alignEnd(toCalendarDate(maxValue), duration, locale)\n );\n }\n\n return aligned;\n}\n\nexport function constrainValue(date: CalendarDate, minValue: DateValue, maxValue: DateValue) {\n if (minValue) {\n date = maxDate(date, toCalendarDate(minValue));\n }\n\n if (maxValue) {\n date = minDate(date, toCalendarDate(maxValue));\n }\n\n return date;\n}\n\nexport function previousAvailableDate(date: CalendarDate, minValue: DateValue, isDateUnavailable: (date: CalendarDate) => boolean) {\n if (!isDateUnavailable) {\n return date;\n }\n\n while (date.compare(minValue) >= 0 && isDateUnavailable(date)) {\n date = date.subtract({days: 1});\n }\n\n if (date.compare(minValue) >= 0) {\n return date;\n }\n}\n"],"names":[],"version":3,"file":"utils.module.js.map"}
1
+ {"mappings":"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","sources":["packages/@react-stately/calendar/src/utils.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n CalendarDate,\n DateDuration,\n maxDate,\n minDate,\n startOfMonth,\n startOfWeek,\n startOfYear,\n toCalendarDate\n} from '@internationalized/date';\nimport {DateValue} from '@react-types/calendar';\n\nexport function isInvalid(date: DateValue, minValue?: DateValue | null, maxValue?: DateValue | null) {\n return (minValue != null && date.compare(minValue) < 0) ||\n (maxValue != null && date.compare(maxValue) > 0);\n}\n\nexport function alignCenter(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue | null, maxValue?: DateValue | null) {\n let halfDuration: DateDuration = {};\n for (let key in duration) {\n halfDuration[key] = Math.floor(duration[key] / 2);\n if (halfDuration[key] > 0 && duration[key] % 2 === 0) {\n halfDuration[key]--;\n }\n }\n\n let aligned = alignStart(date, duration, locale).subtract(halfDuration);\n return constrainStart(date, aligned, duration, locale, minValue, maxValue);\n}\n\nexport function alignStart(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue | null, maxValue?: DateValue | null) {\n // align to the start of the largest unit\n let aligned = date;\n if (duration.years) {\n aligned = startOfYear(date);\n } else if (duration.months) {\n aligned = startOfMonth(date);\n } else if (duration.weeks) {\n aligned = startOfWeek(date, locale);\n }\n\n return constrainStart(date, aligned, duration, locale, minValue, maxValue);\n}\n\nexport function alignEnd(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue | null, maxValue?: DateValue | null) {\n let d = {...duration};\n // subtract 1 from the smallest unit\n if (d.days) {\n d.days--;\n } else if (d.weeks) {\n d.weeks--;\n } else if (d.months) {\n d.months--;\n } else if (d.years) {\n d.years--;\n }\n\n let aligned = alignStart(date, duration, locale).subtract(d);\n return constrainStart(date, aligned, duration, locale, minValue, maxValue);\n}\n\nexport function constrainStart(\n date: CalendarDate,\n aligned: CalendarDate,\n duration: DateDuration,\n locale: string,\n minValue?: DateValue | null,\n maxValue?: DateValue | null) {\n if (minValue && date.compare(minValue) >= 0) {\n let newDate = maxDate(\n aligned,\n alignStart(toCalendarDate(minValue), duration, locale)\n );\n if (newDate) {\n aligned = newDate;\n }\n }\n\n if (maxValue && date.compare(maxValue) <= 0) {\n let newDate = minDate(\n aligned,\n alignEnd(toCalendarDate(maxValue), duration, locale)\n );\n if (newDate) {\n aligned = newDate;\n }\n }\n\n return aligned;\n}\n\nexport function constrainValue(date: CalendarDate, minValue?: DateValue | null, maxValue?: DateValue | null) {\n if (minValue) {\n let newDate = maxDate(date, toCalendarDate(minValue));\n if (newDate) {\n date = newDate;\n }\n }\n\n if (maxValue) {\n let newDate = minDate(date, toCalendarDate(maxValue));\n if (newDate) {\n date = newDate;\n }\n }\n\n return date;\n}\n\nexport function previousAvailableDate(date: CalendarDate, minValue: DateValue, isDateUnavailable?: (date: CalendarDate) => boolean): CalendarDate | null {\n if (!isDateUnavailable) {\n return date;\n }\n\n while (date.compare(minValue) >= 0 && isDateUnavailable(date)) {\n date = date.subtract({days: 1});\n }\n\n if (date.compare(minValue) >= 0) {\n return date;\n }\n return null;\n}\n"],"names":[],"version":3,"file":"utils.module.js.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-stately/calendar",
3
- "version": "3.5.0",
3
+ "version": "3.5.2",
4
4
  "description": "Spectrum UI components in React",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/main.js",
@@ -22,17 +22,17 @@
22
22
  "url": "https://github.com/adobe/react-spectrum"
23
23
  },
24
24
  "dependencies": {
25
- "@internationalized/date": "^3.5.3",
26
- "@react-stately/utils": "^3.10.0",
27
- "@react-types/calendar": "^3.4.5",
28
- "@react-types/shared": "^3.23.0",
25
+ "@internationalized/date": "^3.5.5",
26
+ "@react-stately/utils": "^3.10.2",
27
+ "@react-types/calendar": "^3.4.7",
28
+ "@react-types/shared": "^3.24.0",
29
29
  "@swc/helpers": "^0.5.0"
30
30
  },
31
31
  "peerDependencies": {
32
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
32
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0"
33
33
  },
34
34
  "publishConfig": {
35
35
  "access": "public"
36
36
  },
37
- "gitHead": "f645f29edc1322153fd60af4640cbcab1d992dbd"
37
+ "gitHead": "86d80e3216bc32e75108831cf3a5a720bc849206"
38
38
  }
package/src/types.ts CHANGED
@@ -22,16 +22,16 @@ interface CalendarStateBase {
22
22
  /** The date range that is currently visible in the calendar. */
23
23
  readonly visibleRange: RangeValue<CalendarDate>,
24
24
  /** The minimum allowed date that a user may select. */
25
- readonly minValue?: DateValue,
25
+ readonly minValue?: DateValue | null,
26
26
  /** The maximum allowed date that a user may select. */
27
- readonly maxValue?: DateValue,
27
+ readonly maxValue?: DateValue | null,
28
28
  /** The time zone of the dates currently being displayed. */
29
29
  readonly timeZone: string,
30
30
  /**
31
31
  * The current validation state of the selected value.
32
32
  * @deprecated Use `isValueInvalid` instead.
33
33
  */
34
- readonly validationState: ValidationState,
34
+ readonly validationState: ValidationState | null,
35
35
  /** Whether the calendar is invalid. */
36
36
  readonly isValueInvalid: boolean,
37
37
  /** The currently focused date. */
@@ -108,9 +108,9 @@ export interface CalendarState extends CalendarStateBase {
108
108
 
109
109
  export interface RangeCalendarState extends CalendarStateBase {
110
110
  /** The currently selected date range. */
111
- readonly value: RangeValue<DateValue>,
111
+ readonly value: RangeValue<DateValue> | null,
112
112
  /** Sets the currently selected date range. */
113
- setValue(value: RangeValue<DateValue>): void,
113
+ setValue(value: RangeValue<DateValue> | null): void,
114
114
  /** Highlights the given date during selection, e.g. by hovering or dragging. */
115
115
  highlightDate(date: CalendarDate): void,
116
116
  /** The current anchor date that the user clicked on to begin range selection. */
@@ -118,7 +118,7 @@ export interface RangeCalendarState extends CalendarStateBase {
118
118
  /** Sets the anchor date that the user clicked on to begin range selection. */
119
119
  setAnchorDate(date: CalendarDate | null): void,
120
120
  /** The currently highlighted date range. */
121
- readonly highlightedRange: RangeValue<CalendarDate>,
121
+ readonly highlightedRange: RangeValue<CalendarDate> | null,
122
122
  /** Whether the user is currently dragging over the calendar. */
123
123
  readonly isDragging: boolean,
124
124
  /** Sets whether the user is dragging over the calendar. */
@@ -27,7 +27,7 @@ import {
27
27
  toCalendarDate,
28
28
  today
29
29
  } from '@internationalized/date';
30
- import {CalendarProps, DateValue} from '@react-types/calendar';
30
+ import {CalendarProps, DateValue, MappedDateValue} from '@react-types/calendar';
31
31
  import {CalendarState} from './types';
32
32
  import {useControlledState} from '@react-stately/utils';
33
33
  import {useMemo, useState} from 'react';
@@ -51,7 +51,6 @@ export interface CalendarStateOptions<T extends DateValue = DateValue> extends C
51
51
  /** Determines how to align the initial selection relative to the visible date range. */
52
52
  selectionAlignment?: 'start' | 'center' | 'end'
53
53
  }
54
-
55
54
  /**
56
55
  * Provides state management for a calendar component.
57
56
  * A calendar displays one or more date grids and allows users to select a single date.
@@ -71,7 +70,7 @@ export function useCalendarState<T extends DateValue = DateValue>(props: Calenda
71
70
  } = props;
72
71
  let calendar = useMemo(() => createCalendar(resolvedOptions.calendar), [createCalendar, resolvedOptions.calendar]);
73
72
 
74
- let [value, setControlledValue] = useControlledState<DateValue>(props.value, props.defaultValue, props.onChange);
73
+ let [value, setControlledValue] = useControlledState<DateValue | null, MappedDateValue<T>>(props.value!, props.defaultValue ?? null!, props.onChange);
75
74
  let calendarDateValue = useMemo(() => value ? toCalendar(toCalendarDate(value), calendar) : null, [value, calendar]);
76
75
  let timeZone = useMemo(() => value && 'timeZone' in value ? value.timeZone : resolvedOptions.timeZone, [value, resolvedOptions.timeZone]);
77
76
  let focusedCalendarDate = useMemo(() => (
@@ -138,25 +137,26 @@ export function useCalendarState<T extends DateValue = DateValue>(props: Calenda
138
137
 
139
138
  function setValue(newValue: CalendarDate | null) {
140
139
  if (!props.isDisabled && !props.isReadOnly) {
141
- if (newValue === null) {
140
+ let localValue = newValue;
141
+ if (localValue === null) {
142
142
  setControlledValue(null);
143
143
  return;
144
144
  }
145
- newValue = constrainValue(newValue, minValue, maxValue);
146
- newValue = previousAvailableDate(newValue, startDate, isDateUnavailable);
147
- if (!newValue) {
145
+ localValue = constrainValue(localValue, minValue, maxValue);
146
+ localValue = previousAvailableDate(localValue, startDate, isDateUnavailable);
147
+ if (!localValue) {
148
148
  return;
149
149
  }
150
150
 
151
151
  // The display calendar should not have any effect on the emitted value.
152
152
  // Emit dates in the same calendar as the original value, if any, otherwise gregorian.
153
- newValue = toCalendar(newValue, value?.calendar || new GregorianCalendar());
153
+ localValue = toCalendar(localValue, value?.calendar || new GregorianCalendar());
154
154
 
155
155
  // Preserve time if the input value had one.
156
156
  if (value && 'hour' in value) {
157
- setControlledValue(value.set(newValue));
157
+ setControlledValue(value.set(localValue));
158
158
  } else {
159
- setControlledValue(newValue);
159
+ setControlledValue(localValue);
160
160
  }
161
161
  }
162
162
  }
@@ -173,7 +173,7 @@ export function useCalendarState<T extends DateValue = DateValue>(props: Calenda
173
173
  return isInvalid(calendarDateValue, minValue, maxValue);
174
174
  }, [calendarDateValue, isDateUnavailable, minValue, maxValue]);
175
175
  let isValueInvalid = props.isInvalid || props.validationState === 'invalid' || isUnavailable;
176
- let validationState: ValidationState = isValueInvalid ? 'invalid' : null;
176
+ let validationState: ValidationState | null = isValueInvalid ? 'invalid' : null;
177
177
 
178
178
  let pageDuration = useMemo(() => {
179
179
  if (pageBehavior === 'visible') {
@@ -184,8 +184,8 @@ export function useCalendarState<T extends DateValue = DateValue>(props: Calenda
184
184
  }, [pageBehavior, visibleDuration]);
185
185
 
186
186
  return {
187
- isDisabled: props.isDisabled,
188
- isReadOnly: props.isReadOnly,
187
+ isDisabled: props.isDisabled ?? false,
188
+ isReadOnly: props.isReadOnly ?? false,
189
189
  value: calendarDateValue,
190
190
  setValue,
191
191
  visibleRange: {
@@ -308,25 +308,25 @@ export function useCalendarState<T extends DateValue = DateValue>(props: Calenda
308
308
  return isFocused && focusedDate && isSameDay(date, focusedDate);
309
309
  },
310
310
  isCellDisabled(date) {
311
- return props.isDisabled || date.compare(startDate) < 0 || date.compare(endDate) > 0 || this.isInvalid(date, minValue, maxValue);
311
+ return props.isDisabled || date.compare(startDate) < 0 || date.compare(endDate) > 0 || this.isInvalid(date);
312
312
  },
313
313
  isCellUnavailable(date) {
314
- return props.isDateUnavailable && props.isDateUnavailable(date);
314
+ return props.isDateUnavailable ? props.isDateUnavailable(date) : false;
315
315
  },
316
316
  isPreviousVisibleRangeInvalid() {
317
317
  let prev = startDate.subtract({days: 1});
318
- return isSameDay(prev, startDate) || this.isInvalid(prev, minValue, maxValue);
318
+ return isSameDay(prev, startDate) || this.isInvalid(prev);
319
319
  },
320
320
  isNextVisibleRangeInvalid() {
321
321
  // Adding may return the same date if we reached the end of time
322
322
  // according to the calendar system (e.g. 9999-12-31).
323
323
  let next = endDate.add({days: 1});
324
- return isSameDay(next, endDate) || this.isInvalid(next, minValue, maxValue);
324
+ return isSameDay(next, endDate) || this.isInvalid(next);
325
325
  },
326
326
  getDatesInWeek(weekIndex, from = startDate) {
327
327
  // let date = startOfWeek(from, locale);
328
328
  let date = from.add({weeks: weekIndex});
329
- let dates = [];
329
+ let dates: (CalendarDate | null)[] = [];
330
330
 
331
331
  date = startOfWeek(date, locale);
332
332
 
@@ -13,7 +13,7 @@
13
13
  import {alignCenter, constrainValue, isInvalid, previousAvailableDate} from './utils';
14
14
  import {Calendar, CalendarDate, DateDuration, GregorianCalendar, isEqualDay, maxDate, minDate, toCalendar, toCalendarDate} from '@internationalized/date';
15
15
  import {CalendarState, RangeCalendarState} from './types';
16
- import {DateRange, DateValue, RangeCalendarProps} from '@react-types/calendar';
16
+ import {DateValue, RangeCalendarProps} from '@react-types/calendar';
17
17
  import {RangeValue, ValidationState} from '@react-types/shared';
18
18
  import {useCalendarState} from './useCalendarState';
19
19
  import {useControlledState} from '@react-stately/utils';
@@ -42,13 +42,13 @@ export interface RangeCalendarStateOptions<T extends DateValue = DateValue> exte
42
42
  */
43
43
  export function useRangeCalendarState<T extends DateValue = DateValue>(props: RangeCalendarStateOptions<T>): RangeCalendarState {
44
44
  let {value: valueProp, defaultValue, onChange, createCalendar, locale, visibleDuration = {months: 1}, minValue, maxValue, ...calendarProps} = props;
45
- let [value, setValue] = useControlledState<DateRange>(
46
- valueProp,
47
- defaultValue || null,
45
+ let [value, setValue] = useControlledState<RangeValue<T> | null, RangeValue<T>>(
46
+ valueProp!,
47
+ defaultValue || null!,
48
48
  onChange
49
49
  );
50
50
 
51
- let [anchorDate, setAnchorDateState] = useState(null);
51
+ let [anchorDate, setAnchorDateState] = useState<CalendarDate | null>(null);
52
52
  let alignment: 'center' | 'start' = 'center';
53
53
  if (value && value.start && value.end) {
54
54
  let start = alignCenter(toCalendarDate(value.start), visibleDuration, locale, minValue, maxValue);
@@ -60,8 +60,8 @@ export function useRangeCalendarState<T extends DateValue = DateValue>(props: Ra
60
60
  }
61
61
 
62
62
  // Available range must be stored in a ref so we have access to the updated version immediately in `isInvalid`.
63
- let availableRangeRef = useRef<RangeValue<DateValue>>(null);
64
- let [availableRange, setAvailableRange] = useState<RangeValue<DateValue>>(null);
63
+ let availableRangeRef = useRef<Partial<RangeValue<DateValue>> | null>(null);
64
+ let [availableRange, setAvailableRange] = useState<Partial<RangeValue<DateValue>>|null>(null);
65
65
  let min = useMemo(() => maxDate(minValue, availableRange?.start), [minValue, availableRange]);
66
66
  let max = useMemo(() => minDate(maxValue, availableRange?.end), [maxValue, availableRange]);
67
67
 
@@ -78,9 +78,11 @@ export function useRangeCalendarState<T extends DateValue = DateValue>(props: Ra
78
78
 
79
79
  let updateAvailableRange = (date) => {
80
80
  if (date && props.isDateUnavailable && !props.allowsNonContiguousRanges) {
81
+ const nextAvailableStartDate = nextUnavailableDate(date, calendar, -1);
82
+ const nextAvailableEndDate = nextUnavailableDate(date, calendar, 1);
81
83
  availableRangeRef.current = {
82
- start: nextUnavailableDate(date, calendar, -1),
83
- end: nextUnavailableDate(date, calendar, 1)
84
+ start: nextAvailableStartDate,
85
+ end: nextAvailableEndDate
84
86
  };
85
87
  setAvailableRange(availableRangeRef.current);
86
88
  } else {
@@ -96,7 +98,7 @@ export function useRangeCalendarState<T extends DateValue = DateValue>(props: Ra
96
98
  setLastVisibleRange(calendar.visibleRange);
97
99
  }
98
100
 
99
- let setAnchorDate = (date: CalendarDate) => {
101
+ let setAnchorDate = (date: CalendarDate | null) => {
100
102
  if (date) {
101
103
  setAnchorDateState(date);
102
104
  updateAvailableRange(date);
@@ -112,20 +114,22 @@ export function useRangeCalendarState<T extends DateValue = DateValue>(props: Ra
112
114
  return;
113
115
  }
114
116
 
115
- date = constrainValue(date, min, max);
116
- date = previousAvailableDate(date, calendar.visibleRange.start, props.isDateUnavailable);
117
- if (!date) {
117
+ const constrainedDate = constrainValue(date, min, max);
118
+ const previousAvailableConstrainedDate = previousAvailableDate(constrainedDate, calendar.visibleRange.start, props.isDateUnavailable);
119
+ if (!previousAvailableConstrainedDate) {
118
120
  return;
119
121
  }
120
122
 
121
123
  if (!anchorDate) {
122
- setAnchorDate(date);
124
+ setAnchorDate(previousAvailableConstrainedDate);
123
125
  } else {
124
- let range = makeRange(anchorDate, date);
125
- setValue({
126
- start: convertValue(range.start, value?.start),
127
- end: convertValue(range.end, value?.end)
128
- });
126
+ let range = makeRange(anchorDate, previousAvailableConstrainedDate);
127
+ if (range) {
128
+ setValue({
129
+ start: convertValue(range.start, value?.start) as T,
130
+ end: convertValue(range.end, value?.end) as T
131
+ });
132
+ }
129
133
  setAnchorDate(null);
130
134
  }
131
135
  };
@@ -146,7 +150,7 @@ export function useRangeCalendarState<T extends DateValue = DateValue>(props: Ra
146
150
  }, [isDateUnavailable, value, anchorDate, minValue, maxValue]);
147
151
 
148
152
  let isValueInvalid = props.isInvalid || props.validationState === 'invalid' || isInvalidSelection;
149
- let validationState: ValidationState = isValueInvalid ? 'invalid' : null;
153
+ let validationState: ValidationState | null = isValueInvalid ? 'invalid' : null;
150
154
 
151
155
  return {
152
156
  ...calendar,
@@ -167,7 +171,7 @@ export function useRangeCalendarState<T extends DateValue = DateValue>(props: Ra
167
171
  }
168
172
  },
169
173
  isSelected(date) {
170
- return highlightedRange && date.compare(highlightedRange.start) >= 0 && date.compare(highlightedRange.end) <= 0 && !calendar.isCellDisabled(date) && !calendar.isCellUnavailable(date);
174
+ return Boolean(highlightedRange && date.compare(highlightedRange.start) >= 0 && date.compare(highlightedRange.end) <= 0 && !calendar.isCellDisabled(date) && !calendar.isCellUnavailable(date));
171
175
  },
172
176
  isInvalid(date) {
173
177
  return calendar.isInvalid(date) || isInvalid(date, availableRangeRef.current?.start, availableRangeRef.current?.end);
@@ -177,7 +181,7 @@ export function useRangeCalendarState<T extends DateValue = DateValue>(props: Ra
177
181
  };
178
182
  }
179
183
 
180
- function makeRange(start: DateValue, end: DateValue): RangeValue<CalendarDate> {
184
+ function makeRange(start: DateValue, end: DateValue): RangeValue<CalendarDate> | null {
181
185
  if (!start || !end) {
182
186
  return null;
183
187
  }
@@ -189,7 +193,7 @@ function makeRange(start: DateValue, end: DateValue): RangeValue<CalendarDate> {
189
193
  return {start: toCalendarDate(start), end: toCalendarDate(end)};
190
194
  }
191
195
 
192
- function convertValue(newValue: CalendarDate, oldValue: DateValue) {
196
+ function convertValue(newValue: CalendarDate, oldValue?: DateValue): DateValue {
193
197
  // The display calendar should not have any effect on the emitted value.
194
198
  // Emit dates in the same calendar as the original value, if any, otherwise gregorian.
195
199
  newValue = toCalendar(newValue, oldValue?.calendar || new GregorianCalendar());
@@ -202,7 +206,7 @@ function convertValue(newValue: CalendarDate, oldValue: DateValue) {
202
206
  return newValue;
203
207
  }
204
208
 
205
- function nextUnavailableDate(anchorDate: CalendarDate, state: CalendarState, dir: number) {
209
+ function nextUnavailableDate(anchorDate: CalendarDate, state: CalendarState, dir: number): CalendarDate | undefined {
206
210
  let nextDate = anchorDate.add({days: dir});
207
211
  while (
208
212
  (dir < 0 ? nextDate.compare(state.visibleRange.start) >= 0 : nextDate.compare(state.visibleRange.end) <= 0) &&
@@ -215,5 +219,4 @@ function nextUnavailableDate(anchorDate: CalendarDate, state: CalendarState, dir
215
219
  return nextDate.add({days: -dir});
216
220
  }
217
221
 
218
- return null;
219
222
  }
package/src/utils.ts CHANGED
@@ -21,12 +21,12 @@ import {
21
21
  } from '@internationalized/date';
22
22
  import {DateValue} from '@react-types/calendar';
23
23
 
24
- export function isInvalid(date: DateValue, minValue: DateValue, maxValue: DateValue) {
24
+ export function isInvalid(date: DateValue, minValue?: DateValue | null, maxValue?: DateValue | null) {
25
25
  return (minValue != null && date.compare(minValue) < 0) ||
26
26
  (maxValue != null && date.compare(maxValue) > 0);
27
27
  }
28
28
 
29
- export function alignCenter(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue, maxValue?: DateValue) {
29
+ export function alignCenter(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue | null, maxValue?: DateValue | null) {
30
30
  let halfDuration: DateDuration = {};
31
31
  for (let key in duration) {
32
32
  halfDuration[key] = Math.floor(duration[key] / 2);
@@ -39,7 +39,7 @@ export function alignCenter(date: CalendarDate, duration: DateDuration, locale:
39
39
  return constrainStart(date, aligned, duration, locale, minValue, maxValue);
40
40
  }
41
41
 
42
- export function alignStart(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue, maxValue?: DateValue) {
42
+ export function alignStart(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue | null, maxValue?: DateValue | null) {
43
43
  // align to the start of the largest unit
44
44
  let aligned = date;
45
45
  if (duration.years) {
@@ -53,16 +53,16 @@ export function alignStart(date: CalendarDate, duration: DateDuration, locale: s
53
53
  return constrainStart(date, aligned, duration, locale, minValue, maxValue);
54
54
  }
55
55
 
56
- export function alignEnd(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue, maxValue?: DateValue) {
56
+ export function alignEnd(date: CalendarDate, duration: DateDuration, locale: string, minValue?: DateValue | null, maxValue?: DateValue | null) {
57
57
  let d = {...duration};
58
58
  // subtract 1 from the smallest unit
59
- if (duration.days) {
59
+ if (d.days) {
60
60
  d.days--;
61
- } else if (duration.weeks) {
61
+ } else if (d.weeks) {
62
62
  d.weeks--;
63
- } else if (duration.months) {
63
+ } else if (d.months) {
64
64
  d.months--;
65
- } else if (duration.years) {
65
+ } else if (d.years) {
66
66
  d.years--;
67
67
  }
68
68
 
@@ -75,38 +75,50 @@ export function constrainStart(
75
75
  aligned: CalendarDate,
76
76
  duration: DateDuration,
77
77
  locale: string,
78
- minValue: DateValue,
79
- maxValue: DateValue) {
78
+ minValue?: DateValue | null,
79
+ maxValue?: DateValue | null) {
80
80
  if (minValue && date.compare(minValue) >= 0) {
81
- aligned = maxDate(
81
+ let newDate = maxDate(
82
82
  aligned,
83
83
  alignStart(toCalendarDate(minValue), duration, locale)
84
84
  );
85
+ if (newDate) {
86
+ aligned = newDate;
87
+ }
85
88
  }
86
89
 
87
90
  if (maxValue && date.compare(maxValue) <= 0) {
88
- aligned = minDate(
91
+ let newDate = minDate(
89
92
  aligned,
90
93
  alignEnd(toCalendarDate(maxValue), duration, locale)
91
94
  );
95
+ if (newDate) {
96
+ aligned = newDate;
97
+ }
92
98
  }
93
99
 
94
100
  return aligned;
95
101
  }
96
102
 
97
- export function constrainValue(date: CalendarDate, minValue: DateValue, maxValue: DateValue) {
103
+ export function constrainValue(date: CalendarDate, minValue?: DateValue | null, maxValue?: DateValue | null) {
98
104
  if (minValue) {
99
- date = maxDate(date, toCalendarDate(minValue));
105
+ let newDate = maxDate(date, toCalendarDate(minValue));
106
+ if (newDate) {
107
+ date = newDate;
108
+ }
100
109
  }
101
110
 
102
111
  if (maxValue) {
103
- date = minDate(date, toCalendarDate(maxValue));
112
+ let newDate = minDate(date, toCalendarDate(maxValue));
113
+ if (newDate) {
114
+ date = newDate;
115
+ }
104
116
  }
105
117
 
106
118
  return date;
107
119
  }
108
120
 
109
- export function previousAvailableDate(date: CalendarDate, minValue: DateValue, isDateUnavailable: (date: CalendarDate) => boolean) {
121
+ export function previousAvailableDate(date: CalendarDate, minValue: DateValue, isDateUnavailable?: (date: CalendarDate) => boolean): CalendarDate | null {
110
122
  if (!isDateUnavailable) {
111
123
  return date;
112
124
  }
@@ -118,4 +130,5 @@ export function previousAvailableDate(date: CalendarDate, minValue: DateValue, i
118
130
  if (date.compare(minValue) >= 0) {
119
131
  return date;
120
132
  }
133
+ return null;
121
134
  }