aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdrien Hopkins <[email protected]>2025-10-01 11:13:09 -0500
committerAdrien Hopkins <[email protected]>2025-10-01 11:13:09 -0500
commit2f2348f459e3b6683284975e63df356e8c821bdc (patch)
tree116ac01326052ff5ee5e375f2e93ff8f6ec66c25 /src
parent48d2cac1abf64d549cf10c18c90b875a086c575f (diff)
downloadcoinos-ui-2f2348f459e3b6683284975e63df356e8c821bdc.tar.gz
coinos-ui-2f2348f459e3b6683284975e63df356e8c821bdc.zip
Fetch & display received DMs from relays
Diffstat (limited to 'src')
-rw-r--r--src/lib/nip17.ts6
-rw-r--r--src/routes/(app)/dm/[recipient]/+page.svelte27
2 files changed, 21 insertions, 12 deletions
diff --git a/src/lib/nip17.ts b/src/lib/nip17.ts
index 84790275..495f897e 100644
--- a/src/lib/nip17.ts
+++ b/src/lib/nip17.ts
@@ -79,13 +79,11 @@ const giftWrap = (event: object, receiverPK: string) => {
return finalizeEvent(giftWrapEvent, secretKey);
}
-export const decryptNIP17MessageNIP07 = async (text: string): string => {
- const wrapped = JSON.parse(text);
+export const decryptNIP17MessageNIP07 = async (wrapped: object): object => {
const sealedText = await window.nostr.nip44.decrypt(
wrapped.pubkey, wrapped.content);
const sealed = JSON.parse(sealedText);
const rumourText = await window.nostr.nip44.decrypt(
sealed.pubkey, sealed.content);
- const rumour = JSON.parse(rumourText);
- return rumour.content;
+ return JSON.parse(rumourText);
}
diff --git a/src/routes/(app)/dm/[recipient]/+page.svelte b/src/routes/(app)/dm/[recipient]/+page.svelte
index 4f02829d..971c0cd5 100644
--- a/src/routes/(app)/dm/[recipient]/+page.svelte
+++ b/src/routes/(app)/dm/[recipient]/+page.svelte
@@ -12,8 +12,16 @@
const pool = new SimplePool();
import { PUBLIC_DM_RELAYS } from '$env/static/public';
const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(',');
+ const DM_FETCH_LIMIT = 256;
let text = $state("");
+ let events = $state([]);
+
+ pool.querySync(DM_RELAYS_LIST,
+ { kinds: [1059], "#p": [user.pubkey], limit: DM_FETCH_LIMIT })
+ .then(wrapped =>
+ Promise.all(wrapped.map(decryptMessage))
+ .then(rumours => events = rumours));
const btnCreateMessage = async () => {
let event;
@@ -28,15 +36,12 @@
await Promise.any(pool.publish(DM_RELAYS_LIST, event));
}
- const btnDecryptMessage = async () => {
+ const decryptMessage = async (event: object): object => {
if (window.nostr) {
- text = await libnip17.decryptNIP17MessageNIP07(text);
+ return await libnip17.decryptNIP17MessageNIP07(event);
} else {
- // TODO get events from relays instead of the text box
- const wrapped = JSON.parse(text);
const sk = await getPrivateKey(user);
- const rumour = toolsnip17.unwrapEvent(wrapped, sk);
- text = rumour.content;
+ return toolsnip17.unwrapEvent(event, sk);
}
}
</script>
@@ -56,9 +61,15 @@
>Direct Messages</h1>
<p>You are sending nostr messages to {recipient.username}.</p>
+ <p>Received Messages:</p>
+ <ul>
+ {#each events as evt}
+ <li>{new Date(evt.created_at * 1000)}: &quot;{evt.content}&quot;</li>
+ {/each}
+ </ul>
+
<textarea id="message-contents" bind:value={text}></textarea>
- <input type="button" class="btn" value="Generate Message" on:click={btnCreateMessage}>
- <input type="button" class="btn" value="Decrypt Message" on:click={btnDecryptMessage}>
+ <input type="button" class="btn" value="Send Message" on:click={btnCreateMessage}>
</div>
</div>