Fix tooltip performances (#9930)

Rendering the Tooltip is creating performance issues on the whole app.

In this PR we only render the tooltip on hover
This commit is contained in:
Charles Bochet
2025-01-30 12:37:56 +01:00
committed by GitHub
parent a039987549
commit ae4bf8d929
2 changed files with 29 additions and 20 deletions

View File

@ -50,6 +50,7 @@ export type AppTooltipProps = {
positionStrategy?: PositionStrategy; positionStrategy?: PositionStrategy;
clickable?: boolean; clickable?: boolean;
width?: string; width?: string;
isOpen?: boolean;
}; };
export const AppTooltip = ({ export const AppTooltip = ({
@ -65,6 +66,7 @@ export const AppTooltip = ({
children, children,
clickable, clickable,
width, width,
isOpen,
}: AppTooltipProps) => { }: AppTooltipProps) => {
const delayInMs = const delayInMs =
delay === TooltipDelay.noDelay delay === TooltipDelay.noDelay
@ -89,6 +91,7 @@ export const AppTooltip = ({
children, children,
clickable, clickable,
width, width,
isOpen,
}} }}
/> />
); );

View File

@ -89,6 +89,7 @@ export const OverflowingTextWithTooltip = ({
const textRef = useRef<HTMLDivElement>(null); const textRef = useRef<HTMLDivElement>(null);
const [isTitleOverflowing, setIsTitleOverflowing] = useState(false); const [isTitleOverflowing, setIsTitleOverflowing] = useState(false);
const [shouldRenderTooltip, setShouldRenderTooltip] = useState(false);
const handleMouseEnter = () => { const handleMouseEnter = () => {
const isOverflowing = const isOverflowing =
@ -98,10 +99,12 @@ export const OverflowingTextWithTooltip = ({
: false; : false;
setIsTitleOverflowing(isOverflowing); setIsTitleOverflowing(isOverflowing);
setShouldRenderTooltip(true);
}; };
const handleMouseLeave = () => { const handleMouseLeave = () => {
setIsTitleOverflowing(false); setIsTitleOverflowing(false);
setShouldRenderTooltip(false);
}; };
const handleTooltipClick = (event: React.MouseEvent<HTMLDivElement>) => { const handleTooltipClick = (event: React.MouseEvent<HTMLDivElement>) => {
@ -137,7 +140,9 @@ export const OverflowingTextWithTooltip = ({
{text} {text}
</StyledOverflowingText> </StyledOverflowingText>
)} )}
{createPortal( {shouldRenderTooltip &&
isTitleOverflowing &&
createPortal(
<div onClick={handleTooltipClick}> <div onClick={handleTooltipClick}>
<AppTooltip <AppTooltip
anchorSelect={`#${textElementId}`} anchorSelect={`#${textElementId}`}
@ -147,6 +152,7 @@ export const OverflowingTextWithTooltip = ({
place="bottom" place="bottom"
positionStrategy="absolute" positionStrategy="absolute"
delay={TooltipDelay.mediumDelay} delay={TooltipDelay.mediumDelay}
isOpen={true}
> >
{isTooltipMultiline ? ( {isTooltipMultiline ? (
<Styledpre>{text}</Styledpre> <Styledpre>{text}</Styledpre>