fix(v2): player zoom no longer locks the map
The zoom-to-player effect was re-triggering on every telemetry update (every 2s) because selectedPlayer stayed set and players array kept changing. Now tracks lastZoomedRef — zoom only fires once per selection. Map is immediately free to pan/zoom after. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
869507a3ef
commit
2095f54d79
4 changed files with 17 additions and 9 deletions
|
|
@ -97,11 +97,14 @@ export const MapView: React.FC<Props> = ({ players, getColor, onSelectPlayer, sh
|
|||
return () => { window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('mouseup', onMouseUp); };
|
||||
}, [applyTransform, imgSize.w, imgSize.h]);
|
||||
|
||||
// Zoom to selected player
|
||||
// Zoom to selected player — fires once then releases
|
||||
const lastZoomedRef = useRef<string | null>(null);
|
||||
useEffect(() => {
|
||||
if (!selectedPlayer || imgSize.w === 0 || !containerRef.current) return;
|
||||
if (lastZoomedRef.current === selectedPlayer) return; // already zoomed to this player
|
||||
const player = players.find(p => p.character_name === selectedPlayer);
|
||||
if (!player) return;
|
||||
lastZoomedRef.current = selectedPlayer;
|
||||
const { x, y } = worldToPx(player.ew, player.ns, imgSize.w, imgSize.h);
|
||||
const rect = containerRef.current.getBoundingClientRect();
|
||||
const focusZoom = 3;
|
||||
|
|
@ -113,6 +116,11 @@ export const MapView: React.FC<Props> = ({ players, getColor, onSelectPlayer, sh
|
|||
applyTransform();
|
||||
}, [selectedPlayer, players, imgSize.w, imgSize.h, applyTransform]);
|
||||
|
||||
// Reset zoom lock when player is deselected
|
||||
useEffect(() => {
|
||||
if (!selectedPlayer) lastZoomedRef.current = null;
|
||||
}, [selectedPlayer]);
|
||||
|
||||
const handleDotHover = useCallback((player: TelemetrySnapshot | null, x: number, y: number) => {
|
||||
setTooltip(player ? { x, y, player } : null);
|
||||
}, []);
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -5,7 +5,7 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Mosswart Overlord v2</title>
|
||||
<link rel="icon" type="image/png" href="/icons/7735.png" />
|
||||
<script type="module" crossorigin src="/v2/assets/index-B0FrDIQB.js"></script>
|
||||
<script type="module" crossorigin src="/v2/assets/index-Bi20HmPd.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/v2/assets/index-CyLyPOVJ.css">
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue