Skip to content
Snippets Groups Projects
SettingsDeleteViewModel.swift 1.69 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
import Defaults
Bruno Muniz's avatar
Bruno Muniz committed
import Keychain
import Foundation
Bruno Muniz's avatar
Bruno Muniz committed
import XXMessengerClient
Bruno Muniz's avatar
Bruno Muniz committed

final class SettingsDeleteViewModel {
  @Dependency(\.keychain) var keychain: KeychainManager
  @Dependency(\.app.dbManager) var dbManager: DBManager
  @Dependency(\.app.messenger) var messenger: Messenger
  @Dependency(\.app.hudManager) var hudManager: HUDManager
Bruno Muniz's avatar
Bruno Muniz committed
  @KeyObject(.username, defaultValue: nil) var username: String?

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

Bruno Muniz's avatar
Bruno Muniz committed
    
    do {
      try cleanUD()
      try messenger.destroy()
      try keychain.destroy()
      try dbManager.removeDB()
Bruno Muniz's avatar
Bruno Muniz committed
      try deleteDatabase()
      
      UserDefaults.resetStandardUserDefaults()
      UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
      UserDefaults.standard.synchronize()
      
      hudManager.show(.init(
Bruno Muniz's avatar
Bruno Muniz committed
        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 }
        self.hudManager.show(.init(error: error))
Bruno Muniz's avatar
Bruno Muniz committed
      }
Bruno Muniz's avatar
Bruno Muniz committed
    }
Bruno Muniz's avatar
Bruno Muniz committed
  }
  
  private func cleanUD() throws {
    try messenger.ud.get()!.permanentDeleteAccount(
      username: .init(type: .username, value: username!)
    )
Bruno Muniz's avatar
Bruno Muniz committed
  }
  
  private func deleteDatabase() throws {
    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
}