Skip to content

Commit

Permalink
Show DM recipient verification badges on the room details screen prof…
Browse files Browse the repository at this point in the history
…ile button (#3824)
  • Loading branch information
stefanceriu authored Feb 26, 2025
1 parent 2db80b6 commit 5b2f6cf
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 132 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ enum RoomDetailsScreenViewModelAction: Equatable {

// MARK: View

struct DMRecipientInfo {
var member: RoomMemberDetails
var verificationState: UserIdentityVerificationState?
}

struct RoomDetailsScreenViewState: BindableState {
var details: RoomDetails

Expand Down Expand Up @@ -60,11 +65,11 @@ struct RoomDetailsScreenViewState: BindableState {
var knockRequestsCount = 0

var canSeeKnockingRequests: Bool {
knockingEnabled && dmRecipient == nil && isKnockableRoom && (canInviteUsers || canKickUsers || canBanUsers)
knockingEnabled && dmRecipientInfo == nil && isKnockableRoom && (canInviteUsers || canKickUsers || canBanUsers)
}

var canSeeSecurityAndPrivacy: Bool {
knockingEnabled && dmRecipient == nil && canEditRolesOrPermissions
knockingEnabled && dmRecipientInfo == nil && canEditRolesOrPermissions
}

var canEdit: Bool {
Expand All @@ -77,18 +82,18 @@ struct RoomDetailsScreenViewState: BindableState {

var bindings: RoomDetailsScreenViewStateBindings

var dmRecipient: RoomMemberDetails?
var dmRecipientInfo: DMRecipientInfo?
var accountOwner: RoomMemberDetails?

var shortcuts: [RoomDetailsScreenViewShortcut] {
var shortcuts: [RoomDetailsScreenViewShortcut] = [.mute]
if !ProcessInfo.processInfo.isiOSAppOnMac, canJoinCall {
shortcuts.append(.call)
}
if dmRecipient == nil, canInviteUsers {
if dmRecipientInfo == nil, canInviteUsers {
shortcuts.append(.invite)
}
if let permalink = dmRecipient?.permalink {
if let permalink = dmRecipientInfo?.member.permalink {
shortcuts.append(.share(link: permalink))
} else if let permalink {
shortcuts.append(.share(link: permalink))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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)

Expand All @@ -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 {
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)
}
Expand Down
Loading

0 comments on commit 5b2f6cf

Please sign in to comment.