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}
import CodexBarCore
import 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
}