import Component from '@glimmer/component'; import { service } from '@ember/service'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; import { on } from '@ember/modifier'; import { fn } from '@ember/helper'; import or from 'ember-truth-helpers/helpers/or'; export default class PlacesSidebar extends Component { @service storage; @action selectPlace(place) { if (this.args.onSelect) { this.args.onSelect(place); } } @action clearSelection() { // Going "back" clears the specific selection but keeps the sidebar open (showing list) if (this.args.onSelect) { this.args.onSelect(null); } // Fallback logic: if no list available, close sidebar if (!this.args.places || this.args.places.length === 0) { if (this.args.onClose) { this.args.onClose(); } } } @action async toggleSave(place) { if (!place) return; if (place.createdAt) { // It's a saved bookmark -> Delete it if (confirm(`Delete "${place.title}"?`)) { try { if (place.id && place.geohash) { await this.storage.places.remove(place.id, place.geohash); console.log('Place deleted:', place.title); // Close sidebar after delete if (this.args.onClose) { this.args.onClose(); } } else { alert('Cannot delete: Missing ID or Geohash'); } } catch (e) { console.error('Failed to delete:', e); alert('Failed to delete: ' + e.message); } } } else { // It's a fresh POI -> Save it const placeData = { title: place.tags.name || place.tags['name:en'] || 'Untitled Place', lat: place.lat, lon: place.lon, tags: [], url: place.tags.website, osmId: String(place.id), }; try { const savedPlace = await this.storage.places.store(placeData); console.log('Place saved:', placeData.title); // Update selection to the new saved place object if (this.args.onSelect) { this.args.onSelect(savedPlace); } } catch (error) { console.error('Failed to save place:', error); alert('Failed to save place: ' + error.message); } } } }