diff --git a/src/renderer/src/components/WorktreeJumpPalette.tsx b/src/renderer/src/components/WorktreeJumpPalette.tsx index 255d24b12aa..a8191ab3850 100644 --- a/src/renderer/src/components/WorktreeJumpPalette.tsx +++ b/src/renderer/src/components/WorktreeJumpPalette.tsx @@ -475,10 +475,11 @@ function PaletteOpenTabWorktreeRailLabel({ slot?: string }): React.JSX.Element | null { const [truncated, setTruncated] = useState(false) - const resizeObserverRef = useRef(null) - const handleRef = useCallback((node: HTMLSpanElement | null) => { - resizeObserverRef.current?.disconnect() - resizeObserverRef.current = null + const labelRef = useRef(null) + // Why: observe in an effect so unmount disconnects the ResizeObserver instead of + // leaking the callback-ref subscription (react-doctor effect-needs-cleanup). + useLayoutEffect(() => { + const node = labelRef.current if (!node) { setTruncated(false) return @@ -493,8 +494,8 @@ function PaletteOpenTabWorktreeRailLabel({ } const observer = new ResizeObserver(updateTruncated) observer.observe(node) - resizeObserverRef.current = observer - }, []) + return () => observer.disconnect() + }, [name]) if (name.trim().length === 0) { return null @@ -506,14 +507,7 @@ function PaletteOpenTabWorktreeRailLabel({ return ( - +