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 {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)
+18 -10
View File
@@ -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
})