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 {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)
|
||||||
|
|||||||
@@ -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
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user