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
import HUD
import Combine
import Models
import Integration
import DifferenceKit
import CombineSchedulers
import DependencyInjection
final class RequestsFailedViewModel {
// MARK: Injected
@Dependency private var session: SessionType
// MARK: Properties
var items: AnyPublisher<[Contact], Never> {
relay.eraseToAnyPublisher()
}
var hud: AnyPublisher<HUDStatus, Never> {
hudRelay.eraseToAnyPublisher()
}
private var cancellables = Set<AnyCancellable>()
private let relay = CurrentValueSubject<[Contact], Never>([])
private let hudRelay = CurrentValueSubject<HUDStatus, Never>(.none)
var backgroundScheduler: AnySchedulerOf<DispatchQueue> = DispatchQueue.global().eraseToAnyScheduler()
// MARK: Lifecycle
init() {
session.contacts(.failed)
.sink { [unowned self] in relay.send($0) }
.store(in: &cancellables)
}
// MARK: Public
func didTapRetry(_ contact: Contact) {
hudRelay.send(.on)
backgroundScheduler.schedule { [weak self] in
guard let self = self else { return }
do {
try self.session.add(contact)
self.hudRelay.send(.none)
} catch {
self.hudRelay.send(.error(.init(with: error)))
}
}
}
}