From 890d822a2b6c9c8acec0654efd76bc00df021664 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Wed, 18 Jan 2023 11:31:57 +1100 Subject: [PATCH] wrap up message info --- .../Context Menu/ContextMenuVC+Action.swift | 4 +++ .../ContextMenuVC+MessageInfoView.swift | 36 ++++++++++++++++--- .../Context Menu/ContextMenuVC.swift | 28 ++++++++++++--- .../ConversationVC+Interaction.swift | 3 +- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift index 7a42f2aa5..5b2f2ebad 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift @@ -10,6 +10,7 @@ extension ContextMenuVC { let isEmojiAction: Bool let isEmojiPlus: Bool let isDismissAction: Bool + let shouldDismissAfterAction: Bool let accessibilityLabel: String? let work: () -> Void @@ -21,6 +22,7 @@ extension ContextMenuVC { isEmojiAction: Bool = false, isEmojiPlus: Bool = false, isDismissAction: Bool = false, + shouldDismissAfterAction: Bool = true, accessibilityLabel: String? = nil, work: @escaping () -> Void ) { @@ -29,6 +31,7 @@ extension ContextMenuVC { self.isEmojiAction = isEmojiAction self.isEmojiPlus = isEmojiPlus self.isDismissAction = isDismissAction + self.shouldDismissAfterAction = shouldDismissAfterAction self.accessibilityLabel = accessibilityLabel self.work = work } @@ -39,6 +42,7 @@ extension ContextMenuVC { return Action( icon: UIImage(named: "ic_info"), title: "context_menu_info".localized(), + shouldDismissAfterAction: false, accessibilityLabel: "Message info" ) { delegate?.info(cellViewModel) } } diff --git a/Session/Conversations/Context Menu/ContextMenuVC+MessageInfoView.swift b/Session/Conversations/Context Menu/ContextMenuVC+MessageInfoView.swift index 01cc7bd40..048629812 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC+MessageInfoView.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC+MessageInfoView.swift @@ -9,9 +9,25 @@ extension ContextMenuVC { private static let cornerRadius: CGFloat = 8 private let cellViewModel: MessageViewModel + private let dismissAction: () -> Void // MARK: - UI + private lazy var dismissButton: UIButton = { + let result: UIButton = UIButton(type: .custom) + result.setImage( + UIImage(named: "small_chevron_left")? + .withRenderingMode(.alwaysTemplate), + for: .normal + ) + result.addTarget(self, action: #selector(dismiss), for: UIControl.Event.touchUpInside) + result.themeTintColor = .white + result.set(.width, to: 20) + result.set(.height, to: 20) + + return result + }() + private lazy var messageSentDateLabel: UILabel = { let result: UILabel = UILabel() result.font = .systemFont(ofSize: Values.smallFontSize) @@ -58,8 +74,9 @@ extension ContextMenuVC { // MARK: - Lifecycle - init(cellViewModel: MessageViewModel) { + init(cellViewModel: MessageViewModel, dismissAction: @escaping () -> Void) { self.cellViewModel = cellViewModel + self.dismissAction = dismissAction super.init(frame: CGRect.zero) self.accessibilityLabel = "Message info" @@ -67,20 +84,25 @@ extension ContextMenuVC { } override init(frame: CGRect) { - preconditionFailure("Use init(cellViewModel:) instead.") + preconditionFailure("Use init(cellViewModel:dismiss:) instead.") } required init?(coder: NSCoder) { - preconditionFailure("Use init(cellViewModel:) instead.") + preconditionFailure("Use init(cellViewModel:dismiss:) instead.") } private func setUpViewHierarchy() { + addSubview(dismissButton) + dismissButton.pin(.top, to: .top, of: self, withInset: Values.smallSpacing) + dismissButton.pin(.leading, to: .leading, of: self) + let backgroundView: UIView = UIView() backgroundView.clipsToBounds = true backgroundView.themeBackgroundColor = .contextMenu_background backgroundView.layer.cornerRadius = Self.cornerRadius addSubview(backgroundView) - backgroundView.pin(to: self) + backgroundView.pin([ UIView.HorizontalEdge.trailing, UIView.VerticalEdge.top, UIView.VerticalEdge.bottom ], to: self) + backgroundView.pin(.leading, to: .trailing, of: dismissButton) let stackView: UIStackView = UIStackView() stackView.axis = .vertical @@ -130,5 +152,11 @@ extension ContextMenuVC { stackView.addArrangedSubview(profileContainerView) } + + // MARK: - Interaction + + @objc private func dismiss() { + dismissAction() + } } } diff --git a/Session/Conversations/Context Menu/ContextMenuVC.swift b/Session/Conversations/Context Menu/ContextMenuVC.swift index 31e2e940a..5992fea74 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC.swift @@ -60,13 +60,13 @@ final class ContextMenuVC: UIViewController { }() private lazy var messageInfoView: MessageInfoView = { - let result: MessageInfoView = MessageInfoView(cellViewModel: self.cellViewModel) + let result: MessageInfoView = MessageInfoView(cellViewModel: self.cellViewModel, dismissAction: hideMessageInfo) result.themeShadowColor = .black result.layer.shadowOffset = CGSize.zero result.layer.shadowOpacity = 0.4 result.layer.shadowRadius = 4 result.alpha = 0 - result.set(.width, to: 320) + result.set(.width, to: 340) return result }() @@ -176,7 +176,12 @@ final class ContextMenuVC: UIViewController { let menuStackView = UIStackView( arrangedSubviews: actions .filter { !$0.isEmojiAction && !$0.isEmojiPlus && !$0.isDismissAction } - .map { action -> ActionView in ActionView(for: action, dismiss: snDismiss) } + .map { action -> ActionView in + ActionView( + for: action, + dismiss: action.shouldDismissAfterAction ? snDismiss : {} + ) + } ) menuStackView.axis = .vertical menuBackgroundView.addSubview(menuStackView) @@ -273,7 +278,6 @@ final class ContextMenuVC: UIViewController { UIView.animate(withDuration: 0.2) { [weak self] in self?.emojiBar.alpha = 1 self?.menuView.alpha = 1 - self?.messageInfoView.alpha = 1 self?.timestampLabel.alpha = 1 self?.fallbackTimestampLabel.alpha = 1 } @@ -360,6 +364,22 @@ final class ContextMenuVC: UIViewController { // MARK: - Interaction + func showMessageInfo() { + UIView.animate(withDuration: 0.2) { [weak self] in + self?.emojiBar.alpha = 0 + self?.menuView.alpha = 0 + self?.messageInfoView.alpha = 1 + } + } + + func hideMessageInfo() { + UIView.animate(withDuration: 0.2) { [weak self] in + self?.emojiBar.alpha = 1 + self?.menuView.alpha = 1 + self?.messageInfoView.alpha = 0 + } + } + @objc private func handleTap() { snDismiss() } diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 66de47bff..af4b60c7f 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -1558,7 +1558,8 @@ extension ConversationVC: // MARK: - ContextMenuActionDelegate func info(_ cellViewModel: MessageViewModel) { - + guard let contextMenuVC = self.contextMenuVC else { return } + contextMenuVC.showMessageInfo() } func reply(_ cellViewModel: MessageViewModel) {