@@ -9,6 +9,7 @@ import isEqual from 'lodash/isEqual';
9
9
import { input } from '../prop-types-templates' ;
10
10
import fnToString from '../utils/fn-to-string' ;
11
11
import reducer from './reducer' ;
12
+ import useIsMounted from '../hooks/use-is-mounted' ;
12
13
13
14
const getSelectValue = ( stateValue , simpleValue , isMulti , allOptions ) =>
14
15
simpleValue ? allOptions . filter ( ( { value } ) => ( isMulti ? stateValue . includes ( value ) : isEqual ( value , stateValue ) ) ) : stateValue ;
@@ -46,23 +47,27 @@ const Select = ({
46
47
isLoading : false ,
47
48
options : propsOptions ,
48
49
promises : { } ,
49
- isMounted : false
50
+ isInitialLoaded : false
50
51
} ) ;
51
52
53
+ const isMounted = useIsMounted ( ) ;
54
+
52
55
const updateOptions = ( ) => {
53
56
dispatch ( { type : 'startLoading' } ) ;
54
57
55
58
return loadOptions ( ) . then ( ( data ) => {
56
- if ( value && Array . isArray ( value ) ) {
57
- const selectValue = value . filter ( ( value ) =>
58
- typeof value === 'object' ? data . find ( ( option ) => value . value === option . value ) : data . find ( ( option ) => value === option . value )
59
- ) ;
60
- onChange ( selectValue . length === 0 ? undefined : selectValue ) ;
61
- } else if ( value && ! data . find ( ( { value : internalValue } ) => internalValue === value ) ) {
62
- onChange ( undefined ) ;
59
+ if ( isMounted ) {
60
+ if ( value && Array . isArray ( value ) ) {
61
+ const selectValue = value . filter ( ( value ) =>
62
+ typeof value === 'object' ? data . find ( ( option ) => value . value === option . value ) : data . find ( ( option ) => value === option . value )
63
+ ) ;
64
+ onChange ( selectValue . length === 0 ? undefined : selectValue ) ;
65
+ } else if ( value && ! data . find ( ( { value : internalValue } ) => internalValue === value ) ) {
66
+ onChange ( undefined ) ;
67
+ }
68
+
69
+ dispatch ( { type : 'updateOptions' , payload : data } ) ;
63
70
}
64
-
65
- dispatch ( { type : 'updateOptions' , payload : data } ) ;
66
71
} ) ;
67
72
} ;
68
73
@@ -71,23 +76,19 @@ const Select = ({
71
76
updateOptions ( ) ;
72
77
}
73
78
74
- dispatch ( { type : 'mounted' } ) ;
75
-
76
- return ( ) => {
77
- dispatch ( { type : 'unmounted' } ) ;
78
- } ;
79
+ dispatch ( { type : 'initialLoaded' } ) ;
79
80
} , [ ] ) ;
80
81
81
82
const loadOptionsStr = loadOptions ? fnToString ( loadOptions ) : '' ;
82
83
83
84
useEffect ( ( ) => {
84
- if ( loadOptionsStr && state . isMounted ) {
85
+ if ( loadOptionsStr && state . isInitialLoaded ) {
85
86
updateOptions ( ) ;
86
87
}
87
88
} , [ loadOptionsStr , loadOptionsChangeCounter ] ) ;
88
89
89
90
useEffect ( ( ) => {
90
- if ( state . isMounted ) {
91
+ if ( state . isInitialLoaded ) {
91
92
if ( value && ! propsOptions . map ( ( { value } ) => value ) . includes ( value ) ) {
92
93
onChange ( undefined ) ;
93
94
}
@@ -115,7 +116,7 @@ const Select = ({
115
116
116
117
loadOptions ( inputValue )
117
118
. then ( ( options ) => {
118
- if ( state . isMounted ) {
119
+ if ( isMounted ) {
119
120
dispatch ( {
120
121
type : 'setPromises' ,
121
122
payload : { [ inputValue ] : false } ,
0 commit comments