import * as React from 'react'; import { keyCode } from '../../../utility/Constants'; import { useState } from 'react'; import { IOptionProps, IDropDownOptionsProps } from './IPropsConfig' const Option = (props: IOptionProps) => { const { option, onClick, index, onkeyPressed, activeSuggestion } = props; const { value, label, checked } = option; return (
{ onClick(option); }} onMouseUp={() => { onClick(option); }} onMouseDown={() => { onClick(option); }} className={`dropdown-option ${checked ? 'active' : ''} ${index === activeSuggestion ? 'suggestion-active' : ''}`} tabIndex={0} onKeyDown={(event: any) => { onkeyPressed(event, index, value); }} >
{label}
); }; export const DropDownOptions = React.forwardRef((props: IDropDownOptionsProps, ref: any): any => { const { options, onClick, toggleShowDropdown } = props; const [setFocus]: any = useState(); const [activeSuggestion, setActiveSuggestion] = useState(0); const dropdRef : any = React.useRef(); const containerdRef : any = React.useRef(); const handleKeyDown = (event: any, index: number, value: number) => { if (event.keyCode === keyCode.Down) { setFocus(index + 1); event.preventDefault(); } else if (event.keyCode === keyCode.Up) { setFocus(index - 1); event.preventDefault(); } else if (event.keyCode === keyCode.Enter) { onClick(value); event.preventDefault(); } else if (!event.shiftKey && event.keyCode === keyCode.Tab) { toggleShowDropdown(false); event.preventDefault(); } }; const getInSearchOptions = (allOptions: any[]) => { return allOptions.filter(option => option.inSearch); }; const scrollToPage = (key: string, index: number) => { const selectedOptionOffsetTop = dropdRef.current.querySelector('.suggestion-active').offsetTop; if (key === 'UP') { if (index === 0) { containerdRef.current.scrollTop = -30; } else { containerdRef.current.scrollTop = selectedOptionOffsetTop - 60; } } else { containerdRef.current.scrollTop = selectedOptionOffsetTop; } }; React.useImperativeHandle(ref, () => ({ scrollToSelectedOption(event: any) { if (event.keyCode === keyCode.Down) { if (getInSearchOptions(options).length === activeSuggestion + 1) { return; } setActiveSuggestion(prev => prev + 1) scrollToPage('DOWN', activeSuggestion); event.preventDefault(); } else if (event.keyCode === keyCode.Up) { if (activeSuggestion === 0) { return; } setActiveSuggestion(prev => prev - 1) scrollToPage('UP', activeSuggestion); event.preventDefault(); } else if (event.keyCode === keyCode.Enter) { onClick(getInSearchOptions(options)[activeSuggestion]); setActiveSuggestion(0); } } })); return (
{getInSearchOptions(options).length > 0 ? <> {getInSearchOptions(options).map((inSearchOption, index) => (
); });