"use client"; import { useSearchParams } from "next/navigation"; import { useEffect, useRef } from "react"; function highlight(root: HTMLElement, query: string) { if (!query) return; const regex = new RegExp(`(${query})`, "gi"); const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null); const textNodes: Text[] = []; let node = walker.nextNode(); while (node) { if (node instanceof Text) { textNodes.push(node); } node = walker.nextNode(); } for (const textNode of textNodes) { const nodeValue = textNode.nodeValue; if (!nodeValue || !regex.test(nodeValue)) continue; const span = document.createElement("span"); span.innerHTML = nodeValue.replace(regex, "$1"); textNode.parentNode?.replaceChild(span, textNode); } } export function HighlightText({ children }: { children: React.ReactNode }) { const ref = useRef(null); const searchParams = useSearchParams(); const q = searchParams.get("q"); useEffect(() => { if (ref.current && q) { highlight(ref.current, q); } }, [q]); return
{children}
; }