Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import UIKit
import Models
import Shared
import Combine
import Foundation
import DependencyInjection
import HUD
enum BackupActionState {
case backupFinished
case backupAllowed(Bool)
case backupInProgress(Float, Float)
}
struct BackupConfigViewModel {
var didTapBackupNow: () -> Void
var didChooseWifiOnly: (Bool) -> Void
var didChooseAutomatic: (Bool) -> Void
var didToggleService: (CloudService, Bool) -> Void
var didTapService: (CloudService, UIViewController) -> Void
var wifiOnly: () -> AnyPublisher<Bool, Never>
var automatic: () -> AnyPublisher<Bool, Never>
var lastBackup: () -> AnyPublisher<Backup?, Never>
var actionState: () -> AnyPublisher<BackupActionState, Never>
var enabledService: () -> AnyPublisher<CloudService?, Never>
var connectedServices: () -> AnyPublisher<Set<CloudService>, Never>
}
extension BackupConfigViewModel {
static func live() -> Self {
class Context {
@Dependency var hud: HUDType
@Dependency var service: BackupService
}
let context = Context()
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: context.service.toggle,
didTapService: context.service.authorize,
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()
}
)
}
}