diff --git a/Session/Conversations V2/ConversationVC.swift b/Session/Conversations V2/ConversationVC.swift index f8a490bd2..c5302b9b6 100644 --- a/Session/Conversations V2/ConversationVC.swift +++ b/Session/Conversations V2/ConversationVC.swift @@ -146,6 +146,7 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, UITableViewD let viewItem = viewItems[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: MessageCell.getCellType(for: viewItem).identifier) as! MessageCell cell.delegate = self + cell.conversationStyle = conversationStyle() cell.viewItem = viewItem return cell } diff --git a/Session/Conversations V2/Message Cells/Content Views/LinkPreviewViewV2.swift b/Session/Conversations V2/Message Cells/Content Views/LinkPreviewViewV2.swift index 6c7a63d72..1c3b20c4d 100644 --- a/Session/Conversations V2/Message Cells/Content Views/LinkPreviewViewV2.swift +++ b/Session/Conversations V2/Message Cells/Content Views/LinkPreviewViewV2.swift @@ -1,22 +1,43 @@ final class LinkPreviewViewV2 : UIView { - private let viewItem: ConversationViewItem + private let viewItem: ConversationViewItem? private let maxWidth: CGFloat + private let isOutgoing: Bool private let delegate: UITextViewDelegate & BodyTextViewDelegate - + var linkPreviewState: LinkPreviewState? { didSet { update() } } + private var textColor: UIColor { - let isOutgoing = (viewItem.interaction.interactionType() == .outgoingMessage) switch (isOutgoing, AppModeManager.shared.currentAppMode) { case (true, .dark), (false, .light): return .black default: return .white } } - + + // MARK: UI Components + private lazy var imageView: UIImageView = { + let result = UIImageView() + result.contentMode = .scaleAspectFill + return result + }() + + private lazy var titleLabel: UILabel = { + let result = UILabel() + result.textColor = textColor + result.font = .boldSystemFont(ofSize: Values.smallFontSize) + result.numberOfLines = 0 + return result + }() + + private lazy var bodyTextViewContainer = UIView() + + // MARK: Settings private static let imageSize: CGFloat = 100 - - init(for viewItem: ConversationViewItem, maxWidth: CGFloat, delegate: UITextViewDelegate & BodyTextViewDelegate) { + + // MARK: Lifecycle + init(for viewItem: ConversationViewItem?, maxWidth: CGFloat, isOutgoing: Bool, delegate: UITextViewDelegate & BodyTextViewDelegate) { self.viewItem = viewItem self.maxWidth = maxWidth + self.isOutgoing = isOutgoing self.delegate = delegate super.init(frame: CGRect.zero) setUpViewHierarchy() @@ -31,59 +52,45 @@ final class LinkPreviewViewV2 : UIView { } private func setUpViewHierarchy() { - guard let preview = viewItem.linkPreview else { return } - - let hStackViewContainer = UIView() - hStackViewContainer.backgroundColor = isDarkMode ? .black : UIColor.black.withAlphaComponent(0.06) - - let hStackView = UIStackView() - hStackView.axis = .horizontal - hStackView.alignment = .center - - hStackViewContainer.addSubview(hStackView) - hStackView.pin(to: hStackViewContainer) - + // Image view let imageViewContainer = UIView() imageViewContainer.set(.width, to: LinkPreviewViewV2.imageSize) imageViewContainer.set(.height, to: LinkPreviewViewV2.imageSize) imageViewContainer.clipsToBounds = true - - let imageView = UIImageView() - let filePath = given(preview.imageAttachmentId) { TSAttachmentStream.fetch(uniqueId: $0)!.originalFilePath! } - imageView.image = given(filePath) { UIImage(contentsOfFile: $0)! } - imageView.contentMode = .scaleAspectFill imageViewContainer.addSubview(imageView) imageView.pin(to: imageViewContainer) - hStackView.addArrangedSubview(imageViewContainer) - + // Title label let titleLabelContainer = UIView() - - let titleLabel = UILabel() - titleLabel.text = preview.title - titleLabel.textColor = textColor - titleLabel.font = .boldSystemFont(ofSize: Values.smallFontSize) - titleLabel.numberOfLines = 0 titleLabelContainer.addSubview(titleLabel) titleLabel.pin(to: titleLabelContainer, withInset: Values.smallSpacing) - hStackView.addArrangedSubview(titleLabelContainer) - - let vStackView = UIStackView() + // Horizontal stack view + let hStackViewContainer = UIView() + hStackViewContainer.backgroundColor = isDarkMode ? .black : UIColor.black.withAlphaComponent(0.06) + let hStackView = UIStackView(arrangedSubviews: [ imageViewContainer, titleLabelContainer ]) + hStackView.axis = .horizontal + hStackView.alignment = .center + hStackViewContainer.addSubview(hStackView) + hStackView.pin(to: hStackViewContainer) + // Vertical stack view + let vStackView = UIStackView(arrangedSubviews: [ hStackViewContainer, bodyTextViewContainer ]) vStackView.axis = .vertical - vStackView.addArrangedSubview(hStackViewContainer) - - let separator = UIView() - separator.backgroundColor = Colors.separator - separator.set(.height, to: 1 / UIScreen.main.scale) - vStackView.addArrangedSubview(separator) - - let bodyTextViewContainer = UIView() - - let bodyTextView = VisibleMessageCell.getBodyTextView(for: viewItem, with: maxWidth, textColor: textColor, delegate: delegate) - bodyTextViewContainer.addSubview(bodyTextView) - bodyTextView.pin(to: bodyTextViewContainer, withInset: 12) - vStackView.addArrangedSubview(bodyTextViewContainer) - addSubview(vStackView) vStackView.pin(to: self) } + + // MARK: Updating + private func update() { + guard let linkPreviewState = linkPreviewState else { return } + // Image view + imageView.image = linkPreviewState.image() + // Title + titleLabel.text = linkPreviewState.title() + // Body text view + bodyTextViewContainer.subviews.forEach { $0.removeFromSuperview() } + if let viewItem = viewItem { + let bodyTextView = VisibleMessageCell.getBodyTextView(for: viewItem, with: maxWidth, textColor: textColor, delegate: delegate) + bodyTextViewContainer.addSubview(bodyTextView) + bodyTextView.pin(to: bodyTextViewContainer, withInset: 12) + } + } } diff --git a/Session/Conversations V2/Message Cells/MessageCell.swift b/Session/Conversations V2/Message Cells/MessageCell.swift index 86851bf9c..a3f700f64 100644 --- a/Session/Conversations V2/Message Cells/MessageCell.swift +++ b/Session/Conversations V2/Message Cells/MessageCell.swift @@ -2,6 +2,7 @@ import UIKit class MessageCell : UITableViewCell { var delegate: MessageCellDelegate? + var conversationStyle: ConversationStyle? var viewItem: ConversationViewItem? { didSet { update() } } // MARK: Settings diff --git a/Session/Conversations V2/Message Cells/VisibleMessageCell.swift b/Session/Conversations V2/Message Cells/VisibleMessageCell.swift index ac3e2807a..e8c1e2b5b 100644 --- a/Session/Conversations V2/Message Cells/VisibleMessageCell.swift +++ b/Session/Conversations V2/Message Cells/VisibleMessageCell.swift @@ -270,8 +270,10 @@ final class VisibleMessageCell : MessageCell, UITextViewDelegate, BodyTextViewDe case .textOnlyMessage: let inset: CGFloat = 12 let maxWidth = VisibleMessageCell.getMaxWidth(for: viewItem) - 2 * inset - if viewItem.linkPreview != nil { - let linkPreviewView = LinkPreviewViewV2(for: viewItem, maxWidth: maxWidth, delegate: self) + if let linkPreview = viewItem.linkPreview { + let linkPreviewView = LinkPreviewViewV2(for: viewItem, maxWidth: maxWidth, isOutgoing: isOutgoing, delegate: self) + let conversationStyle = self.conversationStyle ?? ConversationStyle(thread: viewItem.interaction.thread) + linkPreviewView.linkPreviewState = LinkPreviewSent(linkPreview: linkPreview, imageAttachment: viewItem.linkPreviewAttachment, conversationStyle:conversationStyle) snContentView.addSubview(linkPreviewView) linkPreviewView.pin(to: snContentView) } else { diff --git a/Session/Conversations V2/Views & Modals/MessagesTableView.swift b/Session/Conversations V2/Views & Modals/MessagesTableView.swift index 7ea97216b..382de99d2 100644 --- a/Session/Conversations V2/Views & Modals/MessagesTableView.swift +++ b/Session/Conversations V2/Views & Modals/MessagesTableView.swift @@ -41,7 +41,7 @@ final class MessagesTableView : UITableView { override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { if gestureRecognizer == panGestureRecognizer { let v = panGestureRecognizer.velocity(in: self) - return abs(v.x) < 120 + return abs(v.x) < 160 } else { return true }