@mui/x-date-pickers 8.0.0-beta.0 → 8.0.0-beta.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.
Files changed (237) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/DateCalendar/DateCalendar.js +4 -8
  3. package/DateCalendar/DayCalendar.d.ts +3 -7
  4. package/DateCalendar/DayCalendar.js +18 -10
  5. package/DateCalendar/index.d.ts +0 -1
  6. package/DateField/useDateField.d.ts +1 -1
  7. package/DateField/useDateField.js +2 -16
  8. package/DatePicker/DatePicker.js +1 -0
  9. package/DatePicker/shared.js +3 -9
  10. package/DateTimeField/useDateTimeField.d.ts +1 -1
  11. package/DateTimeField/useDateTimeField.js +2 -16
  12. package/DateTimePicker/DateTimePicker.js +1 -0
  13. package/DateTimePicker/shared.js +3 -13
  14. package/DesktopDatePicker/DesktopDatePicker.js +1 -0
  15. package/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  16. package/DesktopTimePicker/DesktopTimePicker.js +1 -0
  17. package/MobileDatePicker/MobileDatePicker.js +1 -0
  18. package/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  19. package/MobileTimePicker/MobileTimePicker.js +1 -0
  20. package/MonthCalendar/MonthCalendar.js +4 -9
  21. package/PickersDay/PickersDay.d.ts +1 -72
  22. package/PickersDay/PickersDay.js +30 -28
  23. package/PickersDay/PickersDay.types.d.ts +114 -0
  24. package/PickersDay/PickersDay.types.js +5 -0
  25. package/PickersDay/index.d.ts +1 -1
  26. package/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  27. package/PickersDay/usePickerDayOwnerState.js +40 -0
  28. package/PickersSectionList/PickersSectionList.d.ts +1 -1
  29. package/PickersSectionList/PickersSectionList.types.d.ts +2 -6
  30. package/TimeField/useTimeField.d.ts +1 -1
  31. package/TimeField/useTimeField.js +2 -16
  32. package/TimePicker/TimePicker.js +1 -0
  33. package/TimePicker/shared.js +3 -3
  34. package/YearCalendar/YearCalendar.js +4 -10
  35. package/esm/DateCalendar/DateCalendar.js +6 -10
  36. package/esm/DateCalendar/DayCalendar.d.ts +3 -7
  37. package/esm/DateCalendar/DayCalendar.js +18 -10
  38. package/esm/DateCalendar/index.d.ts +0 -1
  39. package/esm/DateField/useDateField.d.ts +1 -1
  40. package/esm/DateField/useDateField.js +3 -17
  41. package/esm/DatePicker/DatePicker.js +1 -0
  42. package/esm/DatePicker/shared.js +3 -9
  43. package/esm/DateTimeField/useDateTimeField.d.ts +1 -1
  44. package/esm/DateTimeField/useDateTimeField.js +3 -17
  45. package/esm/DateTimePicker/DateTimePicker.js +1 -0
  46. package/esm/DateTimePicker/shared.js +4 -14
  47. package/esm/DesktopDatePicker/DesktopDatePicker.js +1 -0
  48. package/esm/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  49. package/esm/DesktopTimePicker/DesktopTimePicker.js +1 -0
  50. package/esm/MobileDatePicker/MobileDatePicker.js +1 -0
  51. package/esm/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  52. package/esm/MobileTimePicker/MobileTimePicker.js +1 -0
  53. package/esm/MonthCalendar/MonthCalendar.js +6 -11
  54. package/esm/PickersDay/PickersDay.d.ts +1 -72
  55. package/esm/PickersDay/PickersDay.js +30 -28
  56. package/esm/PickersDay/PickersDay.types.d.ts +114 -0
  57. package/esm/PickersDay/PickersDay.types.js +1 -0
  58. package/esm/PickersDay/index.d.ts +1 -1
  59. package/esm/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  60. package/esm/PickersDay/usePickerDayOwnerState.js +32 -0
  61. package/esm/PickersSectionList/PickersSectionList.d.ts +1 -1
  62. package/esm/PickersSectionList/PickersSectionList.types.d.ts +2 -6
  63. package/esm/TimeField/useTimeField.d.ts +1 -1
  64. package/esm/TimeField/useTimeField.js +3 -17
  65. package/esm/TimePicker/TimePicker.js +1 -0
  66. package/esm/TimePicker/shared.js +3 -3
  67. package/esm/YearCalendar/YearCalendar.js +5 -11
  68. package/esm/hooks/useSplitFieldProps.d.ts +1 -1
  69. package/esm/index.js +1 -1
  70. package/esm/internals/components/PickerFieldUI.d.ts +5 -5
  71. package/esm/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  72. package/esm/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  73. package/esm/internals/hooks/useField/index.d.ts +1 -1
  74. package/esm/internals/hooks/useField/syncSelectionToDOM.d.ts +9 -0
  75. package/esm/internals/hooks/useField/syncSelectionToDOM.js +50 -0
  76. package/esm/internals/hooks/useField/useField.d.ts +2 -4
  77. package/esm/internals/hooks/useField/useField.js +5 -229
  78. package/esm/internals/hooks/useField/useField.types.d.ts +55 -68
  79. package/esm/internals/hooks/useField/useField.utils.d.ts +3 -8
  80. package/esm/internals/hooks/useField/useField.utils.js +7 -149
  81. package/esm/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  82. package/esm/internals/hooks/useField/useFieldCharacterEditing.js +42 -60
  83. package/esm/internals/hooks/useField/useFieldHiddenInputProps.d.ts +20 -0
  84. package/esm/internals/hooks/useField/useFieldHiddenInputProps.js +31 -0
  85. package/esm/internals/hooks/useField/useFieldInternalPropsWithDefaults.js +8 -10
  86. package/esm/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  87. package/esm/internals/hooks/useField/useFieldRootHandleKeyDown.js +205 -0
  88. package/esm/internals/hooks/useField/useFieldRootProps.d.ts +32 -0
  89. package/esm/internals/hooks/useField/useFieldRootProps.js +150 -0
  90. package/esm/internals/hooks/useField/useFieldSectionContainerProps.d.ts +15 -0
  91. package/esm/internals/hooks/useField/useFieldSectionContainerProps.js +29 -0
  92. package/esm/internals/hooks/useField/useFieldSectionContentProps.d.ts +23 -0
  93. package/esm/internals/hooks/useField/useFieldSectionContentProps.js +226 -0
  94. package/esm/internals/hooks/useField/useFieldState.d.ts +23 -13
  95. package/esm/internals/hooks/useField/useFieldState.js +103 -30
  96. package/esm/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  97. package/esm/internals/hooks/useField/useFieldV6TextField.js +202 -135
  98. package/esm/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  99. package/esm/internals/hooks/useField/useFieldV7TextField.js +200 -367
  100. package/esm/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  101. package/esm/internals/index.d.ts +6 -5
  102. package/esm/internals/index.js +4 -3
  103. package/esm/locales/deDE.js +2 -3
  104. package/esm/managers/useDateManager.d.ts +4 -13
  105. package/esm/managers/useDateManager.js +21 -31
  106. package/esm/managers/useDateTimeManager.d.ts +4 -13
  107. package/esm/managers/useDateTimeManager.js +26 -36
  108. package/esm/managers/useTimeManager.d.ts +4 -13
  109. package/esm/managers/useTimeManager.js +17 -27
  110. package/esm/models/fields.d.ts +2 -2
  111. package/esm/models/manager.d.ts +6 -10
  112. package/esm/validation/validateDate.js +3 -4
  113. package/hooks/useSplitFieldProps.d.ts +1 -1
  114. package/index.js +1 -1
  115. package/internals/components/PickerFieldUI.d.ts +5 -5
  116. package/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  117. package/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  118. package/internals/hooks/useField/index.d.ts +1 -1
  119. package/internals/hooks/useField/syncSelectionToDOM.d.ts +9 -0
  120. package/internals/hooks/useField/syncSelectionToDOM.js +56 -0
  121. package/internals/hooks/useField/useField.d.ts +2 -4
  122. package/internals/hooks/useField/useField.js +5 -231
  123. package/internals/hooks/useField/useField.types.d.ts +55 -68
  124. package/internals/hooks/useField/useField.utils.d.ts +3 -8
  125. package/internals/hooks/useField/useField.utils.js +9 -154
  126. package/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  127. package/internals/hooks/useField/useFieldCharacterEditing.js +41 -59
  128. package/internals/hooks/useField/useFieldHiddenInputProps.d.ts +20 -0
  129. package/internals/hooks/useField/useFieldHiddenInputProps.js +39 -0
  130. package/internals/hooks/useField/useFieldInternalPropsWithDefaults.js +8 -10
  131. package/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  132. package/internals/hooks/useField/useFieldRootHandleKeyDown.js +211 -0
  133. package/internals/hooks/useField/useFieldRootProps.d.ts +32 -0
  134. package/internals/hooks/useField/useFieldRootProps.js +156 -0
  135. package/internals/hooks/useField/useFieldSectionContainerProps.d.ts +15 -0
  136. package/internals/hooks/useField/useFieldSectionContainerProps.js +37 -0
  137. package/internals/hooks/useField/useFieldSectionContentProps.d.ts +23 -0
  138. package/internals/hooks/useField/useFieldSectionContentProps.js +234 -0
  139. package/internals/hooks/useField/useFieldState.d.ts +23 -13
  140. package/internals/hooks/useField/useFieldState.js +102 -29
  141. package/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  142. package/internals/hooks/useField/useFieldV6TextField.js +202 -135
  143. package/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  144. package/internals/hooks/useField/useFieldV7TextField.js +200 -367
  145. package/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  146. package/internals/index.d.ts +6 -5
  147. package/internals/index.js +25 -18
  148. package/locales/deDE.js +2 -3
  149. package/managers/useDateManager.d.ts +4 -13
  150. package/managers/useDateManager.js +21 -31
  151. package/managers/useDateTimeManager.d.ts +4 -13
  152. package/managers/useDateTimeManager.js +26 -36
  153. package/managers/useTimeManager.d.ts +4 -13
  154. package/managers/useTimeManager.js +18 -28
  155. package/models/fields.d.ts +2 -2
  156. package/models/manager.d.ts +6 -10
  157. package/modern/DateCalendar/DateCalendar.js +6 -10
  158. package/modern/DateCalendar/DayCalendar.d.ts +3 -7
  159. package/modern/DateCalendar/DayCalendar.js +18 -10
  160. package/modern/DateCalendar/index.d.ts +0 -1
  161. package/modern/DateField/useDateField.d.ts +1 -1
  162. package/modern/DateField/useDateField.js +3 -17
  163. package/modern/DatePicker/DatePicker.js +1 -0
  164. package/modern/DatePicker/shared.js +3 -9
  165. package/modern/DateTimeField/useDateTimeField.d.ts +1 -1
  166. package/modern/DateTimeField/useDateTimeField.js +3 -17
  167. package/modern/DateTimePicker/DateTimePicker.js +1 -0
  168. package/modern/DateTimePicker/shared.js +4 -14
  169. package/modern/DesktopDatePicker/DesktopDatePicker.js +1 -0
  170. package/modern/DesktopDateTimePicker/DesktopDateTimePicker.js +1 -0
  171. package/modern/DesktopTimePicker/DesktopTimePicker.js +1 -0
  172. package/modern/MobileDatePicker/MobileDatePicker.js +1 -0
  173. package/modern/MobileDateTimePicker/MobileDateTimePicker.js +1 -0
  174. package/modern/MobileTimePicker/MobileTimePicker.js +1 -0
  175. package/modern/MonthCalendar/MonthCalendar.js +6 -11
  176. package/modern/PickersDay/PickersDay.d.ts +1 -72
  177. package/modern/PickersDay/PickersDay.js +30 -28
  178. package/modern/PickersDay/PickersDay.types.d.ts +114 -0
  179. package/modern/PickersDay/PickersDay.types.js +1 -0
  180. package/modern/PickersDay/index.d.ts +1 -1
  181. package/modern/PickersDay/usePickerDayOwnerState.d.ts +14 -0
  182. package/modern/PickersDay/usePickerDayOwnerState.js +32 -0
  183. package/modern/PickersSectionList/PickersSectionList.d.ts +1 -1
  184. package/modern/PickersSectionList/PickersSectionList.types.d.ts +2 -6
  185. package/modern/TimeField/useTimeField.d.ts +1 -1
  186. package/modern/TimeField/useTimeField.js +3 -17
  187. package/modern/TimePicker/TimePicker.js +1 -0
  188. package/modern/TimePicker/shared.js +3 -3
  189. package/modern/YearCalendar/YearCalendar.js +5 -11
  190. package/modern/hooks/useSplitFieldProps.d.ts +1 -1
  191. package/modern/index.js +1 -1
  192. package/modern/internals/components/PickerFieldUI.d.ts +5 -5
  193. package/modern/internals/hooks/useField/buildSectionsFromFormat.d.ts +2 -2
  194. package/modern/internals/hooks/useField/buildSectionsFromFormat.js +9 -9
  195. package/modern/internals/hooks/useField/index.d.ts +1 -1
  196. package/modern/internals/hooks/useField/syncSelectionToDOM.d.ts +9 -0
  197. package/modern/internals/hooks/useField/syncSelectionToDOM.js +50 -0
  198. package/modern/internals/hooks/useField/useField.d.ts +2 -4
  199. package/modern/internals/hooks/useField/useField.js +5 -229
  200. package/modern/internals/hooks/useField/useField.types.d.ts +55 -68
  201. package/modern/internals/hooks/useField/useField.utils.d.ts +3 -8
  202. package/modern/internals/hooks/useField/useField.utils.js +7 -149
  203. package/modern/internals/hooks/useField/useFieldCharacterEditing.d.ts +19 -26
  204. package/modern/internals/hooks/useField/useFieldCharacterEditing.js +42 -60
  205. package/modern/internals/hooks/useField/useFieldHiddenInputProps.d.ts +20 -0
  206. package/modern/internals/hooks/useField/useFieldHiddenInputProps.js +31 -0
  207. package/modern/internals/hooks/useField/useFieldInternalPropsWithDefaults.js +8 -10
  208. package/modern/internals/hooks/useField/useFieldRootHandleKeyDown.d.ts +16 -0
  209. package/modern/internals/hooks/useField/useFieldRootHandleKeyDown.js +205 -0
  210. package/modern/internals/hooks/useField/useFieldRootProps.d.ts +32 -0
  211. package/modern/internals/hooks/useField/useFieldRootProps.js +150 -0
  212. package/modern/internals/hooks/useField/useFieldSectionContainerProps.d.ts +15 -0
  213. package/modern/internals/hooks/useField/useFieldSectionContainerProps.js +29 -0
  214. package/modern/internals/hooks/useField/useFieldSectionContentProps.d.ts +23 -0
  215. package/modern/internals/hooks/useField/useFieldSectionContentProps.js +226 -0
  216. package/modern/internals/hooks/useField/useFieldState.d.ts +23 -13
  217. package/modern/internals/hooks/useField/useFieldState.js +103 -30
  218. package/modern/internals/hooks/useField/useFieldV6TextField.d.ts +3 -3
  219. package/modern/internals/hooks/useField/useFieldV6TextField.js +202 -135
  220. package/modern/internals/hooks/useField/useFieldV7TextField.d.ts +3 -2
  221. package/modern/internals/hooks/useField/useFieldV7TextField.js +200 -367
  222. package/modern/internals/hooks/usePicker/usePicker.types.d.ts +1 -0
  223. package/modern/internals/index.d.ts +6 -5
  224. package/modern/internals/index.js +4 -3
  225. package/modern/locales/deDE.js +2 -3
  226. package/modern/managers/useDateManager.d.ts +4 -13
  227. package/modern/managers/useDateManager.js +21 -31
  228. package/modern/managers/useDateTimeManager.d.ts +4 -13
  229. package/modern/managers/useDateTimeManager.js +26 -36
  230. package/modern/managers/useTimeManager.d.ts +4 -13
  231. package/modern/managers/useTimeManager.js +17 -27
  232. package/modern/models/fields.d.ts +2 -2
  233. package/modern/models/manager.d.ts +6 -10
  234. package/modern/validation/validateDate.js +3 -4
  235. package/package.json +2 -2
  236. package/tsconfig.build.tsbuildinfo +1 -1
  237. package/validation/validateDate.js +3 -4
