diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 7c626871d..8bd2e1c78 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -68,10 +68,11 @@ 325380D1228C1BE500ADDEFA /* ReactionsMenuAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380D0228C1BE500ADDEFA /* ReactionsMenuAction.swift */; }; 325380D3228C1E3700ADDEFA /* ReactionsMenuViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380D2228C1E3700ADDEFA /* ReactionsMenuViewModelType.swift */; }; 325380D5228C245D00ADDEFA /* ReactionsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380D4228C245D00ADDEFA /* ReactionsMenuViewModel.swift */; }; - 325380D7228C2E5800ADDEFA /* ReactionsMenuReactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380D6228C2E5800ADDEFA /* ReactionsMenuReactions.swift */; }; 325380DB228C34EF00ADDEFA /* ReactionsMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380DA228C34EF00ADDEFA /* ReactionsMenuView.swift */; }; 325380DD228C34FC00ADDEFA /* ReactionsMenuView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 325380DC228C34FC00ADDEFA /* ReactionsMenuView.xib */; }; 325380DF228C5C2800ADDEFA /* ReactionsMenuButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380DE228C5C2800ADDEFA /* ReactionsMenuButton.swift */; }; + 325380E1228D1F7F00ADDEFA /* ReactionsMenuViewAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380E0228D1F7F00ADDEFA /* ReactionsMenuViewAction.swift */; }; + 325380E3228D2EE500ADDEFA /* ReactionsMenuReaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 325380E2228D2EE500ADDEFA /* ReactionsMenuReaction.swift */; }; 3275FD8C21A5A2C500B9C13D /* TermsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3275FD8B21A5A2C500B9C13D /* TermsView.swift */; }; 3281BCF72201FA4200F4A383 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3281BCF62201FA4200F4A383 /* UIControl.swift */; }; 3284A35120A07C210044F922 /* postMessageAPI.js in Resources */ = {isa = PBXBuildFile; fileRef = 3284A35020A07C210044F922 /* postMessageAPI.js */; }; @@ -572,10 +573,11 @@ 325380D0228C1BE500ADDEFA /* ReactionsMenuAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsMenuAction.swift; sourceTree = ""; }; 325380D2228C1E3700ADDEFA /* ReactionsMenuViewModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsMenuViewModelType.swift; sourceTree = ""; }; 325380D4228C245D00ADDEFA /* ReactionsMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsMenuViewModel.swift; sourceTree = ""; }; - 325380D6228C2E5800ADDEFA /* ReactionsMenuReactions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsMenuReactions.swift; sourceTree = ""; }; 325380DA228C34EF00ADDEFA /* ReactionsMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsMenuView.swift; sourceTree = ""; }; 325380DC228C34FC00ADDEFA /* ReactionsMenuView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ReactionsMenuView.xib; sourceTree = ""; }; 325380DE228C5C2800ADDEFA /* ReactionsMenuButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsMenuButton.swift; sourceTree = ""; }; + 325380E0228D1F7F00ADDEFA /* ReactionsMenuViewAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsMenuViewAction.swift; sourceTree = ""; }; + 325380E2228D2EE500ADDEFA /* ReactionsMenuReaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReactionsMenuReaction.swift; sourceTree = ""; }; 3267EFB320E379FD00FF1CAA /* CHANGES.rst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGES.rst; sourceTree = ""; }; 3267EFB420E379FD00FF1CAA /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; path = Podfile; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 3267EFB520E379FD00FF1CAA /* AUTHORS.rst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AUTHORS.rst; sourceTree = ""; }; @@ -1431,13 +1433,14 @@ 325380CF228C181400ADDEFA /* ReactionsMenu */ = { isa = PBXGroup; children = ( + 325380E2228D2EE500ADDEFA /* ReactionsMenuReaction.swift */, 325380D0228C1BE500ADDEFA /* ReactionsMenuAction.swift */, 325380D2228C1E3700ADDEFA /* ReactionsMenuViewModelType.swift */, 325380D4228C245D00ADDEFA /* ReactionsMenuViewModel.swift */, - 325380D6228C2E5800ADDEFA /* ReactionsMenuReactions.swift */, 325380DA228C34EF00ADDEFA /* ReactionsMenuView.swift */, 325380DC228C34FC00ADDEFA /* ReactionsMenuView.xib */, 325380DE228C5C2800ADDEFA /* ReactionsMenuButton.swift */, + 325380E0228D1F7F00ADDEFA /* ReactionsMenuViewAction.swift */, ); path = ReactionsMenu; sourceTree = ""; @@ -3817,6 +3820,7 @@ B16932A320F3A21C00746532 /* main.m in Sources */, B1B5574520EE6C4D00210D55 /* StartChatViewController.m in Sources */, 3232AB4C2256558300AD6A5C /* TemplateScreenCoordinator.swift in Sources */, + 325380E1228D1F7F00ADDEFA /* ReactionsMenuViewAction.swift in Sources */, B1B5575920EE6C4D00210D55 /* HomeMessagesSearchViewController.m in Sources */, B1B558DE20EF768F00210D55 /* RoomIncomingAttachmentBubbleCell.m in Sources */, B1B5574820EE6C4D00210D55 /* PeopleViewController.m in Sources */, @@ -3870,7 +3874,6 @@ 32F6B9692270623100BBA352 /* DeviceVerificationDataLoadingCoordinator.swift in Sources */, B1B5594720EF7BD000210D55 /* RoomCollectionViewCell.m in Sources */, B10CFBC32268D99D00A5842E /* JitsiService.swift in Sources */, - 325380D7228C2E5800ADDEFA /* ReactionsMenuReactions.swift in Sources */, B1B558C120EF768F00210D55 /* RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell.m in Sources */, B1B5573E20EE6C4D00210D55 /* RiotNavigationController.m in Sources */, B1B5593B20EF7BAC00210D55 /* TableViewCellWithCheckBoxAndLabel.m in Sources */, @@ -4053,6 +4056,7 @@ 32F6B96A2270623100BBA352 /* DeviceVerificationDataLoadingViewState.swift in Sources */, 32BF995321FA2A1300698084 /* SettingsKeyBackupViewState.swift in Sources */, B1B5599420EFC5E400210D55 /* DecryptionFailureTracker.m in Sources */, + 325380E3228D2EE500ADDEFA /* ReactionsMenuReaction.swift in Sources */, F083BDF01E7009ED00A9B29C /* UIViewController+RiotSearch.m in Sources */, F083BDF91E7009ED00A9B29C /* RoomEmailInvitation.m in Sources */, 324A2055225FC571004FE8B0 /* DeviceVerificationIncomingViewModelType.swift in Sources */, diff --git a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuReactions.swift b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuReaction.swift similarity index 94% rename from Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuReactions.swift rename to Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuReaction.swift index 12a54ae3b..93de3403d 100644 --- a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuReactions.swift +++ b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuReaction.swift @@ -16,7 +16,7 @@ import Foundation -enum ReactionsMenuReactions: String { +enum ReactionsMenuReaction: String { case agree = "👍" case disagree = "👎" case like = "🙂" diff --git a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift index 879847c82..e7290d0c2 100644 --- a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift +++ b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift @@ -29,8 +29,6 @@ final class ReactionsMenuView: UIView, NibOwnerLoadable { // MARK: Private - //private var strengthViews: [UIView] = [] - // MARK: Public var viewModel: ReactionsMenuViewModelType? { @@ -54,18 +52,36 @@ final class ReactionsMenuView: UIView, NibOwnerLoadable { self.commonInit() } + // MARK: - Actions + + @IBAction private func agreeButtonAction(_ sender: Any) { + self.viewModel?.process(viewAction: .toggleReaction(.agree)) + } + + @IBAction private func disagreeButtonAction(_ sender: Any) { + self.viewModel?.process(viewAction: .toggleReaction(.disagree)) + } + + @IBAction private func likeButtonAction(_ sender: Any) { + self.viewModel?.process(viewAction: .toggleReaction(.like)) + } + + @IBAction private func dislikeButtonAction(_ sender: Any) { + self.viewModel?.process(viewAction: .toggleReaction(.dislike)) + } + // MARK: - Private private func commonInit() { - agreeButton.setTitle(VectorL10n.roomEventActionReactionAgree(ReactionsMenuReactions.agree.rawValue), for: .normal) - agreeButton.setTitle(VectorL10n.roomEventActionReactionAgree(ReactionsMenuReactions.agree.rawValue), for: .highlighted) - disagreeButton.setTitle(VectorL10n.roomEventActionReactionDisagree(ReactionsMenuReactions.disagree.rawValue), for: .normal) - disagreeButton.setTitle(VectorL10n.roomEventActionReactionDisagree(ReactionsMenuReactions.disagree.rawValue), for: .highlighted) - likeButton.setTitle(VectorL10n.roomEventActionReactionLike(ReactionsMenuReactions.like.rawValue), for: .normal) - likeButton.setTitle(VectorL10n.roomEventActionReactionLike(ReactionsMenuReactions.like.rawValue), for: .highlighted) - dislikeButton.setTitle(VectorL10n.roomEventActionReactionDislike(ReactionsMenuReactions.dislike.rawValue), for: .normal) - dislikeButton.setTitle(VectorL10n.roomEventActionReactionDislike(ReactionsMenuReactions.dislike.rawValue), for: .highlighted) + agreeButton.setTitle(VectorL10n.roomEventActionReactionAgree(ReactionsMenuReaction.agree.rawValue), for: .normal) + agreeButton.setTitle(VectorL10n.roomEventActionReactionAgree(ReactionsMenuReaction.agree.rawValue), for: .highlighted) + disagreeButton.setTitle(VectorL10n.roomEventActionReactionDisagree(ReactionsMenuReaction.disagree.rawValue), for: .normal) + disagreeButton.setTitle(VectorL10n.roomEventActionReactionDisagree(ReactionsMenuReaction.disagree.rawValue), for: .highlighted) + likeButton.setTitle(VectorL10n.roomEventActionReactionLike(ReactionsMenuReaction.like.rawValue), for: .normal) + likeButton.setTitle(VectorL10n.roomEventActionReactionLike(ReactionsMenuReaction.like.rawValue), for: .highlighted) + dislikeButton.setTitle(VectorL10n.roomEventActionReactionDislike(ReactionsMenuReaction.dislike.rawValue), for: .normal) + dislikeButton.setTitle(VectorL10n.roomEventActionReactionDislike(ReactionsMenuReaction.dislike.rawValue), for: .highlighted) customizeViewRendering() } diff --git a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.xib b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.xib index 9b81ffaeb..f8ca5acd4 100644 --- a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.xib +++ b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.xib @@ -34,6 +34,9 @@ + + + diff --git a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewAction.swift b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewAction.swift new file mode 100644 index 000000000..b98ac829a --- /dev/null +++ b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewAction.swift @@ -0,0 +1,22 @@ +/* + Copyright 2019 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 UIKit + +/// Action chosen by the user +enum ReactionsMenuViewAction { + case toggleReaction(ReactionsMenuReaction) +} diff --git a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModel.swift b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModel.swift index 819ce6ec0..43b94d0c9 100644 --- a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModel.swift +++ b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModel.swift @@ -38,7 +38,6 @@ final class ReactionsMenuViewModel: ReactionsMenuViewModelType { // MARK: - Setup init(aggregations: MXAggregations, roomId: String, eventId: String) { - self.aggregations = aggregations self.roomId = roomId self.eventId = eventId @@ -47,8 +46,36 @@ final class ReactionsMenuViewModel: ReactionsMenuViewModelType { self.listenToDataUpdate() } - // MARK: - Private + // MARK: - Public + func process(viewAction: ReactionsMenuViewAction) { + var reaction: ReactionsMenuReaction? + var newState: Bool? + + switch viewAction { + case .toggleReaction(let menuReaction): + reaction = menuReaction + + switch menuReaction { + case .agree: + newState = !self.isAgreeButtonSelected + case .disagree: + newState = !self.isDisagreeButtonSelected + case .like: + newState = !self.isLikeButtonSelected + case .dislike: + newState = !self.isDislikeButtonSelected + } + } + + guard let theReaction = reaction, let theNewState = newState else { + return + } + + self.react(withReaction: theReaction, selected: theNewState) + } + + // MARK: - Private private func resetData() { self.isAgreeButtonSelected = false @@ -64,7 +91,7 @@ final class ReactionsMenuViewModel: ReactionsMenuViewModelType { self.resetData() reactionCounts.forEach { (reaction) in - if let reaction = ReactionsMenuReactions(rawValue: reaction.reaction) { + if let reaction = ReactionsMenuReaction(rawValue: reaction.reaction) { switch reaction { case .agree: self.isAgreeButtonSelected = true @@ -78,9 +105,7 @@ final class ReactionsMenuViewModel: ReactionsMenuViewModelType { } } - if let viewDelegate = self.viewDelegate { - viewDelegate.reactionsMenuViewModelDidUpdate(self) - } + self.viewDelegate?.reactionsMenuViewModelDidUpdate(self) } private func listenToDataUpdate() { @@ -96,4 +121,34 @@ final class ReactionsMenuViewModel: ReactionsMenuViewModelType { } } + private func react(withReaction reaction: ReactionsMenuReaction, selected: Bool) { + if selected { + self.aggregations.sendReaction(reaction.rawValue, toEvent: self.eventId, inRoom: self.roomId, success: {_ in + + }, failure: {(error) in + print("[ReactionsMenuViewModel] react: Error: \(error)") + }) + } else { + // TODO + } + + self.fakeToggleReaction(reaction: reaction) + } + + // TODO: to remove + private func fakeToggleReaction(reaction: ReactionsMenuReaction) { + switch reaction { + case .agree: + isAgreeButtonSelected = !isDislikeButtonSelected + case .disagree: + isDisagreeButtonSelected = !isDisagreeButtonSelected + case .like: + isLikeButtonSelected = !isLikeButtonSelected + case .dislike: + isDislikeButtonSelected = !isDislikeButtonSelected + } + + self.viewDelegate?.reactionsMenuViewModelDidUpdate(self) + } + } diff --git a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModelType.swift b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModelType.swift index bbdfbf5be..81b52fd0d 100644 --- a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModelType.swift +++ b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModelType.swift @@ -32,7 +32,8 @@ protocol ReactionsMenuViewModelType { var isLikeButtonSelected: Bool { get } var isDislikeButtonSelected: Bool { get } - var viewDelegate: ReactionsMenuViewModelDelegate? { get set } var coordinatorDelegate: ReactionsMenuViewModelCoordinatorDelegate? { get set } + + func process(viewAction: ReactionsMenuViewAction) }