element-ios/Riot/Modules/KeyBackup/Recover/RecoveryKey/KeyBackupRecoverFromRecover...

91 lines
2.7 KiB
Swift

/*
Copyright 2019-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
import Foundation
final class KeyBackupRecoverFromRecoveryKeyViewModel: KeyBackupRecoverFromRecoveryKeyViewModelType {
// MARK: - Properties
// MARK: Private
private let keyBackup: MXKeyBackup
private var currentHTTPOperation: MXHTTPOperation?
private let keyBackupVersion: MXKeyBackupVersion
// MARK: Public
var recoveryKey: String?
var isFormValid: Bool {
return self.recoveryKey?.isEmpty == false
}
weak var viewDelegate: KeyBackupRecoverFromRecoveryKeyViewModelViewDelegate?
weak var coordinatorDelegate: KeyBackupRecoverFromRecoveryKeyViewModelCoordinatorDelegate?
// MARK: - Setup
init(keyBackup: MXKeyBackup, keyBackupVersion: MXKeyBackupVersion) {
self.keyBackup = keyBackup
self.keyBackupVersion = keyBackupVersion
}
deinit {
self.currentHTTPOperation?.cancel()
}
// MARK: - Public
func process(viewAction: KeyBackupRecoverFromRecoveryKeyViewAction) {
switch viewAction {
case .recover:
self.recover()
case .cancel:
self.coordinatorDelegate?.keyBackupRecoverFromRecoveryKeyViewModelDidCancel(self)
case .unknownRecoveryKey:
break
}
}
// MARK: - Private
private func recover() {
guard let recoveryKey = self.recoveryKey else {
return
}
self.update(viewState: .loading)
self.currentHTTPOperation = self.keyBackup.restore(self.keyBackupVersion, withRecoveryKey: recoveryKey, room: nil, session: nil, success: { [weak self] (_, _) in
guard let sself = self else {
return
}
// Trust on decrypt
sself.currentHTTPOperation = sself.keyBackup.trust(sself.keyBackupVersion, trust: true, success: { [weak sself] () in
guard let ssself = sself else {
return
}
ssself.update(viewState: .loaded)
ssself.coordinatorDelegate?.keyBackupRecoverFromRecoveryKeyViewModelDidRecover(ssself)
}, failure: {[weak sself] error in
sself?.update(viewState: .error(error))
})
}, failure: {[weak self] error in
self?.update(viewState: .error(error))
})
}
private func update(viewState: KeyBackupRecoverFromRecoveryKeyViewState) {
self.viewDelegate?.keyBackupRecoverFromPassphraseViewModel(self, didUpdateViewState: viewState)
}
}