import { type FocusEventHandler, type MouseEventHandler, type ReactElement } from 'react'; import Highlighter from 'react-highlight-words'; import { type RowComponentProps } from 'react-window'; import { Cell, Row } from '@/components/Table'; import { useColumns } from '@/hooks/useColumns'; import { LOCALE_FEATURES } from '@/i18n/constants'; import { selectIsResultMatching, selectLocale, selectResultCoordinates, selectResultsQuery, useTypedSelector, } from '@/state'; import { ResultColumnId } from '@/types'; import styles from './Results.module.scss'; import { type ResultData } from './types'; export const Result = ({ index, highlightedIndex, results = [], onBlur, onClick, onFocus, onMouseEnter, style, }: RowComponentProps): ReactElement => { 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 | undefined = onClick && ((event) => onClick(result, event)); const handleMouseEnter: MouseEventHandler | undefined = onMouseEnter && ((event) => onMouseEnter(result, event)); const handleBlur: FocusEventHandler | undefined = onBlur && ((event) => onBlur(result, event)); const handleFocus: FocusEventHandler | undefined = onFocus && ((event) => onFocus(result, event)); return ( {columns[ResultColumnId.Coordinates] && ( )} {columns[ResultColumnId.Word] && ( )} {columns[ResultColumnId.TilesCount] && ( )} {columns[ResultColumnId.VowelsCount] && ( )} {columns[ResultColumnId.ConsonantsCount] && ( )} {columns[ResultColumnId.BlanksCount] && ( )} {columns[ResultColumnId.WordsCount] && ( )} {columns[ResultColumnId.Points] && ( )} ); };