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; @tracked selectedPlace = null; constructor() { super(...arguments); // If a specific place was passed in (pre-selected by map), show it immediately if (this.args.initialPlace) { this.selectedPlace = this.args.initialPlace; } } @action selectPlace(place) { this.selectedPlace = place; } @action clearSelection() { this.selectedPlace = null; // If we were initialized with a single place (direct click), // going "back" might mean closing or showing the list if available. // Logic: if we have a list (@places), go back to list. // If we only had one place (@initialPlace) and no list, maybe close? // For now, assuming @places is always passed if we want a list fallback. if (!this.args.places || this.args.places.length === 0) { 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 { // We need geohash to delete. // Existing bookmarks have it. // If for some reason it's missing (shouldn't happen for saved items), we can't delete easily. if (place.id && place.geohash) { await this.storage.places.remove(place.id, place.geohash); console.log('Place deleted:', place.title); // Close sidebar after delete since the item is gone from "Saved" context // Or we could revert to "Save" state if we had the original POI data, // but usually we just close or show "Nearby". 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 // Map Overpass POI to our Place schema 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), // We rely on the module to generate ID and Geohash }; try { const savedPlace = await this.storage.places.store(placeData); console.log('Place saved:', placeData.title); // Update the selected place in the UI to be the saved bookmark // (so the button turns to "Saved") // We can update the local tracked property if we are viewing a single item // or let the parent update. // Ideally, we switch `this.selectedPlace` to the `savedPlace` returned by the store. this.selectedPlace = savedPlace; // Notify parent if needed (map will auto-update via events) if (this.args.onBookmarkSaved) { this.args.onBookmarkSaved(); } } catch (error) { console.error('Failed to save place:', error); alert('Failed to save place: ' + error.message); } } } }