diff --git a/frontend/src/HomePage/AppCard.jsx b/frontend/src/HomePage/AppCard.jsx index 6d48ed0caa..8530cbf464 100644 --- a/frontend/src/HomePage/AppCard.jsx +++ b/frontend/src/HomePage/AppCard.jsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback, useEffect } from 'react'; +import React, { useState, useCallback, useEffect, useRef } from 'react'; import cx from 'classnames'; import { AppMenu } from './AppMenu'; import moment from 'moment'; @@ -32,6 +32,17 @@ export default function AppCard({ const { t } = useTranslation(); const navigate = useNavigate(); + const cardRef = useRef(); + const [popoverVisible, setPopoverVisible] = useState(true) + const options = { + root: null, + rootMargin: '0px', + threshold: 1.0 + } + const callBackFunction = (entries) => { + const [entry] = entries; + setPopoverVisible(isMenuOpen && entry.isIntersecting) + } const onMenuToggle = useCallback( (status) => { setMenuOpen(!!status); @@ -54,8 +65,17 @@ export default function AppCard({ useEffect(() => { !isMenuOpen && setFocused(!!isHovered); + // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isHovered]); + const observer = new IntersectionObserver(callBackFunction, options) + if (cardRef.current) observer.observe(cardRef.current) + + return () => { + if (cardRef.current) { + observer.unobserve(cardRef.current) + } + } + }, [isHovered, cardRef, options]); const updated_at = app?.editing_version?.updated_at || app?.updated_at; const updated = moment(updated_at).fromNow(true); @@ -69,7 +89,7 @@ export default function AppCard({ } return ( -
+
@@ -90,7 +110,9 @@ export default function AppCard({ canUpdateApp={canUpdateApp(app)} deleteApp={() => deleteApp(app)} exportApp={() => exportApp(app)} - isMenuOpen={isMenuOpen} + isMenuOpen={setMenuOpen} + popoverVisible={popoverVisible} + setMenuOpen={setMenuOpen} darkMode={darkMode} currentFolder={currentFolder} /> @@ -146,8 +168,7 @@ export default function AppCard({