From 07c2d1afc6d8512fda97ce5c74c44dade1ddb218 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 6 Mar 2026 17:14:31 -0800 Subject: MLS user search on /messages Co-Authored-By: Claude Opus 4.6 --- src/routes/(app)/messages/+page.svelte | 57 +++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 11 deletions(-) (limited to 'src/routes') diff --git a/src/routes/(app)/messages/+page.svelte b/src/routes/(app)/messages/+page.svelte index f9f59bb1..1981b5f1 100644 --- a/src/routes/(app)/messages/+page.svelte +++ b/src/routes/(app)/messages/+page.svelte @@ -3,12 +3,14 @@ import { getGroups, subscribeToMessages, fetchGroupHistory, - resolveUser, displayName, + searchMlsUsers, preloadMlsUsers, resolveUser, displayName, } from "$lib/messaging"; import type { GroupInfo } from "$lib/messaging"; import { t } from "$lib/translations"; import Avatar from "$comp/Avatar.svelte"; + const focus = (el: HTMLElement) => el.focus(); + let { data } = $props(); const user = $derived(data.user); @@ -22,6 +24,15 @@ let loaded = $state(false); let memberInfos = $state(new Map()); + // Search state + let query = $state(""); + let searchResults: any[] = $state([]); + + const onSearchInput = async () => { + if (!query.trim()) { searchResults = []; return; } + searchResults = (await searchMlsUsers(query)).filter((u) => u.pubkey !== user.pubkey); + }; + const otherMembers = (g: GroupInfo) => g.members.filter((pk) => pk !== user.pubkey); const groupDisplayName = (g: GroupInfo): string => { @@ -50,30 +61,54 @@ } }; - const loadGroups = async () => { - await fetchGroupHistory(user); + const refreshGroups = async () => { const allGroups = await getGroups(user); groups = allGroups.filter((g) => g.members.includes(user.pubkey)); resolveMembers(groups); - loaded = true; }; let closeSub: (() => void) | undefined; onMount(() => { - loadGroups(); - subscribeToMessages(user, async () => { - const allGroups = await getGroups(user); - groups = allGroups.filter((g) => g.members.includes(user.pubkey)); - resolveMembers(groups); - }).then((close) => (closeSub = close)); + // Show cached groups immediately, then fetch history in background + refreshGroups().then(() => { loaded = true; }); + fetchGroupHistory(user).then(refreshGroups); + preloadMlsUsers(); + subscribeToMessages(user, refreshGroups).then((close) => (closeSub = close)); }); onDestroy(() => closeSub?.());
- {#if !loaded} + + + {#if query.trim()} + {#if searchResults.length === 0} +

{$t("dm.noResults")}

+ {:else} + {#each searchResults as u} + +
+ +
+
+
{u.name || u.pubkey.slice(0, 12) + "…"}
+ {#if u.nip05} +
{u.nip05}
+ {/if} +
+
+ {/each} + {/if} + {:else if !loaded}
{:else if groups.length === 0}

{$t("dm.noChats")}

-- cgit v1.2.3