Adopt the new latest event API. (#4779)

This commit is contained in:
Doug
2025-11-25 11:52:48 +00:00
committed by GitHub
parent 08514917fe
commit f2607affd2
23 changed files with 321 additions and 139 deletions
+1 -1
View File
@@ -140,7 +140,7 @@ extension ClientProxyMock {
}
}
userIdentityForReturnValue = .success(UserIdentityProxyMock(configuration: .init()))
userIdentityForFallBackToServerReturnValue = .success(UserIdentityProxyMock(configuration: .init()))
underlyingIsReportRoomSupported = true
underlyingIsLiveKitRTCSupported = true
@@ -5297,15 +5297,15 @@ class ClientProxyMock: ClientProxyProtocol, @unchecked Sendable {
}
//MARK: - userIdentity
var userIdentityForUnderlyingCallsCount = 0
var userIdentityForCallsCount: Int {
var userIdentityForFallBackToServerUnderlyingCallsCount = 0
var userIdentityForFallBackToServerCallsCount: Int {
get {
if Thread.isMainThread {
return userIdentityForUnderlyingCallsCount
return userIdentityForFallBackToServerUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = userIdentityForUnderlyingCallsCount
returnValue = userIdentityForFallBackToServerUnderlyingCallsCount
}
return returnValue!
@@ -5313,29 +5313,29 @@ class ClientProxyMock: ClientProxyProtocol, @unchecked Sendable {
}
set {
if Thread.isMainThread {
userIdentityForUnderlyingCallsCount = newValue
userIdentityForFallBackToServerUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
userIdentityForUnderlyingCallsCount = newValue
userIdentityForFallBackToServerUnderlyingCallsCount = newValue
}
}
}
}
var userIdentityForCalled: Bool {
return userIdentityForCallsCount > 0
var userIdentityForFallBackToServerCalled: Bool {
return userIdentityForFallBackToServerCallsCount > 0
}
var userIdentityForReceivedUserID: String?
var userIdentityForReceivedInvocations: [String] = []
var userIdentityForFallBackToServerReceivedArguments: (userID: String, fallBackToServer: Bool)?
var userIdentityForFallBackToServerReceivedInvocations: [(userID: String, fallBackToServer: Bool)] = []
var userIdentityForUnderlyingReturnValue: Result<UserIdentityProxyProtocol?, ClientProxyError>!
var userIdentityForReturnValue: Result<UserIdentityProxyProtocol?, ClientProxyError>! {
var userIdentityForFallBackToServerUnderlyingReturnValue: Result<UserIdentityProxyProtocol?, ClientProxyError>!
var userIdentityForFallBackToServerReturnValue: Result<UserIdentityProxyProtocol?, ClientProxyError>! {
get {
if Thread.isMainThread {
return userIdentityForUnderlyingReturnValue
return userIdentityForFallBackToServerUnderlyingReturnValue
} else {
var returnValue: Result<UserIdentityProxyProtocol?, ClientProxyError>? = nil
DispatchQueue.main.sync {
returnValue = userIdentityForUnderlyingReturnValue
returnValue = userIdentityForFallBackToServerUnderlyingReturnValue
}
return returnValue!
@@ -5343,26 +5343,26 @@ class ClientProxyMock: ClientProxyProtocol, @unchecked Sendable {
}
set {
if Thread.isMainThread {
userIdentityForUnderlyingReturnValue = newValue
userIdentityForFallBackToServerUnderlyingReturnValue = newValue
} else {
DispatchQueue.main.sync {
userIdentityForUnderlyingReturnValue = newValue
userIdentityForFallBackToServerUnderlyingReturnValue = newValue
}
}
}
}
var userIdentityForClosure: ((String) async -> Result<UserIdentityProxyProtocol?, ClientProxyError>)?
var userIdentityForFallBackToServerClosure: ((String, Bool) async -> Result<UserIdentityProxyProtocol?, ClientProxyError>)?
func userIdentity(for userID: String) async -> Result<UserIdentityProxyProtocol?, ClientProxyError> {
userIdentityForCallsCount += 1
userIdentityForReceivedUserID = userID
func userIdentity(for userID: String, fallBackToServer: Bool) async -> Result<UserIdentityProxyProtocol?, ClientProxyError> {
userIdentityForFallBackToServerCallsCount += 1
userIdentityForFallBackToServerReceivedArguments = (userID: userID, fallBackToServer: fallBackToServer)
DispatchQueue.main.async {
self.userIdentityForReceivedInvocations.append(userID)
self.userIdentityForFallBackToServerReceivedInvocations.append((userID: userID, fallBackToServer: fallBackToServer))
}
if let userIdentityForClosure = userIdentityForClosure {
return await userIdentityForClosure(userID)
if let userIdentityForFallBackToServerClosure = userIdentityForFallBackToServerClosure {
return await userIdentityForFallBackToServerClosure(userID, fallBackToServer)
} else {
return userIdentityForReturnValue
return userIdentityForFallBackToServerReturnValue
}
}
//MARK: - setTimelineMediaVisibility
@@ -8816,16 +8816,16 @@ open class EncryptionSDKMock: MatrixRustSDK.Encryption, @unchecked Sendable {
//MARK: - userIdentity
open var userIdentityUserIdThrowableError: Error?
var userIdentityUserIdUnderlyingCallsCount = 0
open var userIdentityUserIdCallsCount: Int {
open var userIdentityUserIdFallbackToServerThrowableError: Error?
var userIdentityUserIdFallbackToServerUnderlyingCallsCount = 0
open var userIdentityUserIdFallbackToServerCallsCount: Int {
get {
if Thread.isMainThread {
return userIdentityUserIdUnderlyingCallsCount
return userIdentityUserIdFallbackToServerUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = userIdentityUserIdUnderlyingCallsCount
returnValue = userIdentityUserIdFallbackToServerUnderlyingCallsCount
}
return returnValue!
@@ -8833,29 +8833,29 @@ open class EncryptionSDKMock: MatrixRustSDK.Encryption, @unchecked Sendable {
}
set {
if Thread.isMainThread {
userIdentityUserIdUnderlyingCallsCount = newValue
userIdentityUserIdFallbackToServerUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
userIdentityUserIdUnderlyingCallsCount = newValue
userIdentityUserIdFallbackToServerUnderlyingCallsCount = newValue
}
}
}
}
open var userIdentityUserIdCalled: Bool {
return userIdentityUserIdCallsCount > 0
open var userIdentityUserIdFallbackToServerCalled: Bool {
return userIdentityUserIdFallbackToServerCallsCount > 0
}
open var userIdentityUserIdReceivedUserId: String?
open var userIdentityUserIdReceivedInvocations: [String] = []
open var userIdentityUserIdFallbackToServerReceivedArguments: (userId: String, fallbackToServer: Bool)?
open var userIdentityUserIdFallbackToServerReceivedInvocations: [(userId: String, fallbackToServer: Bool)] = []
var userIdentityUserIdUnderlyingReturnValue: UserIdentity?
open var userIdentityUserIdReturnValue: UserIdentity? {
var userIdentityUserIdFallbackToServerUnderlyingReturnValue: UserIdentity?
open var userIdentityUserIdFallbackToServerReturnValue: UserIdentity? {
get {
if Thread.isMainThread {
return userIdentityUserIdUnderlyingReturnValue
return userIdentityUserIdFallbackToServerUnderlyingReturnValue
} else {
var returnValue: UserIdentity?? = nil
DispatchQueue.main.sync {
returnValue = userIdentityUserIdUnderlyingReturnValue
returnValue = userIdentityUserIdFallbackToServerUnderlyingReturnValue
}
return returnValue!
@@ -8863,29 +8863,29 @@ open class EncryptionSDKMock: MatrixRustSDK.Encryption, @unchecked Sendable {
}
set {
if Thread.isMainThread {
userIdentityUserIdUnderlyingReturnValue = newValue
userIdentityUserIdFallbackToServerUnderlyingReturnValue = newValue
} else {
DispatchQueue.main.sync {
userIdentityUserIdUnderlyingReturnValue = newValue
userIdentityUserIdFallbackToServerUnderlyingReturnValue = newValue
}
}
}
}
open var userIdentityUserIdClosure: ((String) async throws -> UserIdentity?)?
open var userIdentityUserIdFallbackToServerClosure: ((String, Bool) async throws -> UserIdentity?)?
open override func userIdentity(userId: String) async throws -> UserIdentity? {
if let error = userIdentityUserIdThrowableError {
open override func userIdentity(userId: String, fallbackToServer: Bool) async throws -> UserIdentity? {
if let error = userIdentityUserIdFallbackToServerThrowableError {
throw error
}
userIdentityUserIdCallsCount += 1
userIdentityUserIdReceivedUserId = userId
userIdentityUserIdFallbackToServerCallsCount += 1
userIdentityUserIdFallbackToServerReceivedArguments = (userId: userId, fallbackToServer: fallbackToServer)
DispatchQueue.main.async {
self.userIdentityUserIdReceivedInvocations.append(userId)
self.userIdentityUserIdFallbackToServerReceivedInvocations.append((userId: userId, fallbackToServer: fallbackToServer))
}
if let userIdentityUserIdClosure = userIdentityUserIdClosure {
return try await userIdentityUserIdClosure(userId)
if let userIdentityUserIdFallbackToServerClosure = userIdentityUserIdFallbackToServerClosure {
return try await userIdentityUserIdFallbackToServerClosure(userId, fallbackToServer)
} else {
return userIdentityUserIdReturnValue
return userIdentityUserIdFallbackToServerReturnValue
}
}
@@ -22936,6 +22936,127 @@ open class SpaceServiceSDKMock: MatrixRustSDK.SpaceService, @unchecked Sendable
}
fileprivate var underlyingHandle: UInt64!
//MARK: - addChildToSpace
open var addChildToSpaceChildIdSpaceIdThrowableError: Error?
var addChildToSpaceChildIdSpaceIdUnderlyingCallsCount = 0
open var addChildToSpaceChildIdSpaceIdCallsCount: Int {
get {
if Thread.isMainThread {
return addChildToSpaceChildIdSpaceIdUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = addChildToSpaceChildIdSpaceIdUnderlyingCallsCount
}
return returnValue!
}
}
set {
if Thread.isMainThread {
addChildToSpaceChildIdSpaceIdUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
addChildToSpaceChildIdSpaceIdUnderlyingCallsCount = newValue
}
}
}
}
open var addChildToSpaceChildIdSpaceIdCalled: Bool {
return addChildToSpaceChildIdSpaceIdCallsCount > 0
}
open var addChildToSpaceChildIdSpaceIdReceivedArguments: (childId: String, spaceId: String)?
open var addChildToSpaceChildIdSpaceIdReceivedInvocations: [(childId: String, spaceId: String)] = []
open var addChildToSpaceChildIdSpaceIdClosure: ((String, String) async throws -> Void)?
open override func addChildToSpace(childId: String, spaceId: String) async throws {
if let error = addChildToSpaceChildIdSpaceIdThrowableError {
throw error
}
addChildToSpaceChildIdSpaceIdCallsCount += 1
addChildToSpaceChildIdSpaceIdReceivedArguments = (childId: childId, spaceId: spaceId)
DispatchQueue.main.async {
self.addChildToSpaceChildIdSpaceIdReceivedInvocations.append((childId: childId, spaceId: spaceId))
}
try await addChildToSpaceChildIdSpaceIdClosure?(childId, spaceId)
}
//MARK: - joinedParentsOfChild
open var joinedParentsOfChildChildIdThrowableError: Error?
var joinedParentsOfChildChildIdUnderlyingCallsCount = 0
open var joinedParentsOfChildChildIdCallsCount: Int {
get {
if Thread.isMainThread {
return joinedParentsOfChildChildIdUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = joinedParentsOfChildChildIdUnderlyingCallsCount
}
return returnValue!
}
}
set {
if Thread.isMainThread {
joinedParentsOfChildChildIdUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
joinedParentsOfChildChildIdUnderlyingCallsCount = newValue
}
}
}
}
open var joinedParentsOfChildChildIdCalled: Bool {
return joinedParentsOfChildChildIdCallsCount > 0
}
open var joinedParentsOfChildChildIdReceivedChildId: String?
open var joinedParentsOfChildChildIdReceivedInvocations: [String] = []
var joinedParentsOfChildChildIdUnderlyingReturnValue: [SpaceRoom]!
open var joinedParentsOfChildChildIdReturnValue: [SpaceRoom]! {
get {
if Thread.isMainThread {
return joinedParentsOfChildChildIdUnderlyingReturnValue
} else {
var returnValue: [SpaceRoom]? = nil
DispatchQueue.main.sync {
returnValue = joinedParentsOfChildChildIdUnderlyingReturnValue
}
return returnValue!
}
}
set {
if Thread.isMainThread {
joinedParentsOfChildChildIdUnderlyingReturnValue = newValue
} else {
DispatchQueue.main.sync {
joinedParentsOfChildChildIdUnderlyingReturnValue = newValue
}
}
}
}
open var joinedParentsOfChildChildIdClosure: ((String) async throws -> [SpaceRoom])?
open override func joinedParentsOfChild(childId: String) async throws -> [SpaceRoom] {
if let error = joinedParentsOfChildChildIdThrowableError {
throw error
}
joinedParentsOfChildChildIdCallsCount += 1
joinedParentsOfChildChildIdReceivedChildId = childId
DispatchQueue.main.async {
self.joinedParentsOfChildChildIdReceivedInvocations.append(childId)
}
if let joinedParentsOfChildChildIdClosure = joinedParentsOfChildChildIdClosure {
return try await joinedParentsOfChildChildIdClosure(childId)
} else {
return joinedParentsOfChildChildIdReturnValue
}
}
//MARK: - joinedSpaces
var joinedSpacesUnderlyingCallsCount = 0
@@ -23076,6 +23197,52 @@ open class SpaceServiceSDKMock: MatrixRustSDK.SpaceService, @unchecked Sendable
}
}
//MARK: - removeChildFromSpace
open var removeChildFromSpaceChildIdSpaceIdThrowableError: Error?
var removeChildFromSpaceChildIdSpaceIdUnderlyingCallsCount = 0
open var removeChildFromSpaceChildIdSpaceIdCallsCount: Int {
get {
if Thread.isMainThread {
return removeChildFromSpaceChildIdSpaceIdUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = removeChildFromSpaceChildIdSpaceIdUnderlyingCallsCount
}
return returnValue!
}
}
set {
if Thread.isMainThread {
removeChildFromSpaceChildIdSpaceIdUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
removeChildFromSpaceChildIdSpaceIdUnderlyingCallsCount = newValue
}
}
}
}
open var removeChildFromSpaceChildIdSpaceIdCalled: Bool {
return removeChildFromSpaceChildIdSpaceIdCallsCount > 0
}
open var removeChildFromSpaceChildIdSpaceIdReceivedArguments: (childId: String, spaceId: String)?
open var removeChildFromSpaceChildIdSpaceIdReceivedInvocations: [(childId: String, spaceId: String)] = []
open var removeChildFromSpaceChildIdSpaceIdClosure: ((String, String) async throws -> Void)?
open override func removeChildFromSpace(childId: String, spaceId: String) async throws {
if let error = removeChildFromSpaceChildIdSpaceIdThrowableError {
throw error
}
removeChildFromSpaceChildIdSpaceIdCallsCount += 1
removeChildFromSpaceChildIdSpaceIdReceivedArguments = (childId: childId, spaceId: spaceId)
DispatchQueue.main.async {
self.removeChildFromSpaceChildIdSpaceIdReceivedInvocations.append((childId: childId, spaceId: spaceId))
}
try await removeChildFromSpaceChildIdSpaceIdClosure?(childId, spaceId)
}
//MARK: - spaceRoomList
open var spaceRoomListSpaceIdThrowableError: Error?
@@ -329,14 +329,14 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
if roomProxy.isDirectOneToOneRoom {
if var dmRecipientInfo = state.dmRecipientInfo {
if case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: dmRecipientInfo.member.id) {
if case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: dmRecipientInfo.member.id, fallBackToServer: true) {
dmRecipientInfo.verificationState = userIdentity?.verificationState
state.dmRecipientInfo = dmRecipientInfo
}
}
} else {
for member in roomProxy.membersPublisher.value {
if case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: member.userID) {
if case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: member.userID, fallBackToServer: false) {
if userIdentity?.verificationState == .verificationViolation {
state.hasMemberIdentityVerificationStateViolations = true
return
@@ -446,7 +446,7 @@ struct RoomDetailsScreen_Previews: PreviewProvider, TestablePreview {
let clientProxyMock = ClientProxyMock(.init())
clientProxyMock.userIdentityForClosure = { userID in
clientProxyMock.userIdentityForFallBackToServerClosure = { userID, _ in
let identity = switch userID {
case RoomMemberProxyMock.mockDan.userID:
UserIdentityProxyMock(configuration: .init(verificationState: verificationState))
@@ -112,7 +112,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
actionsSubject.send(.openUserProfile)
}
if case let .success(.some(identity)) = await userSession.clientProxy.userIdentity(for: state.userID) {
if case let .success(.some(identity)) = await userSession.clientProxy.userIdentity(for: state.userID, fallBackToServer: true) {
state.verificationState = identity.verificationState
} else {
MXLog.error("Failed to find the member's identity.")
@@ -209,7 +209,7 @@ struct RoomMemberDetailsScreen_Previews: PreviewProvider, TestablePreview {
let clientProxyMock = ClientProxyMock(.init())
clientProxyMock.userIdentityForClosure = { userID in
clientProxyMock.userIdentityForFallBackToServerClosure = { userID, _ in
let identity = switch userID {
case RoomMemberProxyMock.mockDan.userID:
UserIdentityProxyMock(configuration: .init(verificationState: .verified))
@@ -132,7 +132,7 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
for member in members {
var verificationState: UserIdentityVerificationState = .notVerified
if roomProxy.infoPublisher.value.isEncrypted, // We don't care about identity statuses on non-encrypted rooms
case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: member.userID),
case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: member.userID, fallBackToServer: false),
let userIdentity {
verificationState = userIdentity.verificationState
}
@@ -240,7 +240,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
}
let clientProxyMock = ClientProxyMock(.init())
clientProxyMock.userIdentityForClosure = { userID in
clientProxyMock.userIdentityForFallBackToServerClosure = { userID, _ in
let identity = switch userID {
case RoomMemberProxyMock.mockAlice.userID:
UserIdentityProxyMock(configuration: .init(verificationState: .verified))
@@ -257,7 +257,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
private func updateVerificationBadge() async {
guard roomProxy.isDirectOneToOneRoom,
let dmRecipient = roomProxy.membersPublisher.value.first(where: { $0.userID != roomProxy.ownUserID }),
case let .success(userIdentity) = await clientProxy.userIdentity(for: dmRecipient.userID) else {
case let .success(userIdentity) = await clientProxy.userIdentity(for: dmRecipient.userID, fallBackToServer: true) else {
state.dmRecipientVerificationState = .notVerified
return
}
@@ -86,7 +86,7 @@ class ThreadTimelineScreenViewModel: ThreadTimelineScreenViewModelType, ThreadTi
private func updateVerificationBadge() async {
guard roomProxy.isDirectOneToOneRoom,
let dmRecipient = roomProxy.membersPublisher.value.first(where: { $0.userID != roomProxy.ownUserID }),
case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: dmRecipient.userID) else {
case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: dmRecipient.userID, fallBackToServer: true) else {
state.dmRecipientVerificationState = .notVerified
return
}
@@ -73,7 +73,7 @@ class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScr
private func loadProfile() async {
async let profileResult = userSession.clientProxy.profile(for: state.userID)
async let identityResult = userSession.clientProxy.userIdentity(for: state.userID)
async let identityResult = userSession.clientProxy.userIdentity(for: state.userID, fallBackToServer: true)
switch await profileResult {
case .success(let userProfile):
@@ -119,7 +119,7 @@ struct UserProfileScreen_Previews: PreviewProvider, TestablePreview {
static func makeViewModel(userID: String) -> UserProfileScreenViewModel {
let clientProxyMock = ClientProxyMock(.init())
clientProxyMock.userIdentityForClosure = { userID in
clientProxyMock.userIdentityForFallBackToServerClosure = { userID, _ in
let identity = switch userID {
case RoomMemberProxyMock.mockDan.userID:
UserIdentityProxyMock(configuration: .init(verificationState: .verified))
@@ -1097,7 +1097,7 @@ class ClientProxy: ClientProxyProtocol {
MXLog.info("Pinning current identity for user: \(userID)")
do {
guard let userIdentity = try await client.encryption().userIdentity(userId: userID) else {
guard let userIdentity = try await client.encryption().userIdentity(userId: userID, fallbackToServer: true) else {
MXLog.error("Failed retrieving identity for user: \(userID)")
return .failure(.failedRetrievingUserIdentity)
}
@@ -1113,7 +1113,7 @@ class ClientProxy: ClientProxyProtocol {
MXLog.info("Withdrawing current identity verification for user: \(userID)")
do {
guard let userIdentity = try await client.encryption().userIdentity(userId: userID) else {
guard let userIdentity = try await client.encryption().userIdentity(userId: userID, fallbackToServer: true) else {
MXLog.error("Failed retrieving identity for user: \(userID)")
return .failure(.failedRetrievingUserIdentity)
}
@@ -1133,9 +1133,9 @@ class ClientProxy: ClientProxyProtocol {
}
}
func userIdentity(for userID: String) async -> Result<UserIdentityProxyProtocol?, ClientProxyError> {
func userIdentity(for userID: String, fallBackToServer: Bool) async -> Result<UserIdentityProxyProtocol?, ClientProxyError> {
do {
return try await .success(client.encryption().userIdentity(userId: userID).map(UserIdentityProxy.init))
return try await .success(client.encryption().userIdentity(userId: userID, fallbackToServer: fallBackToServer).map(UserIdentityProxy.init))
} catch {
MXLog.error("Failed retrieving user identity: \(error)")
return .failure(.sdkError(error))
@@ -236,7 +236,7 @@ protocol ClientProxyProtocol: AnyObject {
func withdrawUserIdentityVerification(_ userID: String) async -> Result<Void, ClientProxyError>
func resetIdentity() async -> Result<IdentityResetHandle?, ClientProxyError>
func userIdentity(for userID: String) async -> Result<UserIdentityProxyProtocol?, ClientProxyError>
func userIdentity(for userID: String, fallBackToServer: Bool) async -> Result<UserIdentityProxyProtocol?, ClientProxyError>
// MARK: - Moderation & Safety
@@ -16,15 +16,19 @@ struct RoomEventStringBuilder {
let shouldPrefixSenderName: Bool
func buildAttributedString(for eventItemProxy: EventTimelineItemProxy) -> AttributedString? {
let sender = eventItemProxy.sender
let isOutgoing = eventItemProxy.isOwn
buildAttributedString(for: eventItemProxy.content,
sender: eventItemProxy.sender,
isOutgoing: eventItemProxy.isOwn)
}
func buildAttributedString(for content: TimelineItemContent, sender: TimelineItemSender, isOutgoing: Bool) -> AttributedString? {
let displayName = if shouldDisambiguateDisplayNames {
sender.disambiguatedDisplayName ?? sender.id
} else {
sender.displayName ?? sender.id
}
switch eventItemProxy.content {
switch content {
case .msgLike(let messageLikeContent):
switch messageLikeContent.kind {
case .message(let messageContent):
@@ -230,10 +230,10 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
return updatedItems
}
private func fetchRoomDetails(from room: Room) -> (roomInfo: RoomInfo?, latestEvent: EventTimelineItem?) {
private func fetchRoomDetails(from room: Room) -> (roomInfo: RoomInfo?, latestEvent: LatestEventValue?) {
class FetchResult {
var roomInfo: RoomInfo?
var latestEvent: EventTimelineItem?
var latestEvent: LatestEventValue?
}
let semaphore = DispatchSemaphore(value: 0)
@@ -241,7 +241,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
Task {
do {
result.latestEvent = await room.latestEvent()
result.latestEvent = await room.newLatestEvent()
result.roomInfo = try await room.roomInfo()
} catch {
MXLog.error("Failed fetching room info with error: \(error)")
@@ -263,9 +263,18 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
var lastMessageDate: Date?
if let latestRoomMessage = roomDetails.latestEvent {
let lastMessage = EventTimelineItemProxy(item: latestRoomMessage, uniqueID: .init("0"))
lastMessageDate = lastMessage.timestamp
attributedLastMessage = eventStringBuilder.buildAttributedString(for: lastMessage)
switch latestRoomMessage {
case .local(let timestamp, let senderID, let profile, let content, _):
let sender = TimelineItemSender(senderID: senderID, senderProfile: profile)
attributedLastMessage = eventStringBuilder.buildAttributedString(for: content, sender: sender, isOutgoing: true)
lastMessageDate = Date(timeIntervalSince1970: TimeInterval(timestamp / 1000))
case .remote(let timestamp, let senderID, let isOwn, let profile, let content):
let sender = TimelineItemSender(senderID: senderID, senderProfile: profile)
attributedLastMessage = eventStringBuilder.buildAttributedString(for: content, sender: sender, isOutgoing: isOwn)
lastMessageDate = Date(timeIntervalSince1970: TimeInterval(timestamp / 1000))
case .none:
break
}
}
var inviterProxy: RoomMemberProxyProtocol?
@@ -108,22 +108,7 @@ class EventTimelineItemProxy {
lazy var isEditable = item.isEditable
lazy var sender: TimelineItemSender = {
let profile = item.senderProfile
switch profile {
case let .ready(displayName, isDisplayNameAmbiguous, avatarUrl):
return .init(id: item.sender,
displayName: displayName,
isDisplayNameAmbiguous: isDisplayNameAmbiguous,
avatarURL: avatarUrl.flatMap(URL.init(string:)))
default:
return .init(id: item.sender,
displayName: nil,
isDisplayNameAmbiguous: false,
avatarURL: nil)
}
}()
lazy var sender = TimelineItemSender(senderID: item.sender, senderProfile: item.senderProfile)
lazy var timestamp = Date(timeIntervalSince1970: TimeInterval(item.timestamp / 1000))
@@ -6,7 +6,8 @@
// Please see LICENSE files in the repository root for full details.
//
import UIKit
import MatrixRustSDK
import SwiftUI
struct TimelineItemSender: Identifiable, Hashable {
static let test = TimelineItemSender(id: "@test.matrix.org")
@@ -22,6 +23,21 @@ struct TimelineItemSender: Identifiable, Hashable {
self.isDisplayNameAmbiguous = isDisplayNameAmbiguous
self.avatarURL = avatarURL
}
init(senderID: String, senderProfile: ProfileDetails) {
switch senderProfile {
case let .ready(displayName, isDisplayNameAmbiguous, avatarUrl):
self.init(id: senderID,
displayName: displayName,
isDisplayNameAmbiguous: isDisplayNameAmbiguous,
avatarURL: avatarUrl.flatMap(URL.init(string:)))
default:
self.init(id: senderID,
displayName: nil,
isDisplayNameAmbiguous: false,
avatarURL: nil)
}
}
var disambiguatedDisplayName: String? {
guard let displayName else {
@@ -678,7 +678,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
case .pending:
return .loading
case .ready(let content, let senderID, let senderProfile, _, _):
let sender = buildTimelineItemSender(senderID: senderID, senderProfile: senderProfile)
let sender = TimelineItemSender(senderID: senderID, senderProfile: senderProfile)
let latestEventContent: TimelineEventContent = switch content {
case .msgLike(let messageLikeContent):
@@ -814,7 +814,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
case .pending:
return .init(details: .loading(eventID: details.eventId()), isThreaded: isThreaded)
case let .ready(timelineItem, senderID, senderProfile, _, _):
let sender = buildTimelineItemSender(senderID: senderID, senderProfile: senderProfile)
let sender = TimelineItemSender(senderID: senderID, senderProfile: senderProfile)
let replyContent: TimelineEventContent
@@ -850,21 +850,6 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
// MARK: - Helpers
private func buildTimelineItemSender(senderID: String, senderProfile: ProfileDetails?) -> TimelineItemSender {
switch senderProfile {
case let .ready(displayName, isDisplayNameAmbiguous, avatarUrl):
return TimelineItemSender(id: senderID,
displayName: displayName,
isDisplayNameAmbiguous: isDisplayNameAmbiguous,
avatarURL: avatarUrl.flatMap(URL.init(string:)))
default:
return TimelineItemSender(id: senderID,
displayName: nil,
isDisplayNameAmbiguous: false,
avatarURL: nil)
}
}
private func buildMessageTimelineItemContent(messageType: MessageType?, senderID: String, senderDisplayName: String?) -> EventBasedMessageTimelineItemContentType {
switch messageType {
case .audio(let content):