Skip to content
Snippets Groups Projects
Commit eb99e4b7 authored by Bruno Muniz's avatar Bruno Muniz :apple:
Browse files

Merge branch 'fix/hud-upon-delete' into 'dev'

Fix hud not showing up when deleting account

See merge request elixxir/client-ios!83
parents bad47f0e 6903efc5
No related branches found
No related tags found
1 merge request!83Fix hud not showing up when deleting account
......@@ -153,7 +153,13 @@ public final class InputField: UIView {
}
public func update(placeholder: String) {
field.placeholder = placeholder
field.attributedPlaceholder = NSAttributedString(
string: placeholder,
attributes: [
.font: Fonts.Mulish.semiBold.font(size: 14.0),
.foregroundColor: Asset.neutralDisabled.color
]
)
}
public func update(status: ValidationStatus) {
......
import UIKit
import Shared
import Combine
import Defaults
import Dependencies
import AppResources
import AppNavigation
......@@ -11,8 +10,6 @@ import ScrollViewController
public final class SettingsDeleteController: UIViewController {
@Dependency(\.navigator) var navigator
@KeyObject(.username, defaultValue: "") var username: String
private lazy var screenView = SettingsDeleteView()
private lazy var scrollViewController = ScrollViewController()
......@@ -31,8 +28,6 @@ public final class SettingsDeleteController: UIViewController {
setupScrollView()
setupBindings()
screenView.update(username: username)
screenView.setInfoClosure { [weak self] in
guard let self else { return }
self.presentInfo(
......@@ -55,21 +50,40 @@ public final class SettingsDeleteController: UIViewController {
private func setupBindings() {
screenView
.cancelButton
.publisher(for: .touchUpInside)
.inputField
.textPublisher
.sink { [unowned self] in
viewModel.didEnterText($0)
}.store(in: &cancellables)
viewModel
.statePublisher
.map(\.username)
.receive(on: DispatchQueue.main)
.sink { [unowned self] in
dismiss(animated: true)
screenView.inputField.update(placeholder: $0)
}.store(in: &cancellables)
viewModel
.statePublisher
.map(\.isButtonEnabled)
.receive(on: DispatchQueue.main)
.dropFirst()
.sink { [unowned self] in
screenView.confirmButton.isEnabled = $0
screenView.inputField.update(
status: $0 ? .valid("") : .invalid("")
)
}.store(in: &cancellables)
screenView
.inputField
.textPublisher
.returnPublisher
.receive(on: DispatchQueue.main)
.sink { [unowned self] in
screenView.update(
status: $0 == username ?
.valid("") : .invalid("")
)
if screenView.confirmButton.isEnabled {
viewModel.didTapDelete()
}
}.store(in: &cancellables)
screenView
......@@ -82,6 +96,7 @@ public final class SettingsDeleteController: UIViewController {
screenView
.cancelButton
.publisher(for: .touchUpInside)
.receive(on: DispatchQueue.main)
.sink { [unowned self] in
navigationController?.popViewController(animated: true)
}.store(in: &cancellables)
......
import AppCore
import Combine
import Defaults
import Keychain
import Foundation
......@@ -7,45 +8,65 @@ 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?
private var isCurrentlyDeleting = false
func didTapDelete() {
guard isCurrentlyDeleting == false else { return }
isCurrentlyDeleting = true
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()
do {
try cleanUD()
try messenger.destroy()
try keychain.destroy()
try dbManager.removeDB()
UserDefaults.resetStandardUserDefaults()
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
UserDefaults.standard.synchronize()
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))
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))
}
}
}
}
private func cleanUD() throws {
try messenger.ud.get()!.permanentDeleteAccount(
username: .init(type: .username, value: username!)
)
}
}
......@@ -99,19 +99,4 @@ final class SettingsDeleteView: UIView {
func setInfoClosure(_ closure: @escaping () -> Void) {
didTapInfo = closure
}
func update(username: String) {
inputField.update(placeholder: username)
}
func update(status: InputField.ValidationStatus) {
inputField.update(status: status)
switch status {
case .valid:
confirmButton.isEnabled = true
case .invalid, .unknown:
confirmButton.isEnabled = false
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment