B2: Mouseleave listener leak on every rebuild #2

Open
opened 2026-06-05 10:21:40 +00:00 by sebse · 0 comments
Owner

Bug

File: web/components/ChartCard/usePlot.ts:63-67

Every rebuild() appends a new anonymous mouseleave listener through requestAnimationFrame. Old listeners are never removed.

Impact

Memory leak. After 10+ chart rebuilds (resize, data refresh, dep change), mouseleave fires 10+ handlers on a single leave event.

Code reference

requestAnimationFrame(() => {
  plot.over.addEventListener(mouseleave, () => {
    const p = plotRef.current;
    if (!p) return;
    p.setCursor({ left: idxToPixel(p, lastIdxRef.current), top: -10 });
  });
});

Fix

Replace addEventListener/removeEventListener with direct assignment plot.over.onmouseleave = handler to ensure single handler. Pass destroy callback ref to cleanup.

## Bug **File:** `web/components/ChartCard/usePlot.ts:63-67` Every `rebuild()` appends a new anonymous `mouseleave` listener through `requestAnimationFrame`. Old listeners are never removed. ### Impact Memory leak. After 10+ chart rebuilds (resize, data refresh, dep change), `mouseleave` fires 10+ handlers on a single leave event. ### Code reference ```ts requestAnimationFrame(() => { plot.over.addEventListener(mouseleave, () => { const p = plotRef.current; if (!p) return; p.setCursor({ left: idxToPixel(p, lastIdxRef.current), top: -10 }); }); }); ``` ### Fix Replace `addEventListener`/`removeEventListener` with direct assignment `plot.over.onmouseleave = handler` to ensure single handler. Pass `destroy` callback ref to cleanup.
sebse added the bug label 2026-06-05 10:21:40 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sebse/factorio-signal-exporter#2