import React, { useEffect, useState } from 'react'; import styled from 'styled-components/macro'; import tw from 'twin.macro'; import Input from '@/components/elements/Input'; import Label from '@/components/elements/Label'; import InputSpinner from '@/components/elements/InputSpinner'; import { debounce } from 'debounce'; const Dropdown = styled.div<{ expanded: boolean }>` ${tw`absolute mt-1 w-full rounded-md bg-neutral-900 shadow-lg z-10`}; ${props => !props.expanded && tw`hidden`}; `; interface Props { id: string; name: string; nullable: boolean; items: T[]; setItems: (items: T[]) => void; onSearch: (query: string) => Promise; onSelect: (item: T) => void; children: React.ReactNode; } function SearchableSelect ({ id, name, items, setItems, onSearch, children }: Props) { const [ loading, setLoading ] = useState(false); const [ expanded, setExpanded ] = useState(false); const [ inputText, setInputText ] = useState(''); const onFocus = () => { setInputText(''); setItems([]); setExpanded(true); }; const search = debounce((query: string) => { if (!expanded) { return; } if (query === '' || query.length < 2) { setItems([]); return; } setLoading(true); onSearch(query).then(() => setLoading(false)); }, 250); /* const selectItem = (item: any) => { onSelect(item); }; */ useEffect(() => { // setInputText(location.short); setExpanded(false); }, [ ]); // }, [ location ]); useEffect(() => { const handler = (e: KeyboardEvent) => { if (e.key !== 'Escape') { return; } // setInputText(location.short); setExpanded(false); }; window.addEventListener('keydown', handler); return () => { window.removeEventListener('keydown', handler); }; }, [ expanded ]); return (
{ setInputText(e.currentTarget.value); search(e.currentTarget.value); }} />
{ items.length < 1 ? inputText.length < 2 ?

Please type 2 or more characters.

:

No results found.

:
    {children}
}
); } export default SearchableSelect;