Improve how alias settings are handled, add unit tests (#3686)

This commit is contained in:
Stefan Ceriu
2025-01-20 15:43:47 +02:00
committed by GitHub
parent 13e66062ba
commit 0fd8df52ab
10 changed files with 144 additions and 24 deletions
@@ -31,23 +31,33 @@ class EditRoomAddressScreenViewModel: EditRoomAddressScreenViewModelType, EditRo
self.clientProxy = clientProxy
self.userIndicatorController = userIndicatorController
var aliasLocalPart = ""
if let canonicalAlias = roomProxy.infoPublisher.value.canonicalAlias {
aliasLocalPart = canonicalAlias.dropFirst().split(separator: ":").first.flatMap(String.init) ?? ""
} else if let displayName = roomProxy.infoPublisher.value.displayName {
aliasLocalPart = roomAliasNameFromRoomDisplayName(roomName: displayName)
}
if let initialViewState {
super.init(initialViewState: initialViewState)
} else {
super.init(initialViewState: EditRoomAddressScreenViewState(serverName: clientProxy.userIDServerName ?? "",
currentAliasLocalPart: aliasLocalPart,
bindings: .init(desiredAliasLocalPart: aliasLocalPart)))
super.init(initialViewState: EditRoomAddressScreenViewState(serverName: clientProxy.userIDServerName ?? ""))
state.currentAliasLocalPart = localPartForMatchingAlias(computeFromDisplayName: false)
state.bindings.desiredAliasLocalPart = localPartForMatchingAlias(computeFromDisplayName: true) ?? ""
}
setupSubscriptions()
}
/// Give priority to aliases from the current user's homeserver as remote ones
/// cannot be edited. If none match then don't fallback and show an empty alias
/// instead so that the user can add one sepecific to this homeserver.
private func localPartForMatchingAlias(computeFromDisplayName: Bool) -> String? {
if let matchingAlias = roomProxy.infoPublisher.value.firstAliasMatching(serverName: clientProxy.userIDServerName, useFallback: false) {
return matchingAlias.aliasLocalPart
}
guard computeFromDisplayName, let displayName = roomProxy.infoPublisher.value.displayName else {
return nil
}
return roomAliasNameFromRoomDisplayName(roomName: displayName)
}
// MARK: - Public
override func process(viewAction: EditRoomAddressScreenViewAction) {
@@ -136,7 +146,7 @@ class EditRoomAddressScreenViewModel: EditRoomAddressScreenViewModelType, EditRo
return
}
let oldAlias = roomProxy.infoPublisher.value.canonicalAlias
let oldAlias = roomProxy.infoPublisher.value.firstAliasMatching(serverName: clientProxy.userIDServerName, useFallback: false)
// First publish the new alias
if case .failure = await roomProxy.publishRoomAliasInRoomDirectory(canonicalAlias) {
@@ -172,3 +182,9 @@ class EditRoomAddressScreenViewModel: EditRoomAddressScreenViewModelType, EditRo
userIndicatorController.retractIndicatorWithId(Self.loadingIndicatorIdentifier)
}
}
private extension String {
var aliasLocalPart: String {
dropFirst().split(separator: ":").first.flatMap(String.init) ?? ""
}
}