From 75c08621347810f982ffa6ec0cd43f2fac952115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Thu, 17 Sep 2026 22:24:51 +0200 Subject: [PATCH] Hide Nostr publishing settings when no account connected --- app/components/app-menu/settings/nostr.gjs | 197 +++++++++--------- .../app-menu/settings/nostr-test.gjs | 37 ++++ 2 files changed, 137 insertions(+), 97 deletions(-) diff --git a/app/components/app-menu/settings/nostr.gjs b/app/components/app-menu/settings/nostr.gjs index 0db6fe4..bf5a565 100644 --- a/app/components/app-menu/settings/nostr.gjs +++ b/app/components/app-menu/settings/nostr.gjs @@ -20,6 +20,7 @@ const stripProtocol = (url) => (url ? url.replace(/^wss?:\/\//, '') : ''); export default class AppMenuSettingsNostr extends Component { @service settings; @service nostrData; + @service nostrAuth; @service toast; @tracked newReadRelay = ''; @@ -367,109 +368,111 @@ export default class AppMenuSettingsNostr extends Component { {{/if}} -
- - -
- - -
- {{#if this.hasWriteOverrides}} - - {{/if}} -
- -
- - -
- - {{#if this.hasMultipleMediaServers}} + {{#if this.nostrAuth.isConnected}}
- + + +
+ + +
+ {{#if this.hasWriteOverrides}} + + {{/if}} +
+ +
+
+ + {{#if this.hasMultipleMediaServers}} +
+ + +
+ {{/if}} {{/if}}
diff --git a/tests/integration/components/app-menu/settings/nostr-test.gjs b/tests/integration/components/app-menu/settings/nostr-test.gjs index de13829..841dc45 100644 --- a/tests/integration/components/app-menu/settings/nostr-test.gjs +++ b/tests/integration/components/app-menu/settings/nostr-test.gjs @@ -2,6 +2,7 @@ import { module, test } from 'qunit'; import { setupRenderingTest } from 'marco/tests/helpers'; import { click, fillIn, render, settled } from '@ember/test-helpers'; import Service, { service } from '@ember/service'; +import { tracked } from '@glimmer/tracking'; import AppMenuSettingsNostr from 'marco/components/app-menu/settings/nostr'; import { excludeRequiredRelays, @@ -67,6 +68,10 @@ class MockNostrDataService extends Service { async clearCache() {} } +class MockNostrAuthService extends Service { + @tracked isConnected = true; +} + function readRows(element) { const list = element.querySelectorAll('.relay-list')[0]; return [...list.querySelectorAll('li')]; @@ -88,6 +93,7 @@ module('Integration | Component | app-menu/settings/nostr', function (hooks) { localStorage.removeItem('marco:settings'); this.owner.register('service:nostrData', MockNostrDataService); + this.owner.register('service:nostrAuth', MockNostrAuthService); this.settings = this.owner.lookup('service:settings'); this.onChange = () => {}; }); @@ -283,6 +289,37 @@ module('Integration | Component | app-menu/settings/nostr', function (hooks) { ); }); + test('publish-only settings are hidden when no nostr key is connected', async function (assert) { + this.owner.lookup('service:nostrAuth').isConnected = false; + + const element = await renderAndOpenDetails(this); + + assert.dom('#new-write-relay').doesNotExist('write relay input hidden'); + assert + .dom('#nostr-media-server') + .doesNotExist('media server select hidden'); + assert + .dom('#nostr-photo-fallback-uploads') + .doesNotExist('fallback uploads select hidden'); + assert.strictEqual( + element.querySelectorAll('.relay-list').length, + 1, + 'only the read relay list is rendered' + ); + }); + + test('read relays and cached data stay visible when no nostr key is connected', async function (assert) { + this.owner.lookup('service:nostrAuth').isConnected = false; + + const element = await renderAndOpenDetails(this); + + assert.dom('#new-read-relay').exists('read relay input visible'); + assert.dom(readRows(element)[0]).exists('read relay list visible'); + assert + .dom(element.querySelector('.btn-outline')) + .includesText('Clear profiles, photos, and reviews'); + }); + test('tooltip appears on hover and disappears on mouseleave', async function (assert) { const element = await renderAndOpenDetails(this); const mailboxRow = rowByText(readRows(element), 'mailbox.example.com');