ReadKeep/readeck/UI/AppViewModel.swift
Ilyas Hallak 04de2c20d4 refactor: Use @Observable and inject factory in AppViewModel
- Replace ObservableObject with @Observable macro
- Inject UseCaseFactory instead of individual use cases
- Use factory.makeCheckServerReachabilityUseCase() on demand
- Use factory.makeLogoutUseCase() for 401 handling
2025-10-19 19:01:54 +02:00

80 lines
2.0 KiB
Swift

//
// AppViewModel.swift
// readeck
//
// Created by Ilyas Hallak on 27.08.25.
//
import Foundation
import SwiftUI
@MainActor
@Observable
class AppViewModel {
private let settingsRepository = SettingsRepository()
private let factory: UseCaseFactory
var hasFinishedSetup: Bool = true
var isServerReachable: Bool = false
init(factory: UseCaseFactory = DefaultUseCaseFactory.shared) {
self.factory = factory
setupNotificationObservers()
Task {
await loadSetupStatus()
}
}
private func setupNotificationObservers() {
NotificationCenter.default.addObserver(
forName: .unauthorizedAPIResponse,
object: nil,
queue: .main
) { [weak self] _ in
Task { @MainActor in
await self?.handleUnauthorizedResponse()
}
}
NotificationCenter.default.addObserver(
forName: .setupStatusChanged,
object: nil,
queue: .main
) { [weak self] _ in
Task { @MainActor in
self?.loadSetupStatus()
}
}
}
private func handleUnauthorizedResponse() async {
print("AppViewModel: Handling 401 Unauthorized - logging out user")
do {
try await factory.makeLogoutUseCase().execute()
loadSetupStatus()
print("AppViewModel: User successfully logged out due to 401 error")
} catch {
print("AppViewModel: Error during logout: \(error)")
}
}
private func loadSetupStatus() {
hasFinishedSetup = settingsRepository.hasFinishedSetup
}
func onAppResume() async {
await checkServerReachability()
}
private func checkServerReachability() async {
isServerReachable = await factory.makeCheckServerReachabilityUseCase().execute()
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}