aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrien Hopkins <[email protected]>2026-01-06 11:33:22 -0500
committerAdrien Hopkins <[email protected]>2026-01-06 11:33:22 -0500
commit8b2179ca8cbda0dca18dd5a52a8b94514ba6160b (patch)
tree34ccfd5fe3838cf4b7271797562d7e0e6625e000
parentff442a41f26b37832a67df760497bd7da742eb45 (diff)
downloadcoinos-ui-8b2179ca8cbda0dca18dd5a52a8b94514ba6160b.tar.gz
coinos-ui-8b2179ca8cbda0dca18dd5a52a8b94514ba6160b.zip
Add links to shared dm page
-rw-r--r--src/components/Menu.svelte1
-rw-r--r--src/locales/en.json1
-rw-r--r--src/locales/fr.json1
-rw-r--r--src/routes/(app)/[username]/(profile)/+layout.svelte2
-rw-r--r--src/routes/(app)/dm/+page.svelte36
5 files changed, 30 insertions, 11 deletions
diff --git a/src/components/Menu.svelte b/src/components/Menu.svelte
index e433fefb..49e477a1 100644
--- a/src/components/Menu.svelte
+++ b/src/components/Menu.svelte
@@ -16,6 +16,7 @@
// icon: "ph:storefront-bold",
// href: `https://coinosmerch.com`,
// },
+ { key: "nav.dm", icon: "ph:chat-bold", href: `/dm` },
{ key: "nav.dark", icon: "ph:moon-stars-bold", href: `/dark` },
{ key: "nav.signOut", icon: "ph:sign-out-bold", href: `/logout` },
];
diff --git a/src/locales/en.json b/src/locales/en.json
index 03579132..670fa97b 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -227,6 +227,7 @@
"light": "Light",
"about": "About",
"docs": "Docs",
+ "dm": "Nostr Messages",
"messages": "Messages",
"funds": "Funds",
"map": "Map",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index c891293d..da56df68 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -150,6 +150,7 @@
"merch": "Marchandise",
"about": "À Propos",
"docs": "Documents",
+ "dm": "Messages Nostr",
"messages": "Messages",
"funds": "Fonds",
"dark": "Sombre",
diff --git a/src/routes/(app)/[username]/(profile)/+layout.svelte b/src/routes/(app)/[username]/(profile)/+layout.svelte
index 8ce4150c..515dba5d 100644
--- a/src/routes/(app)/[username]/(profile)/+layout.svelte
+++ b/src/routes/(app)/[username]/(profile)/+layout.svelte
@@ -142,7 +142,7 @@
</a>
{:else}
<a
- href="/dm/{subject.username}"
+ href="/dm?username={subject.username}"
class="btn contents"
aria-label="Direct Message"
>
diff --git a/src/routes/(app)/dm/+page.svelte b/src/routes/(app)/dm/+page.svelte
index 171f9a62..7578c27c 100644
--- a/src/routes/(app)/dm/+page.svelte
+++ b/src/routes/(app)/dm/+page.svelte
@@ -1,5 +1,5 @@
<script lang="ts">
- import { tick } from "svelte";
+ import { tick, onMount } from "svelte";
import Icon from "$comp/Icon.svelte";
import { isValid, queryProfile } from "nostr-tools/nip05";
@@ -143,30 +143,41 @@
updateEvents();
}
- const newChatUsername = async (username: string) => {
+ const selectChatUsername = async (username: string) => {
const response = await fetch(`/api/users/${username}`);
if (!response.ok) {
alert("Invalid username");
return;
}
const coinosUserInfo = await response.json();
- newChatPubkey(coinosUserInfo.pubkey);
+ selectChatPubkey(coinosUserInfo.pubkey);
}
- const newChatNip05 = async (nip05: string) => {
+ const selectChatNip05 = async (nip05: string) => {
const response = await queryProfile(nip05);
if (response == null) {
alert("Invalid nip-05");
return;
}
- newChatPubkey(response.pubkey);
+ selectChatPubkey(response.pubkey);
}
- const newChatPubkey = async (pubkey: string) => {
+ const selectChatPubkey = async (pubkey: string) => {
selectChat(await userInfo(pubkey));
creatingNewChat = false;
}
+ onMount(() => {
+ const urlParams = new URLSearchParams(window.location.search);
+ if (urlParams.get('username')) {
+ selectChatUsername(urlParams.get('username'));
+ } else if (urlParams.get('nip05')) {
+ selectChatNip05(urlParams.get('nip05'));
+ } else if (urlParams.get('pubkey')) {
+ selectChatPubkey(urlParams.get('pubkey'));
+ }
+ });
+
const appendMultimap = (map: Map, key: string, value: object) => {
if (map.has(key)) {
map.get(key).push(value);
@@ -385,16 +396,16 @@
</button>
{/each}
{:else if searchQuery !== ""}
- <button class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => newChatUsername(searchQuery)}>
+ <button class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => selectChatUsername(searchQuery)}>
<span class="text-xl">Find by username</span>
</button>
{#if searchQuery.includes(".")}
- <button class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => newChatNip05(searchQuery)}>
+ <button class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => selectChatNip05(searchQuery)}>
<span class="text-xl">Find by NIP-05</span>
</button>
{/if}
{#if searchQuery.length === 64 || searchQuery.slice(0, 4) === "npub"}
- <button class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => newChatPubkey(searchQuery)}>
+ <button class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => selectChatPubkey(searchQuery)}>
<span class="text-xl">Find by pubkey</span>
</button>
{/if}
@@ -406,7 +417,12 @@
>{$t("dm.header")}</h1>
{#if selectedChat}
- <h1><a class="text-3xl" href="/{selectedChat.username}">{name(selectedChat)}</a>
+ <h1>
+ {#if selectedChat.coinosUsername}
+ <a class="text-3xl" href="/{selectedChat.coinosUsername}">{name(selectedChat)}</a>
+ {:else}
+ <span class="text-3xl">{name(selectedChat)}</span>
+ {/if}
<span class={"secondary timestamp text-small" + (idValid(selectedChat) ? "" : " invalid")} title="{npubEncode(selectedChat.pubkey)}">{id(selectedChat)}</span>
</h1>