From e5e21d3d7027e0cda4448ed345a5b1889578e6ca Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 9 Sep 2025 14:58:59 -0700 Subject: daisy fixes --- src/routes/(app)/settings/nostr/+page.svelte | 38 +++++++++++++------------- src/routes/(app)/settings/profile/+page.svelte | 4 +-- 2 files changed, 21 insertions(+), 21 deletions(-) (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index 421b590a..9129e8f3 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -163,25 +163,25 @@
{$t("user.nostrPubkey")}
-
- -
- - - - + +
+
+ + + + +
diff --git a/src/routes/(app)/settings/profile/+page.svelte b/src/routes/(app)/settings/profile/+page.svelte index ec9855d0..3b7de9d3 100644 --- a/src/routes/(app)/settings/profile/+page.svelte +++ b/src/routes/(app)/settings/profile/+page.svelte @@ -116,7 +116,7 @@ > handleFile(e, "picture")} /> @@ -158,7 +158,7 @@ > handleFile(e, "banner")} /> -- cgit v1.2.3 From 9bc38ec4d9f75bcbfa111ed7bf5c9d810b62b86d Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 9 Sep 2025 15:15:24 -0700 Subject: dark mode fix --- src/app.css | 10 +++++++++- src/routes/(app)/settings/nostr/+page.svelte | 3 ++- src/routes/+layout.svelte | 14 +++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) (limited to 'src/routes/(app)/settings') diff --git a/src/app.css b/src/app.css index fca47b23..901893b9 100644 --- a/src/app.css +++ b/src/app.css @@ -48,7 +48,15 @@ html { font-family: PublicSans, sans-serif; } .input { @apply input-lg input-primary h-16 px-4; } /* If you want to *turn* native inputs into DaisyUI inputs via @apply: */ -input:not([type="range"]) { @apply input input-lg input-primary h-16 px-4; } +input[type="text"], +input[type="email"], +input[type="password"], +input[type="number"], +input[type="search"], +input[type="url"], +input[type="tel"] { + @apply input input-lg input-primary h-16 px-4; +} textarea { @apply textarea textarea-lg textarea-primary py-4; } select { @apply select select-lg select-primary h-16 px-4; } diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index 9129e8f3..7168f4f7 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -172,7 +172,7 @@ onclick={() => copy(npub)} aria-label="Copy" > {$t("accounts.copy")} +{$t("accounts.qr")}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 8ae31608..7653e05a 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -7,13 +7,21 @@ import { onMount } from "svelte"; import { installPrompt, theme as themeStore } from "$lib/store"; + +const map = { light: 'lofi', dark: 'black', system: 'system' }; + let { data, children } = $props(); let { pathname, theme } = $state(data); $effect(() => ($themeStore = data.theme)); $effect(() => (theme = $themeStore)); - $effect(() => { - document.documentElement.setAttribute("data-theme", theme); - }); +$effect(() => { + const v = map[theme] ?? theme; + if (!v || v === 'system') { + document.documentElement.removeAttribute('data-theme'); + } else { + document.documentElement.setAttribute('data-theme', v); + } +}); let host = PUBLIC_DOMAIN.includes("localhost") ? `http://${PUBLIC_DOMAIN}` -- cgit v1.2.3 From 53cb36710837f1cdf62b4bcf860cff3d405ec664 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Fri, 31 Oct 2025 19:07:30 -0500 Subject: Add DM Relays to settings page Currently it uses a separate button, since I need to figure out how to get this to work with the different pages. Next, I'll fit it into the save button. --- src/routes/(app)/settings/nostr/+page.svelte | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index 7168f4f7..5ca64588 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -18,6 +18,9 @@ let extensionAvailable = $derived(browser && window.nostr); let { locale } = $derived(user); + import { SimplePool } from 'nostr-tools/pool'; + import { finalizeEvent } from 'nostr-tools/pure'; + let newNsec = $state(), nsec = $state(), pin = $state(""), @@ -41,6 +44,28 @@ await tick(); $save.click(); }; + + const pool = new SimplePool(); + import { PUBLIC_DM_RELAYS } from '$env/static/public'; + const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(','); + let dmRelaysText = $state(''); + let updateRelays = async () => { + const newRelays = dmRelaysText.split('\n'); + const event = { + kind: 10050, + created_at: Math.floor(Date.now() / 1000), + tags: newRelays.map(r => ["relay", r]), + content: "" + }; + let signed; + if (await window.nostr.getPublicKey() === user.pubkey) { + signed = await window.nostr.signEvent(event); + } else { + const sk = await getPrivateKey(user); + signed = finalizeEvent(event, sk); + } + await Promise.any(pool.publish(DM_RELAYS_LIST, signed)); + } @@ -231,3 +256,11 @@ {/if}
{/if} + +

