import { GetPropsCommonOptions, UseSelectGetLabelPropsOptions, UseSelectGetToggleButtonPropsOptions, } from "downshift"; import classNames from "classnames"; import React, { Dispatch, KeyboardEvent, ReactNode, SetStateAction, useMemo, useRef, } from "react"; import mergeRefs from "react-merge-refs"; import { bemHOF } from "../../../utilities"; import { Box } from "../../Box"; import { Flex } from "../../Flex"; import { Icon, ICON_TYPE } from "../../Icon"; import { Label } from "../../Label"; import { VisuallyHidden } from "../../VisuallyHidden"; const cn = bemHOF("SelectNew"); type DotProps = { delay: number }; const LoadingDot = ({ delay }: DotProps) => ( ); const SelectLoadingIndicator = () => { return ( ); }; interface SelectControlProps { setReferenceElement: Dispatch>; label: string | undefined; hasContextLabel: boolean | undefined; getLabelProps: (options?: UseSelectGetLabelPropsOptions | undefined) => any; getToggleButtonProps: ( options?: UseSelectGetToggleButtonPropsOptions | undefined, otherOptions?: GetPropsCommonOptions | undefined, ) => any; isDisabled: boolean | undefined; children: ReactNode; isClearable: boolean | undefined; isLoading: boolean | undefined; onClear: () => void; hasSelection: boolean | undefined; className: string; } export function SelectControl({ setReferenceElement, label, hasContextLabel, getLabelProps, getToggleButtonProps, isDisabled, children, isClearable, isLoading, onClear, hasSelection, className, }: SelectControlProps) { const isClearBtnVisible = isClearable && hasSelection && !isLoading; const clearBtnRef = useRef(null); const toggleBtnRef = useRef(null); const toggleButtonProps = useMemo(() => { const downshiftToggleButtonProps = getToggleButtonProps({ disabled: isDisabled, }); return { ...downshiftToggleButtonProps, ref: mergeRefs([toggleBtnRef, downshiftToggleButtonProps.ref]), onKeyDown: (e: KeyboardEvent) => { downshiftToggleButtonProps.onKeyDown(e); if (e.key === "Tab" && isClearBtnVisible && clearBtnRef.current) { e.preventDefault(); clearBtnRef.current.focus(); } }, }; }, [getToggleButtonProps, isDisabled, isClearBtnVisible]); return ( {label && !hasContextLabel && ( )} ); }