Prevent zooming when selecting saved places

This commit is contained in:
2026-03-11 18:16:24 +04:00
parent 066ddb240d
commit 7e94f335ac
3 changed files with 19 additions and 3 deletions

View File

@@ -441,6 +441,7 @@ export default class MapComponent extends Component {
// Track the selected place from the UI Service (Router -> Map) // Track the selected place from the UI Service (Router -> Map)
updateSelectedPin = modifier(() => { updateSelectedPin = modifier(() => {
const selected = this.mapUi.selectedPlace; const selected = this.mapUi.selectedPlace;
const options = this.mapUi.selectionOptions || {};
if (!this.selectedPinOverlay || !this.selectedPinElement) return; if (!this.selectedPinOverlay || !this.selectedPinElement) return;
@@ -471,7 +472,12 @@ export default class MapComponent extends Component {
} }
} }
if (selected.bbox) { if (options.preventZoom) {
// If we are preventing zoom (e.g. user clicked a bookmark), we still need to center
// but without changing the zoom level.
// We use animateToSmartCenter without a second argument (zoom=null).
this.animateToSmartCenter(coords);
} else if (selected.bbox) {
this.zoomToBbox(selected.bbox); this.zoomToBbox(selected.bbox);
} else { } else {
this.handlePinVisibility(coords); this.handlePinVisibility(coords);
@@ -870,6 +876,7 @@ export default class MapComponent extends Component {
'Clicked bookmark while sidebar open (switching):', 'Clicked bookmark while sidebar open (switching):',
clickedBookmark clickedBookmark
); );
this.mapUi.preventNextZoom = true;
this.router.transitionTo('place', clickedBookmark); this.router.transitionTo('place', clickedBookmark);
return; return;
} }
@@ -884,6 +891,7 @@ export default class MapComponent extends Component {
// Normal behavior (sidebar is closed) // Normal behavior (sidebar is closed)
if (clickedBookmark) { if (clickedBookmark) {
console.debug('Clicked bookmark:', clickedBookmark); console.debug('Clicked bookmark:', clickedBookmark);
this.mapUi.preventNextZoom = true;
this.router.transitionTo('place', clickedBookmark); this.router.transitionTo('place', clickedBookmark);
return; return;
} }

View File

@@ -72,7 +72,9 @@ export default class PlaceRoute extends Route {
// Notify the Map UI to show the pin // Notify the Map UI to show the pin
if (model) { if (model) {
this.mapUi.selectPlace(model); const options = { preventZoom: this.mapUi.preventNextZoom };
this.mapUi.selectPlace(model, options);
this.mapUi.preventNextZoom = false;
} }
// Stop the pulse animation if it was running (e.g. redirected from search) // Stop the pulse animation if it was running (e.g. redirected from search)
this.mapUi.stopSearch(); this.mapUi.stopSearch();

View File

@@ -9,18 +9,24 @@ export default class MapUiService extends Service {
@tracked returnToSearch = false; @tracked returnToSearch = false;
@tracked currentCenter = null; @tracked currentCenter = null;
@tracked searchBoxHasFocus = false; @tracked searchBoxHasFocus = false;
@tracked selectionOptions = {};
@tracked preventNextZoom = false;
selectPlace(place) { selectPlace(place, options = {}) {
this.selectedPlace = place; this.selectedPlace = place;
this.selectionOptions = options;
} }
clearSelection() { clearSelection() {
this.selectedPlace = null; this.selectedPlace = null;
this.selectionOptions = {};
this.preventNextZoom = false;
} }
startSearch() { startSearch() {
this.isSearching = true; this.isSearching = true;
this.isCreating = false; this.isCreating = false;
this.preventNextZoom = false;
} }
stopSearch() { stopSearch() {