import React from 'react';
import _ from 'lodash';
import Select, { components } from 'react-select';
import CreatableSelect from 'react-select/creatable';
import defaultStyles from './styles';
const CustomInput = (props) => {
return ;
};
export const SelectComponent = ({
options = [],
value,
onChange,
closeMenuOnSelect,
darkMode,
creatable = false,
...restProps
}) => {
const selectRef = React.useRef(null);
const isDarkMode = darkMode ?? localStorage.getItem('darkMode') === 'true';
const SelectElement = creatable ? CreatableSelect : Select;
const {
isMulti = false,
styles = {},
isLoading = false,
hasSearch = true,
height,
width,
placeholder = 'Select..',
customOption = undefined,
defaultValue = null,
useMenuPortal = true, // todo: deprecate this prop, use menuPortalTarget instead
maxMenuHeight = 250,
menuPortalTarget = null,
menuPlacement = 'auto',
useCustomStyles = false,
isDisabled = false,
borderRadius,
openMenuOnFocus = false,
customClassPrefix = '',
dataCy = '',
} = restProps;
const customStyles = useCustomStyles ? styles : defaultStyles(isDarkMode, width, height, styles, borderRadius);
const selectOptions =
Array.isArray(options) && options.length === 0
? options
: options?.map((option) => {
if (!option.hasOwnProperty('label')) {
return _.mapKeys(option, (value, key) => (key === 'value' ? key : 'label'));
}
return option;
});
const currentValue = value ? selectOptions.find((option) => option.value === value) || value : defaultValue;
const handleOnChange = (data) => {
if (isMulti) {
onChange(data);
} else {
onChange(data.value);
}
};
const renderCustomOption = (option) => {
if (customOption) {
return customOption(option);
}
return option.label;
};
return (
renderCustomOption(option)}
menuPlacement={menuPlacement}
maxMenuHeight={maxMenuHeight}
menuPortalTarget={useMenuPortal ? document.body : menuPortalTarget}
closeMenuOnSelect={closeMenuOnSelect ?? true}
classNamePrefix={`${customClassPrefix} ${isDarkMode && 'dark-theme'} ${'react-select'}`}
components={{
Input: CustomInput,
...restProps.components,
}}
/>
);
};