From eb91b60053261727712c372292ea1eef23901231 Mon Sep 17 00:00:00 2001 From: Cherryga Date: Mon, 21 Jul 2025 23:02:32 +0530 Subject: [PATCH] feat: Add stopPropagation and event access support to useHover hook --- src/useHover.ts | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/useHover.ts b/src/useHover.ts index 98b5908a8d..902a85d669 100644 --- a/src/useHover.ts +++ b/src/useHover.ts @@ -1,3 +1,37 @@ +// import * as React from 'react'; +// import { noop } from './misc/util'; + +// const { useState } = React; + +// export type Element = ((state: boolean) => React.ReactElement) | React.ReactElement; + +// const useHover = (element: Element): [React.ReactElement, boolean] => { +// const [state, setState] = useState(false); + +// const onMouseEnter = (originalOnMouseEnter?: any) => (event: any) => { +// (originalOnMouseEnter || noop)(event); +// setState(true); +// }; +// const onMouseLeave = (originalOnMouseLeave?: any) => (event: any) => { +// (originalOnMouseLeave || noop)(event); +// setState(false); +// }; + +// if (typeof element === 'function') { +// element = element(state); +// } + +// const el = React.cloneElement(element, { +// onMouseEnter: onMouseEnter(element.props.onMouseEnter), +// onMouseLeave: onMouseLeave(element.props.onMouseLeave), +// }); + +// return [el, state]; +// }; + +// export default useHover; + + import * as React from 'react'; import { noop } from './misc/util'; @@ -5,14 +39,25 @@ const { useState } = React; export type Element = ((state: boolean) => React.ReactElement) | React.ReactElement; -const useHover = (element: Element): [React.ReactElement, boolean] => { +interface UseHoverOptions { + stopPropagation?: boolean; +} + +const useHover = ( + element: Element, + options: UseHoverOptions = {} +): [React.ReactElement, boolean] => { const [state, setState] = useState(false); + const { stopPropagation = false } = options; const onMouseEnter = (originalOnMouseEnter?: any) => (event: any) => { + if (stopPropagation) event.stopPropagation(); (originalOnMouseEnter || noop)(event); setState(true); }; + const onMouseLeave = (originalOnMouseLeave?: any) => (event: any) => { + if (stopPropagation) event.stopPropagation(); (originalOnMouseLeave || noop)(event); setState(false); };