Skip to content

Commit 5a3617a

Browse files
committed
Fix dropped Worktrunk refresh reruns
1 parent f26b07f commit 5a3617a

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

macos/Sources/Features/Worktrunk/WorktrunkStore.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ final class WorktrunkStore: ObservableObject {
309309
private var lastAppQuitTimestamp: Date?
310310
private var sidebarModelRevisionCounter: Int = 0
311311
private var refreshAllTask: Task<Void, Never>?
312+
private var refreshAllTaskGeneration: UInt64 = 0
312313
private var refreshAllNeedsRerun: Bool = false
313314
private var lastRefreshAllCompletedAt: Date = .distantPast
314315
private let sidebarAppearRefreshInterval: TimeInterval = 20
@@ -560,21 +561,43 @@ final class WorktrunkStore: ObservableObject {
560561
return
561562
}
562563

564+
let shouldScheduleRerun = shouldScheduleRefreshRerun(for: trigger)
563565
if let existing = refreshAllTask {
564-
if shouldScheduleRefreshRerun(for: trigger) {
566+
let observedGeneration = refreshAllTaskGeneration
567+
if shouldScheduleRerun {
565568
refreshAllNeedsRerun = true
566569
}
567570
await existing.value
571+
572+
// Existing task may be complete but still stored here until its creator resumes.
573+
if refreshAllTaskGeneration == observedGeneration {
574+
refreshAllTask = nil
575+
}
576+
577+
if shouldScheduleRerun, refreshAllNeedsRerun, refreshAllTask == nil {
578+
await startRefreshAllTask()
579+
}
568580
return
569581
}
570582

583+
await startRefreshAllTask()
584+
}
585+
586+
private func startRefreshAllTask() async {
587+
guard refreshAllTask == nil else { return }
588+
589+
refreshAllTaskGeneration &+= 1
590+
let generation = refreshAllTaskGeneration
571591
let task = Task { [weak self] in
572592
guard let self else { return }
573593
await self.refreshAllBatchedLoop()
574594
}
575595
refreshAllTask = task
576596
await task.value
577-
refreshAllTask = nil
597+
598+
if refreshAllTaskGeneration == generation {
599+
refreshAllTask = nil
600+
}
578601
}
579602

580603
private struct RefreshListResult {

0 commit comments

Comments
 (0)