in Dataset/JS/ReactSelect/index.tsx [704:794]
static getDerivedStateFromProps(
props: Props<unknown, boolean, GroupBase<unknown>>,
state: State<unknown, boolean, GroupBase<unknown>>
) {
const {
prevProps,
clearFocusValueOnUpdate,
inputIsHiddenAfterUpdate,
ariaSelection,
isFocused,
prevWasFocused,
instancePrefix,
} = state;
const { options, value, menuIsOpen, inputValue, isMulti } = props;
const selectValue = cleanValue(value);
let newMenuOptionsState = {};
if (
prevProps &&
(value !== prevProps.value ||
options !== prevProps.options ||
menuIsOpen !== prevProps.menuIsOpen ||
inputValue !== prevProps.inputValue)
) {
const focusableOptions = menuIsOpen
? buildFocusableOptions(props, selectValue)
: [];
const focusableOptionsWithIds = menuIsOpen
? buildFocusableOptionsWithIds(
buildCategorizedOptions(props, selectValue),
`${instancePrefix}-option`
)
: [];
const focusedValue = clearFocusValueOnUpdate
? getNextFocusedValue(state, selectValue)
: null;
const focusedOption = getNextFocusedOption(state, focusableOptions);
const focusedOptionId = getFocusedOptionId(
focusableOptionsWithIds,
focusedOption
);
newMenuOptionsState = {
selectValue,
focusedOption,
focusedOptionId,
focusableOptionsWithIds,
focusedValue,
clearFocusValueOnUpdate: false,
};
}
// some updates should toggle the state of the input visibility
const newInputIsHiddenState =
inputIsHiddenAfterUpdate != null && props !== prevProps
? {
inputIsHidden: inputIsHiddenAfterUpdate,
inputIsHiddenAfterUpdate: undefined,
}
: {};
let newAriaSelection = ariaSelection;
let hasKeptFocus = isFocused && prevWasFocused;
if (isFocused && !hasKeptFocus) {
// If `value` or `defaultValue` props are not empty then announce them
// when the Select is initially focused
newAriaSelection = {
value: valueTernary(isMulti, selectValue, selectValue[0] || null),
options: selectValue,
action: 'initial-input-focus',
};
hasKeptFocus = !prevWasFocused;
}
// If the 'initial-input-focus' action has been set already
// then reset the ariaSelection to null
if (ariaSelection?.action === 'initial-input-focus') {
newAriaSelection = null;
}
return {
...newMenuOptionsState,
...newInputIsHiddenState,
prevProps: props,
ariaSelection: newAriaSelection,
prevWasFocused: hasKeptFocus,
};
}