Fix deleted event handling in repository stores

This commit is contained in:
Jon Staab
2026-02-03 17:39:00 -08:00
parent c5f3681739
commit debc3080c3
3 changed files with 22 additions and 11 deletions
+3 -1
View File
@@ -1,5 +1,5 @@
import {get, derived, Readable, Unsubscriber, Writable, Subscriber} from "svelte/store" import {get, derived, Readable, Unsubscriber, Writable, Subscriber} from "svelte/store"
import {memoize, equals, throttle} from "@welshman/lib" import {memoize, identity, equals, throttle} from "@welshman/lib"
// Define Stores and StoresValues types locally since they're not exported in Svelte 5 // Define Stores and StoresValues types locally since they're not exported in Svelte 5
type Stores = Readable<any> | [Readable<any>, ...Array<Readable<any>>] | Array<Readable<any>> type Stores = Readable<any> | [Readable<any>, ...Array<Readable<any>>] | Array<Readable<any>>
@@ -109,3 +109,5 @@ export const deriveDeduplicatedByValue = <S extends Stores, T>(
} }
}) })
} }
export const merged = <S extends Stores>(stores: S) => derived(stores, identity)
+18 -10
View File
@@ -7,6 +7,7 @@ import {
TrustedEvent, TrustedEvent,
sortEventsAsc, sortEventsAsc,
sortEventsDesc, sortEventsDesc,
getIdOrAddress,
} from "@welshman/util" } from "@welshman/util"
import {Repository, RepositoryUpdate, Tracker} from "@welshman/net" import {Repository, RepositoryUpdate, Tracker} from "@welshman/net"
import {deriveDeduplicated} from "./misc.js" import {deriveDeduplicated} from "./misc.js"
@@ -88,18 +89,20 @@ export const makeDeriveEvent = ({repository, includeDeleted = false, onDerive}:
set(event) set(event)
return on(repository, "update", ({added, removed}: RepositoryUpdate) => { return on(repository, "update", ({added, removed}: RepositoryUpdate) => {
if (!includeDeleted) {
for (const id of removed) {
if (event?.id === id) {
set(undefined)
}
}
}
for (const newEvent of added) { for (const newEvent of added) {
if (matchFilters(filters, newEvent)) { if (matchFilters(filters, newEvent)) {
event = newEvent event = newEvent
set(event) set(event)
} }
} }
for (const id of removed) {
if (event?.id === id) {
set(undefined)
}
}
}) })
}) })
} }
@@ -504,14 +507,19 @@ export const makeLoadItem = <T>(
export const deriveIsDeleted = (repository: Repository, event: TrustedEvent) => export const deriveIsDeleted = (repository: Repository, event: TrustedEvent) =>
readable(false, set => { readable(false, set => {
const idOrAddress = getIdOrAddress(event)
set(repository.isDeleted(event)) set(repository.isDeleted(event))
const unsubscribe = on(repository, "update", ({removed}: RepositoryUpdate) => { return on(repository, "update", ({removed, added}: RepositoryUpdate) => {
if (removed.has(event.id)) { if (removed.has(event.id)) {
set(true) set(true)
unsubscribe() }
for (const event of added) {
if (getIdOrAddress(event) === idOrAddress) {
set(false)
}
} }
}) })
return unsubscribe
}) })
+1
View File
@@ -13,6 +13,7 @@ export * from "./Nip86.js"
export * from "./Nip98.js" export * from "./Nip98.js"
export * from "./Pow.js" export * from "./Pow.js"
export * from "./Profile.js" export * from "./Profile.js"
export * from "./Pubkey.js"
export * from "./Relay.js" export * from "./Relay.js"
export * from "./Room.js" export * from "./Room.js"
export * from "./Tags.js" export * from "./Tags.js"