mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2024-12-24 16:51:19 +01:00
Enables accounts and their delegates to prepare to be deleted. Provides a variation of the Account Inspector on iOS for Feedly.
This commit is contained in:
parent
6e8d1a90a8
commit
bec80922ce
@ -399,6 +399,10 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
|||||||
opmlFile.save()
|
opmlFile.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func prepareForDeletion() {
|
||||||
|
delegate.accountWillBeDeleted(self)
|
||||||
|
}
|
||||||
|
|
||||||
func loadOPMLItems(_ items: [RSOPMLItem], parentFolder: Folder?) {
|
func loadOPMLItems(_ items: [RSOPMLItem], parentFolder: Folder?) {
|
||||||
var feedsToAdd = Set<Feed>()
|
var feedsToAdd = Set<Feed>()
|
||||||
|
|
||||||
|
@ -46,6 +46,8 @@ protocol AccountDelegate {
|
|||||||
|
|
||||||
// Called at the end of account’s init method.
|
// Called at the end of account’s init method.
|
||||||
func accountDidInitialize(_ account: Account)
|
func accountDidInitialize(_ account: Account)
|
||||||
|
|
||||||
|
func accountWillBeDeleted(_ account: Account)
|
||||||
|
|
||||||
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL?, completion: @escaping (Result<Credentials?, Error>) -> Void)
|
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL?, completion: @escaping (Result<Credentials?, Error>) -> Void)
|
||||||
|
|
||||||
|
@ -138,6 +138,8 @@ public final class AccountManager: UnreadCountProvider {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
account.prepareForDeletion()
|
||||||
|
|
||||||
accountsDictionary.removeValue(forKey: account.accountID)
|
accountsDictionary.removeValue(forKey: account.accountID)
|
||||||
account.isDeleted = true
|
account.isDeleted = true
|
||||||
|
|
||||||
|
@ -541,6 +541,9 @@ final class FeedbinAccountDelegate: AccountDelegate {
|
|||||||
credentials = try? account.retrieveCredentials(type: .basic)
|
credentials = try? account.retrieveCredentials(type: .basic)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func accountWillBeDeleted(_ account: Account) {
|
||||||
|
}
|
||||||
|
|
||||||
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL? = nil, completion: @escaping (Result<Credentials?, Error>) -> Void) {
|
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL? = nil, completion: @escaping (Result<Credentials?, Error>) -> Void) {
|
||||||
|
|
||||||
let caller = FeedbinAPICaller(transport: transport)
|
let caller = FeedbinAPICaller(transport: transport)
|
||||||
|
@ -486,6 +486,10 @@ final class FeedlyAccountDelegate: AccountDelegate {
|
|||||||
operationQueue.addOperation(refreshAccessToken)
|
operationQueue.addOperation(refreshAccessToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func accountWillBeDeleted(_ account: Account) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL?, completion: @escaping (Result<Credentials?, Error>) -> Void) {
|
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL?, completion: @escaping (Result<Credentials?, Error>) -> Void) {
|
||||||
assertionFailure("An `account` instance should enqueue an \(FeedlyRefreshAccessTokenOperation.self) instead.")
|
assertionFailure("An `account` instance should enqueue an \(FeedlyRefreshAccessTokenOperation.self) instead.")
|
||||||
completion(.success(credentials))
|
completion(.success(credentials))
|
||||||
|
@ -195,6 +195,9 @@ final class LocalAccountDelegate: AccountDelegate {
|
|||||||
|
|
||||||
func accountDidInitialize(_ account: Account) {
|
func accountDidInitialize(_ account: Account) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func accountWillBeDeleted(_ account: Account) {
|
||||||
|
}
|
||||||
|
|
||||||
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL? = nil, completion: (Result<Credentials?, Error>) -> Void) {
|
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL? = nil, completion: (Result<Credentials?, Error>) -> Void) {
|
||||||
return completion(.success(nil))
|
return completion(.success(nil))
|
||||||
|
@ -418,6 +418,9 @@ final class ReaderAPIAccountDelegate: AccountDelegate {
|
|||||||
credentials = try? account.retrieveCredentials(type: .readerAPIKey)
|
credentials = try? account.retrieveCredentials(type: .readerAPIKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func accountWillBeDeleted(_ account: Account) {
|
||||||
|
}
|
||||||
|
|
||||||
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL?, completion: @escaping (Result<Credentials?, Error>) -> Void) {
|
static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL?, completion: @escaping (Result<Credentials?, Error>) -> Void) {
|
||||||
guard let endpoint = endpoint else {
|
guard let endpoint = endpoint else {
|
||||||
completion(.failure(TransportError.noURL))
|
completion(.failure(TransportError.noURL))
|
||||||
|
@ -28,6 +28,19 @@ final class AccountsDetailViewController: NSViewController, NSTextFieldDelegate
|
|||||||
super.init(coder: coder)
|
super.init(coder: coder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var hidesCredentialsButton: Bool {
|
||||||
|
guard let account = account else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
switch account.type {
|
||||||
|
case .onMyMac,
|
||||||
|
.feedly:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
@ -35,7 +48,7 @@ final class AccountsDetailViewController: NSViewController, NSTextFieldDelegate
|
|||||||
typeLabel.stringValue = account?.defaultName ?? ""
|
typeLabel.stringValue = account?.defaultName ?? ""
|
||||||
nameTextField.stringValue = account?.name ?? ""
|
nameTextField.stringValue = account?.name ?? ""
|
||||||
activeButton.state = account?.isActive ?? false ? .on : .off
|
activeButton.state = account?.isActive ?? false ? .on : .off
|
||||||
credentialsButton.isHidden = account?.type ?? .onMyMac == .onMyMac
|
credentialsButton.isHidden = hidesCredentialsButton
|
||||||
}
|
}
|
||||||
|
|
||||||
func controlTextDidEndEditing(_ obj: Notification) {
|
func controlTextDidEndEditing(_ obj: Notification) {
|
||||||
@ -66,8 +79,6 @@ final class AccountsDetailViewController: NSViewController, NSTextFieldDelegate
|
|||||||
accountsFreshRSSWindowController.account = account
|
accountsFreshRSSWindowController.account = account
|
||||||
accountsFreshRSSWindowController.runSheetOnWindow(self.view.window!)
|
accountsFreshRSSWindowController.runSheetOnWindow(self.view.window!)
|
||||||
accountsWindowController = accountsFreshRSSWindowController
|
accountsWindowController = accountsFreshRSSWindowController
|
||||||
case .feedly:
|
|
||||||
assertionFailure("Implement feedly logout window controller")
|
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
|
@ -64,10 +64,20 @@ class AccountInspectorViewController: UITableViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func deleteAccount(_ sender: Any) {
|
@IBAction func deleteAccount(_ sender: Any) {
|
||||||
let title = NSLocalizedString("Delete Account", comment: "Delete Account")
|
guard let account = account else {
|
||||||
let message = NSLocalizedString("Are you sure you want to delete this account? This can not be undone.", comment: "Delete Account")
|
return
|
||||||
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
}
|
||||||
|
|
||||||
|
let title = NSLocalizedString("Delete Account", comment: "Delete Account")
|
||||||
|
let message: String = {
|
||||||
|
switch account.type {
|
||||||
|
case .feedly:
|
||||||
|
return NSLocalizedString("Are you sure you want to delete this account? NetNewsWire will no longer be able to access articles and feeds unless the account is added again.", comment: "Log Out and Delete Account")
|
||||||
|
default:
|
||||||
|
return NSLocalizedString("Are you sure you want to delete this account? This can not be undone.", comment: "Delete Account")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||||
let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel")
|
let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel")
|
||||||
let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel)
|
let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel)
|
||||||
alertController.addAction(cancelAction)
|
alertController.addAction(cancelAction)
|
||||||
@ -86,19 +96,31 @@ class AccountInspectorViewController: UITableViewController {
|
|||||||
|
|
||||||
present(alertController, animated: true)
|
present(alertController, animated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Table View
|
// MARK: Table View
|
||||||
|
|
||||||
extension AccountInspectorViewController {
|
extension AccountInspectorViewController {
|
||||||
|
|
||||||
|
var hidesCredentialsSection: Bool {
|
||||||
|
guard let account = account else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
switch account.type {
|
||||||
|
case .onMyMac,
|
||||||
|
.feedly:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override func numberOfSections(in tableView: UITableView) -> Int {
|
override func numberOfSections(in tableView: UITableView) -> Int {
|
||||||
guard let account = account else { return 0 }
|
guard let account = account else { return 0 }
|
||||||
|
|
||||||
if account == AccountManager.shared.defaultAccount {
|
if account == AccountManager.shared.defaultAccount {
|
||||||
return 1
|
return 1
|
||||||
} else if account.type == .onMyMac {
|
} else if hidesCredentialsSection {
|
||||||
return 2
|
return 2
|
||||||
} else {
|
} else {
|
||||||
return super.numberOfSections(in: tableView)
|
return super.numberOfSections(in: tableView)
|
||||||
@ -124,7 +146,7 @@ extension AccountInspectorViewController {
|
|||||||
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||||
let cell: UITableViewCell
|
let cell: UITableViewCell
|
||||||
|
|
||||||
if indexPath.section == 1, let account = account, account.type == .onMyMac {
|
if indexPath.section == 1, hidesCredentialsSection {
|
||||||
cell = super.tableView(tableView, cellForRowAt: IndexPath(row: 0, section: 2))
|
cell = super.tableView(tableView, cellForRowAt: IndexPath(row: 0, section: 2))
|
||||||
} else {
|
} else {
|
||||||
cell = super.tableView(tableView, cellForRowAt: indexPath)
|
cell = super.tableView(tableView, cellForRowAt: indexPath)
|
||||||
|
Loading…
Reference in New Issue
Block a user