Add iOS lifecycle hardening hooks
This commit is contained in:
53
apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Lifecycle.swift
Normal file
53
apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Lifecycle.swift
Normal file
@@ -0,0 +1,53 @@
|
||||
import Foundation
|
||||
|
||||
public enum AppLifecycleState: Equatable, Sendable {
|
||||
case foreground
|
||||
case background
|
||||
}
|
||||
|
||||
public struct ScopedSessionEvent: Equatable, Sendable {
|
||||
public var accountId: String
|
||||
public var generation: Int
|
||||
public var event: SessionEvent
|
||||
|
||||
public init(accountId: String, generation: Int, event: SessionEvent) {
|
||||
self.accountId = accountId
|
||||
self.generation = generation
|
||||
self.event = event
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
public final class SessionLifecycleCoordinator: ObservableObject {
|
||||
@Published public private(set) var lifecycleState: AppLifecycleState = .foreground
|
||||
@Published public private(set) var activeAccountId: String
|
||||
@Published public private(set) var generation = 0
|
||||
|
||||
public init(activeAccountId: String) {
|
||||
self.activeAccountId = activeAccountId
|
||||
}
|
||||
|
||||
public var shouldPollEvents: Bool {
|
||||
lifecycleState == .foreground
|
||||
}
|
||||
|
||||
public func enterBackground() {
|
||||
lifecycleState = .background
|
||||
}
|
||||
|
||||
public func enterForeground() {
|
||||
lifecycleState = .foreground
|
||||
}
|
||||
|
||||
public func switchAccount(to accountId: String) {
|
||||
guard accountId != activeAccountId else {
|
||||
return
|
||||
}
|
||||
activeAccountId = accountId
|
||||
generation += 1
|
||||
}
|
||||
|
||||
public func accepts(_ event: ScopedSessionEvent) -> Bool {
|
||||
event.accountId == activeAccountId && event.generation == generation
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user