wrap up message info

This commit is contained in:
ryanzhao 2023-01-18 11:31:57 +11:00
parent f185ccf506
commit 890d822a2b
4 changed files with 62 additions and 9 deletions

View File

@ -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) }
}

View File

@ -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()
}
}
}

View File

@ -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()
}

View File

@ -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) {