From 07660c9d44d76ab7d3b0f02ca6875db3131d92f3 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 30 Oct 2025 15:52:24 -0700 Subject: [PATCH] Re-work rooms derivation --- src/app/components/RoomNameWithImage.svelte | 2 +- src/app/core/state.ts | 75 ++++++++++----------- src/routes/spaces/[relay]/[h]/+page.svelte | 6 +- 3 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/app/components/RoomNameWithImage.svelte b/src/app/components/RoomNameWithImage.svelte index 0ffc80e..a867628 100644 --- a/src/app/components/RoomNameWithImage.svelte +++ b/src/app/components/RoomNameWithImage.svelte @@ -22,7 +22,7 @@ {:else} Room icon {/if} -{:else if $room?.closed || $room?.private} +{:else if $room?.isClosed || $room?.isPrivate} {:else} diff --git a/src/app/core/state.ts b/src/app/core/state.ts index 39d36a0..e1abff8 100644 --- a/src/app/core/state.ts +++ b/src/app/core/state.ts @@ -4,6 +4,8 @@ import {get, derived, writable} from "svelte/store" import * as nip19 from "nostr-tools/nip19" import { on, + gt, + max, spec, call, first, @@ -17,7 +19,6 @@ import { pushToMapKey, shuffle, parseJson, - fromPairs, memoize, addToMapKey, identity, @@ -88,7 +89,6 @@ import { getPubkeyTagValues, getRelaysFromList, getRelayTagValues, - getTag, getTagValue, getTagValues, isRelayUrl, @@ -97,8 +97,16 @@ import { readList, RelayMode, verifyEvent, + readRoomMeta, +} from "@welshman/util" +import type { + TrustedEvent, + RelayProfile, + PublishedList, + PublishedRoomMeta, + List, + Filter, } from "@welshman/util" -import type {TrustedEvent, RelayProfile, PublishedList, List, Filter} from "@welshman/util" import {decrypt} from "@welshman/signer" import {routerContext, Router} from "@welshman/router" import { @@ -534,16 +542,9 @@ export const chatSearch = derived(chats, $chats => export const messages = deriveEvents(repository, {filters: [{kinds: [MESSAGE]}]}) -export type Room = { +export type Room = PublishedRoomMeta & { id: string url: string - h: string - name: string - event: TrustedEvent - closed: boolean - private: boolean - picture?: string - about?: string } export const makeRoomId = (url: string, h: string) => `${url}'${h}` @@ -553,39 +554,37 @@ export const splitRoomId = (id: string) => id.split("'") export const hasNip29 = (relay?: RelayProfile) => relay?.supported_nips?.map?.(String)?.includes?.("29") +export const roomMetas = deriveEventsMapped(repository, { + filters: [{kinds: [ROOM_META]}], + itemToEvent: item => item.event, + eventToItem: readRoomMeta, +}) + +export const roomDeletes = deriveEvents(repository, { + filters: [{kinds: [ROOM_DELETE]}], +}) + export const rooms = derived( - [deriveEvents(repository, {filters: [{kinds: [ROOM_META, ROOM_DELETE]}]}), getUrlsForEvent], - ([$events, $getUrlsForEvent]) => { + [roomMetas, roomDeletes, getUrlsForEvent], + ([$roomMetas, $roomDeletes, $getUrlsForEvent]) => { const result = new Map() + const deletedByH = new Map() - for (const event of sortBy(e => e.created_at, $events)) { - for (const url of $getUrlsForEvent(event.id)) { - if (event.kind === ROOM_META) { - const meta = fromPairs(event.tags) - const h = meta.d + for (const event of $roomDeletes) { + for (const h of getTagValues("h", event.tags)) { + deletedByH.set(h, max([deletedByH.get(h), event.created_at])) + } + } - if (h) { - const id = makeRoomId(url, h) + for (const meta of $roomMetas) { + if (gt(deletedByH.get(meta.h), meta.event.created_at)) { + continue + } - result.set(id, { - id, - url, - h, - event, - name: meta.name || h, - closed: Boolean(getTag("closed", event.tags)), - private: Boolean(getTag("private", event.tags)), - picture: meta.picture, - about: meta.about, - }) - } - } + for (const url of $getUrlsForEvent(meta.event.id)) { + const id = makeRoomId(url, meta.h) - if (event.kind === ROOM_DELETE) { - for (const h of getTagValues("h", event.tags)) { - result.delete(makeRoomId(url, h)) - } - } + result.set(id, {...meta, url, id}) } } diff --git a/src/routes/spaces/[relay]/[h]/+page.svelte b/src/routes/spaces/[relay]/[h]/+page.svelte index 1296787..a7483d1 100644 --- a/src/routes/spaces/[relay]/[h]/+page.svelte +++ b/src/routes/spaces/[relay]/[h]/+page.svelte @@ -386,7 +386,7 @@
- {#if $room?.private && $membershipStatus !== MembershipStatus.Granted} + {#if $room?.isPrivate && $membershipStatus !== MembershipStatus.Granted}

You aren't currently a member of this room.

@@ -450,9 +450,9 @@
- {#if $room?.private && $membershipStatus !== MembershipStatus.Granted} + {#if $room?.isPrivate && $membershipStatus !== MembershipStatus.Granted} - {:else if $room?.closed && $membershipStatus !== MembershipStatus.Granted} + {:else if $room?.isClosed && $membershipStatus !== MembershipStatus.Granted}

Only members are allowed to post to this room.

{#if $membershipStatus === MembershipStatus.Pending}