diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 01d8b320a..1b41def38 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -468,6 +468,15 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc } } } + + func handleViewItemSwiped(_ viewItem: ConversationViewItem, state: SwipeState) { + switch state { + case .began: + messagesTableView.isScrollEnabled = false + case .ended, .cancelled: + messagesTableView.isScrollEnabled = true + } + } func showFailedMessageSheet(for tsMessage: TSOutgoingMessage) { let thread = self.thread diff --git a/Session/Conversations/Message Cells/MessageCell.swift b/Session/Conversations/Message Cells/MessageCell.swift index d013ee3d7..a2d846692 100644 --- a/Session/Conversations/Message Cells/MessageCell.swift +++ b/Session/Conversations/Message Cells/MessageCell.swift @@ -1,5 +1,11 @@ import UIKit +public enum SwipeState { + case began + case ended + case cancelled +} + class MessageCell : UITableViewCell { weak var delegate: MessageCellDelegate? var viewItem: ConversationViewItem? { didSet { update() } } @@ -55,6 +61,7 @@ protocol MessageCellDelegate : AnyObject { func handleViewItemLongPressed(_ viewItem: ConversationViewItem) func handleViewItemTapped(_ viewItem: ConversationViewItem, gestureRecognizer: UITapGestureRecognizer) func handleViewItemDoubleTapped(_ viewItem: ConversationViewItem) + func handleViewItemSwiped(_ viewItem: ConversationViewItem, state: SwipeState) func showFullText(_ viewItem: ConversationViewItem) func openURL(_ url: URL) func handleReplyButtonTapped(for viewItem: ConversationViewItem) diff --git a/Session/Conversations/Message Cells/VisibleMessageCell.swift b/Session/Conversations/Message Cells/VisibleMessageCell.swift index 30cf15727..75f90eb7c 100644 --- a/Session/Conversations/Message Cells/VisibleMessageCell.swift +++ b/Session/Conversations/Message Cells/VisibleMessageCell.swift @@ -466,9 +466,12 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewDelegate { } @objc private func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) { + guard let viewItem = viewItem else { return } let viewsToMove = [ bubbleView, profilePictureView, replyButton, timerView, messageStatusImageView ] let translationX = gestureRecognizer.translation(in: self).x.clamp(-CGFloat.greatestFiniteMagnitude, 0) switch gestureRecognizer.state { + case .began: + delegate?.handleViewItemSwiped(viewItem, state: .began) case .changed: // The idea here is to asymptotically approach a maximum drag distance let damping: CGFloat = 20 @@ -486,8 +489,10 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewDelegate { previousX = translationX case .ended, .cancelled: if abs(translationX) > VisibleMessageCell.swipeToReplyThreshold { + delegate?.handleViewItemSwiped(viewItem, state: .ended) reply() } else { + delegate?.handleViewItemSwiped(viewItem, state: .cancelled) resetReply() } default: break