From bc9fd03d02b0fd5883cfac42ef50f4a5b0471015 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Sat, 7 Mar 2026 14:19:36 -0500 Subject: Prioritize matches at beginning of name --- src/routes/(app)/dm/+page.svelte | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'src') diff --git a/src/routes/(app)/dm/+page.svelte b/src/routes/(app)/dm/+page.svelte index caf74d2c..fa5a18a8 100644 --- a/src/routes/(app)/dm/+page.svelte +++ b/src/routes/(app)/dm/+page.svelte @@ -300,18 +300,36 @@ return chatName.includes(lowerQuery); } + const nameStartsWith = (chat: object, query: string) => { + const lowerQuery = query.toLowerCase(); + const chatName = name(chat).toLowerCase(); + return chatName.startsWith(lowerQuery); + } + const nip05Matches = (chat: object, query: string) => { const lowerQuery = query.toLowerCase(); const chatNip05 = chat?.nip05; return chatNip05 && chatNip05.includes(lowerQuery); } + const nip05StartsWith = (chat: object, query: string) => { + const lowerQuery = query.toLowerCase(); + const chatNip05 = chat?.nip05; + return chatNip05 && chatNip05.startsWith(lowerQuery); + } + const pubkeyMatches = (chat: object, query: string) => { const lowerQuery = query.toLowerCase(); return chat.pubkey.includes(lowerQuery) || npubEncode(chat.pubkey).includes(lowerQuery); } + const pubkeyStartsWith = (chat: object, query: string) => { + const lowerQuery = query.toLowerCase(); + return chat.pubkey.startsWith(lowerQuery) || + npubEncode(chat.pubkey).startsWith(lowerQuery); + } + const searchMatches = (chat: object, query: string) => nameMatches(chat, query) || nip05Matches(chat, query) || pubkeyMatches(chat, query); @@ -324,6 +342,14 @@ // Generates and returns a comparator based on a search query const searchCompare = (query: string) => (a, b) => { + const aNameStartsWith = nameStartsWith(a, query); + const bNameStartsWith = nameStartsWith(b, query); + if (aNameStartsWith && !bNameStartsWith) { + return -1; + } else if (!aNameStartsWith && bNameStartsWith) { + return 1; + } + const aNameMatches = nameMatches(a, query); const bNameMatches = nameMatches(b, query); if (aNameMatches && !bNameMatches) { @@ -332,6 +358,14 @@ return 1; } + const aNip05StartsWith = nip05StartsWith(a, query); + const bNip05StartsWith = nip05StartsWith(b, query); + if (aNip05StartsWith && !bNip05StartsWith) { + return -1; + } else if (!aNip05StartsWith && bNip05StartsWith) { + return 1; + } + const aNip05Matches = nip05Matches(a, query); const bNip05Matches = nip05Matches(b, query); if (aNip05Matches && !bNip05Matches) { @@ -340,6 +374,14 @@ return 1; } + const aPubkeyStartsWith = pubkeyStartsWith(a, query); + const bPubkeyStartsWith = pubkeyStartsWith(b, query); + if (aPubkeyStartsWith && !bPubkeyStartsWith) { + return -1; + } else if (!aPubkeyStartsWith && bPubkeyStartsWith) { + return 1; + } + const aPubkeyMatches = pubkeyMatches(a, query); const bPubkeyMatches = pubkeyMatches(b, query); if (aPubkeyMatches && !bPubkeyMatches) { -- cgit v1.2.3