Match pending sends by a send id the server echoes
This commit is contained in:
@@ -88,6 +88,7 @@ final class Store {
|
||||
@ObservationIgnored private var leadStream: EventStream?
|
||||
@ObservationIgnored private var stopped = false
|
||||
@ObservationIgnored var changesMemory = ChangesMemory()
|
||||
@ObservationIgnored private var localSends: [String: LocalSends] = [:]
|
||||
|
||||
init(api: API, images: ImageDrafts, forwards: Forwards) {
|
||||
self.api = api
|
||||
@@ -98,6 +99,22 @@ final class Store {
|
||||
remote = Remote(api: api)
|
||||
}
|
||||
|
||||
func sends(_ key: String) -> LocalSends {
|
||||
if let sends = localSends[key] {
|
||||
return sends
|
||||
}
|
||||
let sends = LocalSends()
|
||||
localSends[key] = sends
|
||||
return sends
|
||||
}
|
||||
|
||||
private func confirmSend(_ key: String, _ ev: ByreEvent) {
|
||||
guard ev.kind == "user.queued" || ev.kind == "user.message", let sendID = str(ev.payload.value, "send_id") else {
|
||||
return
|
||||
}
|
||||
localSends[key]?.items.removeAll { $0.sendID == sendID }
|
||||
}
|
||||
|
||||
func stop() async {
|
||||
stopped = true
|
||||
globalStream?.stop()
|
||||
@@ -569,6 +586,7 @@ final class Store {
|
||||
leadMore = page.more
|
||||
leadStream = EventStream(api: api, after: page.events.last?.seq ?? 0, lead: true, onEvent: { [weak self] ev in
|
||||
self?.leadFeed.push(ev)
|
||||
self?.confirmSend("lead", ev)
|
||||
}, onState: { _ in }, onReady: { [weak self] in
|
||||
self?.leadFeed.load(page.events)
|
||||
})
|
||||
@@ -603,6 +621,7 @@ final class Store {
|
||||
func handleEvent(_ ev: ByreEvent) {
|
||||
if let taskId = ev.taskId {
|
||||
taskFeeds[taskId]?.push(ev)
|
||||
confirmSend(taskId, ev)
|
||||
}
|
||||
if ev.seq == 0 {
|
||||
events.send(ev)
|
||||
|
||||
Reference in New Issue
Block a user