import cn from "classnames"; import React, { forwardRef, useImperativeHandle, useEffect, useCallback, ReactNode } from "react"; import Dropdown, { InputHandlers, IDropdownProps } from "../dropdown/dropdown"; import Search from "../search/search"; import Context from "./select-context"; export interface ISelect extends IDropdownProps { controls?: ReactNode | ReactNode[]; loading?: boolean; onLazyLoad?: () => void; onSearch?: (value: string) => void; searchClassName?: string; searchDebounce?: number; searchLabel?: string; selectAppend?: ReactNode; selectPrepend?: ReactNode; wrapperClassName?: string; } const Select = forwardRef((props, ref) => { const { btnClassName, btnVariant, controls, header, loading, maxHeight, maxWidth, minHeight, minWidth, onLazyLoad, onSearch, position, searchClassName, searchDebounce, searchLabel, selectAppend, selectPrepend, wrapperClassName, ...rest } = props; const actions = React.createRef(); const btnRef = React.createRef(); const scrollRef = React.createRef(); const [selectWidth, setSelectWidth] = React.useState(0); if (onSearch && !searchLabel) { console.warn("Select: searchLabel must be provided for Search input"); } useImperativeHandle(ref, () => ({ closeDropdown() { if (actions && actions.current) { actions.current.closeDropdown(); } } })); useEffect(() => { if (!btnRef.current) { return; } setSelectWidth(btnRef.current.offsetWidth); }, []); const onScroll = useCallback(() => { if (!onLazyLoad || !scrollRef.current) { return; } if ( scrollRef.current.scrollTop + scrollRef.current.clientHeight >= scrollRef.current.scrollHeight ) { onLazyLoad(); } }, [scrollRef]); return ( {header}} maxHeight="auto" maxWidth={selectWidth} minWidth={selectWidth} position={position || "left"} ref={actions} {...rest} > <> {loading ? (
{/* TODO use honeyUI loader */}
) : null} {onSearch ? (
) : null} {selectAppend}
{props.children}
{selectPrepend} {controls} ); }); Select.displayName = "Select"; Select.defaultProps = { maxHeight: 284, maxWidth: 300, minWidth: 300 }; export default Select;