mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-20 08:32:53 +02:00
Room preview unexpectedly triggering within the room (#6255)
* Room preview unexpectedly triggering within the room - The room creation modal is now triggered only when the user taps the room name label - Also fix empty room creation modal view
This commit is contained in:
+34
-17
@@ -25,12 +25,12 @@ final class RoomCreationEventsModalViewModel: RoomCreationEventsModalViewModelTy
|
||||
// MARK: Private
|
||||
|
||||
private let session: MXSession
|
||||
private let bubbleData: MXKRoomBubbleCellDataStoring
|
||||
private let roomState: MXRoomState
|
||||
private lazy var eventFormatter: EventFormatter = {
|
||||
return EventFormatter(matrixSession: self.session)
|
||||
}()
|
||||
private var events: [MXEvent] = []
|
||||
private var roomCreateEvent: MXEvent?
|
||||
|
||||
// MARK: Public
|
||||
|
||||
@@ -40,6 +40,7 @@ final class RoomCreationEventsModalViewModel: RoomCreationEventsModalViewModelTy
|
||||
var numberOfRows: Int {
|
||||
return events.count
|
||||
}
|
||||
|
||||
func rowViewModel(at indexPath: IndexPath) -> RoomCreationEventRowViewModel? {
|
||||
let event = events[indexPath.row]
|
||||
let formatterError = UnsafeMutablePointer<MXKEventFormatterError>.allocate(capacity: 1)
|
||||
@@ -53,14 +54,16 @@ final class RoomCreationEventsModalViewModel: RoomCreationEventsModalViewModelTy
|
||||
}
|
||||
return RoomCreationEventRowViewModel(title: nil)
|
||||
}
|
||||
|
||||
var roomName: String? {
|
||||
guard let summary = session.roomSummary(withRoomId: roomState.roomId) else {
|
||||
return nil
|
||||
}
|
||||
return summary.displayname
|
||||
}
|
||||
|
||||
var roomInfo: String? {
|
||||
guard let creationEvent = events.first(where: { $0.eventType == .roomCreate }) else {
|
||||
guard let creationEvent = roomCreateEvent else {
|
||||
return nil
|
||||
}
|
||||
let timestamp = creationEvent.originServerTs
|
||||
@@ -69,6 +72,7 @@ final class RoomCreationEventsModalViewModel: RoomCreationEventsModalViewModelTy
|
||||
formatter.dateStyle = .full
|
||||
return formatter.string(from: date)
|
||||
}
|
||||
|
||||
func setAvatar(in avatarImageView: MXKImageView) {
|
||||
let avatarImage = AvatarGenerator.generateAvatar(forMatrixItem: roomState.roomId, withDisplayName: roomName)
|
||||
|
||||
@@ -86,6 +90,7 @@ final class RoomCreationEventsModalViewModel: RoomCreationEventsModalViewModelTy
|
||||
avatarImageView.image = avatarImage
|
||||
}
|
||||
}
|
||||
|
||||
func setEncryptionIcon(in imageView: UIImageView) {
|
||||
guard let summary = session.roomSummary(withRoomId: roomState.roomId) else {
|
||||
imageView.image = nil
|
||||
@@ -103,23 +108,9 @@ final class RoomCreationEventsModalViewModel: RoomCreationEventsModalViewModelTy
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession, bubbleData: MXKRoomBubbleCellDataStoring, roomState: MXRoomState) {
|
||||
init(session: MXSession, roomState: MXRoomState) {
|
||||
self.session = session
|
||||
self.bubbleData = bubbleData
|
||||
self.roomState = roomState
|
||||
|
||||
// shape-up events
|
||||
events.append(contentsOf: bubbleData.events)
|
||||
var nextBubbleData = bubbleData.nextCollapsableCellData
|
||||
while nextBubbleData != nil {
|
||||
// swiftlint:disable force_unwrapping
|
||||
events.append(contentsOf: nextBubbleData!.events)
|
||||
// swiftlint:enable force_unwrapping
|
||||
nextBubbleData = nextBubbleData?.nextCollapsableCellData
|
||||
}
|
||||
|
||||
// remove room create event from the list, as EW and ElA do. This will also avoid duplication of "%@ joined" messages for direct rooms.
|
||||
events.removeAll(where: { $0.eventType == .roomCreate })
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
@@ -136,9 +127,35 @@ final class RoomCreationEventsModalViewModel: RoomCreationEventsModalViewModelTy
|
||||
// MARK: - Private
|
||||
|
||||
private func loadData() {
|
||||
events.removeAll()
|
||||
|
||||
// shape-up events
|
||||
for event in roomState.stateEvents {
|
||||
let formatterError = UnsafeMutablePointer<MXKEventFormatterError>.allocate(capacity: 1)
|
||||
let eventString = eventFormatter.attributedString(from: event, with: roomState, error: formatterError)
|
||||
guard shouldDisplay(event), eventString != nil, formatterError.pointee == MXKEventFormatterErrorNone else {
|
||||
continue
|
||||
}
|
||||
|
||||
// we replace previous event of the same type to keep the latest one.
|
||||
if events.last?.eventType == event.eventType {
|
||||
events.removeLast()
|
||||
}
|
||||
events.append(event)
|
||||
}
|
||||
|
||||
roomCreateEvent = events.first(where: { $0.eventType == .roomCreate })
|
||||
|
||||
// remove room create event from the list, as EW and ElA do. This will also avoid duplication of "%@ joined" messages for direct rooms.
|
||||
events.removeAll(where: { $0.eventType == .roomCreate })
|
||||
|
||||
self.update(viewState: .loaded)
|
||||
}
|
||||
|
||||
private func shouldDisplay(_ event: MXEvent) -> Bool {
|
||||
return event.eventType != .roomPowerLevels
|
||||
}
|
||||
|
||||
private func update(viewState: RoomCreationEventsModalViewState) {
|
||||
self.viewDelegate?.roomCreationEventsModalViewModel(self, didUpdateViewState: viewState)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user