Skip to content
Snippets Groups Projects
AccountDeleteViewModel.swift 2.39 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
import HUD
Bruno Muniz's avatar
Bruno Muniz committed
import Models
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 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 DependencyInjection
Bruno Muniz's avatar
Bruno Muniz committed
import Retry
Bruno Muniz's avatar
Bruno Muniz committed
import XXModels
Bruno Muniz's avatar
Bruno Muniz committed

final class AccountDeleteViewModel {
Bruno Muniz's avatar
Bruno Muniz committed
    @Dependency var messenger: Messenger
Bruno Muniz's avatar
Bruno Muniz committed
    @Dependency var keychain: KeychainHandling
Bruno Muniz's avatar
Bruno Muniz committed
    @Dependency var database: Database
Bruno Muniz's avatar
Bruno Muniz committed

    @KeyObject(.username, defaultValue: nil) var username: String?

Bruno Muniz's avatar
Bruno Muniz committed
    var hudPublisher: AnyPublisher<HUDStatus, Never> {
        hudSubject.eraseToAnyPublisher()
    }
Bruno Muniz's avatar
Bruno Muniz committed

Bruno Muniz's avatar
Bruno Muniz committed
    private var isCurrentlyDeleting = false
    private let hudSubject = CurrentValueSubject<HUDStatus, Never>(.none)
Bruno Muniz's avatar
Bruno Muniz committed

    func didTapDelete() {
Bruno Muniz's avatar
Bruno Muniz committed
        guard isCurrentlyDeleting == false else { return }
        isCurrentlyDeleting = true
Bruno Muniz's avatar
Bruno Muniz committed

Bruno Muniz's avatar
Bruno Muniz committed
        hudSubject.send(.on)
Bruno Muniz's avatar
Bruno Muniz committed
        do {
            print(">>> try self.cleanUD()")
            try cleanUD()
Bruno Muniz's avatar
Bruno Muniz committed
            print(">>> try self.messenger.destroy()")
            try messenger.destroy()
Bruno Muniz's avatar
Bruno Muniz committed
            print(">>> try self.keychain.clear()")
            try keychain.clear()
Bruno Muniz's avatar
Bruno Muniz committed
            print(">>> try database.drop()")
            try database.drop()
Bruno Muniz's avatar
Bruno Muniz committed
            print(">>> try self.deleteDatabase()")
            try deleteDatabase()
Bruno Muniz's avatar
Bruno Muniz committed

Bruno Muniz's avatar
Bruno Muniz committed
            UserDefaults.resetStandardUserDefaults()
            UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
            UserDefaults.standard.synchronize()
Bruno Muniz's avatar
Bruno Muniz committed

Bruno Muniz's avatar
Bruno Muniz committed
            hudSubject.send(.error(.init(
                content: "Now kill the app and re-open",
                title: "Account deleted",
                dismissable: false
            )))
        } catch {
            DispatchQueue.main.async { [weak self] in
                guard let self = self else { return }
                self.hudSubject.send(.error(.init(with: 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!))
Bruno Muniz's avatar
Bruno Muniz committed
    }

    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
}