>) => (
), []);
const componentNoOptions = useCallback(() => (
{props.noOptionsText ?? 'No options'}
), [props.noOptionsText]);
const elLabel = useMemo(() => {
if(props.label) {
return (
);
}
}, [props.label]);
const elContainer = useCallback((children: ReactNode) => {
return (
);
}, []);
const loadOptions = useCallback(async (
search: string
): Promise<{ options: Array>, hasMore: boolean }> => {
let options: Array> = [];
const params = {
...props.callbackParams,
search
};
if(props.loadCallback) {
options = await props.loadCallback(params);
}
return {
options,
hasMore: props.hasMore ?? false
};
}, [props.options, props.hasMore, props.callbackParams]);
const params = {
placeholder: props.placeholder ?? '',
isMulti: props.isMulti,
hideSelectedOptions: props.hideSelectedOptions,
menuIsOpen: props.menuIsOpen,
defaultMenuIsOpen: props.defaultMenuIsOpen,
defaultValue: props.defaultValue,
filterOption: props.filterOption,
isSearchable: isSearchable,
name: props.name,
isClearable: props.isClearable,
escapeClearsValue: props.escapeClearsValue,
value: props.value,
autoFocus: props.autoFocus,
isRtl: props.isRtl,
backspaceRemovesValue: props.backspaceRemovesValue,
blurInputOnSelect: props.blurInputOnSelect,
captureMenuScroll: props.captureMenuScroll,
closeMenuOnSelect: props.closeMenuOnSelect,
closeMenuOnScroll: props.closeMenuOnScroll,
controlShouldRenderValue: props.controlShouldRenderValue,
isDisabled: props.isDisabled,
defaultInputValue: props.defaultInputValue,
menuShouldBlockScroll: props.menuShouldBlockScroll,
menuShouldScrollIntoView: props.menuShouldScrollIntoView,
onBlur: props.onBlur,
onFocus: props.onFocus,
onKeyDown: props.onKeyDown,
onMenuScrollToTop: props.onMenuScrollToTop,
onMenuScrollToBottom: props.onMenuScrollToBottom,
onChange: props.onChange,
openMenuOnFocus: props.openMenuOnFocus,
openMenuOnClick: props.openMenuOnClick,
pageSize: pageSize,
tabIndex: props.tabIndex,
menuPortalTarget: props.menuPortalTarget,
menuPosition: props.menuPosition,
getOptionLabel: (option: IOption) => option.label,
isOptionDisabled: (option: IOption) => !!option.disabled
};
const classNames = {
menu: () => cn('select__menu'),
menuList: () => cn('select__menu-list'),
singleValue: () => cn('select__single-value'),
control: (option: { isDisabled: boolean }) => cn('select__control', {
'select__control_disabled': option.isDisabled,
'select__control_error': props.isError
}),
valueContainer: () => cn('select__value-container'),
placeholder: () => cn('select__placeholder'),
option: (option: { isDisabled: boolean, isFocused: boolean, isSelected: boolean }) => cn('select__option', {
'select__option_focused': option.isFocused,
'select__option_disabled': option.isDisabled,
'select__option_selected': option.isSelected
})
};
if(typeComponent === 'async') {
return elContainer(
, unknown, IsMulti>
loadOptions={loadOptions}
isLoading={isLoading}
classNames={classNames}
onInputChange={(newValue, actionMeta) => {
if(newValue && props.onInputChange) {
props.onInputChange(newValue, actionMeta);
}
}}
components={{
/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */
Option: (option) => componentOption(option as OptionProps>),
SingleValue: (option) => componentSingleValue(option as SingleValueProps>),
IndicatorSeparator: null,
IndicatorsContainer: (option) => componentIndicatorsContainer(option as IndicatorsContainerProps>),
LoadingIndicator: components.LoadingIndicator,
NoOptionsMessage: componentNoOptions
/* eslint-enable @typescript-eslint/no-unnecessary-type-assertion */
}}
debounceTimeout={300}
{...params}
/>
);
}
return elContainer(
);
};