import React, { useRef, useEffect, useState } from 'react'; import classNames from 'classnames'; import { useKeyboardListNavigation } from '../../hooks/useKeyboardListNavigation'; import { useUpdateEffect } from '../../hooks/useUpdateEffect'; import { Text } from '../Text'; import { SearchInput } from '../SearchInput'; import { ControlLink } from '../ControlLink'; import { SelectOption } from './SelectOption'; import { SelectableOption, SelectExtraOption } from './Select'; import './SelectOptions.scss'; export type SelectOptionsProps = Omit< React.HTMLAttributes, 'onSelect' | 'onFocus' > & { idRef?: string; searchable?: boolean; autoFocus?: boolean; options: SelectableOption[]; selectedOption?: SelectableOption | undefined; onFocus?(option: SelectableOption): void; onSelect(option: SelectableOption): void; dataTestId?: string; extraOption?: SelectExtraOption; onCloseDropdown?: () => void; }; export const SelectOptions: React.FC = ({ idRef, searchable, autoFocus = true, options: allOptions, selectedOption, onSelect, onFocus, className, dataTestId, extraOption, onCloseDropdown, ...rest }) => { const [searchPhrase, setSearchPhrase] = useState(''); const options = allOptions.filter(option => option.label.toLowerCase().includes(searchPhrase.toLowerCase()) ); const { selected: activeOption } = useKeyboardListNavigation({ list: options.filter(option => !option.disabled), defaultSelected: selectedOption, onEnter: ({ element }) => element && onSelect(element), extractValue: option => option?.label.toLowerCase() }); const ref = useRef(null); useEffect(() => { if (autoFocus) { ref.current?.focus(); } }, [autoFocus]); useUpdateEffect(() => { if (activeOption) onFocus?.(activeOption); }, [activeOption, onFocus]); return (
{searchable && ( setSearchPhrase('')} /> )}
    {options.map(option => ( ))} {extraOption && ( ) => { extraOption.callback(event); if (extraOption.closeOnClick) { onCloseDropdown?.(); } }} > {extraOption.label} )}
{options.length === 0 && ( Nothing found )}
); };