NetNewsWire/Shared/Timer/AccountRefreshTimer.swift
2024-03-25 23:36:27 -07:00

82 lines
1.7 KiB
Swift

//
// RefreshTimer.swift
// NetNewsWire
//
// Created by Maurice Parker on 4/23/19.
// Copyright © 2019 Ranchero Software. All rights reserved.
//
import Foundation
import Account
@MainActor final class AccountRefreshTimer {
var shuttingDown = false
private var internalTimer: Timer?
private var lastTimedRefresh: Date?
private let launchTime = Date()
func fireOldTimer() {
if let timer = internalTimer {
if timer.fireDate < Date() {
if AppDefaults.shared.refreshInterval != .manually {
timedRefresh(nil)
}
}
}
}
func invalidate() {
guard let timer = internalTimer else {
return
}
if timer.isValid {
timer.invalidate()
}
internalTimer = nil
}
func update() {
guard !shuttingDown else {
return
}
let refreshInterval = AppDefaults.shared.refreshInterval
if refreshInterval == .manually {
invalidate()
return
}
let lastRefreshDate = lastTimedRefresh ?? launchTime
let secondsToAdd = refreshInterval.inSeconds()
var nextRefreshTime = lastRefreshDate.addingTimeInterval(secondsToAdd)
if nextRefreshTime < Date() {
nextRefreshTime = Date().addingTimeInterval(secondsToAdd)
}
if let currentNextFireDate = internalTimer?.fireDate, currentNextFireDate == nextRefreshTime {
return
}
invalidate()
let timer = Timer(fireAt: nextRefreshTime, interval: 0, target: self, selector: #selector(timedRefresh(_:)), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: .common)
internalTimer = timer
}
@objc @MainActor func timedRefresh(_ sender: Timer?) {
guard !shuttingDown else {
return
}
lastTimedRefresh = Date()
update()
Task { @MainActor in
await AccountManager.shared.refreshAll()
}
}
}