// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import UIKit import SessionUIKit import SessionMessagingKit final class DocumentView: UIView { // MARK: - Lifecycle init(attachment: Attachment, textColor: ThemeValue) { super.init(frame: CGRect.zero) setUpViewHierarchy(attachment: attachment, textColor: textColor) } override init(frame: CGRect) { preconditionFailure("Use init(viewItem:textColor:) instead.") } required init?(coder: NSCoder) { preconditionFailure("Use init(viewItem:textColor:) instead.") } private func setUpViewHierarchy(attachment: Attachment, textColor: ThemeValue) { let imageBackgroundView: UIView = UIView() imageBackgroundView.themeBackgroundColor = .messageBubble_overlay addSubview(imageBackgroundView) // Image view let imageView = UIImageView( image: UIImage(systemName: "doc")? .withRenderingMode(.alwaysTemplate) ) imageView.setContentCompressionResistancePriority(.required, for: .horizontal) imageView.setContentHuggingPriority(.required, for: .horizontal) imageView.themeTintColor = textColor imageView.set(.height, to: 22) // Body label let titleLabel = UILabel() titleLabel.font = .systemFont(ofSize: Values.mediumFontSize) titleLabel.text = (attachment.sourceFilename ?? "File") titleLabel.themeTextColor = textColor titleLabel.lineBreakMode = .byTruncatingTail // Size label let sizeLabel = UILabel() sizeLabel.font = .systemFont(ofSize: Values.verySmallFontSize) sizeLabel.text = Format.fileSize(attachment.byteCount) sizeLabel.themeTextColor = textColor sizeLabel.lineBreakMode = .byTruncatingTail // Label stack view let labelStackView = UIStackView(arrangedSubviews: [ titleLabel, sizeLabel ]) labelStackView.axis = .vertical // Download image view let downloadImageView = UIImageView( image: UIImage(systemName: "arrow.down")? .withRenderingMode(.alwaysTemplate) ) downloadImageView.setContentCompressionResistancePriority(.required, for: .horizontal) downloadImageView.setContentHuggingPriority(.required, for: .horizontal) downloadImageView.themeTintColor = textColor downloadImageView.set(.height, to: 16) // Stack view let stackView = UIStackView( arrangedSubviews: [ imageView, UIView.spacer(withWidth: 0), labelStackView, downloadImageView ] ) stackView.axis = .horizontal stackView.spacing = Values.mediumSpacing stackView.alignment = .center addSubview(stackView) stackView.pin(.top, to: .top, of: self, withInset: Values.smallSpacing) stackView.pin(.leading, to: .leading, of: self, withInset: Values.mediumSpacing) stackView.pin(.trailing, to: .trailing, of: self, withInset: -Values.mediumSpacing) stackView.pin(.bottom, to: .bottom, of: self, withInset: -Values.smallSpacing) imageBackgroundView.pin(.top, to: .top, of: self) imageBackgroundView.pin(.leading, to: .leading, of: self) imageBackgroundView.pin(.trailing, to: .trailing, of: imageView, withInset: Values.mediumSpacing) imageBackgroundView.pin(.bottom, to: .bottom, of: self) } }