Fix deleted event handling in repository stores
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
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
|
||||
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)
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
TrustedEvent,
|
||||
sortEventsAsc,
|
||||
sortEventsDesc,
|
||||
getIdOrAddress,
|
||||
} from "@welshman/util"
|
||||
import {Repository, RepositoryUpdate, Tracker} from "@welshman/net"
|
||||
import {deriveDeduplicated} from "./misc.js"
|
||||
@@ -88,18 +89,20 @@ export const makeDeriveEvent = ({repository, includeDeleted = false, onDerive}:
|
||||
set(event)
|
||||
|
||||
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) {
|
||||
if (matchFilters(filters, newEvent)) {
|
||||
event = newEvent
|
||||
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) =>
|
||||
readable(false, set => {
|
||||
const idOrAddress = getIdOrAddress(event)
|
||||
|
||||
set(repository.isDeleted(event))
|
||||
|
||||
const unsubscribe = on(repository, "update", ({removed}: RepositoryUpdate) => {
|
||||
return on(repository, "update", ({removed, added}: RepositoryUpdate) => {
|
||||
if (removed.has(event.id)) {
|
||||
set(true)
|
||||
unsubscribe()
|
||||
}
|
||||
|
||||
for (const event of added) {
|
||||
if (getIdOrAddress(event) === idOrAddress) {
|
||||
set(false)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return unsubscribe
|
||||
})
|
||||
|
||||
@@ -13,6 +13,7 @@ export * from "./Nip86.js"
|
||||
export * from "./Nip98.js"
|
||||
export * from "./Pow.js"
|
||||
export * from "./Profile.js"
|
||||
export * from "./Pubkey.js"
|
||||
export * from "./Relay.js"
|
||||
export * from "./Room.js"
|
||||
export * from "./Tags.js"
|
||||
|
||||
Reference in New Issue
Block a user