+ Preferred DM Relays +

+Direct Messages meant for you will be published to these relays. + + + -- cgit v1.2.3 From 29c629150aac2aaf089554c75e92f68520d4e1b3 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Sat, 1 Nov 2025 11:00:24 -0500 Subject: Use save button to save DM relays This needed me to use document.getElementById instead of Svelte states, but it works. --- src/routes/(app)/settings/+layout.svelte | 28 ++++++++++++++++++++++ src/routes/(app)/settings/nostr/+page.svelte | 36 +++++----------------------- 2 files changed, 34 insertions(+), 30 deletions(-) (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte index 3c2ebd88..75827719 100644 --- a/src/routes/(app)/settings/+layout.svelte +++ b/src/routes/(app)/settings/+layout.svelte @@ -17,6 +17,9 @@ import { getPublicKey } from "nostr-tools"; import { bytesToHex } from "@noble/hashes/utils"; + import { SimplePool } from 'nostr-tools/pool'; + import { finalizeEvent } from 'nostr-tools/pure'; + let { children, data, form } = $props(); let formElement = $state(); @@ -45,7 +48,32 @@ let { about, id, username } = $derived(user); let submitting = $state(); + const pool = new SimplePool(); + import { PUBLIC_DM_RELAYS } from '$env/static/public'; + const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(','); + let updateRelaysIfAvailable = async () => { + const relayEntry = document.getElementById('dmRelays'); + if (!relayEntry) return; + + const newRelays = relayEntry.value.split('\n'); + const event = { + kind: 10050, + created_at: Math.floor(Date.now() / 1000), + tags: newRelays.map(r => ["relay", r]), + content: "" + }; + let signed; + if (await window.nostr.getPublicKey() === user.pubkey) { + signed = await window.nostr.signEvent(event); + } else { + const sk = await getPrivateKey(user); + signed = finalizeEvent(event, sk); + } + await Promise.any(pool.publish(DM_RELAYS_LIST, signed)); + } + async function handleSubmit(e) { + updateRelaysIfAvailable(); e.preventDefault(); try { submitting = true; diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index 5ca64588..204b924b 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -1,4 +1,4 @@ - @@ -257,10 +232,11 @@ {/if} -

+ Preferred DM Relays + +

+ Direct Messages meant for you will be published to these relays.

-Direct Messages meant for you will be published to these relays. - - + -- cgit v1.2.3 From e31a8948e31a44949647f863196b1f68c58161ad Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Sat, 1 Nov 2025 11:01:06 -0500 Subject: Load user's DM relays into entry --- src/routes/(app)/settings/nostr/+page.svelte | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index 204b924b..e84f10f6 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -18,6 +18,8 @@ let extensionAvailable = $derived(browser && window.nostr); let { locale } = $derived(user); + import { SimplePool } from 'nostr-tools/pool'; + let newNsec = $state(), nsec = $state(), pin = $state(""), @@ -41,6 +43,30 @@ await tick(); $save.click(); }; + + import { PUBLIC_DM_RELAYS } from '$env/static/public'; + const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(','); + const pool = new SimplePool(); + const getPreferredRelays = async (pubkey: string): string[] => { + const events = await pool.querySync( + DM_RELAYS_LIST, { kinds: [10050], limit: 1, authors: [pubkey] } + ); + + let relays = []; + for (const event of events) { + for (const tag of event.tags) { + if (tag.length >= 2 && tag[0] == "relay") { + relays.push(tag[1]); + } + } + } + + return relays; + } + getPreferredRelays(user.pubkey).then(relays => { + const relayEntry = document.getElementById('dmRelays'); + relayEntry.value = relays.join("\n"); + }); -- cgit v1.2.3 From 8b8c3cb3af361a34417dddca945dea9022fe1ae1 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Tue, 4 Nov 2025 14:48:29 -0500 Subject: Clarify how to set multiple DM relays --- src/routes/(app)/settings/nostr/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index e84f10f6..fee9885d 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -262,7 +262,7 @@ Preferred DM Relays

- Direct Messages meant for you will be published to these relays. + Direct Messages meant for you will be published to these relays. To get DMs on multiple relays, put each relay URL on its own line.

-- cgit v1.2.3 From 78667b3f97a1e6c4bd7d09b7ff69602e2e771590 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Thu, 6 Nov 2025 16:47:21 -0500 Subject: Add translatability to new DM-related text --- src/locales/en.json | 12 ++++++++++++ src/routes/(app)/dm/[recipient]/+page.svelte | 21 +++++++++------------ src/routes/(app)/settings/nostr/+page.svelte | 4 ++-- 3 files changed, 23 insertions(+), 14 deletions(-) (limited to 'src/routes/(app)/settings') diff --git a/src/locales/en.json b/src/locales/en.json index dd6e29f1..a8b8a06a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -92,6 +92,16 @@ "description": "Over 500 businesses worldwide are accepting bitcoin with Coinos. We hope that yours will be next!" } }, + "dm": { + "header": "Direct Messages", + "recipientMsg": "You are sending nostr messages to [R].", + "sendMessage": "Send Message", + "expiry": "Enable message expiry", + "days": "days", + "relaysNotFound": "Could not find [R]’s DM relays.", + "noRelaysSet": "WARNING: You haven't set any preferred relays. You won't be able to receive any messages or see the messages you've sent.", + "nostrSettingsLink": "Go to your Nostr settings to set your relays." + }, "error": { "header": "Error", "message": "Please try again or contact support.", @@ -337,6 +347,8 @@ "revealNsec": "Reveal secret key", "hideSeed": "Hide seed phrase", "revealSeed": "Reveal seed phrase", + "preferredDM": "Preferred DM Relays", + "preferredDMDescription": "Direct Messages meant for you will be published to these relays. To get DMs on multiple relays, put each relay URL on its own line.", "saveSettings": "Save settings", "bannerImage": "Banner Image", "profileImage": "Profile Image", diff --git a/src/routes/(app)/dm/[recipient]/+page.svelte b/src/routes/(app)/dm/[recipient]/+page.svelte index 35b5221e..26b1907d 100644 --- a/src/routes/(app)/dm/[recipient]/+page.svelte +++ b/src/routes/(app)/dm/[recipient]/+page.svelte @@ -5,6 +5,7 @@ import { SimplePool } from 'nostr-tools/pool'; import * as libnip17 from '$lib/nip17'; import { sign, getPrivateKey } from '$lib/nostr'; + import { t } from "$lib/translations"; let { data } = $props(); const { user, recipient } = data; @@ -22,6 +23,7 @@ let relayWarningShown = $state(false); let expiryEnabled = $state(false); let expiryDays = $state(7); + let canSend = $state(false); const appendMultimap = (map: Map, key: string, value: object) => { if (map.has(key)) { @@ -104,13 +106,8 @@ relayWarningShown = false; loadEvents(relays); }); - getPreferredRelays(recipient.pubkey).then((relays) => { - let sendButton = document.getElementById("send-message"); - if (!relays || relays.length == 0) { - sendButton.disabled = true; - sendButton.value = `Could not find ${recipient.username}'s DM relays.`; - } - }); + getPreferredRelays(recipient.pubkey) + .then((relays) => canSend = relays && relays.length > 0); const sendMessage = async (message: string) => { const expiry = expiryEnabled ? expiryDays : null; @@ -194,8 +191,8 @@

Direct Messages

-

You are sending nostr messages to {recipient.username}.

+ >{$t("dm.header")} +

{$t("dm.recipientMsg").replace("[R]", recipient.username)}

{#each dates as day}

[{new Date(day * 86400 * 1000).toDateString()}]

@@ -210,10 +207,10 @@ - Enable message expiry in days. - sendMessage(text)}> + {$t("dm.expiry")}: {$t("dm.days")}. + sendMessage(text)}> {#if relayWarningShown} -

WARNING: You haven't set any preferred relays. You won't be able to receive any messages or see the messages you've sent. Go to your Nostr settings to set your relays.

+

{$t("dm.noRelaysSet")} {$t("dm.nostrSettingsLink")}

{/if}
diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index fee9885d..8557d522 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -259,10 +259,10 @@ {/if} - Preferred DM Relays + {$t("user.settings.preferredDM")}

- Direct Messages meant for you will be published to these relays. To get DMs on multiple relays, put each relay URL on its own line. + {$t("user.settings.preferredDMDescription")}

-- cgit v1.2.3 From 9b00a8c530314da368a6786997fb69787e2625ba Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Fri, 7 Nov 2025 11:19:12 -0500 Subject: Change relay settings link to anchor --- src/routes/(app)/dm/[recipient]/+page.svelte | 2 +- src/routes/(app)/settings/nostr/+page.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/dm/[recipient]/+page.svelte b/src/routes/(app)/dm/[recipient]/+page.svelte index 7f5d36ad..0f232256 100644 --- a/src/routes/(app)/dm/[recipient]/+page.svelte +++ b/src/routes/(app)/dm/[recipient]/+page.svelte @@ -212,7 +212,7 @@ {$t("dm.expiry")}: {$t("dm.days")}. sendMessage(text)}> {#if relayWarningShown} -

{$t("dm.noRelaysSet")} {$t("dm.nostrSettingsLink")}

+

{$t("dm.noRelaysSet")} {$t("dm.nostrSettingsLink")}

{/if} diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index 8557d522..33ff9a59 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -258,7 +258,7 @@ {/if} - + {$t("user.settings.preferredDM")}

-- cgit v1.2.3 From 9c05ecb697144c3e6299be1158eb4f53d41d3198 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Tue, 18 Nov 2025 10:55:00 -0500 Subject: Separate settings DM URLs by any whitespace --- src/routes/(app)/settings/+layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte index 75827719..ef4b8abf 100644 --- a/src/routes/(app)/settings/+layout.svelte +++ b/src/routes/(app)/settings/+layout.svelte @@ -55,7 +55,7 @@ const relayEntry = document.getElementById('dmRelays'); if (!relayEntry) return; - const newRelays = relayEntry.value.split('\n'); + const newRelays = relayEntry.value.split(/[ \r\n\t]+/); const event = { kind: 10050, created_at: Math.floor(Date.now() / 1000), -- cgit v1.2.3 From 082429c6ebe4cf78d58e9c0249bb8e83271fc778 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Tue, 18 Nov 2025 11:23:39 -0500 Subject: Only put valid URLs in kind-10050 relay tags --- src/locales/en.json | 1 + src/locales/fr.json | 1 + src/routes/(app)/settings/+layout.svelte | 23 +++++++++++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) (limited to 'src/routes/(app)/settings') diff --git a/src/locales/en.json b/src/locales/en.json index 869a6beb..03579132 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -351,6 +351,7 @@ "revealSeed": "Reveal seed phrase", "preferredDM": "Preferred DM Relays", "preferredDMDescription": "Direct Messages meant for you will be published to these relays. To get DMs on multiple relays, put each relay URL on its own line.", + "noDMURLsWarning": "You haven't set any valid relay URLs. You will not be able to use DMs.", "saveSettings": "Save settings", "bannerImage": "Banner Image", "profileImage": "Profile Image", diff --git a/src/locales/fr.json b/src/locales/fr.json index d8533bd7..c891293d 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -250,6 +250,7 @@ "revealSeed": "Montrer la phrase mnémotechnique", "preferredDM": "Relais MD Préferés", "preferredDMDescription": "Messages directs destinés à vous seront publiés à ces relais. Pour obtiendre des messages sur plusieurs relais, met chaque URL sur son propre ligne.", + "noDMURLsWarning": "Vous n'avez pas specifié aucun URL valide. Vous ne pourrez pas utiliser les messages directs.", "notifications": "Notifications de paiement", "notificationsDesc": "Reçevez un email quand un paiement arrive à votre compte", "seedPhrase": "Phrase mnémotechnique", diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte index ef4b8abf..24c54a97 100644 --- a/src/routes/(app)/settings/+layout.svelte +++ b/src/routes/(app)/settings/+layout.svelte @@ -1,4 +1,4 @@ -