@primer/components 0.0.0-2021929153151 → 0.0.0-202192923313

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.
Files changed (186) hide show
  1. package/CHANGELOG.md +1 -25
  2. package/dist/browser.esm.js +49 -53
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +46 -50
  5. package/dist/browser.umd.js.map +1 -1
  6. package/lib/ActionList/Item.d.ts +0 -6
  7. package/lib/ActionList/Item.js +1 -5
  8. package/lib/AnchoredOverlay/AnchoredOverlay.d.ts +4 -2
  9. package/lib/Autocomplete/Autocomplete.d.ts +32 -30
  10. package/lib/Autocomplete/AutocompleteInput.d.ts +32 -30
  11. package/lib/Button/Button.d.ts +27 -27
  12. package/lib/Button/ButtonBase.d.ts +1 -1
  13. package/lib/Button/ButtonClose.d.ts +45 -45
  14. package/lib/Button/ButtonDanger.d.ts +27 -27
  15. package/lib/Button/ButtonInvisible.d.ts +27 -27
  16. package/lib/Button/ButtonOutline.d.ts +27 -27
  17. package/lib/Button/ButtonPrimary.d.ts +27 -27
  18. package/lib/CircleBadge.d.ts +2 -2
  19. package/lib/CircleOcticon.d.ts +43 -43
  20. package/lib/DatePicker/DatePicker.d.ts +48 -0
  21. package/lib/DatePicker/DatePicker.js +106 -0
  22. package/lib/DatePicker/DatePickerAnchor.d.ts +5 -0
  23. package/lib/DatePicker/DatePickerAnchor.js +223 -0
  24. package/lib/DatePicker/DatePickerOverlay.d.ts +3 -0
  25. package/lib/DatePicker/DatePickerOverlay.js +48 -0
  26. package/lib/DatePicker/DatePickerPanel.d.ts +2 -0
  27. package/lib/DatePicker/DatePickerPanel.js +126 -0
  28. package/lib/DatePicker/Day.d.ts +14 -0
  29. package/lib/DatePicker/Day.js +192 -0
  30. package/lib/DatePicker/Month.d.ts +9 -0
  31. package/lib/DatePicker/Month.js +122 -0
  32. package/lib/DatePicker/dateParser.d.ts +11 -0
  33. package/lib/DatePicker/dateParser.js +192 -0
  34. package/lib/DatePicker/index.d.ts +2 -0
  35. package/lib/DatePicker/index.js +13 -0
  36. package/lib/DatePicker/useDatePicker.d.ts +89 -0
  37. package/lib/DatePicker/useDatePicker.js +439 -0
  38. package/lib/Dialog.d.ts +46 -46
  39. package/lib/Dropdown.d.ts +178 -178
  40. package/lib/DropdownMenu/DropdownButton.d.ts +47 -47
  41. package/lib/FilterList.d.ts +42 -42
  42. package/lib/Flash.d.ts +1 -1
  43. package/lib/Label.d.ts +1 -1
  44. package/lib/Position.d.ts +4 -4
  45. package/lib/ProgressBar.d.ts +1 -1
  46. package/lib/SelectMenu/SelectMenu.d.ts +248 -246
  47. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  48. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  49. package/lib/TextInputWithTokens.d.ts +32 -34
  50. package/lib/TextInputWithTokens.js +29 -102
  51. package/lib/Timeline.d.ts +44 -44
  52. package/lib/Token/AvatarToken.d.ts +1 -1
  53. package/lib/Token/IssueLabelToken.d.ts +1 -1
  54. package/lib/Token/Token.d.ts +1 -1
  55. package/lib/Token/Token.js +2 -13
  56. package/lib/Token/TokenBase.js +4 -0
  57. package/lib/Token/_RemoveTokenButton.js +2 -15
  58. package/lib/_TextInputWrapper.d.ts +1 -1
  59. package/lib/_TextInputWrapper.js +1 -1
  60. package/lib/hooks/useDebounce.d.ts +2 -0
  61. package/lib/hooks/useDebounce.js +24 -0
  62. package/lib/sx.d.ts +2 -10
  63. package/lib/sx.js +0 -8
  64. package/lib/theme-preval.js +2 -2
  65. package/lib/theme.d.ts +0 -78
  66. package/lib/theme.js +1 -3
  67. package/lib/utils/testing.d.ts +1 -1
  68. package/lib-esm/ActionList/Item.d.ts +0 -6
  69. package/lib-esm/ActionList/Item.js +1 -5
  70. package/lib-esm/AnchoredOverlay/AnchoredOverlay.d.ts +4 -2
  71. package/lib-esm/Autocomplete/Autocomplete.d.ts +32 -30
  72. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +32 -30
  73. package/lib-esm/Button/Button.d.ts +27 -27
  74. package/lib-esm/Button/ButtonBase.d.ts +1 -1
  75. package/lib-esm/Button/ButtonClose.d.ts +45 -45
  76. package/lib-esm/Button/ButtonDanger.d.ts +27 -27
  77. package/lib-esm/Button/ButtonInvisible.d.ts +27 -27
  78. package/lib-esm/Button/ButtonOutline.d.ts +27 -27
  79. package/lib-esm/Button/ButtonPrimary.d.ts +27 -27
  80. package/lib-esm/CircleBadge.d.ts +2 -2
  81. package/lib-esm/CircleOcticon.d.ts +43 -43
  82. package/lib-esm/DatePicker/DatePicker.d.ts +48 -0
  83. package/lib-esm/DatePicker/DatePicker.js +89 -0
  84. package/lib-esm/DatePicker/DatePickerAnchor.d.ts +5 -0
  85. package/lib-esm/DatePicker/DatePickerAnchor.js +196 -0
  86. package/lib-esm/DatePicker/DatePickerOverlay.d.ts +3 -0
  87. package/lib-esm/DatePicker/DatePickerOverlay.js +29 -0
  88. package/lib-esm/DatePicker/DatePickerPanel.d.ts +2 -0
  89. package/lib-esm/DatePicker/DatePickerPanel.js +100 -0
  90. package/lib-esm/DatePicker/Day.d.ts +14 -0
  91. package/lib-esm/DatePicker/Day.js +169 -0
  92. package/lib-esm/DatePicker/Month.d.ts +9 -0
  93. package/lib-esm/DatePicker/Month.js +98 -0
  94. package/lib-esm/DatePicker/dateParser.d.ts +11 -0
  95. package/lib-esm/DatePicker/dateParser.js +178 -0
  96. package/lib-esm/DatePicker/index.d.ts +2 -0
  97. package/lib-esm/DatePicker/index.js +1 -0
  98. package/lib-esm/DatePicker/useDatePicker.d.ts +89 -0
  99. package/lib-esm/DatePicker/useDatePicker.js +408 -0
  100. package/lib-esm/Dialog.d.ts +46 -46
  101. package/lib-esm/Dropdown.d.ts +178 -178
  102. package/lib-esm/DropdownMenu/DropdownButton.d.ts +47 -47
  103. package/lib-esm/FilterList.d.ts +42 -42
  104. package/lib-esm/Flash.d.ts +1 -1
  105. package/lib-esm/Label.d.ts +1 -1
  106. package/lib-esm/Position.d.ts +4 -4
  107. package/lib-esm/ProgressBar.d.ts +1 -1
  108. package/lib-esm/SelectMenu/SelectMenu.d.ts +248 -246
  109. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  110. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  111. package/lib-esm/TextInputWithTokens.d.ts +32 -34
  112. package/lib-esm/TextInputWithTokens.js +30 -101
  113. package/lib-esm/Timeline.d.ts +44 -44
  114. package/lib-esm/Token/AvatarToken.d.ts +1 -1
  115. package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
  116. package/lib-esm/Token/Token.d.ts +1 -1
  117. package/lib-esm/Token/Token.js +2 -13
  118. package/lib-esm/Token/TokenBase.js +4 -0
  119. package/lib-esm/Token/_RemoveTokenButton.js +2 -11
  120. package/lib-esm/_TextInputWrapper.d.ts +1 -1
  121. package/lib-esm/_TextInputWrapper.js +1 -1
  122. package/lib-esm/hooks/useDebounce.d.ts +2 -0
  123. package/lib-esm/hooks/useDebounce.js +16 -0
  124. package/lib-esm/sx.d.ts +2 -10
  125. package/lib-esm/sx.js +1 -3
  126. package/lib-esm/theme-preval.js +2 -2
  127. package/lib-esm/theme.d.ts +0 -78
  128. package/lib-esm/theme.js +1 -2
  129. package/lib-esm/utils/testing.d.ts +1 -1
  130. package/package.json +14 -16
  131. package/lib/ActionList2/Description.d.ts +0 -6
  132. package/lib/ActionList2/Description.js +0 -53
  133. package/lib/ActionList2/Divider.d.ts +0 -5
  134. package/lib/ActionList2/Divider.js +0 -33
  135. package/lib/ActionList2/Group.d.ts +0 -11
  136. package/lib/ActionList2/Group.js +0 -55
  137. package/lib/ActionList2/Header.d.ts +0 -26
  138. package/lib/ActionList2/Header.js +0 -55
  139. package/lib/ActionList2/Item.d.ts +0 -48
  140. package/lib/ActionList2/Item.js +0 -204
  141. package/lib/ActionList2/List.d.ts +0 -26
  142. package/lib/ActionList2/List.js +0 -56
  143. package/lib/ActionList2/Selection.d.ts +0 -5
  144. package/lib/ActionList2/Selection.js +0 -73
  145. package/lib/ActionList2/Visuals.d.ts +0 -11
  146. package/lib/ActionList2/Visuals.js +0 -90
  147. package/lib/ActionList2/hacks.d.ts +0 -30
  148. package/lib/ActionList2/hacks.js +0 -38
  149. package/lib/ActionList2/index.d.ts +0 -28
  150. package/lib/ActionList2/index.js +0 -42
  151. package/lib/experiments.d.ts +0 -1
  152. package/lib/experiments.js +0 -18
  153. package/lib/utils/create-slots.d.ts +0 -17
  154. package/lib/utils/create-slots.js +0 -105
  155. package/lib/utils/types/KeyPaths.d.ts +0 -3
  156. package/lib/utils/types/KeyPaths.js +0 -1
  157. package/lib/utils/use-force-update.d.ts +0 -1
  158. package/lib/utils/use-force-update.js +0 -19
  159. package/lib-esm/ActionList2/Description.d.ts +0 -6
  160. package/lib-esm/ActionList2/Description.js +0 -37
  161. package/lib-esm/ActionList2/Divider.d.ts +0 -5
  162. package/lib-esm/ActionList2/Divider.js +0 -21
  163. package/lib-esm/ActionList2/Group.d.ts +0 -11
  164. package/lib-esm/ActionList2/Group.js +0 -38
  165. package/lib-esm/ActionList2/Header.d.ts +0 -26
  166. package/lib-esm/ActionList2/Header.js +0 -45
  167. package/lib-esm/ActionList2/Item.d.ts +0 -48
  168. package/lib-esm/ActionList2/Item.js +0 -176
  169. package/lib-esm/ActionList2/List.d.ts +0 -26
  170. package/lib-esm/ActionList2/List.js +0 -38
  171. package/lib-esm/ActionList2/Selection.d.ts +0 -5
  172. package/lib-esm/ActionList2/Selection.js +0 -55
  173. package/lib-esm/ActionList2/Visuals.d.ts +0 -11
  174. package/lib-esm/ActionList2/Visuals.js +0 -68
  175. package/lib-esm/ActionList2/hacks.d.ts +0 -30
  176. package/lib-esm/ActionList2/hacks.js +0 -30
  177. package/lib-esm/ActionList2/index.d.ts +0 -28
  178. package/lib-esm/ActionList2/index.js +0 -29
  179. package/lib-esm/experiments.d.ts +0 -1
  180. package/lib-esm/experiments.js +0 -2
  181. package/lib-esm/utils/create-slots.d.ts +0 -17
  182. package/lib-esm/utils/create-slots.js +0 -84
  183. package/lib-esm/utils/types/KeyPaths.d.ts +0 -3
  184. package/lib-esm/utils/types/KeyPaths.js +0 -1
  185. package/lib-esm/utils/use-force-update.d.ts +0 -1
  186. package/lib-esm/utils/use-force-update.js +0 -6
