From 465aedd43ff31f97e2760848e27c06c72400b354 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sun, 12 Apr 2020 11:14:10 -0400 Subject: [PATCH] Make account info username optional Onboarding view controller needs to set the account info object on the mastodon controller before calling getOwnAccount since getOwnAccount will upsert the user's account into the persistent container, which requires the account info to exist to create a unique-per-account identifier. --- Tusker/Controllers/MastodonController.swift | 4 ++-- Tusker/LocalData.swift | 23 +++++++++++++------ .../Onboarding/OnboardingViewController.swift | 7 ++++-- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Tusker/Controllers/MastodonController.swift b/Tusker/Controllers/MastodonController.swift index 899b35cd..3fc56033 100644 --- a/Tusker/Controllers/MastodonController.swift +++ b/Tusker/Controllers/MastodonController.swift @@ -33,9 +33,9 @@ class MastodonController { private(set) lazy var cache = MastodonCache(mastodonController: self) private(set) lazy var persistentContainer = MastodonCachePersistentStore(for: self) - + let instanceURL: URL - private(set) var accountInfo: LocalData.UserAccountInfo? + var accountInfo: LocalData.UserAccountInfo? let client: Client! diff --git a/Tusker/LocalData.swift b/Tusker/LocalData.swift index f1fbfbd3..821b3955 100644 --- a/Tusker/LocalData.swift +++ b/Tusker/LocalData.swift @@ -44,11 +44,10 @@ class LocalData: ObservableObject { let url = URL(string: instanceURL), let clientId = info["clientID"], let secret = info["clientSecret"], - let username = info["username"], let accessToken = info["accessToken"] else { return nil } - return UserAccountInfo(id: id, instanceURL: url, clientID: clientId, clientSecret: secret, username: username, accessToken: accessToken) + return UserAccountInfo(id: id, instanceURL: url, clientID: clientId, clientSecret: secret, username: info["username"], accessToken: accessToken) } } else { return [] @@ -56,15 +55,18 @@ class LocalData: ObservableObject { } set { objectWillChange.send() - let array = newValue.map { (info) in - return [ + let array = newValue.map { (info) -> [String: String] in + var res = [ "id": info.id, "instanceURL": info.instanceURL.absoluteString, "clientID": info.clientID, "clientSecret": info.clientSecret, - "username": info.username, "accessToken": info.accessToken ] + if let username = info.username { + res["username"] = username + } + return res } defaults.set(array, forKey: accountsKey) } @@ -85,7 +87,7 @@ class LocalData: ObservableObject { return !accounts.isEmpty } - func addAccount(instanceURL url: URL, clientID: String, clientSecret secret: String, username: String, accessToken: String) -> UserAccountInfo { + func addAccount(instanceURL url: URL, clientID: String, clientSecret secret: String, username: String?, accessToken: String) -> UserAccountInfo { var accounts = self.accounts if let index = accounts.firstIndex(where: { $0.instanceURL == url && $0.username == username }) { accounts.remove(at: index) @@ -97,6 +99,13 @@ class LocalData: ObservableObject { return info } + func setUsername(for info: UserAccountInfo, username: String) { + var info = info + info.username = username + removeAccount(info) + accounts.append(info) + } + func removeAccount(_ info: UserAccountInfo) { accounts.removeAll(where: { $0.id == info.id }) } @@ -128,7 +137,7 @@ extension LocalData { let instanceURL: URL let clientID: String let clientSecret: String - let username: String + fileprivate(set) var username: String! let accessToken: String func hash(into hasher: inout Hasher) { diff --git a/Tusker/Screens/Onboarding/OnboardingViewController.swift b/Tusker/Screens/Onboarding/OnboardingViewController.swift index 9bb2af60..b94a9a4c 100644 --- a/Tusker/Screens/Onboarding/OnboardingViewController.swift +++ b/Tusker/Screens/Onboarding/OnboardingViewController.swift @@ -68,10 +68,13 @@ extension OnboardingViewController: InstanceSelectorTableViewControllerDelegate let authCode = item.value else { return } mastodonController.authorize(authorizationCode: authCode) { (accessToken) in + let accountInfo = LocalData.shared.addAccount(instanceURL: instanceURL, clientID: clientID, clientSecret: clientSecret, username: nil, accessToken: accessToken) + mastodonController.accountInfo = accountInfo + mastodonController.getOwnAccount { (account) in + LocalData.shared.setUsername(for: accountInfo, username: account.username) + DispatchQueue.main.async { - let accountInfo = LocalData.shared.addAccount(instanceURL: instanceURL, clientID: clientID, clientSecret: clientSecret, username: account.username, accessToken: accessToken) - self.onboardingDelegate?.didFinishOnboarding(account: accountInfo) } }