diff --git a/packages/react-core/src/helpers/Popper/Popper.tsx b/packages/react-core/src/helpers/Popper/Popper.tsx index 0341f325dce..9d1a4235c88 100644 --- a/packages/react-core/src/helpers/Popper/Popper.tsx +++ b/packages/react-core/src/helpers/Popper/Popper.tsx @@ -165,6 +165,7 @@ export const Popper: React.FunctionComponent = ({ element.removeEventListener(event, listener); } }; + React.useEffect(() => { addEventListener(onMouseEnter, refOrTrigger, 'mouseenter'); addEventListener(onMouseLeave, refOrTrigger, 'mouseleave'); @@ -175,6 +176,13 @@ export const Popper: React.FunctionComponent = ({ addEventListener(onPopperClick, popperElement, 'click'); onDocumentClick && addEventListener(onDocumentClickCallback, document, 'click'); addEventListener(onDocumentKeyDown, document, 'keydown'); + + // Trigger a Popper update when content changes. + const observer = new MutationObserver(() => { + update && update(); + }); + popperElement && observer.observe(popperElement, { attributes: true, childList: true, subtree: true }); + return () => { removeEventListener(onMouseEnter, refOrTrigger, 'mouseenter'); removeEventListener(onMouseLeave, refOrTrigger, 'mouseleave'); @@ -185,6 +193,7 @@ export const Popper: React.FunctionComponent = ({ removeEventListener(onPopperClick, popperElement, 'click'); onDocumentClick && removeEventListener(onDocumentClickCallback, document, 'click'); removeEventListener(onDocumentKeyDown, document, 'keydown'); + observer.disconnect(); }; }, [ triggerElement, @@ -233,7 +242,7 @@ export const Popper: React.FunctionComponent = ({ [popperMatchesTriggerWidth] ); - const { styles: popperStyles, attributes, forceUpdate } = usePopper(refOrTrigger, popperElement, { + const { styles: popperStyles, attributes, update } = usePopper(refOrTrigger, popperElement, { placement: getPlacementMemo, modifiers: [ { @@ -262,12 +271,6 @@ export const Popper: React.FunctionComponent = ({ ] }); - // force update when content changes - // https://github.com/patternfly/patternfly-react/issues/5620 - React.useEffect(() => { - forceUpdate && forceUpdate(); - }, [popper]); - // Returns the CSS modifier class in order to place the Popper's arrow properly // Depends on the position of the Popper relative to the reference element const modifierFromPopperPosition = () => {