import { Fragment, useCallback, useRef } from "react"; import { useBoolean, useOnClickOutside } from "usehooks-ts"; import { Ico } from "components/Ico"; import { cIf, cJoin } from "helpers/className"; /* * ╭─────────────╮ * ───────────────────────────────────────╯ COMPONENT ╰─────────────────────────────────────────── */ interface Props { value: number; options: string[]; selected?: number; allowEmpty?: boolean; className?: string; onChange: (value: number) => void; disabled?: boolean; } // ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ export const Select = ({ className, value, options, allowEmpty, disabled = false, onChange, }: Props): JSX.Element => { const { value: isOpened, setFalse: setClosed, toggle: toggleOpened } = useBoolean(false); const tryToggling = useCallback(() => { if (disabled) return; const optionCount = options.length + (value === -1 ? 1 : 0); if (optionCount > 1) toggleOpened(); }, [disabled, options.length, value, toggleOpened]); const onSelectionChanged = useCallback( (newIndex: number) => { setClosed(); onChange(newIndex); }, [onChange, setClosed] ); const ref = useRef(null); useOnClickOutside(ref, setClosed); return (

{value === -1 ? "—" : options[value]}

{value >= 0 && allowEmpty && ( !disabled && onSelectionChanged(-1)} /> )}
{options.map((option, index) => ( {index !== value && (
onSelectionChanged(index)}> {option}
)}
))}
); };