From 7bf0984698e43b9aa2dd879f65951318ed410390 Mon Sep 17 00:00:00 2001 From: Maze <167211895+mazeincoding@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:20:04 +0100 Subject: codebase overhaul (#697) --- apps/web/src/hooks/use-reveal-item.ts | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 apps/web/src/hooks/use-reveal-item.ts (limited to 'apps/web/src/hooks/use-reveal-item.ts') diff --git a/apps/web/src/hooks/use-reveal-item.ts b/apps/web/src/hooks/use-reveal-item.ts new file mode 100644 index 00000000..5004f60c --- /dev/null +++ b/apps/web/src/hooks/use-reveal-item.ts @@ -0,0 +1,36 @@ +import { useEffect, useState, useRef } from "react"; + +export function useRevealItem( + highlightId: string | null, + onClearHighlight: () => void, + highlightDuration = 1000, +) { + const [highlightedId, setHighlightedId] = useState(null); + const elementRefs = useRef>(new Map()); + + const registerElement = (id: string, element: HTMLElement | null) => { + if (element) { + elementRefs.current.set(id, element); + } else { + elementRefs.current.delete(id); + } + }; + + useEffect(() => { + if (!highlightId) return; + + setHighlightedId(highlightId); + + const target = elementRefs.current.get(highlightId); + target?.scrollIntoView({ block: "center" }); + + const timeout = setTimeout(() => { + setHighlightedId(null); + onClearHighlight(); + }, highlightDuration); + + return () => clearTimeout(timeout); + }, [highlightId, onClearHighlight, highlightDuration]); + + return { highlightedId, registerElement }; +} -- cgit v1.3.1