From 3d9898f6b2b51f0cebcd5cbbc3061e3e08f0f8e6 Mon Sep 17 00:00:00 2001 From: userAdityaa Date: Tue, 26 May 2026 12:59:35 +0530 Subject: [PATCH] Fix deleted rooms persisting in navigation Rooms were staying in the sidebar after deletion because the timestamp comparison used gt (strictly greater than). When the relay generates a ROOM_DELETE event at the same timestamp as the ROOM_META, gt returns false and the room survives the filter. Switch to gte so equal timestamps correctly suppress the room. Also fetch ROOM_DELETE events alongside ROOM_META in loadRoom so that direct navigation to a deleted room picks up the delete, and remove the room from the user's group list on successful deletion so it drops out of favorites immediately. Co-authored-by: Cursor --- src/app/components/RoomDetail.svelte | 1 + src/app/core/state.ts | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/app/components/RoomDetail.svelte b/src/app/components/RoomDetail.svelte index 3115b3d5..03378fd5 100644 --- a/src/app/components/RoomDetail.svelte +++ b/src/app/components/RoomDetail.svelte @@ -122,6 +122,7 @@ repository.removeEvent(thunk.event.id) pushToast({theme: "error", message}) } else { + await removeRoomMembership(url, h) goto(makeSpacePath(url)) } }, diff --git a/src/app/core/state.ts b/src/app/core/state.ts index 0496d655..a6e8249e 100644 --- a/src/app/core/state.ts +++ b/src/app/core/state.ts @@ -5,7 +5,7 @@ import {derived, readable, writable} from "svelte/store" import * as nip19 from "nostr-tools/nip19" import { on, - gt, + gte, max, spec, call, @@ -596,6 +596,9 @@ export const splitRoomId = (id: string) => id.split("'") export const hasNip29 = (relay?: RelayProfile) => Boolean(relay?.supported_nips?.map?.(String)?.includes?.("29")) +const getRoomDeleteId = (event: TrustedEvent) => + getTagValue("h", event.tags) || getTagValue("d", event.tags) + export const roomMetaEventsByIdByUrl = deriveEventsByIdByUrl({ tracker, repository, @@ -610,7 +613,9 @@ export const roomsByUrl = derived(roomMetaEventsByIdByUrl, roomMetaEventsByIdByU const deletedByH = new Map() for (const event of deleteEvents) { - for (const h of getTagValues("h", event.tags)) { + const h = getRoomDeleteId(event) + + if (h) { deletedByH.set(h, max([deletedByH.get(h), event.created_at])) } } @@ -620,7 +625,7 @@ export const roomsByUrl = derived(roomMetaEventsByIdByUrl, roomMetaEventsByIdByU for (const event of metaEvents) { const meta = tryCatch(() => readRoomMeta(event)) - if (!meta || gt(deletedByH.get(meta.h), meta.event.created_at)) { + if (!meta || gte(deletedByH.get(meta.h), meta.event.created_at)) { continue } @@ -651,7 +656,10 @@ export const loadRoom = call(() => { await load({ relays: [url], - filters: [{kinds: [ROOM_META], "#d": [h]}], + filters: [ + {kinds: [ROOM_META], "#d": [h]}, + {kinds: [ROOM_DELETE], "#h": [h]}, + ], }) }