From 5bd4dba9073788b576257d322336402b392bacc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Tue, 21 Apr 2026 14:39:24 +0400 Subject: [PATCH] Refactor settings menu, add Nostr settings Adds a setting to control if photos should be uploaded only to the main/default server, or all known servers of a user. Only upload to the main server by default, to speed up adding photos. --- app/components/app-menu/settings.gjs | 180 +++----------------- app/components/app-menu/settings/apis.gjs | 69 ++++++++ app/components/app-menu/settings/map-ui.gjs | 76 +++++++++ app/components/app-menu/settings/nostr.gjs | 53 ++++++ app/services/blossom.js | 9 +- app/services/settings.js | 14 ++ 6 files changed, 241 insertions(+), 160 deletions(-) create mode 100644 app/components/app-menu/settings/apis.gjs create mode 100644 app/components/app-menu/settings/map-ui.gjs create mode 100644 app/components/app-menu/settings/nostr.gjs diff --git a/app/components/app-menu/settings.gjs b/app/components/app-menu/settings.gjs index 55673d4..50654b9 100644 --- a/app/components/app-menu/settings.gjs +++ b/app/components/app-menu/settings.gjs @@ -1,163 +1,25 @@ -import Component from '@glimmer/component'; import { on } from '@ember/modifier'; -import { service } from '@ember/service'; -import { action } from '@ember/object'; import Icon from '#components/icon'; -import eq from 'ember-truth-helpers/helpers/eq'; +import AppMenuSettingsMapUi from './settings/map-ui'; +import AppMenuSettingsApis from './settings/apis'; +import AppMenuSettingsNostr from './settings/nostr'; -export default class AppMenuSettings extends Component { - @service settings; + diff --git a/app/components/app-menu/settings/apis.gjs b/app/components/app-menu/settings/apis.gjs new file mode 100644 index 0000000..44a1cb5 --- /dev/null +++ b/app/components/app-menu/settings/apis.gjs @@ -0,0 +1,69 @@ +import Component from '@glimmer/component'; +import { on } from '@ember/modifier'; +import { service } from '@ember/service'; +import { action } from '@ember/object'; +import Icon from '#components/icon'; +import eq from 'ember-truth-helpers/helpers/eq'; + +export default class AppMenuSettingsApis extends Component { + @service settings; + + @action + updateApi(event) { + this.settings.updateOverpassApi(event.target.value); + } + + @action + updatePhotonApi(event) { + this.settings.updatePhotonApi(event.target.value); + } + + +} diff --git a/app/components/app-menu/settings/map-ui.gjs b/app/components/app-menu/settings/map-ui.gjs new file mode 100644 index 0000000..1435f5c --- /dev/null +++ b/app/components/app-menu/settings/map-ui.gjs @@ -0,0 +1,76 @@ +import Component from '@glimmer/component'; +import { on } from '@ember/modifier'; +import { service } from '@ember/service'; +import { action } from '@ember/object'; +import Icon from '#components/icon'; + +export default class AppMenuSettingsMapUi extends Component { + @service settings; + + @action + toggleKinetic(event) { + this.settings.updateMapKinetic(event.target.value === 'true'); + } + + @action + toggleQuickSearchButtons(event) { + this.settings.updateShowQuickSearchButtons(event.target.value === 'true'); + } + + +} diff --git a/app/components/app-menu/settings/nostr.gjs b/app/components/app-menu/settings/nostr.gjs new file mode 100644 index 0000000..6cacd60 --- /dev/null +++ b/app/components/app-menu/settings/nostr.gjs @@ -0,0 +1,53 @@ +import Component from '@glimmer/component'; +import { on } from '@ember/modifier'; +import { service } from '@ember/service'; +import { action } from '@ember/object'; +import Icon from '#components/icon'; + +export default class AppMenuSettingsNostr extends Component { + @service settings; + + @action + togglePhotoFallbackUploads(event) { + this.settings.updateNostrPhotoFallbackUploads( + event.target.value === 'true' + ); + } + + +} diff --git a/app/services/blossom.js b/app/services/blossom.js index 05b3648..4a189a0 100644 --- a/app/services/blossom.js +++ b/app/services/blossom.js @@ -21,10 +21,17 @@ function getBlossomUrl(serverUrl, path) { export default class BlossomService extends Service { @service nostrAuth; @service nostrData; + @service settings; get servers() { const servers = this.nostrData.blossomServers; - return servers.length ? servers : [DEFAULT_BLOSSOM_SERVER]; + const allServers = servers.length ? servers : [DEFAULT_BLOSSOM_SERVER]; + + if (!this.settings.nostrPhotoFallbackUploads) { + return [allServers[0]]; + } + + return allServers; } async _getAuthHeader(action, hash, serverUrl) { diff --git a/app/services/settings.js b/app/services/settings.js index e9e265e..7f6e668 100644 --- a/app/services/settings.js +++ b/app/services/settings.js @@ -6,6 +6,7 @@ export default class SettingsService extends Service { @tracked mapKinetic = true; @tracked photonApi = 'https://photon.komoot.io/api/'; @tracked showQuickSearchButtons = true; + @tracked nostrPhotoFallbackUploads = false; overpassApis = [ { @@ -64,6 +65,14 @@ export default class SettingsService extends Service { if (savedShowQuickSearch !== null) { this.showQuickSearchButtons = savedShowQuickSearch === 'true'; } + + const savedNostrPhotoFallbackUploads = localStorage.getItem( + 'marco:nostr-photo-fallback-uploads' + ); + if (savedNostrPhotoFallbackUploads !== null) { + this.nostrPhotoFallbackUploads = + savedNostrPhotoFallbackUploads === 'true'; + } } updateOverpassApi(url) { @@ -84,4 +93,9 @@ export default class SettingsService extends Service { updatePhotonApi(url) { this.photonApi = url; } + + updateNostrPhotoFallbackUploads(enabled) { + this.nostrPhotoFallbackUploads = enabled; + localStorage.setItem('marco:nostr-photo-fallback-uploads', String(enabled)); + } }