@@ -42,6 +42,8 @@ export default function useRangeOpen(
4242 firstTimeOpen : boolean ,
4343 triggerOpen : ( open : boolean , activeIndex : 0 | 1 | false , source : SourceType ) => void ,
4444] {
45+ const rafRef = React . useRef < number > ( null ) ;
46+
4547 const [ firstTimeOpen , setFirstTimeOpen ] = React . useState ( false ) ;
4648
4749 const [ afferentOpen , setAfferentOpen ] = useMergedState ( defaultOpen || false , {
@@ -61,13 +63,26 @@ export default function useRangeOpen(
6163
6264 const [ nextActiveIndex , setNextActiveIndex ] = React . useState < 0 | 1 > ( null ) ;
6365
66+ const queryNextIndex = ( index : number ) => ( index === 0 ? 1 : 0 ) ;
67+
6468 React . useEffect ( ( ) => {
6569 if ( mergedOpen ) {
6670 setFirstTimeOpen ( true ) ;
6771 }
6872 } , [ mergedOpen ] ) ;
6973
70- const queryNextIndex = ( index : number ) => ( index === 0 ? 1 : 0 ) ;
74+ React . useEffect ( ( ) => {
75+ if ( ! afferentOpen && rafRef . current !== null ) {
76+ // Unfocus
77+ raf . cancel ( rafRef . current ) ;
78+ rafRef . current = null ;
79+
80+ // Since the index will eventually point to the next one, it needs to be reset.
81+ if ( mergedActivePickerIndex !== null ) {
82+ setMergedActivePickerIndex ( queryNextIndex ( mergedActivePickerIndex ) ) ;
83+ }
84+ }
85+ } , [ afferentOpen ] ) ;
7186
7287 const triggerOpen = useEvent ( ( nextOpen : boolean , index : 0 | 1 | false , source : SourceType ) => {
7388 if ( index === false ) {
@@ -102,12 +117,17 @@ export default function useRangeOpen(
102117 setFirstTimeOpen ( false ) ;
103118 setMergedActivePickerIndex ( customNextActiveIndex ) ;
104119 }
105-
120+
106121 setNextActiveIndex ( null ) ;
107122
108123 // Focus back
109124 if ( customNextActiveIndex !== null && ! disabled [ customNextActiveIndex ] ) {
110- raf ( ( ) => {
125+ // Trigger closure to ensure consistency between controlled and uncontrolled logic.
126+ if ( afferentOpen && ! firstTimeOpen && nextActiveIndex === null ) {
127+ setMergedOpen ( false ) ;
128+ }
129+
130+ rafRef . current = raf ( ( ) => {
111131 const ref = [ startInputRef , endInputRef ] [ customNextActiveIndex ] ;
112132 ref . current ?. focus ( ) ;
113133 } ) ;
0 commit comments