diff --git a/Riot/Modules/Room/BubbleReactions/BubbleReactionsViewModel.swift b/Riot/Modules/Room/BubbleReactions/BubbleReactionsViewModel.swift index 8e362d736..1c7418133 100644 --- a/Riot/Modules/Room/BubbleReactions/BubbleReactionsViewModel.swift +++ b/Riot/Modules/Room/BubbleReactions/BubbleReactionsViewModel.swift @@ -94,4 +94,14 @@ import Foundation self.viewDelegate?.bubbleReactionsViewModel(self, didUpdateViewState: .loaded(reactionsViewData: reactionsViewData, showAllButtonState: showAllButtonState)) } + + // MARK: - Hashable + + override var hash: Int { + var hasher = Hasher() + hasher.combine(self.aggregatedReactions) + hasher.combine(self.eventId) + hasher.combine(self.showAll) + return hasher.finalize() + } } diff --git a/Riot/Modules/Room/BubbleReactions/BubbleReactionsViewModelBuilder.swift b/Riot/Modules/Room/BubbleReactions/BubbleReactionsViewModelBuilder.swift new file mode 100644 index 000000000..b01cc3e9d --- /dev/null +++ b/Riot/Modules/Room/BubbleReactions/BubbleReactionsViewModelBuilder.swift @@ -0,0 +1,59 @@ +/* +Copyright 2020 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import Foundation + +@objcMembers +final class BubbleReactionsViewModelBuilder: NSObject { + + func buildForFirstVisibleComponent(of roomBubbleCellData: RoomBubbleCellData) -> BubbleReactionsViewModel? { + + guard roomBubbleCellData.firstVisibleComponentIndex() != NSNotFound else { + return nil + } + + return self.build(from: roomBubbleCellData, componentIndex: roomBubbleCellData.firstVisibleComponentIndex()) + } + + func build(from roomBubbleCellData: RoomBubbleCellData, componentIndex: Int) -> BubbleReactionsViewModel? { + + let isCollapsableCellCollapsed = roomBubbleCellData.collapsable && roomBubbleCellData.collapsed + + guard isCollapsableCellCollapsed == false else { + return nil + } + + guard let bubbleComponents = roomBubbleCellData.bubbleComponents, componentIndex < roomBubbleCellData.bubbleComponents.count else { + return nil + } + + let bubbleComponent: MXKRoomBubbleComponent = bubbleComponents[componentIndex] + + guard let bubbleComponentEvent = bubbleComponent.event, + bubbleComponentEvent.isRedactedEvent() == false, + let componentEventId = bubbleComponentEvent.eventId, + let cellDataReactions = roomBubbleCellData.reactions, + let componentReactions = cellDataReactions[componentEventId] as? MXAggregatedReactions, + let aggregatedReactions = componentReactions.withNonZeroCount() else { + return nil + } + + let showAllReactions = roomBubbleCellData.showAllReactions(forEvent: componentEventId) + return BubbleReactionsViewModel(aggregatedReactions: aggregatedReactions, + eventId: componentEventId, + showAll: showAllReactions) + } +}