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 <cursoragent@cursor.com>
This commit is contained in:
2026-05-26 12:59:35 +05:30
parent 6dbe9c0ebb
commit 3d9898f6b2
2 changed files with 13 additions and 4 deletions
+1
View File
@@ -122,6 +122,7 @@
repository.removeEvent(thunk.event.id)
pushToast({theme: "error", message})
} else {
await removeRoomMembership(url, h)
goto(makeSpacePath(url))
}
},
+12 -4
View File
@@ -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<string, number>()
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]},
],
})
}