fix: deleted rooms persisting in navigation

This commit is contained in:
2026-05-26 12:59:35 +05:30
parent 6dbe9c0ebb
commit b42ba377e5
2 changed files with 25 additions and 5 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))
}
},
+24 -5
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,
@@ -605,12 +608,25 @@ export const roomMetaEventsByIdByUrl = deriveEventsByIdByUrl({
export const roomsByUrl = derived(roomMetaEventsByIdByUrl, roomMetaEventsByIdByUrl => {
const result = new Map<string, Room[]>()
// Build a global set of deleted rooms from the repository directly so that
// deletes are visible even before the tracker has mapped them to a URL.
const deletedByH = new Map<string, number>()
for (const event of repository.query([{kinds: [ROOM_DELETE]}])) {
const h = getRoomDeleteId(event)
if (h) {
deletedByH.set(h, max([deletedByH.get(h), event.created_at]))
}
}
for (const [url, events] of roomMetaEventsByIdByUrl.entries()) {
const [metaEvents, deleteEvents] = partition(spec({kind: ROOM_META}), events.values())
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 +636,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 +667,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]},
],
})
}