From db6267ac36137ba5e50a34e5cf7ed8c3fe2a89fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Eust=C3=A1quio?= <43277022+carloseustaquio@users.noreply.github.com> Date: Thu, 3 Oct 2024 19:43:09 -0300 Subject: [PATCH] feat: Tooltip - Performance - avoid calling clearTimeout on unmount if timeout id is 0 (#3163) Co-authored-by: Carlos Nicacio --- .yarn/versions/ae1744f4.yml | 5 +++++ packages/react/tooltip/src/Tooltip.tsx | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 .yarn/versions/ae1744f4.yml diff --git a/.yarn/versions/ae1744f4.yml b/.yarn/versions/ae1744f4.yml new file mode 100644 index 000000000..03c01858e --- /dev/null +++ b/.yarn/versions/ae1744f4.yml @@ -0,0 +1,5 @@ +releases: + "@radix-ui/react-tooltip": patch + +declined: + - primitives diff --git a/packages/react/tooltip/src/Tooltip.tsx b/packages/react/tooltip/src/Tooltip.tsx index 45cb76ac8..269cfd32f 100644 --- a/packages/react/tooltip/src/Tooltip.tsx +++ b/packages/react/tooltip/src/Tooltip.tsx @@ -190,12 +190,14 @@ const Tooltip: React.FC = (props: ScopedProps) => { const handleOpen = React.useCallback(() => { window.clearTimeout(openTimerRef.current); + openTimerRef.current = 0; wasOpenDelayedRef.current = false; setOpen(true); }, [setOpen]); const handleClose = React.useCallback(() => { window.clearTimeout(openTimerRef.current); + openTimerRef.current = 0; setOpen(false); }, [setOpen]); @@ -204,11 +206,17 @@ const Tooltip: React.FC = (props: ScopedProps) => { openTimerRef.current = window.setTimeout(() => { wasOpenDelayedRef.current = true; setOpen(true); + openTimerRef.current = 0; }, delayDuration); }, [delayDuration, setOpen]); React.useEffect(() => { - return () => window.clearTimeout(openTimerRef.current); + return () => { + if (openTimerRef.current) { + window.clearTimeout(openTimerRef.current); + openTimerRef.current = 0; + } + }; }, []); return ( @@ -230,6 +238,7 @@ const Tooltip: React.FC = (props: ScopedProps) => { } else { // Clear the timer in case the pointer leaves the trigger before the tooltip is opened. window.clearTimeout(openTimerRef.current); + openTimerRef.current = 0; } }, [handleClose, disableHoverableContent])} onOpen={handleOpen}