import { useState, memo, Fragment, useEffect, useRef } from 'react' import { Listbox, Transition } from '@headlessui/react' import { GrCaretDownFill, GrCheckmark } from 'react-icons/gr' const runners = [ { id: 1, name: 'htmlcs' }, { id: 2, name: 'axe' }, ] // selected runner drop down export const RunnerSelectComponent = ({ cb, defaultRunners, }: { defaultRunners?: typeof runners cb?(runners: string[]): void }) => { const [selectedRunners, setSelectedRunners] = useState( defaultRunners ?? [] ) const mounted = useRef(false) useEffect(() => { if (defaultRunners && !mounted.current) { setSelectedRunners(defaultRunners) mounted.current = true } }, [defaultRunners, setSelectedRunners, mounted]) const onChangeEvent = (selected: typeof runners) => { let nextRunners: { id: number name: string }[] = [] if (selected.length === 3) { nextRunners = selected.filter((item) => item.name !== selected[2].name) } else if (selected.length === 2 && selected[0].name === selected[1].name) { // remove selected item nextRunners = [] } else { nextRunners = selected } setSelectedRunners(nextRunners) if (cb && typeof cb === 'function') { cb(nextRunners.map((runner) => runner.name)) } } return ( Runners:
{selectedRunners.length ? selectedRunners.map((runner) => runner.name).join(', ') : 'Default Runner'} {runners.map((runner, personIdx) => ( `relative cursor-default select-none py-1.5 pl-10 pr-4 ${ active ? 'bg-blue-100 text-blue-900' : 'text-gray-900 dark:text-gray-300' }` } value={runner} > {({ selected }) => { const defaultSelected = selected || selectedRunners.some((item) => item.name === runner.name) return ( <> {runner.name} {defaultSelected ? ( ) : null} ) }} ))}
) } export const RunnerSelect = memo(RunnerSelectComponent)