1- import React , { useCallback , Fragment , useRef } from "react"
1+ import React , { useCallback , Fragment , useRef , useEffect } from "react"
22import Drop from "@/components/drops/drop"
33import useForwardRef from "@/hooks/useForwardRef"
44import useToggle from "@/hooks/useToggle"
@@ -7,6 +7,7 @@ import useDescribedId from "@/components/drops/mixins/useDescribedId"
77import dropAlignMap from "@/components/drops/mixins/dropAlignMap"
88import Container from "@/components/drops/container"
99
10+ const noop = ( ) => { }
1011const getContent = content => ( typeof content === "function" ? content ( ) : content )
1112
1213const Popover = ( {
@@ -19,6 +20,7 @@ const Popover = ({
1920 children,
2021 zIndex = 70 ,
2122 ref : parentRef ,
23+ onHoverChange = noop ,
2224 ...rest
2325} ) => {
2426 const id = useDescribedId ( rest [ "aria-describedby" ] )
@@ -33,16 +35,34 @@ const Popover = ({
3335
3436 const [ ref , setRef ] = useForwardRef ( parentRef )
3537
38+ const onTargetElementMouseOver = useCallback ( ( ) => {
39+ open ( )
40+ onHoverChange ( true )
41+ } , [ open , onHoverChange ] )
42+
43+ const onTargetElementMouseLeave = useCallback ( ( ) => {
44+ closeDrop ( )
45+ onHoverChange ( false )
46+ } , [ closeDrop , onHoverChange ] )
47+
3648 const targetElement = useClonedChildren ( children , setRef , {
3749 isOpen,
38- onMouseOver : open ,
39- onMouseLeave : closeDrop ,
50+ onMouseOver : onTargetElementMouseOver ,
51+ onMouseLeave : onTargetElementMouseLeave ,
4052 onFocus : open ,
4153 onBlur : closeDrop ,
4254 ...( isOpen && { "aria-describedby" : id } ) ,
4355 ...rest ,
4456 } )
4557
58+ useEffect ( ( ) => {
59+ if ( initialOpen ) {
60+ open ( )
61+ } else {
62+ close ( )
63+ }
64+ } , [ initialOpen , open , close ] )
65+
4666 const onMouseEnter = useCallback ( ( ) => {
4767 dropHoverRef . current = true
4868 } , [ ] )
0 commit comments