Skip to content
Snippets Groups Projects

Restore contacts from backup

Files

@@ -24,7 +24,7 @@ public struct RestoreState: Equatable {
@@ -24,7 +24,7 @@ public struct RestoreState: Equatable {
public init(
public init(
file: File? = nil,
file: File? = nil,
fileImportFailure: String? = nil,
fileImportFailure: String? = nil,
restoreFailure: String? = nil,
restoreFailures: [String] = [],
focusedField: Field? = nil,
focusedField: Field? = nil,
isImportingFile: Bool = false,
isImportingFile: Bool = false,
passphrase: String = "",
passphrase: String = "",
@@ -32,7 +32,7 @@ public struct RestoreState: Equatable {
@@ -32,7 +32,7 @@ public struct RestoreState: Equatable {
) {
) {
self.file = file
self.file = file
self.fileImportFailure = fileImportFailure
self.fileImportFailure = fileImportFailure
self.restoreFailure = restoreFailure
self.restoreFailures = restoreFailures
self.focusedField = focusedField
self.focusedField = focusedField
self.isImportingFile = isImportingFile
self.isImportingFile = isImportingFile
self.passphrase = passphrase
self.passphrase = passphrase
@@ -41,7 +41,7 @@ public struct RestoreState: Equatable {
@@ -41,7 +41,7 @@ public struct RestoreState: Equatable {
public var file: File?
public var file: File?
public var fileImportFailure: String?
public var fileImportFailure: String?
public var restoreFailure: String?
public var restoreFailures: [String]
@BindableState public var focusedField: Field?
@BindableState public var focusedField: Field?
@BindableState public var isImportingFile: Bool
@BindableState public var isImportingFile: Bool
@BindableState public var passphrase: String
@BindableState public var passphrase: String
@@ -53,7 +53,7 @@ public enum RestoreAction: Equatable, BindableAction {
@@ -53,7 +53,7 @@ public enum RestoreAction: Equatable, BindableAction {
case fileImport(Result<URL, NSError>)
case fileImport(Result<URL, NSError>)
case restoreTapped
case restoreTapped
case finished
case finished
case failed(NSError)
case failed([NSError])
case binding(BindingAction<RestoreState>)
case binding(BindingAction<RestoreState>)
}
}
@@ -125,7 +125,7 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm
@@ -125,7 +125,7 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm
guard let backupData = state.file?.data, backupData.count > 0 else { return .none }
guard let backupData = state.file?.data, backupData.count > 0 else { return .none }
let backupPassphrase = state.passphrase
let backupPassphrase = state.passphrase
state.isRestoring = true
state.isRestoring = true
state.restoreFailure = nil
state.restoreFailures = []
return Effect.result {
return Effect.result {
do {
do {
let result = try env.messenger.restoreBackup(
let result = try env.messenger.restoreBackup(
@@ -140,10 +140,23 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm
@@ -140,10 +140,23 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm
phone: facts.get(.phone)?.value,
phone: facts.get(.phone)?.value,
createdAt: env.now()
createdAt: env.now()
))
))
 
try result.restoredContacts.forEach { contactId in
 
if try env.db().fetchContacts(.init(id: [contactId])).isEmpty {
 
try env.db().saveContact(Contact(
 
id: contactId,
 
createdAt: env.now()
 
))
 
}
 
}
return .success(.finished)
return .success(.finished)
} catch {
} catch {
try? env.messenger.destroy()
var errors = [error as NSError]
return .success(.failed(error as NSError))
do {
 
try env.messenger.destroy()
 
} catch {
 
errors.append(error as NSError)
 
}
 
return .success(.failed(errors))
}
}
}
}
.subscribe(on: env.bgQueue)
.subscribe(on: env.bgQueue)
@@ -154,9 +167,9 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm
@@ -154,9 +167,9 @@ public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironm
state.isRestoring = false
state.isRestoring = false
return .none
return .none
case .failed(let error):
case .failed(let errors):
state.isRestoring = false
state.isRestoring = false
state.restoreFailure = error.localizedDescription
state.restoreFailures = errors.map(\.localizedDescription)
return .none
return .none
case .binding(_):
case .binding(_):
Loading