diff --git a/pass/Controllers/PasswordsViewController.swift b/pass/Controllers/PasswordsViewController.swift index 6111a25..5b76ab9 100644 --- a/pass/Controllers/PasswordsViewController.swift +++ b/pass/Controllers/PasswordsViewController.swift @@ -68,6 +68,8 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV DispatchQueue.main.async { self.passwordEntities = PasswordStore.shared.fetchPasswordEntityCoreData() self.reloadTableView(data: self.passwordEntities!) + PasswordStore.shared.setAllSynced() + self.setNavigationItemTitle() Defaults[.lastUpdatedTime] = Date() SVProgressHUD.showSuccess(withStatus: "Done") SVProgressHUD.dismiss(withDelay: 1) @@ -83,6 +85,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV override func viewDidLoad() { super.viewDidLoad() + setNavigationItemTitle() passwordEntities = PasswordStore.shared.fetchPasswordEntityCoreData() NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnPasswordUpdatedNotification), name: NSNotification.Name(rawValue: "passwordUpdated"), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnPasswordStoreErasedNotification), name: NSNotification.Name(rawValue: "passwordStoreErased"), object: nil) @@ -134,7 +137,11 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } else { password = passwordEntities![index] } - cell.textLabel?.text = password.name + if password.synced { + cell.textLabel?.text = password.name! + } else { + cell.textLabel?.text = "↻ \(password.name!)" + } let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressAction(_:))) longPressGestureRecognizer.minimumPressDuration = 0.6 cell.addGestureRecognizer(longPressGestureRecognizer) @@ -220,6 +227,15 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV func actOnPasswordUpdatedNotification() { passwordEntities = PasswordStore.shared.fetchPasswordEntityCoreData() reloadTableView(data: passwordEntities!) + setNavigationItemTitle() + } + private func setNavigationItemTitle() { + let numberOfUnsynced = PasswordStore.shared.getNumberOfUnsyncedPasswords() + if numberOfUnsynced == 0 { + navigationItem.title = "Password Store" + } else { + navigationItem.title = "Password Store (\(numberOfUnsynced))" + } } func actOnPasswordStoreErasedNotification() { diff --git a/pass/Models/PasswordStore.swift b/pass/Models/PasswordStore.swift index 93e3eac..a64a43d 100644 --- a/pass/Models/PasswordStore.swift +++ b/pass/Models/PasswordStore.swift @@ -162,7 +162,7 @@ class PasswordStore { let fetchedPasswordEntities = try context.fetch(passwordEntityFetch) as! [PasswordEntity] return fetchedPasswordEntities.sorted { $0.name!.caseInsensitiveCompare($1.name!) == .orderedAscending } } catch { - fatalError("Failed to fetch employees: \(error)") + fatalError("Failed to fetch passwords: \(error)") } } @@ -173,6 +173,39 @@ class PasswordStore { do { let passwordCategoryEntities = try context.fetch(passwordCategoryEntityFetchRequest) as! [PasswordCategoryEntity] return passwordCategoryEntities + } catch { + fatalError("Failed to fetch password categories: \(error)") + } + } + + func fetchUnsyncedPasswords() -> [PasswordEntity] { + let passwordEntityFetchRequest = NSFetchRequest(entityName: "PasswordEntity") + passwordEntityFetchRequest.predicate = NSPredicate(format: "synced = %i", 0) + do { + let passwordEntities = try context.fetch(passwordEntityFetchRequest) as! [PasswordEntity] + return passwordEntities + } catch { + fatalError("Failed to fetch passwords: \(error)") + } + } + + func setAllSynced() { + let passwordEntities = fetchUnsyncedPasswords() + for passwordEntity in passwordEntities { + passwordEntity.synced = true + } + do { + try context.save() + } catch { + fatalError("Failed to save: \(error)") + } + } + + func getNumberOfUnsyncedPasswords() -> Int { + let passwordEntityFetchRequest = NSFetchRequest(entityName: "PasswordEntity") + do { + passwordEntityFetchRequest.predicate = NSPredicate(format: "synced = %i", 0) + return try context.count(for: passwordEntityFetchRequest) } catch { fatalError("Failed to fetch employees: \(error)") } @@ -205,6 +238,7 @@ class PasswordStore { return nil } + private func getLocalBranch(withName branchName: String) -> GTBranch? { do { let reference = GTBranch.localNamePrefix().appending(branchName) @@ -235,6 +269,7 @@ class PasswordStore { let saveURL = storeURL.appendingPathComponent("\(password.name).gpg") try encryptedData.write(to: saveURL) passwordEntity.rawPath = "\(password.name).gpg" + passwordEntity.synced = false try context.save() print(saveURL.path) let _ = createCommitInRepository(message: "Add new password by pass for iOS", fileData: encryptedData, filename: saveURL.lastPathComponent, progressBlock: progressBlock) diff --git a/pass/pass.xcdatamodeld/pass.xcdatamodel/contents b/pass/pass.xcdatamodeld/pass.xcdatamodel/contents index c8e3773..ede2475 100644 --- a/pass/pass.xcdatamodeld/pass.xcdatamodel/contents +++ b/pass/pass.xcdatamodeld/pass.xcdatamodel/contents @@ -6,14 +6,15 @@ - + - + + - + \ No newline at end of file