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.
This commit is contained in:
Neil
2026-09-12 03:01:21 -07:00
parent 609745e0a1
commit 4e99b673cc
@@ -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