Files
editor/packages
Wassim SAMADandClaude Opus 4.7 71b211de97 Fence + wall panels: stable handler refs via nodeRef to fix slider-drag loop
User report: dragging the Length slider on a fence triggered
"Maximum update depth exceeded" in updateNodesAction.

Root cause: the panels' `handleUpdate` / `handleUpdateLength`
useCallback deps included the subscribed `node` and `updateNode`
references. On every store tick during slider drag (one per
pointermove), Zustand notified subscribers → panel re-rendered →
new `node` ref → new handler refs → SliderControl re-rendered with
new onChange prop → its `useCallback([..., onChange])` for
handleLabelPointerMove rebuilt while pointer capture was active.
Combined with float drift in `getWallCurveLength` recomputing per
render, React eventually flagged the cascade as a
componentWillUpdate / componentDidUpdate loop.

Fix:
 - Mirror `node` into a `nodeRef` updated on every render. Handlers
   read from `nodeRef.current` instead of closing over `node`.
 - Drop the subscribed `updateNode` dep: use `useScene.getState().
   updateNode(...)` inside the handler. Same pattern ParametricInspector
   already uses for its registry-driven inspector.
 - Drop the now-redundant `useScene.getState().dirtyNodes.add(id)`
   call — updateNode's RAF markDirty already covers it.

Net effect: handler refs are stable across slider drags (only change
when `selectedId` changes). SliderControl's pointer listeners no longer
churn mid-drag. Cycle broken.

Same fix applied to wall-panel.tsx prophylactically — it has the
identical pattern and would exhibit the same loop under the right
float-drift / drag conditions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 12:20:01 -04:00
..
2026-01-21 10:03:29 +09:00
2026-02-05 08:35:09 +09:00
2026-02-26 22:09:40 -05:00