Add setting for Overpass API provider

This commit is contained in:
2026-01-24 20:47:55 +07:00
parent e61dc00725
commit 911e6ddf38
4 changed files with 66 additions and 14 deletions

View File

@@ -1,10 +1,16 @@
import Component from '@glimmer/component'; import Component from '@glimmer/component';
import { on } from '@ember/modifier'; import { on } from '@ember/modifier';
import { service } from '@ember/service';
import { action } from '@ember/object';
import Icon from '#components/icon'; import Icon from '#components/icon';
import eq from 'ember-truth-helpers/helpers/eq';
export default class SettingsPane extends Component { export default class SettingsPane extends Component {
constructor() { @service settings;
super(...arguments);
@action
updateApi(event) {
this.settings.updateOverpassApi(event.target.value);
} }
<template> <template>
@@ -19,9 +25,23 @@ export default class SettingsPane extends Component {
<div class="sidebar-content"> <div class="sidebar-content">
<section class="settings-section"> <section class="settings-section">
<h3>Settings</h3> <h3>Settings</h3>
<p> <div class="form-group">
<em>App settings/preferences go here.</em> <label for="overpass-api">Overpass API Provider</label>
</p> <select
id="overpass-api"
class="form-control"
{{on "change" this.updateApi}}
>
{{#each this.settings.overpassApis as |api|}}
<option
value={{api.url}}
selected={{if (eq api.url this.settings.overpassApi) "selected"}}
>
{{api.name}}
</option>
{{/each}}
</select>
</div>
</section> </section>
<section class="settings-section"> <section class="settings-section">
<h3>About</h3> <h3>About</h3>

View File

@@ -1,6 +1,8 @@
import Service from '@ember/service'; import Service, { service } from '@ember/service';
export default class OsmService extends Service { export default class OsmService extends Service {
@service settings;
controller = null; controller = null;
async getNearbyPois(lat, lon, radius = 50) { async getNearbyPois(lat, lon, radius = 50) {
@@ -23,10 +25,7 @@ export default class OsmService extends Service {
out center; out center;
`.trim(); `.trim();
const url = `https://overpass.bke.ro/api/interpreter?data=${encodeURIComponent( const url = `${this.settings.overpassApi}?data=${encodeURIComponent(query)}`;
// const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
query
)}`;
try { try {
const res = await this.fetchWithRetry(url, { signal }); const res = await this.fetchWithRetry(url, { signal });
@@ -101,10 +100,7 @@ out center;
`.trim(); `.trim();
} }
const url = `https://overpass.bke.ro/api/interpreter?data=${encodeURIComponent( const url = `${this.settings.overpassApi}?data=${encodeURIComponent(query)}`;
// const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
query
)}`;
const res = await this.fetchWithRetry(url); const res = await this.fetchWithRetry(url);
if (!res.ok) throw new Error('Overpass request failed'); if (!res.ok) throw new Error('Overpass request failed');
const data = await res.json(); const data = await res.json();

32
app/services/settings.js Normal file
View File

@@ -0,0 +1,32 @@
import Service from '@ember/service';
import { tracked } from '@glimmer/tracking';
export default class SettingsService extends Service {
@tracked overpassApi = 'https://overpass.bke.ro/api/interpreter';
overpassApis = [
{ name: 'bke.ro', url: 'https://overpass.bke.ro/api/interpreter' },
{ name: 'overpass-api.de', url: 'https://overpass-api.de/api/interpreter' },
{
name: 'private.coffee',
url: 'https://overpass.private.coffee/api/interpreter',
},
];
constructor() {
super(...arguments);
this.loadSettings();
}
loadSettings() {
const savedApi = localStorage.getItem('marco-overpass-api');
if (savedApi) {
this.overpassApi = savedApi;
}
}
updateOverpassApi(url) {
this.overpassApi = url;
localStorage.setItem('marco-overpass-api', url);
}
}

View File

@@ -280,6 +280,10 @@ body {
letter-spacing: 0.5px; letter-spacing: 0.5px;
} }
.settings-section .form-group {
margin-top: 1rem;
}
.btn-full { .btn-full {
width: 100%; width: 100%;
} }