diff --git a/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts b/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts index 9dd3d684e0d68..98ca4f49269c1 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts @@ -77,6 +77,7 @@ export const addPositionPropertiesToSections = ( export const useFieldV6TextField: UseFieldTextField = (params) => { const isRtl = useRtl(); const focusTimeoutRef = React.useRef>(); + const selectionSyncTimeoutRef = React.useRef>(); const { forwardedProps: { @@ -162,12 +163,16 @@ export const useFieldV6TextField: UseFieldTextField = (params) => { inputRef.current.setSelectionRange(selectionStart, selectionEnd); } } - setTimeout(() => { + clearTimeout(selectionSyncTimeoutRef.current); + selectionSyncTimeoutRef.current = setTimeout(() => { // handle case when the selection is not updated correctly // could happen on Android if ( inputRef.current && inputRef.current === getActiveElement(document) && + // The section might loose all selection, where `selectionStart === selectionEnd` + // https://github.com/mui/mui-x/pull/13652 + inputRef.current.selectionStart === inputRef.current.selectionEnd && (inputRef.current.selectionStart !== selectionStart || inputRef.current.selectionEnd !== selectionEnd) ) { @@ -433,6 +438,7 @@ export const useFieldV6TextField: UseFieldTextField = (params) => { return () => { clearTimeout(focusTimeoutRef.current); + clearTimeout(selectionSyncTimeoutRef.current); }; }, []); // eslint-disable-line react-hooks/exhaustive-deps