Skip to content
Snippets Groups Projects

Restore contacts from backup

2 files
+ 75
41
Compare changes
  • Side-by-side
  • Inline

Files

import AppCore
import AppCore
 
import Combine
import ComposableArchitecture
import ComposableArchitecture
import Foundation
import Foundation
import XCTestDynamicOverlay
import XCTestDynamicOverlay
@@ -40,7 +41,8 @@ public enum SendRequestAction: Equatable, BindableAction {
@@ -40,7 +41,8 @@ public enum SendRequestAction: Equatable, BindableAction {
case sendSucceeded
case sendSucceeded
case sendFailed(String)
case sendFailed(String)
case binding(BindingAction<SendRequestState>)
case binding(BindingAction<SendRequestState>)
case myContactFetched(XXClient.Contact?)
case myContactFetched(XXClient.Contact)
 
case myContactFetchFailed(NSError)
}
}
public struct SendRequestEnvironment {
public struct SendRequestEnvironment {
@@ -75,25 +77,32 @@ extension SendRequestEnvironment {
@@ -75,25 +77,32 @@ extension SendRequestEnvironment {
public let sendRequestReducer = Reducer<SendRequestState, SendRequestAction, SendRequestEnvironment>
public let sendRequestReducer = Reducer<SendRequestState, SendRequestAction, SendRequestEnvironment>
{ state, action, env in
{ state, action, env in
enum DBFetchEffectID {}
switch action {
switch action {
case .start:
case .start:
return Effect
return Effect.run { subscriber in
.catching { try env.messenger.e2e.tryGet().getContact().getId() }
do {
.tryMap { try env.db().fetchContactsPublisher(.init(id: [$0])) }
var contact = try env.messenger.e2e.tryGet().getContact()
.flatMap { $0 }
let facts = try env.messenger.ud.tryGet().getFacts()
.assertNoFailure()
try contact.setFacts(facts)
.map(\.first)
subscriber.send(.myContactFetched(contact))
.map { $0?.marshaled.map { XXClient.Contact.live($0) } }
} catch {
.map(SendRequestAction.myContactFetched)
subscriber.send(.myContactFetchFailed(error as NSError))
.subscribe(on: env.bgQueue)
}
.receive(on: env.mainQueue)
subscriber.send(completion: .finished)
.eraseToEffect()
return AnyCancellable {}
.cancellable(id: DBFetchEffectID.self, cancelInFlight: true)
}
 
.receive(on: env.mainQueue)
 
.subscribe(on: env.bgQueue)
 
.eraseToEffect()
case .myContactFetched(let contact):
case .myContactFetched(let contact):
state.myContact = contact
state.myContact = contact
 
state.failure = nil
 
return .none
 
 
case .myContactFetchFailed(let failure):
 
state.myContact = nil
 
state.failure = failure.localizedDescription
return .none
return .none
case .sendTapped:
case .sendTapped:
Loading