@@ -15,7 +15,7 @@ import {FormValidationState, useFormValidationState} from '@react-stately/form';
15
15
import { OverlayTriggerState , useOverlayTriggerState } from '@react-stately/overlays' ;
16
16
import { SelectProps } from '@react-types/select' ;
17
17
import { SingleSelectListState , useSingleSelectListState } from '@react-stately/list' ;
18
- import { useState , useMemo , useEffect , useCallback , useRef } from 'react' ;
18
+ import { useCallback , useLayoutEffect , useMemo , useRef , useState } from 'react' ;
19
19
20
20
export interface SelectStateOptions < T > extends Omit < SelectProps < T > , 'children' > , CollectionStateBase < T > { }
21
21
@@ -45,25 +45,30 @@ export function useSelectState<T extends object>(props: SelectStateOptions<T>):
45
45
let triggerState = useOverlayTriggerState ( props ) ;
46
46
let [ focusStrategy , setFocusStrategy ] = useState < FocusStrategy | null > ( null ) ;
47
47
48
+ // This is necessary to circumvent a circular dependency below
48
49
let validationStateRef = useRef < FormValidationState > ( null ) ;
49
50
51
+ let onSelectionChange = props . onSelectionChange ;
50
52
let listState = useSingleSelectListState ( {
51
53
...props ,
52
54
onSelectionChange : useCallback ( key => {
53
- if ( props . onSelectionChange != null ) {
54
- props . onSelectionChange ( key ) ;
55
+ if ( onSelectionChange != null ) {
56
+ onSelectionChange ( key ) ;
55
57
}
56
58
57
59
triggerState . close ( ) ;
58
60
validationStateRef . current ! . commitValidation ( ) ;
59
- } , [ props . onSelectionChange , triggerState ] )
61
+ } , [ onSelectionChange , triggerState ] )
60
62
} ) ;
61
63
62
64
let validationState = useFormValidationState ( {
63
65
...props ,
64
66
value : listState . selectedKey
65
67
} ) ;
66
- validationStateRef . current = validationState ;
68
+ useLayoutEffect ( ( ) => {
69
+ validationStateRef . current = validationState ;
70
+ } , [ validationState ] ) ;
71
+
67
72
68
73
let [ isFocused , setFocused ] = useState ( false ) ;
69
74
0 commit comments