diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 16253cb68..709944a25 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -109,6 +109,7 @@ 7B1D74AA27BCC16E0030B423 /* NSENotificationPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1D74A927BCC16E0030B423 /* NSENotificationPresenter.swift */; }; 7B1D74AC27BDE7510030B423 /* Promise+Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1D74AB27BDE7510030B423 /* Promise+Timeout.swift */; }; 7B1D74B027C365960030B423 /* Timer+MainThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1D74AF27C365960030B423 /* Timer+MainThread.swift */; }; + 7B3A392C2971100D002FE4AC /* ContextMenuVC+MessageInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A392B2971100D002FE4AC /* ContextMenuVC+MessageInfoView.swift */; }; 7B46AAAF28766DF4001AF2DC /* AllMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */; }; 7B4C75CB26B37E0F0000AC89 /* UnsendRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */; }; 7B4C75CD26BB92060000AC89 /* DeletedMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */; }; @@ -1175,6 +1176,7 @@ 7B1D74AB27BDE7510030B423 /* Promise+Timeout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Promise+Timeout.swift"; sourceTree = ""; }; 7B1D74AF27C365960030B423 /* Timer+MainThread.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Timer+MainThread.swift"; sourceTree = ""; }; 7B2DB2AD26F1B0FF0035B509 /* si */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = si; path = si.lproj/Localizable.strings; sourceTree = ""; }; + 7B3A392B2971100D002FE4AC /* ContextMenuVC+MessageInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContextMenuVC+MessageInfoView.swift"; sourceTree = ""; }; 7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllMediaViewController.swift; sourceTree = ""; }; 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsendRequest.swift; sourceTree = ""; }; 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedMessageView.swift; sourceTree = ""; }; @@ -2712,6 +2714,7 @@ C328254825CA60E60062D0A7 /* ContextMenuVC+Action.swift */, C328255125CA64470062D0A7 /* ContextMenuVC+ActionView.swift */, 7BFA8AE22831D0D4001876F3 /* ContextMenuVC+EmojiReactsView.swift */, + 7B3A392B2971100D002FE4AC /* ContextMenuVC+MessageInfoView.swift */, ); path = "Context Menu"; sourceTree = ""; @@ -5614,6 +5617,7 @@ 34A8B3512190A40E00218A25 /* MediaAlbumView.swift in Sources */, FD09C5E828264937000CE219 /* MediaDetailViewController.swift in Sources */, 3496955E219B605E00DCFE74 /* PhotoLibrary.swift in Sources */, + 7B3A392C2971100D002FE4AC /* ContextMenuVC+MessageInfoView.swift in Sources */, 7B8C44C528B49DDA00FBE25F /* NewConversationVC.swift in Sources */, 7B1B52E028580D51006069F2 /* EmojiSkinTonePicker.swift in Sources */, B849789625D4A2F500D0D0B3 /* LinkPreviewView.swift in Sources */, diff --git a/Session/Conversations/Context Menu/ContextMenuVC+MessageInfoView.swift b/Session/Conversations/Context Menu/ContextMenuVC+MessageInfoView.swift new file mode 100644 index 000000000..04e1977c9 --- /dev/null +++ b/Session/Conversations/Context Menu/ContextMenuVC+MessageInfoView.swift @@ -0,0 +1,87 @@ +// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. + +import UIKit +import SessionUIKit +import SessionUtilitiesKit + +extension ContextMenuVC { + final class MessageInfoView: UIView { + private static let cornerRadius: CGFloat = 8 + + private let cellViewModel: MessageViewModel + + // MARK: - UI + + private lazy var messageSentDateLabel: UILabel = { + let result: UILabel = UILabel() + result.font = .systemFont(ofSize: Values.mediumFontSize) + result.themeTextColor = .textPrimary + + return result + }() + + private lazy var messageReceivedDateLabel: UILabel = { + let result: UILabel = UILabel() + result.font = .systemFont(ofSize: Values.mediumFontSize) + result.themeTextColor = .textPrimary + + return result + }() + + private lazy var profilePictureView: ProfilePictureView = { + let result: ProfilePictureView = ProfilePictureView() + result.set(.height, to: Values.verySmallProfilePictureSize) + result.size = Values.verySmallProfilePictureSize + + return result + }() + + private lazy var displayNameLabel: UILabel = { + let result: UILabel = UILabel() + result.font = .systemFont(ofSize: Values.verySmallFontSize) + result.themeTextColor = .textPrimary + + return result + }() + + private lazy var sessionIDLabel: UILabel = { + let result: UILabel = UILabel() + result.font = .systemFont(ofSize: Values.verySmallFontSize) + result.themeTextColor = .textPrimary + + return result + }() + + // MARK: - Lifecycle + + init(cellViewModel: MessageViewModel) { + self.cellViewModel = cellViewModel + + super.init(frame: CGRect.zero) + self.accessibilityLabel = "Message info" + setUpViewHierarchy() + } + + override init(frame: CGRect) { + preconditionFailure("Use init(cellViewModel:) instead.") + } + + required init?(coder: NSCoder) { + preconditionFailure("Use init(cellViewModel:) instead.") + } + + private func setUpViewHierarchy() { + let backgroundView: UIView = UIView() + backgroundView.clipsToBounds = true + backgroundView.themeBackgroundColor = .contextMenu_background + backgroundView.layer.cornerRadius = Self.cornerRadius + addSubview(backgroundView) + backgroundView.pin(to: self) + + let stackView: UIStackView = UIStackView() + stackView.axis = .vertical + backgroundView.addSubview(stackView) + stackView.pin(to: backgroundView) + } + } +} diff --git a/Session/Conversations/Context Menu/ContextMenuVC.swift b/Session/Conversations/Context Menu/ContextMenuVC.swift index d68851588..f7d46d695 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC.swift @@ -59,6 +59,17 @@ final class ContextMenuVC: UIViewController { return result }() + private lazy var messageInfoView: MessageInfoView = { + let result: MessageInfoView = MessageInfoView(cellViewModel: self.cellViewModel) + result.themeShadowColor = .black + result.layer.shadowOffset = CGSize.zero + result.layer.shadowOpacity = 0.4 + result.layer.shadowRadius = 4 + result.alpha = 0 + + return result + }() + private lazy var timestampLabel: UILabel = { let result: UILabel = UILabel() result.font = .systemFont(ofSize: Values.verySmallFontSize) @@ -171,6 +182,10 @@ final class ContextMenuVC: UIViewController { menuStackView.pin(to: menuBackgroundView) view.addSubview(menuView) + // MessageInfo + + view.addSubview(messageInfoView) + // Timestamp view.addSubview(timestampLabel) timestampLabel.center(.vertical, in: snapshot)