From 3c3ce570558a83f143c85c276f719b97ec65cb54 Mon Sep 17 00:00:00 2001 From: Ryan Hamamura <58859899+ryanhamamura@users.noreply.github.com> Date: Fri, 20 Feb 2026 07:46:05 -1000 Subject: [PATCH] fix: signal-backed marker reactivity and stale signal re-push MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two issues discovered during testing: 1. data-effect expressions for signal-backed markers short-circuited before reading $signalID when the map hadn't loaded yet. Datastar never tracked those signals as dependencies, so the effect never re-ran. Fix: read signal values unconditionally before the guard. 2. prepareSignalsForPatch never reset changed=false on regular signals (only computed ones), causing every SyncSignals() call to re-push all signals — including stale server-side values for the draggable pin, overwriting the client-side drag position. --- context.go | 1 + maplibre/js.go | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/context.go b/context.go index dee6bac..52164e5 100644 --- a/context.go +++ b/context.go @@ -291,6 +291,7 @@ func (c *Context) prepareSignalsForPatch() map[string]any { } if sig.changed { updatedSigs[sigID.(string)] = fmt.Sprintf("%v", sig.val) + sig.changed = false } case *computedSignal: sig.recompute() diff --git a/maplibre/js.go b/maplibre/js.go index ee136dc..67952f1 100644 --- a/maplibre/js.go +++ b/maplibre/js.go @@ -233,12 +233,15 @@ func dragendHandlerJS(mapID, markerID string, mk Marker) string { // markerEffectExpr generates a data-effect expression that moves a signal-backed marker // when its signals change. func markerEffectExpr(mapID, markerID string, mk Marker) string { + // Read signals before the guard so Datastar tracks them as dependencies + // even when the map/marker hasn't loaded yet on first evaluation. return fmt.Sprintf( - `var m=window.__via_maps&&window.__via_maps[%s];`+ + `var lng=$%s,lat=$%s;`+ + `var m=window.__via_maps&&window.__via_maps[%s];`+ `if(m&&m._via_markers[%s]){`+ - `m._via_markers[%s].setLngLat([$%s,$%s])}`, - jsonStr(mapID), jsonStr(markerID), jsonStr(markerID), + `m._via_markers[%s].setLngLat([lng,lat])}`, mk.LngSignal.ID(), mk.LatSignal.ID(), + jsonStr(mapID), jsonStr(markerID), jsonStr(markerID), ) }