import { useNavigate } from 'react-router-dom'; import { cn } from '../../../lib/cn'; import { useAppSelector } from '../../../redux/hooks'; export interface ArticleItemProps { id: number; name: string; tags: string[]; } const ArticleItem: React.FC = ({ id, name, tags }) => { const navigate = useNavigate(); const filterTags = useAppSelector( (state) => state.store.articles.articleTagFilter, ); const nameFilter = useAppSelector( (state) => state.store.articles.filterName, ); const highlightZ = (name: string, filter: string) => { if (!filter) return name; const s = filter.toLowerCase(); const t = name.toLowerCase(); const n = t.length; const m = s.length; const mark = Array(n).fill(false); // Проходимся с конца и ставим отметки for (let i = n - 1; i >= 0; i--) { if (i + m <= n && t.slice(i, i + m) === s) { for (let j = i; j < i + m; j++) { if (mark[j]) break; mark[j] = true; } } } // === Формируем единые жёлтые блоки === const result: any[] = []; let i = 0; while (i < n) { if (!mark[i]) { // обычный символ result.push(name[i]); i++; } else { // начинаем жёлтый блок let j = i; while (j < n && mark[j]) j++; const chunk = name.slice(i, j); result.push( {chunk} , ); i = j; } } return result; }; return (
{ navigate(`/article/${id}`); }} >
#{id}
{highlightZ(name, nameFilter)}
{tags.map((v, i) => (
{v}
))}
); }; export default ArticleItem;