67 lines · 2.3 KB · Swift
RawDownload
import CodexBarCoreimport Foundation extension StatusItemController {    private nonisolated static let menuBarCountdownRefreshEpsilon: TimeInterval = 0.05     func scheduleMenuBarCountdownRefreshIfNeeded(now: Date = .init()) {        self.menuBarCountdownRefreshTask?.cancel()        self.menuBarCountdownRefreshTask = nil         guard self.settings.menuBarShowsBrandIconWithPercent,              self.settings.menuBarDisplayMode == .resetTime,              self.settings.resetTimeDisplayStyle == .countdown        else {            return        }         let resetDates = self.menuBarCountdownProviders().compactMap { provider in            self.menuBarMetricWindow(                for: provider,                snapshot: self.store.snapshot(for: provider))?.resetsAt        }        guard let delay = Self.menuBarCountdownRefreshDelay(resetDates: resetDates, now: now) else {            return        }         self.menuBarCountdownRefreshTask = Task { @MainActor [weak self] in            do {                try await Task.sleep(for: .seconds(delay))            } catch {                return            }            guard let self, !Task.isCancelled else { return }            self.menuBarCountdownRefreshTask = nil            self.updateIcons()        }    }     nonisolated static func menuBarCountdownRefreshDelay(        resetDates: [Date],        now: Date)        -> TimeInterval?    {        resetDates.compactMap { resetDate -> TimeInterval? in            let remaining = resetDate.timeIntervalSince(now)            guard remaining > 0 else { return nil }            let displayedMinutes = ceil(remaining / 60)            let nextBoundaryRemaining = max(0, displayedMinutes - 1) * 60            return max(                self.menuBarCountdownRefreshEpsilon,                remaining - nextBoundaryRemaining + self.menuBarCountdownRefreshEpsilon)        }.min()    }     private func menuBarCountdownProviders() -> [UsageProvider] {        if self.shouldMergeIcons {            return [self.primaryProviderForUnifiedIcon()]        }        return UsageProvider.allCases.filter(self.isVisible)    }     #if DEBUG    func _test_isMenuBarCountdownRefreshScheduled() -> Bool {        self.menuBarCountdownRefreshTask != nil    }    #endif}