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 && (
)}
);
}