mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
RoomMemberDetailsScreen (#727)
* generated files * Revert "generated files" This reverts commit f62c1dbcd9e505083ad4ff17532e2c054e253187. * renaming files to RoomMembersList * completed the renaming of the list files * added generated files * basic setup of the view and the mock * added a new mock with a avatar * share/copy link * copyUserLink implemented * removed unimplemented tests * block user UI * navigation to room member details added * implemented but we require a sync from the Rust side * adjusted some UI test screens * alert for unblocking * completed * some tests * changelog * some unit tests * improved the tests * removed unused comment * Update ElementX/Sources/Services/Room/RoomProxy.swift Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> * optional displayName * removing toggle * removed cancel title * Update UnitTests/Sources/RoomMemberDetailsViewModelTests.swift Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> * removing Group * pr suggestion * better naming * removed capitalizingFirstLetter * Update ElementX/Sources/Other/Extensions/Alert.swift Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> * trailing closure * removed useless catch clause * naming conformed to ignore --------- Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
This commit is contained in:
@@ -18,9 +18,16 @@ import Foundation
|
||||
import MatrixRustSDK
|
||||
|
||||
final class RoomMemberProxy: RoomMemberProxyProtocol {
|
||||
private let backgroundTaskService: BackgroundTaskServiceProtocol
|
||||
private let member: RoomMemberProtocol
|
||||
|
||||
init(member: RoomMemberProtocol) {
|
||||
private let backgroundAccountDataTaskName = "SendAccountDataEvent"
|
||||
private var sendAccountDataEventBackgroundTask: BackgroundTaskProtocol?
|
||||
|
||||
private let userInitiatedDispatchQueue = DispatchQueue(label: "io.element.elementx.roommemberproxy.userinitiated", qos: .userInitiated)
|
||||
|
||||
init(member: RoomMemberProtocol, backgroundTaskService: BackgroundTaskServiceProtocol) {
|
||||
self.backgroundTaskService = backgroundTaskService
|
||||
self.member = member
|
||||
}
|
||||
|
||||
@@ -51,4 +58,44 @@ final class RoomMemberProxy: RoomMemberProxyProtocol {
|
||||
var normalizedPowerLevel: Int {
|
||||
Int(member.normalizedPowerLevel())
|
||||
}
|
||||
|
||||
var isAccountOwner: Bool {
|
||||
member.isAccountUser()
|
||||
}
|
||||
|
||||
var isIgnored: Bool {
|
||||
member.isIgnored()
|
||||
}
|
||||
|
||||
func ignoreUser() async -> Result<Void, RoomMemberProxyError> {
|
||||
sendAccountDataEventBackgroundTask = backgroundTaskService.startBackgroundTask(withName: backgroundAccountDataTaskName, isReusable: true)
|
||||
defer {
|
||||
sendAccountDataEventBackgroundTask?.stop()
|
||||
}
|
||||
|
||||
return await Task.dispatch(on: userInitiatedDispatchQueue) {
|
||||
do {
|
||||
try self.member.ignore()
|
||||
return .success(())
|
||||
} catch {
|
||||
return .failure(.ignoreUserFailed)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func unignoreUser() async -> Result<Void, RoomMemberProxyError> {
|
||||
sendAccountDataEventBackgroundTask = backgroundTaskService.startBackgroundTask(withName: backgroundAccountDataTaskName, isReusable: true)
|
||||
defer {
|
||||
sendAccountDataEventBackgroundTask?.stop()
|
||||
}
|
||||
|
||||
return await Task.dispatch(on: userInitiatedDispatchQueue) {
|
||||
do {
|
||||
try self.member.unignore()
|
||||
return .success(())
|
||||
} catch {
|
||||
return .failure(.unignoreUserFailed)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
import Foundation
|
||||
import MatrixRustSDK
|
||||
|
||||
enum RoomMemberProxyError: Error {
|
||||
case ignoreUserFailed
|
||||
case unignoreUserFailed
|
||||
}
|
||||
|
||||
@MainActor
|
||||
// sourcery: AutoMockable
|
||||
protocol RoomMemberProxyProtocol {
|
||||
var userID: String { get }
|
||||
@@ -26,4 +32,15 @@ protocol RoomMemberProxyProtocol {
|
||||
var isNameAmbiguous: Bool { get }
|
||||
var powerLevel: Int { get }
|
||||
var normalizedPowerLevel: Int { get }
|
||||
var isAccountOwner: Bool { get }
|
||||
var isIgnored: Bool { get }
|
||||
|
||||
func ignoreUser() async -> Result<Void, RoomMemberProxyError>
|
||||
func unignoreUser() async -> Result<Void, RoomMemberProxyError>
|
||||
}
|
||||
|
||||
extension RoomMemberProxyProtocol {
|
||||
var permalink: URL? {
|
||||
try? PermalinkBuilder.permalinkTo(userIdentifier: userID)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -272,13 +272,16 @@ class RoomProxy: RoomProxyProtocol {
|
||||
}
|
||||
|
||||
func members() async -> Result<[RoomMemberProxyProtocol], RoomProxyError> {
|
||||
await Task.dispatch(on: .global()) {
|
||||
do {
|
||||
do {
|
||||
let members = try await Task.dispatch(on: .global()) {
|
||||
let members = try self.room.members()
|
||||
return .success(members.map { RoomMemberProxy(member: $0) })
|
||||
} catch {
|
||||
return .failure(.failedRetrievingMembers)
|
||||
return members
|
||||
}
|
||||
|
||||
let proxiedMembers = await members.asyncMap { RoomMemberProxy(member: $0, backgroundTaskService: self.backgroundTaskService) }
|
||||
return .success(proxiedMembers)
|
||||
} catch {
|
||||
return .failure(.failedRetrievingMembers)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user