From 4e99b673cc17dd028377d960b53182a34492478c Mon Sep 17 00:00:00 2001 From: Neil Date: Sat, 12 Sep 2026 03:01:21 -0700 Subject: [PATCH] fix(diff): move the post-render chain ref write out of render React Doctor fails CI on a ref mutated during render. The ref exists so the onPostRender callback can stay identity-stable -- Pierre treats a new onPostRender as forceRender -- while still reading current consumers. useRef seeds the first render's chain and this effect, declared before the consumers' own effects, keeps it current without writing during render. --- .../editor/pierre-diff/PierreDiffSurface.tsx | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/renderer/src/components/editor/pierre-diff/PierreDiffSurface.tsx b/src/renderer/src/components/editor/pierre-diff/PierreDiffSurface.tsx index 81f13887034..ffe77953412 100644 --- a/src/renderer/src/components/editor/pierre-diff/PierreDiffSurface.tsx +++ b/src/renderer/src/components/editor/pierre-diff/PierreDiffSurface.tsx @@ -174,13 +174,19 @@ export function PierreDiffSurface({ shiftWheelPostRender, nativeViewPostRender }) - postRenderRef.current = { - onPostRender, - navigateToNote, - searchPostRender, - shiftWheelPostRender, - nativeViewPostRender - } + // Why layout and not render: Pierre treats a new onPostRender identity as forceRender, so the + // callback below must stay stable and read its chain from here. Writing during render is impure + // -- React can discard that work. useRef seeds the first render's chain, and this effect is + // declared before every consumer's own effects, so each Pierre post-render sees current values. + useLayoutEffect(() => { + postRenderRef.current = { + onPostRender, + navigateToNote, + searchPostRender, + shiftWheelPostRender, + nativeViewPostRender + } + }, [onPostRender, navigateToNote, searchPostRender, shiftWheelPostRender, nativeViewPostRender]) const handlePostRender = useCallback( (node: HTMLElement, instance: PierreDiffInstance, phase: PostRenderPhase) => { const chain = postRenderRef.current