import AppCore import Combine import Defaults import Keychain import Foundation import Dependencies import AppResources import XXMessengerClient final class SettingsDeleteViewModel { struct ViewState: Equatable { var input = "" var username: String var isButtonEnabled = false } @Dependency(\.keychain) var keychain @Dependency(\.app.bgQueue) var bgQueue @Dependency(\.app.dbManager) var dbManager @Dependency(\.app.messenger) var messenger @Dependency(\.app.hudManager) var hudManager @KeyObject(.username, defaultValue: nil) var username: String? var statePublisher: AnyPublisher<ViewState, Never> { stateSubject.eraseToAnyPublisher() } private let stateSubject: CurrentValueSubject<ViewState, Never> init() { @KeyObject(.username, defaultValue: nil) var username: String? self.stateSubject = .init(.init(username: username!)) } func didEnterText(_ string: String) { stateSubject.value.input = string stateSubject.value.isButtonEnabled = string == stateSubject.value.username } func didTapDelete() { hudManager.show() bgQueue.schedule { [weak self] in guard let self else { return } do { try self.messenger.ud.tryGet().permanentDeleteAccount( username: .init( type: .username, value: self.stateSubject.value.username ) ) try self.messenger.destroy() try self.keychain.destroy() try self.dbManager.removeDB() UserDefaults.resetStandardUserDefaults() UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) UserDefaults.standard.synchronize() self.hudManager.show(.init( title: Localized.Settings.Delete.Success.title, content: Localized.Settings.Delete.Success.subtitle )) } catch { DispatchQueue.main.async { [weak self] in guard let self else { return } self.hudManager.show(.init(error: error)) } } } } }