import React, { useLayoutEffect, useState } from 'react'; import AnimateHeight from 'react-animate-height'; import { Highlight } from '../../../Highlight'; import { Typography } from '../../../Typography'; import { ItemsWrapper, ItemWrapper } from './SearchList.styled'; type BaseItem = { id: string; label: string; }; export type SearchItemRendererProps = { item: BaseItem; searchedValue?: string }; export type SearchListProps = { itemFilter?: (item: BaseItem, value: string) => boolean; itemRenderer?: React.FunctionComponent; items: BaseItem[]; onItemClick: (item: BaseItem, e: React.MouseEvent) => void; parentWidth: number; searchedValue?: string; selectedItemUntouched: boolean; }; const defaultItemRenderer = (props: SearchItemRendererProps) => { const { searchedValue, item } = props; return ( {item.label} ); }; const defaultItemFilter = (item: BaseItem, value: string) => !value ? true : item.label.toLowerCase().includes(value.toLowerCase()); export const SearchList: React.FunctionComponent = ({ items, itemRenderer = defaultItemRenderer, itemFilter = defaultItemFilter, parentWidth, searchedValue = '', onItemClick, selectedItemUntouched, }) => { const [height, setHeight] = useState<'auto' | number>(0); const [width, setWidth] = useState<'auto' | number>('auto'); useLayoutEffect(() => { setHeight('auto'); setWidth(parentWidth); }, [parentWidth]); const filteredItems = selectedItemUntouched ? items : items.filter((item) => itemFilter(item, searchedValue)); return ( {filteredItems.length > 0 ? ( filteredItems.map((item, index) => ( { onItemClick(item, e); }} > {itemRenderer({ item, searchedValue })} )) ) : ( {searchedValue.length === 0 ? 'Nothing to search for... Try searching for unicorns instead!' : 'No items match the filter... Perhaps they joined the NFT craze?'} )} ); };