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:
Gil Eluard
2022-06-10 10:41:37 +02:00
committed by GitHub
parent 51b2a1ce4d
commit ced9858a06
7 changed files with 61 additions and 27 deletions
@@ -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)
}