diff --git a/src/app/components/Search.svelte b/src/app/components/Search.svelte index 3b792d30..cb9a27a4 100644 --- a/src/app/components/Search.svelte +++ b/src/app/components/Search.svelte @@ -14,7 +14,7 @@ import RelayName from "@app/components/RelayName.svelte" import SearchBody from "@app/components/SearchBody.svelte" import {CONTENT_KINDS} from "@app/content" - import {app, relays, searchRelayLists, user} from "@app/core" + import {app, relays, searchRelayLists, user, userSearchRelayUrls} from "@app/core" import {pushModal} from "@app/modal" import {userSpaceUrls} from "@app/rooms" @@ -38,12 +38,23 @@ Search across all your spaces - + {#snippet empty()} + {@const spaces = $userSpaceUrls.length} + {@const extras = $userSearchRelayUrls.length} +
+

+ Searching {spaces} + {spaces === 1 ? "space" : "spaces"}{#if extras > 0}, plus {extras} + extra {extras === 1 ? "relay" : "relays"} for people{/if}. +

+ +
+ {/snippet} {#snippet badges(event)} {@const url = getSpaceUrl(event)} {#if url} diff --git a/src/app/components/SearchBody.svelte b/src/app/components/SearchBody.svelte index 0212a5ec..6758e9ea 100644 --- a/src/app/components/SearchBody.svelte +++ b/src/app/components/SearchBody.svelte @@ -27,9 +27,10 @@ url?: string members?: string[] badges?: Snippet<[TrustedEvent]> + empty?: Snippet } - const {placeholder, relays, filter, url, members, badges}: Props = $props() + const {placeholder, relays, filter, url, members, badges, empty}: Props = $props() const profileSearch = $profiles.profileSearch @@ -126,42 +127,46 @@ {placeholder} oninput={onInput} /> - {#if people.length > 0} -

People

- {#each people as pubkey (pubkey)} - - {/each} - {/if} - {#if loading} - Searching... - {:else if term && results.length === 0 && people.length === 0} - No results found. - {:else} - {#each eventsByAge as [key, events] (key)} -

- {#if key === "day"} - Last 24 Hours - {:else if key === "week"} - Last 7 Days - {:else} - Older - {/if} -

- {#each events as event (event.id)} - + {#if term} + {#if people.length > 0} +

People

+ {#each people as pubkey (pubkey)} + {/each} - {/each} + {/if} + {#if loading} + Searching... + {:else if results.length === 0 && people.length === 0} + No results found. + {:else} + {#each eventsByAge as [key, events] (key)} +

+ {#if key === "day"} + Last 24 Hours + {:else if key === "week"} + Last 7 Days + {:else} + Older + {/if} +

+ {#each events as event (event.id)} + + {/each} + {/each} + {/if} + {:else} + {@render empty?.()} {/if} diff --git a/src/app/core.ts b/src/app/core.ts index cd1d3c51..8fa48740 100644 --- a/src/app/core.ts +++ b/src/app/core.ts @@ -1,4 +1,4 @@ -import {derived, writable} from "svelte/store" +import {derived, readable, writable} from "svelte/store" import type {Readable} from "svelte/store" import {always} from "@welshman/lib" import type {Maybe} from "@welshman/lib" @@ -59,11 +59,7 @@ const makeApp = (user?: User) => { dufflepudUrl: DUFFLEPUD_URL, getDefaultRelays: always(DEFAULT_RELAYS), getIndexerRelays: always(INDEXER_RELAYS), - getSearchRelays: () => { - const urls = user ? instance.use(SearchRelayLists).urls(user.pubkey).get() : [] - - return urls.length > 0 ? urls : DEFAULT_SEARCH_RELAYS - }, + getSearchRelays: () => userSearchRelayUrls.get(), }, policies: appPolicies, }) @@ -164,6 +160,17 @@ export const thunks = usePlugin(Thunks) export const wot = usePlugin(Wot) export const wraps = usePlugin(Wraps) +// The relays profile search runs against, with a fallback so search still works before the user +// has chosen any of their own. +export const userSearchRelayUrls = withGetter( + derived( + fromApp($app => + $app.user ? $app.use(SearchRelayLists).urls($app.user.pubkey).$ : readable([]), + ), + urls => (urls.length > 0 ? urls : DEFAULT_SEARCH_RELAYS), + ), +) + // The domain entry points, since almost every read or write goes through one of them. export const reader = >( factory: KindFactory,