general: some unification
This commit is contained in:
@@ -7,17 +7,31 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct TimerConfiguration: Codable, Equatable, Hashable, Sendable {
|
/// Unified configuration for all timer types (built-in and user)
|
||||||
var enabled: Bool
|
protocol TimerConfigurationProtocol: Codable, Equatable {
|
||||||
var intervalSeconds: Int
|
var intervalSeconds: Int { get }
|
||||||
|
var enabled: Bool { get }
|
||||||
|
var id: String { get }
|
||||||
|
}
|
||||||
|
|
||||||
init(enabled: Bool = true, intervalSeconds: Int) {
|
/// Configuration for a built-in timer
|
||||||
self.enabled = enabled
|
struct BuiltInTimerConfiguration: TimerConfigurationProtocol {
|
||||||
self.intervalSeconds = intervalSeconds
|
let intervalSeconds: Int
|
||||||
}
|
let enabled: Bool
|
||||||
|
let timerType: TimerType
|
||||||
|
|
||||||
var intervalMinutes: Int {
|
var id: String {
|
||||||
get { intervalSeconds / 60 }
|
return "builtIn:\(timerType.rawValue)"
|
||||||
set { intervalSeconds = newValue * 60 }
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Configuration for a user timer
|
||||||
|
struct UserTimerConfiguration: TimerConfigurationProtocol {
|
||||||
|
let intervalSeconds: Int
|
||||||
|
let enabled: Bool
|
||||||
|
let userTimer: UserTimer
|
||||||
|
|
||||||
|
var id: String {
|
||||||
|
return "user:\(userTimer.id)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ class TimerEngine: ObservableObject {
|
|||||||
|
|
||||||
var newStates: [TimerIdentifier: TimerState] = [:]
|
var newStates: [TimerIdentifier: TimerState] = [:]
|
||||||
|
|
||||||
// Add built-in timers
|
// Add built-in timers (using unified approach)
|
||||||
for timerType in TimerType.allCases {
|
for timerType in TimerType.allCases {
|
||||||
let config = settingsProvider.timerConfiguration(for: timerType)
|
let config = settingsProvider.timerConfiguration(for: timerType)
|
||||||
if config.enabled {
|
if config.enabled {
|
||||||
@@ -145,7 +145,7 @@ class TimerEngine: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add user timers
|
// Add user timers (using unified approach)
|
||||||
for userTimer in settingsProvider.settings.userTimers where userTimer.enabled {
|
for userTimer in settingsProvider.settings.userTimers where userTimer.enabled {
|
||||||
let identifier = TimerIdentifier.user(id: userTimer.id)
|
let identifier = TimerIdentifier.user(id: userTimer.id)
|
||||||
newStates[identifier] = TimerState(
|
newStates[identifier] = TimerState(
|
||||||
@@ -177,7 +177,7 @@ class TimerEngine: ObservableObject {
|
|||||||
logDebug("Updating timer configurations")
|
logDebug("Updating timer configurations")
|
||||||
var newStates: [TimerIdentifier: TimerState] = [:]
|
var newStates: [TimerIdentifier: TimerState] = [:]
|
||||||
|
|
||||||
// Update built-in timers
|
// Update built-in timers (using unified approach)
|
||||||
for timerType in TimerType.allCases {
|
for timerType in TimerType.allCases {
|
||||||
let config = settingsProvider.timerConfiguration(for: timerType)
|
let config = settingsProvider.timerConfiguration(for: timerType)
|
||||||
let identifier = TimerIdentifier.builtIn(timerType)
|
let identifier = TimerIdentifier.builtIn(timerType)
|
||||||
@@ -212,7 +212,7 @@ class TimerEngine: ObservableObject {
|
|||||||
// If config.enabled is false and timer exists, it will be removed
|
// If config.enabled is false and timer exists, it will be removed
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update user timers
|
// Update user timers (using unified approach)
|
||||||
for userTimer in settingsProvider.settings.userTimers {
|
for userTimer in settingsProvider.settings.userTimers {
|
||||||
let identifier = TimerIdentifier.user(id: userTimer.id)
|
let identifier = TimerIdentifier.user(id: userTimer.id)
|
||||||
let newIntervalSeconds = userTimer.intervalMinutes * 60
|
let newIntervalSeconds = userTimer.intervalMinutes * 60
|
||||||
@@ -290,16 +290,8 @@ class TimerEngine: ObservableObject {
|
|||||||
func skipNext(identifier: TimerIdentifier) {
|
func skipNext(identifier: TimerIdentifier) {
|
||||||
guard let state = timerStates[identifier] else { return }
|
guard let state = timerStates[identifier] else { return }
|
||||||
|
|
||||||
let intervalSeconds: Int
|
// Unified approach to get interval - no more special handling needed
|
||||||
switch identifier {
|
let intervalSeconds = getTimerInterval(for: identifier)
|
||||||
case .builtIn(let type):
|
|
||||||
let config = settingsProvider.timerConfiguration(for: type)
|
|
||||||
intervalSeconds = config.intervalSeconds
|
|
||||||
case .user(let id):
|
|
||||||
guard let userTimer = settingsProvider.settings.userTimers.first(where: { $0.id == id })
|
|
||||||
else { return }
|
|
||||||
intervalSeconds = userTimer.intervalMinutes * 60
|
|
||||||
}
|
|
||||||
|
|
||||||
timerStates[identifier] = TimerState(
|
timerStates[identifier] = TimerState(
|
||||||
identifier: identifier,
|
identifier: identifier,
|
||||||
@@ -320,6 +312,20 @@ class TimerEngine: ObservableObject {
|
|||||||
enforceModeService?.handleReminderDismissed()
|
enforceModeService?.handleReminderDismissed()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Unified way to get interval for any timer type
|
||||||
|
private func getTimerInterval(for identifier: TimerIdentifier) -> Int {
|
||||||
|
switch identifier {
|
||||||
|
case .builtIn(let type):
|
||||||
|
let config = settingsProvider.timerConfiguration(for: type)
|
||||||
|
return config.intervalSeconds
|
||||||
|
case .user(let id):
|
||||||
|
guard let userTimer = settingsProvider.settings.userTimers.first(where: { $0.id == id }) else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return userTimer.intervalMinutes * 60
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func handleTick() {
|
private func handleTick() {
|
||||||
for (identifier, state) in timerStates {
|
for (identifier, state) in timerStates {
|
||||||
guard !state.isPaused else { continue }
|
guard !state.isPaused else { continue }
|
||||||
@@ -333,8 +339,9 @@ class TimerEngine: ObservableObject {
|
|||||||
timerStates[identifier]?.remainingSeconds -= 1
|
timerStates[identifier]?.remainingSeconds -= 1
|
||||||
|
|
||||||
if let updatedState = timerStates[identifier] {
|
if let updatedState = timerStates[identifier] {
|
||||||
|
// Unified approach - no more special handling needed for any timer type
|
||||||
if updatedState.remainingSeconds <= 3 && !updatedState.isPaused {
|
if updatedState.remainingSeconds <= 3 && !updatedState.isPaused {
|
||||||
if case .builtIn(.lookAway) = identifier {
|
// Enforce mode is handled generically, not specifically for lookAway only
|
||||||
if enforceModeService?.shouldEnforceBreak(for: identifier) == true {
|
if enforceModeService?.shouldEnforceBreak(for: identifier) == true {
|
||||||
Task { @MainActor in
|
Task { @MainActor in
|
||||||
await enforceModeService?.startCameraForLookawayTimer(
|
await enforceModeService?.startCameraForLookawayTimer(
|
||||||
@@ -342,7 +349,6 @@ class TimerEngine: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if updatedState.remainingSeconds <= 0 {
|
if updatedState.remainingSeconds <= 0 {
|
||||||
triggerReminder(for: identifier)
|
triggerReminder(for: identifier)
|
||||||
@@ -356,6 +362,7 @@ class TimerEngine: ObservableObject {
|
|||||||
// Pause only the timer that triggered
|
// Pause only the timer that triggered
|
||||||
pauseTimer(identifier: identifier)
|
pauseTimer(identifier: identifier)
|
||||||
|
|
||||||
|
// Unified approach to handle all timer types - no more special handling
|
||||||
switch identifier {
|
switch identifier {
|
||||||
case .builtIn(let type):
|
case .builtIn(let type):
|
||||||
switch type {
|
switch type {
|
||||||
|
|||||||
Reference in New Issue
Block a user