Account URL is now fetched async (#2769)

This commit is contained in:
Mauro
2024-04-30 19:08:32 +02:00
committed by GitHub
parent f688d2eda4
commit 18dc9cd20f
16 changed files with 47 additions and 70 deletions
+1 -1
View File
@@ -7332,7 +7332,7 @@
repositoryURL = "https://github.com/matrix-org/matrix-rust-components-swift"; repositoryURL = "https://github.com/matrix-org/matrix-rust-components-swift";
requirement = { requirement = {
kind = exactVersion; kind = exactVersion;
version = 1.1.62; version = 1.1.63;
}; };
}; };
821C67C9A7F8CC3FD41B28B4 /* XCRemoteSwiftPackageReference "emojibase-bindings" */ = { 821C67C9A7F8CC3FD41B28B4 /* XCRemoteSwiftPackageReference "emojibase-bindings" */ = {
@@ -139,8 +139,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/matrix-org/matrix-rust-components-swift", "location" : "https://github.com/matrix-org/matrix-rust-components-swift",
"state" : { "state" : {
"revision" : "c060a2a24f3cfa3cff3f6075bdc1e88abea72553", "revision" : "3d116223646fc7310b977e5116f96b834a9f57f6",
"version" : "1.1.62" "version" : "1.1.63"
} }
}, },
{ {
@@ -113,8 +113,8 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
presentSecureBackupScreen(animated: true) presentSecureBackupScreen(animated: true)
case .userDetails: case .userDetails:
presentUserDetailsEditScreen() presentUserDetailsEditScreen()
case .accountProfile: case let .manageAccount(url):
presentAccountProfileURL() presentAccountManagementURL(url)
case .analytics: case .analytics:
presentAnalyticsScreen() presentAnalyticsScreen()
case .appLock: case .appLock:
@@ -130,8 +130,6 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
presentLegalInformationScreen() presentLegalInformationScreen()
case .blockedUsers: case .blockedUsers:
presentBlockedUsersScreen() presentBlockedUsersScreen()
case .accountSessions:
presentAccountSessionsListURL()
case .notifications: case .notifications:
presentNotificationSettings() presentNotificationSettings()
case .advancedSettings: case .advancedSettings:
@@ -243,22 +241,6 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
// MARK: OIDC Account Management // MARK: OIDC Account Management
private func presentAccountProfileURL() {
guard let url = parameters.userSession.clientProxy.accountURL(action: .profile) else {
MXLog.error("Account URL is missing.")
return
}
presentAccountManagementURL(url)
}
private func presentAccountSessionsListURL() {
guard let url = parameters.userSession.clientProxy.accountURL(action: .sessionsList) else {
MXLog.error("Account URL is missing.")
return
}
presentAccountManagementURL(url)
}
private var accountSettingsPresenter: OIDCAccountSettingsPresenter? private var accountSettingsPresenter: OIDCAccountSettingsPresenter?
private func presentAccountManagementURL(_ url: URL) { private func presentAccountManagementURL(_ url: URL) {
// Note to anyone in the future if you come back here to make this open in Safari instead of a WAS. // Note to anyone in the future if you come back here to make this open in Safari instead of a WAS.
@@ -2104,14 +2104,14 @@ class ClientProxyMock: ClientProxyProtocol {
} }
} }
} }
var accountURLActionClosure: ((AccountManagementAction) -> URL?)? var accountURLActionClosure: ((AccountManagementAction) async -> URL?)?
func accountURL(action: AccountManagementAction) -> URL? { func accountURL(action: AccountManagementAction) async -> URL? {
accountURLActionCallsCount += 1 accountURLActionCallsCount += 1
accountURLActionReceivedAction = action accountURLActionReceivedAction = action
accountURLActionReceivedInvocations.append(action) accountURLActionReceivedInvocations.append(action)
if let accountURLActionClosure = accountURLActionClosure { if let accountURLActionClosure = accountURLActionClosure {
return accountURLActionClosure(action) return await accountURLActionClosure(action)
} else { } else {
return accountURLActionReturnValue return accountURLActionReturnValue
} }
@@ -135,9 +135,9 @@ class SDKClientMock: SDKClientProtocol {
} }
} }
} }
public var accountUrlActionClosure: ((AccountManagementAction?) throws -> String?)? public var accountUrlActionClosure: ((AccountManagementAction?) async throws -> String?)?
public func accountUrl(action: AccountManagementAction?) throws -> String? { public func accountUrl(action: AccountManagementAction?) async throws -> String? {
if let error = accountUrlActionThrowableError { if let error = accountUrlActionThrowableError {
throw error throw error
} }
@@ -145,7 +145,7 @@ class SDKClientMock: SDKClientProtocol {
accountUrlActionReceivedAction = action accountUrlActionReceivedAction = action
accountUrlActionReceivedInvocations.append(action) accountUrlActionReceivedInvocations.append(action)
if let accountUrlActionClosure = accountUrlActionClosure { if let accountUrlActionClosure = accountUrlActionClosure {
return try accountUrlActionClosure(action) return try await accountUrlActionClosure(action)
} else { } else {
return accountUrlActionReturnValue return accountUrlActionReturnValue
} }
@@ -27,13 +27,12 @@ enum SettingsScreenCoordinatorAction {
case logout case logout
case secureBackup case secureBackup
case userDetails case userDetails
case accountProfile
case analytics case analytics
case appLock case appLock
case bugReport case bugReport
case about case about
case blockedUsers case blockedUsers
case accountSessions case manageAccount(url: URL)
case notifications case notifications
case advancedSettings case advancedSettings
case developerOptions case developerOptions
@@ -64,8 +63,8 @@ final class SettingsScreenCoordinator: CoordinatorProtocol {
actionsSubject.send(.dismiss) actionsSubject.send(.dismiss)
case .userDetails: case .userDetails:
actionsSubject.send(.userDetails) actionsSubject.send(.userDetails)
case .accountProfile: case let .manageAccount(url):
actionsSubject.send(.accountProfile) actionsSubject.send(.manageAccount(url: url))
case .analytics: case .analytics:
actionsSubject.send(.analytics) actionsSubject.send(.analytics)
case .appLock: case .appLock:
@@ -78,8 +77,6 @@ final class SettingsScreenCoordinator: CoordinatorProtocol {
actionsSubject.send(.blockedUsers) actionsSubject.send(.blockedUsers)
case .secureBackup: case .secureBackup:
actionsSubject.send(.secureBackup) actionsSubject.send(.secureBackup)
case .accountSessionsList:
actionsSubject.send(.accountSessions)
case .notifications: case .notifications:
actionsSubject.send(.notifications) actionsSubject.send(.notifications)
case .advancedSettings: case .advancedSettings:
@@ -17,17 +17,16 @@
import Foundation import Foundation
import UIKit import UIKit
enum SettingsScreenViewModelAction { enum SettingsScreenViewModelAction: Equatable {
case close case close
case userDetails case userDetails
case accountProfile case manageAccount(url: URL)
case analytics case analytics
case appLock case appLock
case reportBug case reportBug
case about case about
case blockedUsers case blockedUsers
case secureBackup case secureBackup
case accountSessionsList
case notifications case notifications
case advancedSettings case advancedSettings
case developerOptions case developerOptions
@@ -57,14 +56,13 @@ struct SettingsScreenViewState: BindableState {
enum SettingsScreenViewAction { enum SettingsScreenViewAction {
case close case close
case userDetails case userDetails
case accountProfile
case analytics case analytics
case appLock case appLock
case reportBug case reportBug
case about case about
case blockedUsers case blockedUsers
case secureBackup case secureBackup
case accountSessionsList case manageAccount(url: URL)
case notifications case notifications
case developerOptions case developerOptions
case advancedSettings case advancedSettings
@@ -29,8 +29,6 @@ class SettingsScreenViewModel: SettingsScreenViewModelType, SettingsScreenViewMo
init(userSession: UserSessionProtocol, appSettings: AppSettings) { init(userSession: UserSessionProtocol, appSettings: AppSettings) {
super.init(initialViewState: .init(deviceID: userSession.deviceID, super.init(initialViewState: .init(deviceID: userSession.deviceID,
userID: userSession.userID, userID: userSession.userID,
accountProfileURL: userSession.clientProxy.accountURL(action: .profile),
accountSessionsListURL: userSession.clientProxy.accountURL(action: .sessionsList),
showDeveloperOptions: appSettings.isDevelopmentBuild), showDeveloperOptions: appSettings.isDevelopmentBuild),
imageProvider: userSession.mediaProvider) imageProvider: userSession.mediaProvider)
@@ -81,6 +79,8 @@ class SettingsScreenViewModel: SettingsScreenViewModelType, SettingsScreenViewMo
Task { Task {
await userSession.clientProxy.loadUserAvatarURL() await userSession.clientProxy.loadUserAvatarURL()
await userSession.clientProxy.loadUserDisplayName() await userSession.clientProxy.loadUserDisplayName()
await state.accountProfileURL = userSession.clientProxy.accountURL(action: .profile)
await state.accountSessionsListURL = userSession.clientProxy.accountURL(action: .sessionsList)
} }
} }
@@ -90,8 +90,8 @@ class SettingsScreenViewModel: SettingsScreenViewModelType, SettingsScreenViewMo
actionsSubject.send(.close) actionsSubject.send(.close)
case .userDetails: case .userDetails:
actionsSubject.send(.userDetails) actionsSubject.send(.userDetails)
case .accountProfile: case let .manageAccount(url):
actionsSubject.send(.accountProfile) actionsSubject.send(.manageAccount(url: url))
case .analytics: case .analytics:
actionsSubject.send(.analytics) actionsSubject.send(.analytics)
case .appLock: case .appLock:
@@ -108,8 +108,6 @@ class SettingsScreenViewModel: SettingsScreenViewModelType, SettingsScreenViewMo
actionsSubject.send(.secureBackup) actionsSubject.send(.secureBackup)
case .notifications: case .notifications:
actionsSubject.send(.notifications) actionsSubject.send(.notifications)
case .accountSessionsList:
actionsSubject.send(.accountSessionsList)
case .advancedSettings: case .advancedSettings:
actionsSubject.send(.advancedSettings) actionsSubject.send(.advancedSettings)
case .developerOptions: case .developerOptions:
@@ -29,9 +29,7 @@ struct SettingsScreen: View {
mainSection mainSection
if context.viewState.accountSessionsListURL != nil { manageSessionsSection
manageSessionsSection
}
advancedOptionsSection advancedOptionsSection
@@ -95,11 +93,11 @@ struct SettingsScreen: View {
private var mainSection: some View { private var mainSection: some View {
Section { Section {
if context.viewState.accountProfileURL != nil { if let url = context.viewState.accountProfileURL {
ListRow(label: .default(title: L10n.actionManageAccount, ListRow(label: .default(title: L10n.actionManageAccount,
icon: \.userProfile), icon: \.userProfile),
kind: .button { kind: .button {
context.send(viewAction: .accountProfile) context.send(viewAction: .manageAccount(url: url))
}) })
.accessibilityIdentifier(A11yIdentifiers.settingsScreen.account) .accessibilityIdentifier(A11yIdentifiers.settingsScreen.account)
} }
@@ -150,13 +148,16 @@ struct SettingsScreen: View {
} }
} }
@ViewBuilder
private var manageSessionsSection: some View { private var manageSessionsSection: some View {
Section { if let url = context.viewState.accountSessionsListURL {
ListRow(label: .default(title: L10n.actionManageDevices, Section {
icon: \.devices), ListRow(label: .default(title: L10n.actionManageDevices,
kind: .button { icon: \.devices),
context.send(viewAction: .accountSessionsList) kind: .button {
}) context.send(viewAction: .manageAccount(url: url))
})
}
} }
} }
@@ -252,6 +253,7 @@ struct SettingsScreen_Previews: PreviewProvider, TestablePreview {
static var previews: some View { static var previews: some View {
NavigationStack { NavigationStack {
SettingsScreen(context: viewModel.context) SettingsScreen(context: viewModel.context)
.snapshot(delay: 1.0)
} }
} }
} }
@@ -281,8 +281,8 @@ class ClientProxy: ClientProxyProtocol {
} }
} }
func accountURL(action: AccountManagementAction) -> URL? { func accountURL(action: AccountManagementAction) async -> URL? {
try? client.accountUrl(action: action).flatMap(URL.init(string:)) try? await client.accountUrl(action: action).flatMap(URL.init(string:))
} }
func createDirectRoomIfNeeded(with userID: String, expectedRoomName: String?) async -> Result<(roomID: String, isNewRoom: Bool), ClientProxyError> { func createDirectRoomIfNeeded(with userID: String, expectedRoomName: String?) async -> Result<(roomID: String, isNewRoom: Bool), ClientProxyError> {
@@ -121,7 +121,7 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol {
func stopSync() func stopSync()
func accountURL(action: AccountManagementAction) -> URL? func accountURL(action: AccountManagementAction) async -> URL?
func createDirectRoomIfNeeded(with userID: String, expectedRoomName: String?) async -> Result<(roomID: String, isNewRoom: Bool), ClientProxyError> func createDirectRoomIfNeeded(with userID: String, expectedRoomName: String?) async -> Result<(roomID: String, isNewRoom: Bool), ClientProxyError>
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:b8d548c95a888ab8feb15497036af3c89895723dd9525e7681b77761c0347d70 oid sha256:42c6c41d8e7cedc083dda31f83603bb3afdc827454f12dffff2262b6a66809fb
size 197781 size 211546
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:de12cfef26e495bcf88a206f9fe9d23cd69f3272b5ae142650e7b77c6f894ef0 oid sha256:708a96b3352fc118715a9cd92369eaf5130aa2dbfdd41a5a122ef44d28becd93
size 267624 size 282736
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:94f2d6b19bd5fbb45cd4edf50944337d512a93c9aec31ec9fad0ec0168d62fe0 oid sha256:57d1dc985ee32ac33b689281ff6869c21e1cc97c4f3a1bb5c9c84dd3ea0f3010
size 141417 size 143141
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:b85fccd1487aa9f7b46b99d4ba3c9758d6b43bfecb6e4ff7ac3b7d407fdd2f5e oid sha256:b27765cd80dd36afd157d672c254f9d2481e70ccd1faca0409b6d4a9b5c91979
size 195200 size 188558
+1 -1
View File
@@ -49,7 +49,7 @@ packages:
# Element/Matrix dependencies # Element/Matrix dependencies
MatrixRustSDK: MatrixRustSDK:
url: https://github.com/matrix-org/matrix-rust-components-swift url: https://github.com/matrix-org/matrix-rust-components-swift
exactVersion: 1.1.62 exactVersion: 1.1.63
# path: ../matrix-rust-sdk # path: ../matrix-rust-sdk
Compound: Compound:
url: https://github.com/element-hq/compound-ios url: https://github.com/element-hq/compound-ios