aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/settings
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-01-28 22:51:34 -0800
committerAdam Soltys <[email protected]>2026-01-28 22:51:34 -0800
commit568a936e08586b7ac07b4c7adaf5bf9b8ef6ba2f (patch)
tree56a45c92cd37c8ba1d1d794d300af0462c86dbf3 /src/routes/(app)/settings
parent685d085596a1a20d2b5680cf8000313173bbe6fd (diff)
parent838f74effb5b45e545bf68a4659e1e36c14da81f (diff)
downloadcoinos-ui-nip17dm-fixes.tar.gz
coinos-ui-nip17dm-fixes.zip
Merge remote-tracking branch 'origin/nip17dm'nip17dm-fixes
# Conflicts: # .env.sample
Diffstat (limited to 'src/routes/(app)/settings')
-rw-r--r--src/routes/(app)/settings/+layout.svelte45
-rw-r--r--src/routes/(app)/settings/nostr/+page.svelte22
2 files changed, 65 insertions, 2 deletions
diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte
index d0d1a256..e603cbf4 100644
--- a/src/routes/(app)/settings/+layout.svelte
+++ b/src/routes/(app)/settings/+layout.svelte
@@ -1,4 +1,4 @@
-<script>
+<script lang="ts">
import { browser } from "$app/environment";
import { onMount, tick } from "svelte";
import { fly } from "svelte/transition";
@@ -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,47 @@
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(',');
+ const updateRelaysIfAvailable = async () => {
+ const relayEntry = document.getElementById('dmRelays');
+ if (!relayEntry || relayEntry.value.length === 0) return;
+
+ const newRelays = relayEntry.value.split(/[ \r\n\t]+/)
+ .filter(isValidURL);
+ if (newRelays.length === 0) {
+ warning($t("user.settings.noDMURLsWarning"));
+ return;
+ }
+
+ 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));
+ }
+
+ const isValidURL = (url: string) => {
+ try {
+ new URL(url);
+ return true;
+ } catch (err) {
+ return false;
+ }
+ }
+
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 7168f4f7..367f04f5 100644
--- a/src/routes/(app)/settings/nostr/+page.svelte
+++ b/src/routes/(app)/settings/nostr/+page.svelte
@@ -1,4 +1,4 @@
-<script>
+<script lang="ts">
import { untrack } from "svelte";
import { browser } from "$app/environment";
import { getNsec } from "$lib/nostr";
@@ -11,6 +11,7 @@
PUBLIC_COINOS_RELAY as relay,
} from "$env/static/public";
import { signer, save } from "$lib/store";
+ import { getPreferredRelays } from "$lib/nip17";
let { data } = $props();
let { apps, challenge, user } = $derived(data);
@@ -18,6 +19,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 +44,14 @@
await tick();
$save.click();
};
+
+ import { PUBLIC_DM_RELAYS } from '$env/static/public';
+ const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(',');
+ const pool = new SimplePool();
+ getPreferredRelays(user.pubkey).then(relays => {
+ const relayEntry = document.getElementById('dmRelays');
+ relayEntry.value = relays.join("\n");
+ });
</script>
<input type="hidden" name="challenge" value={challenge} />
@@ -231,3 +242,12 @@
{/if}
</div>
{/if}
+
+<span class="font-bold" id="dm-relays">
+ {$t("user.settings.preferredDM")}
+</span>
+<p class="text-secondary mb-1">
+ {$t("user.settings.preferredDMDescription")}
+</p>
+
+<textarea id="dmRelays" name="dmRelays" rows={3}></textarea>