Newer
Older
import UIKit
import Models
import Shared
import Combine
case backupFinished
case backupAllowed(Bool)
case backupInProgress(Float, Float)
var didTapBackupNow: () -> Void
var didChooseWifiOnly: (Bool) -> Void
var didChooseAutomatic: (Bool) -> Void
var didToggleService: (UIViewController, BackupProvider, Bool) -> Void
var didTapService: (BackupProvider, UIViewController) -> Void
var wifiOnly: () -> AnyPublisher<Bool, Never>
var automatic: () -> AnyPublisher<Bool, Never>
var lastBackup: () -> AnyPublisher<Fetch.Metadata?, Never>
var actionState: () -> AnyPublisher<BackupActionState, Never>
var enabledService: () -> AnyPublisher<BackupProvider?, Never>
var connectedServices: () -> AnyPublisher<Set<BackupProvider>, Never>
static func live() -> Self {
class Context {
@Dependency var hud: HUD
@Dependency var service: BackupService
@Dependency var coordinator: BackupCoordinating
}
return .init(
didTapBackupNow: {
context.service.performBackup()
context.hud.update(with: .on)
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
context.hud.update(with: .none)
}
},
didChooseWifiOnly: context.service.setBackupOnlyOnWifi(_:),
didChooseAutomatic: context.service.setBackupAutomatically(_:),
didToggleService: { controller, service, enabling in
guard enabling == true else {
context.service.toggle(service: service, enabling: false)
context.service.stopBackups()
return
}
context.coordinator.toPassphrase(from: controller, cancelClosure: {
context.service.toggle(service: service, enabling: false)
}, passphraseClosure: { passphrase in
context.hud.update(with: .onTitle("Initializing and securing your backup file will take few seconds, please keep the app open."))
context.service.toggle(service: service, enabling: enabling)
context.service.initializeBackup(passphrase: passphrase)
context.hud.update(with: .none)
})
},
didTapService: { service, controller in
if service == .sftp {
context.coordinator.toSFTP(from: controller) { host, username, password in
context.service.setupSFTP(host: host, username: username, password: password)
}
return
}
context.service.authorize(service: service, presenting: controller)
},
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
wifiOnly: {
context.service.settingsPublisher
.map(\.wifiOnlyBackup)
.eraseToAnyPublisher()
},
automatic: {
context.service.settingsPublisher
.map(\.automaticBackups)
.eraseToAnyPublisher()
},
lastBackup: {
context.service.settingsPublisher
.map {
guard let enabledService = $0.enabledService else { return nil }
return $0.backups[enabledService]
}.eraseToAnyPublisher()
},
actionState: {
context.service.settingsPublisher
.map(\.enabledService)
.map { BackupActionState.backupAllowed($0 != nil) }
.eraseToAnyPublisher()
},
enabledService: {
context.service.settingsPublisher
.map(\.enabledService)
.eraseToAnyPublisher()
},
connectedServices: {
context.service.settingsPublisher
.map(\.connectedServices)
.removeDuplicates()
.eraseToAnyPublisher()
}
)
}