From 7217d122b5ad47cd3b6eac1fc50ecaf4b7ce4922 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 5 Sep 2025 17:20:12 -0700 Subject: [PATCH] Re-work invite links --- src/app/components/RelayName.svelte | 2 +- src/app/components/RelaySummary.svelte | 55 ++++++++++ src/app/components/SpaceInvite.svelte | 10 +- src/app/components/SpaceInviteAccept.svelte | 111 ++++++++++---------- src/app/core/requests.ts | 4 +- src/app/core/state.ts | 21 +++- src/lib/components/Field.svelte | 2 +- src/routes/discover/+page.svelte | 71 ++----------- src/routes/join/+page.svelte | 19 ++++ src/routes/people/+page.svelte | 6 +- 10 files changed, 168 insertions(+), 133 deletions(-) create mode 100644 src/app/components/RelaySummary.svelte create mode 100644 src/routes/join/+page.svelte diff --git a/src/app/components/RelayName.svelte b/src/app/components/RelayName.svelte index 560a881..302d8ff 100644 --- a/src/app/components/RelayName.svelte +++ b/src/app/components/RelayName.svelte @@ -3,7 +3,7 @@ const {url} = $props() - const display = deriveRelayDisplay(url) + const display = $derived(deriveRelayDisplay(url)) {$display} diff --git a/src/app/components/RelaySummary.svelte b/src/app/components/RelaySummary.svelte new file mode 100644 index 0000000..46c4109 --- /dev/null +++ b/src/app/components/RelaySummary.svelte @@ -0,0 +1,55 @@ + + +
+
+
+
+
+
+ {#if $relay?.profile?.icon} + + {:else} + + {/if} +
+
+ {#if $userRoomsByUrl.has(url)} +
+ +
+ {/if} +
+
+

+ +

+

{url}

+
+
+ +
+ {#if gt($membersByUrl.get(url)?.size, 0)} +
+ Members: + +
+ {/if} +
diff --git a/src/app/components/SpaceInvite.svelte b/src/app/components/SpaceInvite.svelte index 7aaf83a..4d22071 100644 --- a/src/app/components/SpaceInvite.svelte +++ b/src/app/components/SpaceInvite.svelte @@ -1,6 +1,6 @@ @@ -75,46 +80,40 @@
Join a Space
{/snippet} {#snippet info()} -
Enter a relay URL below to join an existing space.
+
Enter a relay URL or invite link below to join an existing space.
{/snippet} {#snippet label()} -

Relay URL*

+

Invite Link*

{/snippet} {#snippet input()} {/snippet} - {#snippet info()} -

- Enter the URL of the relay that hosts the space you'd like to join. - -

- {/snippet} -
- - {#snippet label()} -

Invite Code (optional)

- {/snippet} - {#snippet input()} - - {/snippet} - {#snippet info()} -

If you have an invite code, enter it here to get access.

- {/snippet}
+
+ {#if inviteData} +
+
+

You're about to join:

+ +
+
+ {/if} +
- - + {/if} + diff --git a/src/app/core/requests.ts b/src/app/core/requests.ts index ce6fc65..e821e64 100644 --- a/src/app/core/requests.ts +++ b/src/app/core/requests.ts @@ -59,7 +59,7 @@ import {daysBetween} from "@lib/util" import { NOTIFIER_RELAY, INDEXER_RELAYS, - getDefaultPubkeys, + defaultPubkeys, userRoomsByUrl, getUrlsForEvent, loadMembership, @@ -416,7 +416,7 @@ export const loadUserData = async (pubkey: string, relays: string[] = []) => { // Load followed profiles slowly in the background without clogging other stuff up. Only use a single // indexer relay to avoid too many redundant validations, which slow things down and eat bandwidth promise.then(async () => { - for (const pubkeys of chunk(50, getDefaultPubkeys())) { + for (const pubkeys of chunk(50, get(defaultPubkeys))) { const relays = sample(1, INDEXER_RELAYS) await sleep(1000) diff --git a/src/app/core/state.ts b/src/app/core/state.ts index 5699de9..8bc75cf 100644 --- a/src/app/core/state.ts +++ b/src/app/core/state.ts @@ -191,12 +191,12 @@ export const entityLink = (entity: string) => `https://coracle.social/${entity}` export const pubkeyLink = (pubkey: string, relays = Router.get().FromPubkeys([pubkey]).getUrls()) => entityLink(nip19.nprofileEncode({pubkey, relays})) -export const getDefaultPubkeys = () => { +export const defaultPubkeys = derived(userFollows, $userFollows => { const appPubkeys = DEFAULT_PUBKEYS.split(",") - const userPubkeys = shuffle(getPubkeyTagValues(getListTags(get(userFollows)))) + const userPubkeys = shuffle(getPubkeyTagValues(getListTags($userFollows))) return userPubkeys.length > 5 ? userPubkeys : [...userPubkeys, ...appPubkeys] -} +}) const failedUnwraps = new Set() @@ -459,6 +459,21 @@ export const { load: makeOutboxLoader(ROOMS), }) +export const membersByUrl = derived( + [defaultPubkeys, membershipsByPubkey], + ([$defaultPubkeys, $membershipsByPubkey]) => { + const $membersByUrl = new Map>() + + for (const pubkey of $defaultPubkeys) { + for (const url of getMembershipUrls($membershipsByPubkey.get(pubkey))) { + addToMapKey($membersByUrl, url, pubkey) + } + } + + return $membersByUrl + }, +) + // Chats export const chatMessages = deriveEvents(repository, { diff --git a/src/lib/components/Field.svelte b/src/lib/components/Field.svelte index a2f31f1..1b3e7e4 100644 --- a/src/lib/components/Field.svelte +++ b/src/lib/components/Field.svelte @@ -27,7 +27,7 @@ {@render input?.()} {#if info} -

+

{@render info()}

{/if} diff --git a/src/routes/discover/+page.svelte b/src/routes/discover/+page.svelte index f472009..a0c81ee 100644 --- a/src/routes/discover/+page.svelte +++ b/src/routes/discover/+page.svelte @@ -1,6 +1,6 @@ + + + + {#snippet abortAction()} + + {/snippet} + + diff --git a/src/routes/people/+page.svelte b/src/routes/people/+page.svelte index 4b82e8f..055dc51 100644 --- a/src/routes/people/+page.svelte +++ b/src/routes/people/+page.svelte @@ -6,15 +6,13 @@ import Page from "@lib/components/Page.svelte" import ContentSearch from "@lib/components/ContentSearch.svelte" import PeopleItem from "@app/components/PeopleItem.svelte" - import {getDefaultPubkeys} from "@app/core/state" - - const defaultPubkeys = getDefaultPubkeys() + import {defaultPubkeys} from "@app/core/state" let term = $state("") let limit = $state(10) let element: Element | undefined = $state() - const pubkeys = $derived(term ? $profileSearch.searchValues(term) : defaultPubkeys) + const pubkeys = $derived(term ? $profileSearch.searchValues(term) : $defaultPubkeys) onMount(() => { const scroller = createScroller({