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.
This commit is contained in:
parent
102fe6ed91
commit
465aedd43f
|
@ -33,9 +33,9 @@ class MastodonController {
|
||||||
private(set) lazy var cache = MastodonCache(mastodonController: self)
|
private(set) lazy var cache = MastodonCache(mastodonController: self)
|
||||||
|
|
||||||
private(set) lazy var persistentContainer = MastodonCachePersistentStore(for: self)
|
private(set) lazy var persistentContainer = MastodonCachePersistentStore(for: self)
|
||||||
|
|
||||||
let instanceURL: URL
|
let instanceURL: URL
|
||||||
private(set) var accountInfo: LocalData.UserAccountInfo?
|
var accountInfo: LocalData.UserAccountInfo?
|
||||||
|
|
||||||
let client: Client!
|
let client: Client!
|
||||||
|
|
||||||
|
|
|
@ -44,11 +44,10 @@ class LocalData: ObservableObject {
|
||||||
let url = URL(string: instanceURL),
|
let url = URL(string: instanceURL),
|
||||||
let clientId = info["clientID"],
|
let clientId = info["clientID"],
|
||||||
let secret = info["clientSecret"],
|
let secret = info["clientSecret"],
|
||||||
let username = info["username"],
|
|
||||||
let accessToken = info["accessToken"] else {
|
let accessToken = info["accessToken"] else {
|
||||||
return nil
|
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 {
|
} else {
|
||||||
return []
|
return []
|
||||||
|
@ -56,15 +55,18 @@ class LocalData: ObservableObject {
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
objectWillChange.send()
|
objectWillChange.send()
|
||||||
let array = newValue.map { (info) in
|
let array = newValue.map { (info) -> [String: String] in
|
||||||
return [
|
var res = [
|
||||||
"id": info.id,
|
"id": info.id,
|
||||||
"instanceURL": info.instanceURL.absoluteString,
|
"instanceURL": info.instanceURL.absoluteString,
|
||||||
"clientID": info.clientID,
|
"clientID": info.clientID,
|
||||||
"clientSecret": info.clientSecret,
|
"clientSecret": info.clientSecret,
|
||||||
"username": info.username,
|
|
||||||
"accessToken": info.accessToken
|
"accessToken": info.accessToken
|
||||||
]
|
]
|
||||||
|
if let username = info.username {
|
||||||
|
res["username"] = username
|
||||||
|
}
|
||||||
|
return res
|
||||||
}
|
}
|
||||||
defaults.set(array, forKey: accountsKey)
|
defaults.set(array, forKey: accountsKey)
|
||||||
}
|
}
|
||||||
|
@ -85,7 +87,7 @@ class LocalData: ObservableObject {
|
||||||
return !accounts.isEmpty
|
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
|
var accounts = self.accounts
|
||||||
if let index = accounts.firstIndex(where: { $0.instanceURL == url && $0.username == username }) {
|
if let index = accounts.firstIndex(where: { $0.instanceURL == url && $0.username == username }) {
|
||||||
accounts.remove(at: index)
|
accounts.remove(at: index)
|
||||||
|
@ -97,6 +99,13 @@ class LocalData: ObservableObject {
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setUsername(for info: UserAccountInfo, username: String) {
|
||||||
|
var info = info
|
||||||
|
info.username = username
|
||||||
|
removeAccount(info)
|
||||||
|
accounts.append(info)
|
||||||
|
}
|
||||||
|
|
||||||
func removeAccount(_ info: UserAccountInfo) {
|
func removeAccount(_ info: UserAccountInfo) {
|
||||||
accounts.removeAll(where: { $0.id == info.id })
|
accounts.removeAll(where: { $0.id == info.id })
|
||||||
}
|
}
|
||||||
|
@ -128,7 +137,7 @@ extension LocalData {
|
||||||
let instanceURL: URL
|
let instanceURL: URL
|
||||||
let clientID: String
|
let clientID: String
|
||||||
let clientSecret: String
|
let clientSecret: String
|
||||||
let username: String
|
fileprivate(set) var username: String!
|
||||||
let accessToken: String
|
let accessToken: String
|
||||||
|
|
||||||
func hash(into hasher: inout Hasher) {
|
func hash(into hasher: inout Hasher) {
|
||||||
|
|
|
@ -68,10 +68,13 @@ extension OnboardingViewController: InstanceSelectorTableViewControllerDelegate
|
||||||
let authCode = item.value else { return }
|
let authCode = item.value else { return }
|
||||||
|
|
||||||
mastodonController.authorize(authorizationCode: authCode) { (accessToken) in
|
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
|
mastodonController.getOwnAccount { (account) in
|
||||||
|
LocalData.shared.setUsername(for: accountInfo, username: account.username)
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
let accountInfo = LocalData.shared.addAccount(instanceURL: instanceURL, clientID: clientID, clientSecret: clientSecret, username: account.username, accessToken: accessToken)
|
|
||||||
|
|
||||||
self.onboardingDelegate?.didFinishOnboarding(account: accountInfo)
|
self.onboardingDelegate?.didFinishOnboarding(account: accountInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue