Skip to content
Snippets Groups Projects
AccountDeleteViewModel.swift 2.03 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
import Retry
Bruno Muniz's avatar
Bruno Muniz committed
import Shared
Bruno Muniz's avatar
Bruno Muniz committed
import Combine
Bruno Muniz's avatar
Bruno Muniz committed
import Defaults
Bruno Muniz's avatar
Bruno Muniz committed
import Keychain
Bruno Muniz's avatar
Bruno Muniz committed
import XXModels
Bruno Muniz's avatar
Bruno Muniz committed
import XXClient
Bruno Muniz's avatar
Bruno Muniz committed
import Foundation
Bruno Muniz's avatar
Bruno Muniz committed
import XXMessengerClient
Bruno Muniz's avatar
Bruno Muniz committed
import DI
Bruno Muniz's avatar
Bruno Muniz committed

final class AccountDeleteViewModel {
Bruno Muniz's avatar
Bruno Muniz committed
  @Dependency var database: Database
  @Dependency var messenger: Messenger
  @Dependency var keychain: KeychainHandling
  @Dependency var hudController: HUDController
  
  @KeyObject(.username, defaultValue: nil) var username: String?

  private var isCurrentlyDeleting = false
  
  func didTapDelete() {
    guard isCurrentlyDeleting == false else { return }
    isCurrentlyDeleting = true

    hudController.show()
    
    do {
      print(">>> try self.cleanUD()")
      try cleanUD()
      
      print(">>> try self.messenger.destroy()")
      try messenger.destroy()
      
      print(">>> try self.keychain.clear()")
      try keychain.clear()
      
      print(">>> try database.drop()")
      try database.drop()
      
      print(">>> try self.deleteDatabase()")
      try deleteDatabase()
      
      UserDefaults.resetStandardUserDefaults()
      UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
      UserDefaults.standard.synchronize()
      
      hudController.show(.init(
        title: "Account deleted",
Bruno Muniz's avatar
Bruno Muniz committed
        content: "Now kill the app and re-open"
Bruno Muniz's avatar
Bruno Muniz committed
      ))
    } catch {
      DispatchQueue.main.async { [weak self] in
Bruno Muniz's avatar
Bruno Muniz committed
        guard let self else { return }
Bruno Muniz's avatar
Bruno Muniz committed
        self.hudController.show(.init(error: error))
      }
Bruno Muniz's avatar
Bruno Muniz committed
    }
Bruno Muniz's avatar
Bruno Muniz committed
  }
  
  private func cleanUD() throws {
    print(">>> Deleting my username (\(username ?? "NO_USERNAME")) from ud")
    try messenger.ud.get()!.permanentDeleteAccount(username: .init(type: .username, value: username!))
  }
  
  private func deleteDatabase() throws {
    print(">>> Deleting database...")
    
    let dbPath = FileManager.default
      .containerURL(forSecurityApplicationGroupIdentifier: "group.elixxir.messenger")!
      .appendingPathComponent("xxm_database")
      .appendingPathExtension("sqlite").path
    
    try FileManager.default.removeItem(atPath: dbPath)
  }
Bruno Muniz's avatar
Bruno Muniz committed
}