useHoverIntent
Trigger hover logic only when the user intentionally hovers (after a delay).
✅ Features
- Delayed hover detection
- Smarter UX, avoids flickers
- Configurable timeout
📦 Usage
1import { useHoverIntent } from './useHoverIntent'; 2 3const ref = useRef(null); 4const isHovered = useHoverIntent({ ref, delay: 150 }); 5 6return <div ref={ref}>{isHovered ? "Hovered!" : "Hover me slowly"}</div>;
📋 Source Code
This is the full implementation of useHoverIntent
1import { useEffect, useRef, useState, RefObject } from 'react';
2
3interface HoverIntentOptions {
4 ref: RefObject<HTMLElement>;
5 delay?: number;
6}
7
8export function useHoverIntent({ ref, delay = 100 }: HoverIntentOptions) {
9 const [hovered, setHovered] = useState(false);
10 const timeout = useRef<NodeJS.Timeout | null>(null);
11
12 useEffect(() => {
13 const el = ref.current;
14 if (!el) return;
15
16 const handleEnter = () => {
17 timeout.current = setTimeout(() => setHovered(true), delay);
18 };
19 const handleLeave = () => {
20 if (timeout.current) clearTimeout(timeout.current);
21 setHovered(false);
22 };
23
24 el.addEventListener('mouseenter', handleEnter);
25 el.addEventListener('mouseleave', handleLeave);
26
27 return () => {
28 el.removeEventListener('mouseenter', handleEnter);
29 el.removeEventListener('mouseleave', handleLeave);
30 };
31 }, [ref, delay]);
32
33 return hovered;
34}
35