// @ts-nocheck import { Combobox } from '@headlessui/react' import { useRef, useState } from 'react' import { classNames } from '../../utils/class-names' import { Button } from '../../components/button' type Option = { name: string disabled: boolean empty?: boolean } export default function Home() { let [list, setList] = useState(() => [ { name: 'Alice', disabled: false }, { name: 'Bob', disabled: false }, { name: 'Charlie', disabled: false }, { name: 'David', disabled: false }, { name: 'Eve', disabled: false }, { name: 'Fred', disabled: false }, { name: 'George', disabled: false }, { name: 'Helen', disabled: false }, { name: 'Iris', disabled: false }, { name: 'John', disabled: false }, { name: 'Kate', disabled: false }, { name: 'Linda', disabled: false }, { name: 'Michael', disabled: false }, { name: 'Nancy', disabled: false }, { name: 'Oscar', disabled: true }, { name: 'Peter', disabled: false }, { name: 'Quentin', disabled: false }, { name: 'Robert', disabled: false }, { name: 'Sarah', disabled: false }, { name: 'Thomas', disabled: false }, { name: 'Ursula', disabled: false }, { name: 'Victor', disabled: false }, { name: 'Wendy', disabled: false }, { name: 'Xavier', disabled: false }, { name: 'Yvonne', disabled: false }, { name: 'Zachary', disabled: false }, ]) let emptyOption = useRef({ name: 'No results', disabled: true, empty: true }) let [query, setQuery] = useState('') let [selectedPerson, setSelectedPerson] = useState(list[0]) let optionsRef = useRef(null) let filtered = query === '' ? list : list.filter((item) => item.name.toLowerCase().includes(query.toLowerCase())) return ( Selected person: {selectedPerson?.name ?? 'N/A'} 0 ? filtered : [emptyOption.current], disabled: (option) => option.disabled || option.empty, }} value={selectedPerson} nullable onChange={(value) => { setSelectedPerson(value) setQuery('') }} as="div" // Don't do this lol — it's not supported // It's just so we can tab to the "Add" button for the demo // The combobox doesn't actually support this behavior onKeyDownCapture={(event: KeyboardEvent) => { let addButton = document.querySelector('#add_person') as HTMLElement | null if (event.key === 'Tab' && addButton && filtered.length === 0) { event.preventDefault() setTimeout(() => addButton.focus(), 0) } }} > Person setQuery(e.target.value)} displayValue={(option: Option | null) => option?.name ?? ''} className="border-none px-3 py-1 outline-none" /> { // @ts-expect-error TODO: Properly handle this ({ option }: { option: Option }) => { if (!option || option.empty) { return ( No people found { let person = { name: query, disabled: false } setList((list) => [...list, person]) setSelectedPerson(person) }} > Add "{query}" ) } return ( { return classNames( 'relative w-full cursor-default select-none py-2 pl-3 pr-9 focus:outline-none', active ? 'bg-indigo-600 text-white' : 'text-gray-900' ) }} > {option.name} ) } } ) }