From 7e45e1b48c382f29c2d3bd114a4751a0f6b89d51 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 6 Mar 2026 08:39:18 -0800 Subject: group chats --- src/routes/(app)/+layout.svelte | 2 + src/routes/(app)/messages/+layout.svelte | 2 +- src/routes/(app)/messages/+page.svelte | 176 +++----- src/routes/(app)/messages/[id]/+page.svelte | 446 ++++++++++++++++++++ src/routes/(app)/messages/[pubkey]/+page.svelte | 520 ------------------------ 5 files changed, 501 insertions(+), 645 deletions(-) create mode 100644 src/routes/(app)/messages/[id]/+page.svelte delete mode 100644 src/routes/(app)/messages/[pubkey]/+page.svelte (limited to 'src/routes') diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index 5a9397b5..6b211563 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -243,6 +243,8 @@ // Auto-unlock nostr key if silent entropy is available import("$lib/seed").then(({ autoUnlockNostr }) => autoUnlockNostr(user.pubkey)); + + // TODO: unread DM badge via MLS } // if (window.NDEFReader) { diff --git a/src/routes/(app)/messages/+layout.svelte b/src/routes/(app)/messages/+layout.svelte index c923768c..18c83d23 100644 --- a/src/routes/(app)/messages/+layout.svelte +++ b/src/routes/(app)/messages/+layout.svelte @@ -10,7 +10,7 @@ let user = $derived(data.user); let w: number | undefined = $state(); - let isDetail = $derived($page.params.pubkey); + let isDetail = $derived($page.params.id); let opacity = $derived((href: string) => $page.url.pathname === href ? "opacity-100" : "opacity-90 hover:opacity-none", diff --git a/src/routes/(app)/messages/+page.svelte b/src/routes/(app)/messages/+page.svelte index 2c3b1eb1..c24a20c8 100644 --- a/src/routes/(app)/messages/+page.svelte +++ b/src/routes/(app)/messages/+page.svelte @@ -1,162 +1,90 @@ -
+
{#if !loaded}
- {:else if chats.length === 0} + {:else if groups.length === 0}

{$t("dm.noChats")}

{:else} - {#each chats as c} - - {#if c.picture} - {name(c)} - {:else} -
- {/if} -
-
{name(c)}
-
{lastMessage(allRumours, c.pubkey)}
+ {#each groups as g} +
+
+ {g.members.length} +
+
+
{groupDisplayName(g)}
+ {#if g.lastMessage} +
{g.lastMessage}
+ {/if}
{/each} diff --git a/src/routes/(app)/messages/[id]/+page.svelte b/src/routes/(app)/messages/[id]/+page.svelte new file mode 100644 index 00000000..d7520c5d --- /dev/null +++ b/src/routes/(app)/messages/[id]/+page.svelte @@ -0,0 +1,446 @@ + + +
+
+

{groupDisplayName(groupInfo)}

+ {#if groupInfo && groupInfo.members.length > 2} + {groupInfo.members.length} members + {/if} +
+ +
+
+ {#each dates as day} +

{formatDate(new Date(day * 86400 * 1000))}

+ {@const dayMessages = messageRumours.get(day) ?? []} +
    + {#each dayMessages as rumour, i (rumour.id)} + {@const showName = i === 0 || dayMessages[i - 1]?.pubkey !== rumour.pubkey} +
  • +
    + {#if showName} +
    {senderName(rumour.pubkey)}
    + {/if} +
    + + + {TIME.format(new Date(rumour.created_at * 1000))} + +
    +
    +
  • + {/each} +
+ {/each} +
+
+ +
+
+ + +
+ {#if sendError} +

{sendError}

+ {/if} +
+
+ + diff --git a/src/routes/(app)/messages/[pubkey]/+page.svelte b/src/routes/(app)/messages/[pubkey]/+page.svelte deleted file mode 100644 index f5402bb1..00000000 --- a/src/routes/(app)/messages/[pubkey]/+page.svelte +++ /dev/null @@ -1,520 +0,0 @@ - - -
- {#if selectedChat} - {@const chatProfile = selectedChat.coinosUsername ? `/${selectedChat.coinosUsername}` : null} - - {#if selectedChat.picture} - {name(selectedChat)} - {/if} -

{name(selectedChat)}

-
- -
-
- {#each dates as day} -

{formatDate(new Date(day * 86400 * 1000))}

- {@const dayMessages = messageRumours.get(day) ?? []} -
    - {#each dayMessages as rumour, i (rumour.id)} - {@const isLastInRun = i === dayMessages.length - 1 || dayMessages[i + 1]?.pubkey !== rumour.pubkey} - {#if rumour.pubkey === user.pubkey && pTagKeys(rumour).includes(selectedChat.pubkey)} -
  • -
    - - - {TIME.format(new Date(rumour.created_at * 1000))} - -
    - {#if isLastInRun && user.picture} - {user.username} - {:else} -
    - {/if} -
  • - {:else if rumour.pubkey === selectedChat.pubkey && pTagKeys(rumour).includes(user.pubkey)} -
  • - {#if isLastInRun && selectedChat.picture} - {name(selectedChat)} - {:else} -
    - {/if} -
    - - - {TIME.format(new Date(rumour.created_at * 1000))} - -
    -
  • - {/if} - {/each} -
- {/each} -
-
- -
-
- - -
- {#if sendError} -

{sendError}

- {/if} -
- {/if} - - {#if relayWarningShown} -

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

- {/if} -
- - -- cgit v1.2.3