All files / libs/ext/react/hooks/src/lib/use-hover useHover.ts

100% Statements 41/41
100% Branches 5/5
100% Functions 1/1
100% Lines 41/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 421x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 2x 2x 6x 6x 6x 6x 6x 6x 2x 2x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x  
import { useCallback, type MouseEventHandler } from 'react';
 
import { useBoolState } from '../use-bool-state/useBoolState';
 
export type HoverEventHandlers<TElement extends HTMLElement> = {
  onMouseEnter: MouseEventHandler<TElement>;
  onMouseLeave: MouseEventHandler<TElement>;
};
 
export type UseHoverValue<TElement extends HTMLElement> = [state: boolean, eventHandlers: HoverEventHandlers<TElement>];
 
export const useHover = <TElement extends HTMLElement>({
  onMouseEnter,
  onMouseLeave,
}: Partial<HoverEventHandlers<TElement>> = {}): UseHoverValue<TElement> => {
  const { isHovered, setHoveredTrue, setHoveredFalse } = useBoolState(false, 'hovered');
 
  const onMouseEnterProxy: MouseEventHandler<TElement> = useCallback(
    (event) => {
      setHoveredTrue();
      onMouseEnter?.(event);
    },
    [setHoveredTrue, onMouseEnter],
  );
 
  const onMouseLeaveProxy: MouseEventHandler<TElement> = useCallback(
    (event) => {
      setHoveredFalse();
      onMouseLeave?.(event);
    },
    [setHoveredFalse, onMouseLeave],
  );
 
  return [
    isHovered,
    {
      onMouseEnter: onMouseEnterProxy,
      onMouseLeave: onMouseLeaveProxy,
    },
  ];
};