Show DM recipient verification badges on the room details screen profile button (#3824)

This commit is contained in:
Stefan Ceriu
2025-02-26 13:55:59 +02:00
committed by GitHub
parent 2db80b6858
commit 5b2f6cfbf4
12 changed files with 219 additions and 132 deletions
@@ -20,7 +20,6 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
private let attributedStringBuilder: AttributedStringBuilderProtocol
private let appSettings: AppSettings
private var dmRecipient: RoomMemberProxyProtocol?
private var pinnedEventsTimelineProvider: TimelineProviderProtocol? {
didSet {
guard let pinnedEventsTimelineProvider else {
@@ -171,7 +170,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
case .processTapSecurityAndPrivacy:
actionsSubject.send(.displaySecurityAndPrivacy)
case .processTapRecipientProfile:
guard let userID = dmRecipient?.userID else {
guard let userID = state.dmRecipientInfo?.member.id else {
return
}
actionsSubject.send(.requestRecipientDetailsPresentation(userID: userID))
@@ -234,11 +233,16 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
.receive(on: DispatchQueue.main)
.sink { [weak self, ownUserID = roomProxy.ownUserID] members in
guard let self else { return }
let accountOwner = members.first { $0.userID == ownUserID }
let dmRecipient = members.first { $0.userID != ownUserID }
self.dmRecipient = dmRecipient
self.state.dmRecipient = dmRecipient.map(RoomMemberDetails.init(withProxy:))
self.state.accountOwner = accountOwner.map(RoomMemberDetails.init(withProxy:))
if let accountOwner = members.first(where: { $0.userID == ownUserID }) {
self.state.accountOwner = .init(withProxy: accountOwner)
}
if let dmRecipient = members.first(where: { $0.userID != ownUserID }) {
self.state.dmRecipientInfo = .init(member: .init(withProxy: dmRecipient))
Task { await self.updateMemberIdentityVerificationStates() }
}
}
.store(in: &cancellables)
@@ -251,16 +255,25 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
return
}
for member in roomProxy.membersPublisher.value {
if case let .success(identity) = await clientProxy.userIdentity(for: member.userID) {
if identity?.verificationState == .verificationViolation {
state.hasMemberIdentityVerificationStateViolations = true
return
if roomProxy.isDirectOneToOneRoom {
if var dmRecipientInfo = state.dmRecipientInfo {
if case let .success(userIdentity) = await clientProxy.userIdentity(for: dmRecipientInfo.member.id) {
dmRecipientInfo.verificationState = userIdentity?.verificationState
state.dmRecipientInfo = dmRecipientInfo
}
}
} else {
for member in roomProxy.membersPublisher.value {
if case let .success(userIdentity) = await clientProxy.userIdentity(for: member.userID) {
if userIdentity?.verificationState == .verificationViolation {
state.hasMemberIdentityVerificationStateViolations = true
return
}
}
}
state.hasMemberIdentityVerificationStateViolations = false
}
state.hasMemberIdentityVerificationStateViolations = false
}
private func updatePowerLevelPermissions() async {
@@ -357,7 +370,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
}
private func ignore() async {
guard let dmUserID = dmRecipient?.userID else {
guard let dmUserID = state.dmRecipientInfo?.member.id else {
MXLog.error("Attempting to ignore a nil DM Recipient")
state.bindings.alertInfo = .init(id: .unknown)
return
@@ -369,16 +382,16 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
switch result {
case .success:
// Mutating the optional in place when built for Release crashes 🤷‍♂️
var dmRecipient = state.dmRecipient
dmRecipient?.isIgnored = true
state.dmRecipient = dmRecipient
var dmRecipientInfo = state.dmRecipientInfo
dmRecipientInfo?.member.isIgnored = true
state.dmRecipientInfo = dmRecipientInfo
case .failure:
state.bindings.alertInfo = .init(id: .unknown)
}
}
private func unignore() async {
guard let dmUserID = dmRecipient?.userID else {
guard let dmUserID = state.dmRecipientInfo?.member.id else {
MXLog.error("Attempting to unignore a nil DM Recipient")
state.bindings.alertInfo = .init(id: .unknown)
return
@@ -390,9 +403,9 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
switch result {
case .success:
// Mutating the optional in place when built for Release crashes 🤷‍♂️
var dmRecipient = state.dmRecipient
dmRecipient?.isIgnored = false
state.dmRecipient = dmRecipient
var dmRecipientInfo = state.dmRecipientInfo
dmRecipientInfo?.member.isIgnored = false
state.dmRecipientInfo = dmRecipientInfo
case .failure:
state.bindings.alertInfo = .init(id: .unknown)
}