UNPKG

@acrsolutions/chat-components

Version:

Un set di componenti per la creazione di un'applicazione di messaggistica

46 lines (45 loc) 2.48 kB
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime"; import { useCallback, useMemo } from 'react'; import { StyledHighlightSpan } from '../ui/StyledHighlightSpan'; /** * La logica di utilizzo di questo componente è compenetrata con l'hook useScrollToResearch */ /** * Componente per evidenziare le parti di un testo che corrispondono a una stringa di ricerca. * @param text - Il testo da evidenziare. * @param searchString - La stringa di ricerca. * @param focusedRefIndex - L'indice dell'elemento evidenziato. Corrisponde a -1 quando non deve evidenziare. * @param onSearchRefs - Funzione per gestire i riferimenti degli elementi evidenziati. * @param parentIndex - Indice del componente genitore (opzionale: serve quando HighlightResearch è usato più volte all'interno di uno stesso messaggio). * @param focusedKeyParentIndexSection - Sezione della chiave dell'elemento evidenziato che corrisponde all'indice dell'elemento genitore (opzionale). * @returns Un componente React che evidenzia le parti del testo corrispondenti alla stringa di ricerca. */ export function HighlightResearch({ text, searchString, focusedRefIndex, onSearchRefs, parentIndex, focusedKeyParentIndexSection, }) { const handleSpanRef = useCallback((elementIndex) => (el) => { if (el == null) return; onSearchRefs({ [`${elementIndex}_${parentIndex ?? ''}_${searchString}`]: el, }); }, [onSearchRefs, parentIndex, searchString]); const isFocused = useCallback((indexCounter) => { if (!focusedKeyParentIndexSection) { return indexCounter === focusedRefIndex; } else { return (focusedKeyParentIndexSection === parentIndex?.toString() && indexCounter === focusedRefIndex); } }, [focusedKeyParentIndexSection, focusedRefIndex, parentIndex]); const textParts = useMemo(() => { if (!searchString) return []; const regex = new RegExp(`(${searchString})`, 'gi'); const parts = text.split(regex); let indexCounter = 0; return parts.map((part, index) => { return regex.test(part) ? (_jsx(StyledHighlightSpan, { "$isFocused": isFocused(indexCounter), ref: handleSpanRef(indexCounter++), children: part }, index)) : (part); }); }, [searchString, text, isFocused, handleSpanRef]); return _jsx(_Fragment, { children: textParts.length > 0 ? textParts : text }); }