@@ -2,25 +2,30 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import useControlled from '@mui/utils/useControlled';
4
4
  import useTimeout from '@mui/utils/useTimeout';
5
+ import useEventCallback from '@mui/utils/useEventCallback';
5
6
  import { useRtl } from '@mui/system/RtlProvider';
6
7
  import { usePickerTranslations } from "../../../hooks/usePickerTranslations.js";
7
8
  import { useUtils, useLocalizationContext } from "../useUtils.js";
8
- import { mergeDateIntoReferenceDate, getSectionsBoundaries, validateSections, getDateFromDateSections, parseSelectedSections, getLocalizedDigits } from "./useField.utils.js";
9
+ import { mergeDateIntoReferenceDate, getSectionsBoundaries, validateSections, getDateFromDateSections, parseSelectedSections, getLocalizedDigits, getSectionOrder } from "./useField.utils.js";
9
10
  import { buildSectionsFromFormat } from "./buildSectionsFromFormat.js";
11
+ import { useValidation } from "../../../validation/index.js";
10
12
  import { useControlledValue } from "../useControlledValue.js";
11
13
  import { getSectionTypeGranularity } from "../../utils/getDefaultReferenceDate.js";
12
- export const useFieldState = params => {
14
+ const QUERY_LIFE_DURATION_MS = 5000;
15
+ export const useFieldState = parameters => {
13
16
  const utils = useUtils();
14
17
  const translations = usePickerTranslations();
15
18
  const adapter = useLocalizationContext();
16
19
  const isRtl = useRtl();
17
20
  const {
18
- valueManager,
19
- fieldValueManager,
20
- valueType,
21
- validator,
22
- internalProps,
23
- internalProps: {
21
+ manager: {
22
+ validator,
23
+ valueType,
24
+ internal_valueManager: valueManager,
25
+ internal_fieldValueManager: fieldValueManager
26
+ },
27
+ internalPropsWithDefaults,
28
+ internalPropsWithDefaults: {
24
29
  value: valueProp,
25
30
  defaultValue,
26
31
  referenceDate: referenceDateProp,
@@ -32,8 +37,11 @@ export const useFieldState = params => {
32
37
  shouldRespectLeadingZeros = false,
33
38
  timezone: timezoneProp,
34
39
  enableAccessibleFieldDOMStructure = true
40
+ },
41
+ forwardedProps: {
42
+ error: errorProp
35
43
  }
36
- } = params;
44
+ } = parameters;
37
45
  const {
38
46
  value,
39
47
  handleValueChange,
@@ -51,6 +59,23 @@ export const useFieldState = params => {
51
59
  React.useEffect(() => {
52
60
  valueRef.current = value;
53
61
  }, [value]);
62
+ const {
63
+ hasValidationError
64
+ } = useValidation({
65
+ props: internalPropsWithDefaults,
66
+ validator,
67
+ timezone,
68
+ value,
69
+ onError: internalPropsWithDefaults.onError
70
+ });
71
+ const error = React.useMemo(() => {
72
+ // only override when `error` is undefined.
73
+ // in case of multi input fields, the `error` value is provided externally and will always be defined.
74
+ if (errorProp !== undefined) {
75
+ return errorProp;
76
+ }
77
+ return hasValidationError;
78
+ }, [hasValidationError, errorProp]);
54
79
  const localizedDigits = React.useMemo(() => getLocalizedDigits(utils), [utils]);
55
80
  const sectionsValueBoundaries = React.useMemo(() => getSectionsBoundaries(utils, localizedDigits, timezone), [utils, localizedDigits, timezone]);
56
81
  const getSectionsFromValue = React.useCallback(valueToAnalyze => fieldValueManager.getSectionsFromValue(valueToAnalyze, date => buildSectionsFromFormat({
@@ -75,14 +100,15 @@ export const useFieldState = params => {
75
100
  isRtl,
76
101
  locale: utils.locale
77
102
  },
78
- tempValueStrAndroid: null
103
+ tempValueStrAndroid: null,
104
+ characterQuery: null
79
105
  };
80
106
  const granularity = getSectionTypeGranularity(sections);
81
107
  const referenceValue = valueManager.getInitialReferenceValue({
82
108
  referenceDate: referenceDateProp,
83
109
  value,
84
110
  utils,
85
- props: internalProps,
111
+ props: internalPropsWithDefaults,
86
112
  granularity,
87
113
  timezone
88
114
  });
@@ -102,13 +128,15 @@ export const useFieldState = params => {
102
128
  };
103
129
  const parsedSelectedSections = React.useMemo(() => parseSelectedSections(selectedSections, state.sections), [selectedSections, state.sections]);
104
130
  const activeSectionIndex = parsedSelectedSections === 'all' ? 0 : parsedSelectedSections;
131
+ const sectionOrder = React.useMemo(() => getSectionOrder(state.sections, isRtl && !enableAccessibleFieldDOMStructure), [state.sections, isRtl, enableAccessibleFieldDOMStructure]);
132
+ const areAllSectionsEmpty = React.useMemo(() => state.sections.every(section => section.value === ''), [state.sections]);
105
133
  const publishValue = newValue => {
106
134
  const context = {
107
135
  validationError: validator({
108
136
  adapter,
109
137
  value: newValue,
110
138
  timezone,
111
- props: internalProps
139
+ props: internalPropsWithDefaults
112
140
  })
113
141
  };
114
142
  handleValueChange(newValue, context);
@@ -122,7 +150,7 @@ export const useFieldState = params => {
122
150
  return newSections;
123
151
  };
124
152
  const sectionToUpdateOnNextInvalidDateRef = React.useRef(null);
125
- const timeoutToUpdateSectionValueOnNextInvalidDate = useTimeout();
153
+ const updateSectionValueOnNextInvalidDateTimeout = useTimeout();
126
154
  const setSectionUpdateToApplyOnNextInvalidDate = newSectionValue => {
127
155
  if (activeSectionIndex == null) {
128
156
  return;
@@ -131,7 +159,7 @@ export const useFieldState = params => {
131
159
  sectionIndex: activeSectionIndex,
132
160
  value: newSectionValue
133
161
  };
134
- timeoutToUpdateSectionValueOnNextInvalidDate.start(0, () => {
162
+ updateSectionValueOnNextInvalidDateTimeout.start(0, () => {
135
163
  sectionToUpdateOnNextInvalidDateRef.current = null;
136
164
  });
137
165
  };
@@ -141,9 +169,13 @@ export const useFieldState = params => {
141
169
  sections: prevState.sections.map(section => _extends({}, section, {
142
170
  value: ''
143
171
  })),
144
- tempValueStrAndroid: null
172
+ tempValueStrAndroid: null,
173
+ characterQuery: null
145
174
  }));
146
175
  } else {
176
+ setState(prevState => _extends({}, prevState, {
177
+ characterQuery: null
178
+ }));
147
179
  publishValue(valueManager.emptyValue);
148
180
  }
149
181
  };
@@ -159,9 +191,13 @@ export const useFieldState = params => {
159
191
  if (fieldValueManager.getDateFromSection(value, activeSection) === null) {
160
192
  setState(prevState => _extends({}, prevState, {
161
193
  sections: setSectionValue(activeSectionIndex, ''),
162
- tempValueStrAndroid: null
194
+ tempValueStrAndroid: null,
195
+ characterQuery: null
163
196
  }));
164
197
  } else {
198
+ setState(prevState => _extends({}, prevState, {
199
+ characterQuery: null
200
+ }));
165
201
  publishValue(fieldValueManager.updateDateInValue(value, activeSection, null));
166
202
  }
167
203
  };
@@ -187,14 +223,14 @@ export const useFieldState = params => {
187
223
  const newValue = fieldValueManager.parseValueStr(valueStr, state.referenceValue, parseDateStr);
188
224
  publishValue(newValue);
189
225
  };
190
- const timeoutToCleanActiveDateSectionsIfValueNull = useTimeout();
226
+ const cleanActiveDateSectionsIfValueNullTimeout = useTimeout();
191
227
  const updateSectionValue = ({
192
228
  section,
193
229
  newSectionValue,
194
230
  shouldGoToNextSection
195
231
  }) => {
196
- timeoutToUpdateSectionValueOnNextInvalidDate.clear();
197
- timeoutToCleanActiveDateSectionsIfValueNull.clear();
232
+ updateSectionValueOnNextInvalidDateTimeout.clear();
233
+ cleanActiveDateSectionsIfValueNullTimeout.clear();
198
234
  const activeDate = fieldValueManager.getDateFromSection(value, section);
199
235
 
200
236
  /**
@@ -219,7 +255,7 @@ export const useFieldState = params => {
219
255
  if (utils.isValid(newActiveDate)) {
220
256
  const mergedDate = mergeDateIntoReferenceDate(utils, newActiveDate, newActiveDateSections, fieldValueManager.getDateFromSection(state.referenceValue, section), true);
221
257
  if (activeDate == null) {
222
- timeoutToCleanActiveDateSectionsIfValueNull.start(0, () => {
258
+ cleanActiveDateSectionsIfValueNullTimeout.start(0, () => {
223
259
  if (valueRef.current === value) {
224
260
  setState(prevState => _extends({}, prevState, {
225
261
  sections: fieldValueManager.clearDateSections(state.sections, section),
@@ -258,9 +294,14 @@ export const useFieldState = params => {
258
294
  tempValueStrAndroid: null
259
295
  }));
260
296
  };
261
- const setTempAndroidValueStr = tempValueStrAndroid => setState(prev => _extends({}, prev, {
297
+ const setTempAndroidValueStr = tempValueStrAndroid => setState(prevState => _extends({}, prevState, {
262
298
  tempValueStrAndroid
263
299
  }));
300
+ const setCharacterQuery = useEventCallback(newCharacterQuery => {
301
+ setState(prevState => _extends({}, prevState, {
302
+ characterQuery: newCharacterQuery
303
+ }));
304
+ });
264
305
 
265
306
  // If `prop.value` changes, we update the state to reflect the new value
266
307
  if (value !== state.lastExternalValue) {
@@ -292,28 +333,60 @@ export const useFieldState = params => {
292
333
  locale: utils.locale
293
334
  },
294
335
  sections,
295
- tempValueStrAndroid: null
336
+ tempValueStrAndroid: null,
337
+ characterQuery: null
296
338
  }));
297
339
  }
340
+ if (state.characterQuery != null && !error && activeSectionIndex == null) {
341
+ setCharacterQuery(null);
342
+ }
343
+ if (state.characterQuery != null && state.sections[state.characterQuery.sectionIndex]?.type !== state.characterQuery.sectionType) {
344
+ setCharacterQuery(null);
345
+ }
298
346
  React.useEffect(() => {
299
347
  if (sectionToUpdateOnNextInvalidDateRef.current != null) {
300
348
  sectionToUpdateOnNextInvalidDateRef.current = null;
301
349
  }
302
350
  });
351
+ const cleanCharacterQueryTimeout = useTimeout();
352
+ React.useEffect(() => {
353
+ if (state.characterQuery != null) {
354
+ cleanCharacterQueryTimeout.start(QUERY_LIFE_DURATION_MS, () => setCharacterQuery(null));
355
+ }
356
+ return () => {};
357
+ }, [state.characterQuery, setCharacterQuery, cleanCharacterQueryTimeout]);
358
+
359
+ // If `tempValueStrAndroid` is still defined for some section when running `useEffect`,
360
+ // Then `onChange` has only been called once, which means the user pressed `Backspace` to reset the section.
361
+ // This causes a small flickering on Android,
362
+ // But we can't use `useEnhancedEffect` which is always called before the second `onChange` call and then would cause false positives.
363
+ React.useEffect(() => {
364
+ if (state.tempValueStrAndroid != null && activeSectionIndex != null) {
365
+ clearActiveSection();
366
+ }
367
+ }, [state.sections]); // eslint-disable-line react-hooks/exhaustive-deps
368
+
303
369
  return {
304
- state,
305
- value,
370
+ // States and derived states
306
371
  activeSectionIndex,
372
+ areAllSectionsEmpty,
373
+ error,
374
+ localizedDigits,
307
375
  parsedSelectedSections,
308
- setSelectedSections,
376
+ sectionOrder,
377
+ sectionsValueBoundaries,
378
+ state,
379
+ timezone,
380
+ value,
381
+ // Methods to update the states
309
382
  clearValue,
310
383
  clearActiveSection,
384
+ setCharacterQuery,
385
+ setSelectedSections,
386
+ setTempAndroidValueStr,
311
387
  updateSectionValue,
312
388
  updateValueFromValueStr,
313
- setTempAndroidValueStr,
314
- getSectionsFromValue,
315
- sectionsValueBoundaries,
316
- localizedDigits,
317
- timezone
389
+ // Utilities methods
390
+ getSectionsFromValue
318
391
  };
319
392
  };
@@ -1,6 +1,8 @@
1
- import { UseFieldTextField } from "./useField.types.js";
1
+ import { UseFieldParameters, UseFieldProps, UseFieldReturnValue } from "./useField.types.js";
2
2
  import { InferFieldSection } from "../../../models/index.js";
3
3
  import { PickerValidValue } from "../../models/index.js";
4
+ export declare const addPositionPropertiesToSections: <TValue extends PickerValidValue>(sections: InferFieldSection<TValue>[], localizedDigits: string[], isRtl: boolean) => FieldSectionWithPositions<TValue>[];
5
+ export declare const useFieldV6TextField: <TValue extends PickerValidValue, TError, TValidationProps extends {}, TProps extends UseFieldProps<false>>(parameters: UseFieldParameters<TValue, false, TError, TValidationProps, TProps>) => UseFieldReturnValue<false, TProps>;
4
6
  type FieldSectionWithPositions<TValue extends PickerValidValue> = InferFieldSection<TValue> & {
5
7
  /**
6
8
  * Start index of the section in the format
@@ -21,6 +23,4 @@ type FieldSectionWithPositions<TValue extends PickerValidValue> = InferFieldSect
21
23
  */
22
24
  endInInput: number;
23
25
  };
24
- export declare const addPositionPropertiesToSections: <TValue extends PickerValidValue>(sections: InferFieldSection<TValue>[], localizedDigits: string[], isRtl: boolean) => FieldSectionWithPositions<TValue>[];
25
- export declare const useFieldV6TextField: UseFieldTextField<false>;
26
26
  export {};