@@ -0,0 +1,439 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isSingleSelection = isSingleSelection;
7
+ exports.isMultiSelection = isMultiSelection;
8
+ exports.isRangeSelection = isRangeSelection;
9
+ exports.isStringRangeSelection = isStringRangeSelection;
10
+ exports.DatePickerProvider = exports.default = void 0;
11
+
12
+ var _octiconsReact = require("@primer/octicons-react");
13
+
14
+ var _dateFns = require("date-fns");
15
+
16
+ var _deepmerge = _interopRequireDefault(require("deepmerge"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _ = require("..");
21
+
22
+ var _dateParser = require("./dateParser");
23
+
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ const DatePickerContext = /*#__PURE__*/(0, _react.createContext)(null);
31
+
32
+ const useDatePicker = date => {
33
+ const value = (0, _react.useContext)(DatePickerContext);
34
+ const [selected, setSelected] = (0, _react.useState)(false);
35
+ const today = date ? (0, _dateFns.isToday)(date) : false;
36
+
37
+ if (!value) {
38
+ throw new Error('useDatePicker must be used inside a DatePickerProvider');
39
+ }
40
+
41
+ (0, _react.useEffect)(() => {
42
+ if (date) {
43
+ if (value.hoverRange) {
44
+ if (isRangeSelection(value.hoverRange)) {
45
+ if ((0, _dateFns.isEqual)(date, value.hoverRange.from)) {
46
+ setSelected('start');
47
+ } else if (value.hoverRange.to && (0, _dateFns.isEqual)(date, value.hoverRange.to)) {
48
+ setSelected('end');
49
+ } else if ((0, _dateFns.isAfter)(date, value.hoverRange.from) && value.hoverRange.to && (0, _dateFns.isBefore)(date, value.hoverRange.to)) {
50
+ setSelected('middle');
51
+ } else {
52
+ setSelected(false);
53
+ }
54
+ }
55
+ } else if (value.selection) {
56
+ if (isMultiSelection(value.selection)) {
57
+ setSelected(!!value.selection.find(d => (0, _dateFns.isEqual)(d, date)));
58
+ } else if (isRangeSelection(value.selection)) {
59
+ if ((0, _dateFns.isEqual)(date, value.selection.from)) {
60
+ setSelected('start');
61
+ } else if (value.selection.to && (0, _dateFns.isEqual)(date, value.selection.to)) {
62
+ setSelected('end');
63
+ } else if ((0, _dateFns.isAfter)(date, value.selection.from) && value.selection.to && (0, _dateFns.isBefore)(date, value.selection.to)) {
64
+ setSelected('middle');
65
+ } else {
66
+ setSelected(false);
67
+ }
68
+ } else {
69
+ setSelected((0, _dateFns.isEqual)(date, value.selection));
70
+ }
71
+ }
72
+ }
73
+ }, [date, value.hoverRange, value.selection, today]);
74
+ let blocked,
75
+ disabled = false;
76
+
77
+ if (date) {
78
+ // Determine if date is blocked out
79
+ if (value.configuration.blockedDates) {
80
+ blocked = !!value.configuration.blockedDates.find(d => (0, _dateFns.isEqual)(d, date));
81
+ } // Determine if date is disabled
82
+
83
+
84
+ if (value.configuration.minDate || value.configuration.maxDate || value.configuration.disableWeekends) {
85
+ disabled = (value.configuration.minDate ? (0, _dateFns.isBefore)(date, value.configuration.minDate) : false) || (value.configuration.maxDate ? (0, _dateFns.isAfter)(date, value.configuration.maxDate) : false) || (value.configuration.disableWeekends ? (0, _dateFns.isWeekend)(date) : false);
86
+ }
87
+ }
88
+
89
+ return { ...value,
90
+ blocked,
91
+ disabled,
92
+ selected,
93
+ today
94
+ };
95
+ };
96
+
97
+ var _default = useDatePicker;
98
+ exports.default = _default;
99
+
100
+ function isSingleSelection(selection) {
101
+ return selection instanceof Date;
102
+ }
103
+
104
+ function isMultiSelection(selection) {
105
+ return Array.isArray(selection);
106
+ }
107
+
108
+ function isRangeSelection(selection) {
109
+ return !!selection.from;
110
+ }
111
+
112
+ function isStringRangeSelection(selection) {
113
+ return !!selection.from;
114
+ }
115
+
116
+ function parseSelection(selection, variant) {
117
+ if (!selection) return;
118
+
119
+ if (variant === 'multi') {
120
+ if (isMultiSelection(selection)) {
121
+ const parsedSelection = [];
122
+
123
+ for (const d of selection) {
124
+ parsedSelection.push(new Date(new Date(d).toDateString()));
125
+ }
126
+
127
+ return parsedSelection.sort((a, b) => a.getTime() - b.getTime());
128
+ } else if (selection instanceof Date) {
129
+ return [new Date(new Date(selection).toDateString())];
130
+ } else if (isRangeSelection(selection)) {
131
+ const parsedSelection = [];
132
+ parsedSelection.push(new Date(new Date(selection.from).toDateString()));
133
+
134
+ if (selection.to) {
135
+ parsedSelection.push(new Date(new Date(selection.to).toDateString()));
136
+ }
137
+
138
+ return parsedSelection.sort((a, b) => a.getTime() - b.getTime());
139
+ }
140
+ } else if (variant === 'range') {
141
+ if (isRangeSelection(selection)) {
142
+ return {
143
+ from: new Date(new Date(selection.from).toDateString()),
144
+ to: selection.to ? new Date(new Date(selection.to).toDateString()) : null
145
+ };
146
+ } else if (isMultiSelection(selection)) {
147
+ return {
148
+ from: new Date(new Date(selection[0]).toDateString()),
149
+ to: selection[1] ? new Date(new Date(selection[1]).toDateString()) : null
150
+ };
151
+ } else if (selection instanceof Date) {
152
+ return {
153
+ from: new Date(new Date(selection).toDateString()),
154
+ to: null
155
+ };
156
+ }
157
+ } else {
158
+ if (selection instanceof Date) {
159
+ return new Date(new Date(selection).toDateString());
160
+ } else if (isMultiSelection(selection)) {
161
+ return new Date(new Date(selection[0]).toDateString());
162
+ } else if (isRangeSelection(selection)) {
163
+ return new Date(new Date(selection.from).toDateString());
164
+ } else {
165
+ return;
166
+ }
167
+ }
168
+ }
169
+
170
+ const defaultConfiguration = {
171
+ anchorVariant: 'button',
172
+ confirmation: false,
173
+ confirmUnsavedClose: false,
174
+ disableWeekends: false,
175
+ iconPlacement: 'start',
176
+ placeholder: 'Select a Date...',
177
+ showInputPrompt: false,
178
+ variant: 'single',
179
+ view: '2-month',
180
+ weekStartsOn: 'Sunday'
181
+ };
182
+
183
+ const DatePickerProvider = ({
184
+ configuration: externalConfig = {},
185
+ children,
186
+ closePicker,
187
+ value
188
+ }) => {
189
+ const [configuration, setConfiguration] = (0, _react.useState)((0, _deepmerge.default)(defaultConfiguration, externalConfig));
190
+ const [previousSelection, setPreviousSelection] = (0, _react.useState)(parseSelection(value, configuration.variant));
191
+ const [isDirty, setIsDirty] = (0, _react.useState)(false);
192
+ const [selection, setSelection] = (0, _react.useState)(parseSelection(value, configuration.variant));
193
+ const [hoverRange, setHoverRange] = (0, _react.useState)(null);
194
+ const [currentViewingDate, setCurrentViewingDate] = (0, _react.useState)(new Date());
195
+ const confirm = (0, _.useConfirm)();
196
+ (0, _react.useEffect)(() => {
197
+ setConfiguration((0, _deepmerge.default)(defaultConfiguration, externalConfig));
198
+ setSelection(parseSelection(selection, configuration.variant)); // Don't want this to run every time selection gets updated
199
+ // eslint-disable-next-line react-hooks/exhaustive-deps
200
+ }, [configuration.variant, externalConfig]);
201
+ const goToMonth = (0, _react.useCallback)(date => {
202
+ setCurrentViewingDate(new Date(new Date(date).toDateString()));
203
+ }, []);
204
+ const nextMonth = (0, _react.useCallback)(() => {
205
+ setCurrentViewingDate((0, _dateFns.addMonths)(currentViewingDate, 1));
206
+ }, [currentViewingDate]);
207
+ const previousMonth = (0, _react.useCallback)(() => {
208
+ setCurrentViewingDate((0, _dateFns.subMonths)(currentViewingDate, 1));
209
+ }, [currentViewingDate]);
210
+ const getFormattedDate = (0, _react.useMemo)(() => {
211
+ const {
212
+ anchorVariant,
213
+ dateFormat,
214
+ placeholder,
215
+ variant
216
+ } = configuration;
217
+ return (0, _dateParser.formatDate)({
218
+ selection,
219
+ anchorVariant,
220
+ dateFormat,
221
+ placeholder,
222
+ variant
223
+ });
224
+ }, [configuration, selection]);
225
+ const saveValue = (0, _react.useCallback)(updatedSelection => {
226
+ setPreviousSelection(updatedSelection !== null && updatedSelection !== void 0 ? updatedSelection : selection);
227
+ setIsDirty(false);
228
+ closePicker === null || closePicker === void 0 ? void 0 : closePicker();
229
+ }, [closePicker, selection]);
230
+ const revertValue = (0, _react.useCallback)(() => {
231
+ setSelection(previousSelection);
232
+ setIsDirty(false);
233
+ }, [previousSelection]);
234
+ const handleClose = (0, _react.useCallback)(async () => {
235
+ if (configuration.confirmUnsavedClose) {
236
+ if (isDirty) {
237
+ const result = await confirm({
238
+ title: 'Save Changes?',
239
+ content: 'You have unsaved changes, would you like to save them?',
240
+ confirmButtonContent: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_octiconsReact.CheckIcon, null), /*#__PURE__*/_react.default.createElement(_.Text, {
241
+ sx: {
242
+ ml: 1
243
+ }
244
+ }, "Save")),
245
+ cancelButtonContent: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_octiconsReact.TrashIcon, null), /*#__PURE__*/_react.default.createElement(_.Text, {
246
+ sx: {
247
+ ml: 1
248
+ }
249
+ }, "Discard"))
250
+ });
251
+
252
+ if (result) {
253
+ saveValue();
254
+ } else {
255
+ revertValue();
256
+ }
257
+ }
258
+ } else if (isDirty) revertValue();
259
+ }, [configuration.confirmUnsavedClose, confirm, isDirty, revertValue, saveValue]);
260
+ const inputHandler = (0, _react.useCallback)(updatedSelection => {
261
+ if (!updatedSelection) return;
262
+ const {
263
+ maxDate,
264
+ minDate,
265
+ variant,
266
+ maxSelections,
267
+ maxRangeSize
268
+ } = configuration;
269
+
270
+ switch (variant) {
271
+ case 'single':
272
+ {
273
+ if (updatedSelection instanceof Date) {
274
+ if (maxDate && (0, _dateFns.isAfter)(updatedSelection, maxDate)) {
275
+ setSelection(maxDate);
276
+ } else if (minDate && (0, _dateFns.isBefore)(minDate, updatedSelection)) {
277
+ setSelection(minDate);
278
+ } else {
279
+ setSelection(updatedSelection);
280
+ }
281
+ }
282
+
283
+ break;
284
+ }
285
+
286
+ case 'multi':
287
+ {
288
+ if (Array.isArray(updatedSelection)) {
289
+ let validSelections = updatedSelection.filter(d => (maxDate ? (0, _dateFns.isBefore)(d, maxDate) : true) && (minDate ? (0, _dateFns.isAfter)(d, minDate) : true));
290
+
291
+ if (maxSelections) {
292
+ validSelections = validSelections.slice(0, maxSelections);
293
+ }
294
+
295
+ setSelection(validSelections);
296
+ }
297
+
298
+ break;
299
+ }
300
+
301
+ case 'range':
302
+ {
303
+ if (isRangeSelection(updatedSelection)) {
304
+ const validRange = updatedSelection;
305
+
306
+ if (minDate) {
307
+ validRange.from = (0, _dateFns.isAfter)(updatedSelection.from, minDate) ? updatedSelection.from : minDate;
308
+
309
+ if (updatedSelection.to) {
310
+ validRange.to = (0, _dateFns.isAfter)(updatedSelection.to, minDate) ? updatedSelection.to : minDate;
311
+ }
312
+ }
313
+
314
+ if (maxDate) {
315
+ validRange.from = (0, _dateFns.isBefore)(updatedSelection.from, maxDate) ? updatedSelection.from : maxDate;
316
+
317
+ if (updatedSelection.to) {
318
+ validRange.to = (0, _dateFns.isBefore)(updatedSelection.to, maxDate) ? updatedSelection.to : maxDate;
319
+ }
320
+ }
321
+
322
+ if (maxRangeSize && validRange.to && Math.abs((0, _dateFns.differenceInDays)(validRange.from, validRange.to)) >= maxRangeSize) {
323
+ validRange.to = (0, _dateFns.addDays)(validRange.from, maxRangeSize - 1);
324
+ }
325
+
326
+ setSelection(updatedSelection);
327
+ }
328
+
329
+ break;
330
+ }
331
+ }
332
+ }, [configuration]);
333
+ const selectionHandler = (0, _react.useCallback)(date => {
334
+ setIsDirty(true);
335
+
336
+ if (configuration.variant === 'multi') {
337
+ const selections = [...selection];
338
+ const existingIndex = selections.findIndex(s => (0, _dateFns.isEqual)(s, date));
339
+
340
+ if (existingIndex > -1) {
341
+ selections.splice(existingIndex, 1);
342
+ setSelection(selections.sort((a, b) => a.getTime() - b.getTime()));
343
+ } else {
344
+ if (configuration.maxSelections && selections.length + 1 > configuration.maxSelections) return;
345
+ setSelection([...selections, date].sort((a, b) => a.getTime() - b.getTime()));
346
+ }
347
+ } else if (configuration.variant === 'range') {
348
+ if (selection && isRangeSelection(selection) && !selection.to) {
349
+ let toDate = date;
350
+
351
+ if (configuration.maxRangeSize && Math.abs((0, _dateFns.differenceInDays)(selection.from, date)) >= configuration.maxRangeSize) {
352
+ toDate = (0, _dateFns.isBefore)(date, selection.from) ? (0, _dateFns.subDays)(selection.from, configuration.maxRangeSize - 1) : (0, _dateFns.addDays)(selection.from, configuration.maxRangeSize - 1);
353
+ }
354
+
355
+ const updatedSelection = (0, _dateFns.isBefore)(toDate, selection.from) ? {
356
+ from: toDate,
357
+ to: selection.from
358
+ } : {
359
+ from: selection.from,
360
+ to: toDate
361
+ };
362
+ setSelection(updatedSelection);
363
+ setHoverRange(null);
364
+
365
+ if (!configuration.confirmation) {
366
+ saveValue(updatedSelection);
367
+ }
368
+ } else {
369
+ setHoverRange({
370
+ from: date,
371
+ to: date
372
+ });
373
+ setSelection({
374
+ from: date,
375
+ to: null
376
+ });
377
+ }
378
+ } else {
379
+ setSelection(date);
380
+
381
+ if (!configuration.confirmation) {
382
+ saveValue(date);
383
+ }
384
+ }
385
+ }, [configuration.confirmation, configuration.maxRangeSize, configuration.maxSelections, configuration.variant, saveValue, selection]);
386
+ const focusHnadler = (0, _react.useCallback)(date => {
387
+ if (!selection) return;
388
+ const {
389
+ minDate,
390
+ maxDate,
391
+ maxRangeSize,
392
+ variant
393
+ } = configuration;
394
+
395
+ if (variant === 'range' && isRangeSelection(selection) && hoverRange) {
396
+ let hoverDate = date;
397
+ if (minDate) hoverDate = (0, _dateFns.isBefore)(date, minDate) ? minDate : hoverDate;
398
+ if (maxDate) hoverDate = (0, _dateFns.isAfter)(date, maxDate) ? maxDate : hoverDate;
399
+
400
+ if (maxRangeSize && Math.abs((0, _dateFns.differenceInDays)(selection.from, hoverDate)) >= maxRangeSize) {
401
+ hoverDate = (0, _dateFns.isBefore)(hoverDate, selection.from) ? (0, _dateFns.subDays)(selection.from, configuration.maxRangeSize - 1) : (0, _dateFns.addDays)(selection.from, configuration.maxRangeSize - 1);
402
+ }
403
+
404
+ setHoverRange((0, _dateFns.isBefore)(hoverDate, selection.from) ? {
405
+ from: hoverDate,
406
+ to: selection.from
407
+ } : {
408
+ from: selection.from,
409
+ to: hoverDate
410
+ });
411
+ }
412
+ }, [configuration, hoverRange, selection]);
413
+ const datePickerCtx = (0, _react.useMemo)(() => {
414
+ return {
415
+ configuration,
416
+ currentViewingDate,
417
+ disabled: false,
418
+ formattedDate: getFormattedDate,
419
+ goToMonth,
420
+ hoverRange,
421
+ nextMonth,
422
+ onClose: handleClose,
423
+ onDateInput: inputHandler,
424
+ onDayFocus: focusHnadler,
425
+ onSelection: selectionHandler,
426
+ previousMonth,
427
+ revertValue,
428
+ saveValue,
429
+ selectionActive: false,
430
+ selection
431
+ };
432
+ }, [configuration, currentViewingDate, focusHnadler, getFormattedDate, goToMonth, handleClose, hoverRange, inputHandler, nextMonth, previousMonth, revertValue, saveValue, selection, selectionHandler]);
433
+ return /*#__PURE__*/_react.default.createElement(DatePickerContext.Provider, {
434
+ value: datePickerCtx
435
+ }, children);
436
+ };
437
+
438
+ exports.DatePickerProvider = DatePickerProvider;
439
+ DatePickerProvider.displayName = "DatePickerProvider";