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, }} /> ); };