import classNames from 'classnames'; import { type FocusEventHandler, type MouseEventHandler, type ReactElement, useRef } from 'react'; import Highlighter from 'react-highlight-words'; import { type RowComponentProps } from 'react-window'; import { useAppLayout, useColumns } from 'hooks'; import { LOCALE_FEATURES } from 'i18n'; import { noop } from 'lib'; import { selectIsResultMatching, selectLocale, selectResultCoordinates, selectResultsQuery, useTypedSelector, } from 'state'; import { ResultColumnId } from 'types'; import { Cell } from './Cell'; import styles from './Results.module.scss'; import { type ResultData } from './types'; export const Result = ({ index, highlightedIndex, results = [], onBlur = noop, onClick = noop, onFocus = noop, onMouseEnter = noop, onMouseLeave = noop, style, }: RowComponentProps): ReactElement => { const { resultWordWidth } = useAppLayout(); const ref = useRef(null); const columns = useColumns(); const locale = useTypedSelector(selectLocale); const query = useTypedSelector(selectResultsQuery); const { direction, separator } = LOCALE_FEATURES[locale]; const result = results[index]; const isMatching = useTypedSelector((state) => selectIsResultMatching(state, index)); const words = direction === 'rtl' ? [...result.words].reverse() : result.words; const coordinates = useTypedSelector((state) => selectResultCoordinates(state, index)); const handleClick: MouseEventHandler = (event) => onClick(result, event); const handleMouseEnter: MouseEventHandler = (event) => onMouseEnter(result, event); const handleMouseLeave: MouseEventHandler = (event) => onMouseLeave(result, event); const handleBlur: FocusEventHandler = (event) => onBlur(result, event); const handleFocus: FocusEventHandler = (event) => onFocus(result, event); return ( ); };