From a6d18273e9b0270e467e0503f3b2b4ebead14f6a Mon Sep 17 00:00:00 2001 From: Ryan Hamamura <58859899+ryanhamamura@users.noreply.github.com> Date: Fri, 20 Feb 2026 16:00:26 -1000 Subject: [PATCH] fix: prevent marker snap-back during drag via PubSub echo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When dragging a marker in a multi-client PubSub setup, the server echoes position updates back to the originating client. The data-effect would then call setLngLat with the stale echoed position, snapping the marker back while the user had already dragged further. Add a per-marker _dragging flag: set on dragstart, cleared after the final dragend writeback. The signal→position effect skips setLngLat (and rotation) while the flag is true. --- maplibre/js.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/maplibre/js.go b/maplibre/js.go index 5077118..a2ce5ef 100644 --- a/maplibre/js.go +++ b/maplibre/js.go @@ -273,7 +273,7 @@ func markerBodyJS(mapID, markerID string, mk Marker) string { func dragHandlerJS(mapID string, mk Marker) string { // Shared writeback logic extracted into a local function for both handlers. return fmt.Sprintf( - `var _raf=0;`+ + `var _raf=0;mk._dragging=false;`+ `function _wb(){`+ `var pos=mk.getLngLat();`+ `var el=document.getElementById(%[1]s);if(!el)return;`+ @@ -284,8 +284,9 @@ func dragHandlerJS(mapID string, mk Marker) string { `if(sig===%[3]s){inp.value=pos.lat;inp.dispatchEvent(new Event('input',{bubbles:true}))}`+ `});`+ `}`+ + `mk.on('dragstart',function(){mk._dragging=true;});`+ `mk.on('drag',function(){if(_raf)return;_raf=requestAnimationFrame(function(){_raf=0;_wb()});});`+ - `mk.on('dragend',function(){cancelAnimationFrame(_raf);_raf=0;_wb()});`, + `mk.on('dragend',function(){cancelAnimationFrame(_raf);_raf=0;_wb();mk._dragging=false;});`, jsonStr("_vwrap_"+mapID), jsonStr(mk.LngSignal.ID()), jsonStr(mk.LatSignal.ID()), @@ -321,7 +322,7 @@ func markerEffectExpr(mapID, markerID string, mk Marker) string { } b.WriteString(fmt.Sprintf( `var m=window.__via_maps&&window.__via_maps[%s];`+ - `if(m&&m._via_markers[%[2]s]){`+ + `if(m&&m._via_markers[%[2]s]&&!m._via_markers[%[2]s]._dragging){`+ `m._via_markers[%[2]s].setLngLat([lng,lat])`, jsonStr(mapID), jsonStr(markerID))) if mk.RotationSignal != nil && mk.Element != "" { -- 2.49.1