import { useEffect, useRef, useState } from 'react'; // ponytail: coordinar via window para evitar Context entre 2 islands hermanas declare global { interface Window { __labreFiltrar?: () => void; } } const norm = (s: string) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase(); function unify() { const cards = document.querySelectorAll('[data-cat]'); let anyVisible = false; cards.forEach((el) => { const hidden = el.dataset.hiddenByCat === 'true' || el.dataset.hiddenBySearch === 'true'; el.hidden = hidden; if (!hidden) anyVisible = true; }); const empty = document.getElementById('catalogo-empty-filter'); if (empty) empty.hidden = anyVisible || cards.length === 0; } function applyText(value: string) { const needle = norm(value.trim()); const cards = document.querySelectorAll('[data-cat]'); cards.forEach((el) => { if (!needle) { delete el.dataset.hiddenBySearch; return; } const nombre = norm(el.dataset.nombre ?? ''); const inv = norm(el.dataset.numeroInventario ?? ''); const match = nombre.includes(needle) || (!!inv && inv.includes(needle)); if (match) delete el.dataset.hiddenBySearch; else el.dataset.hiddenBySearch = 'true'; }); unify(); } export default function BuscadorCatalogo({ q: qInitial = '' }: { q?: string }) { const [q, setQ] = useState(qInitial); const timerRef = useRef(null); useEffect(() => { window.__labreFiltrar = unify; applyText(qInitial); return () => { window.__labreFiltrar = undefined; if (timerRef.current) window.clearTimeout(timerRef.current); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const syncUrl = (value: string) => { const url = new URL(location.href); const clean = value.trim(); if (clean) url.searchParams.set('q', clean); else url.searchParams.delete('q'); history.replaceState(null, '', url.toString()); }; const onChange = (value: string) => { setQ(value); if (timerRef.current) window.clearTimeout(timerRef.current); timerRef.current = window.setTimeout(() => { applyText(value); syncUrl(value); }, 120); }; const clear = () => { setQ(''); if (timerRef.current) window.clearTimeout(timerRef.current); applyText(''); syncUrl(''); }; return (
onChange(e.target.value)} autoComplete="off" style={{ paddingRight: q ? '2.5rem' : undefined }} /> {q && ( )}
); }