forked from coracle/flotilla
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:
@@ -122,6 +122,7 @@
|
|||||||
repository.removeEvent(thunk.event.id)
|
repository.removeEvent(thunk.event.id)
|
||||||
pushToast({theme: "error", message})
|
pushToast({theme: "error", message})
|
||||||
} else {
|
} else {
|
||||||
|
await removeRoomMembership(url, h)
|
||||||
goto(makeSpacePath(url))
|
goto(makeSpacePath(url))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
+12
-4
@@ -5,7 +5,7 @@ import {derived, readable, writable} from "svelte/store"
|
|||||||
import * as nip19 from "nostr-tools/nip19"
|
import * as nip19 from "nostr-tools/nip19"
|
||||||
import {
|
import {
|
||||||
on,
|
on,
|
||||||
gt,
|
gte,
|
||||||
max,
|
max,
|
||||||
spec,
|
spec,
|
||||||
call,
|
call,
|
||||||
@@ -596,6 +596,9 @@ export const splitRoomId = (id: string) => id.split("'")
|
|||||||
export const hasNip29 = (relay?: RelayProfile) =>
|
export const hasNip29 = (relay?: RelayProfile) =>
|
||||||
Boolean(relay?.supported_nips?.map?.(String)?.includes?.("29"))
|
Boolean(relay?.supported_nips?.map?.(String)?.includes?.("29"))
|
||||||
|
|
||||||
|
const getRoomDeleteId = (event: TrustedEvent) =>
|
||||||
|
getTagValue("h", event.tags) || getTagValue("d", event.tags)
|
||||||
|
|
||||||
export const roomMetaEventsByIdByUrl = deriveEventsByIdByUrl({
|
export const roomMetaEventsByIdByUrl = deriveEventsByIdByUrl({
|
||||||
tracker,
|
tracker,
|
||||||
repository,
|
repository,
|
||||||
@@ -610,7 +613,9 @@ export const roomsByUrl = derived(roomMetaEventsByIdByUrl, roomMetaEventsByIdByU
|
|||||||
const deletedByH = new Map<string, number>()
|
const deletedByH = new Map<string, number>()
|
||||||
|
|
||||||
for (const event of deleteEvents) {
|
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]))
|
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) {
|
for (const event of metaEvents) {
|
||||||
const meta = tryCatch(() => readRoomMeta(event))
|
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
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -651,7 +656,10 @@ export const loadRoom = call(() => {
|
|||||||
|
|
||||||
await load({
|
await load({
|
||||||
relays: [url],
|
relays: [url],
|
||||||
filters: [{kinds: [ROOM_META], "#d": [h]}],
|
filters: [
|
||||||
|
{kinds: [ROOM_META], "#d": [h]},
|
||||||
|
{kinds: [ROOM_DELETE], "#h": [h]},
|
||||||
|
],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user