|  |  |  | // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import UIKit | 
					
						
							|  |  |  | import SessionUIKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SessionHeaderView: UITableViewHeaderFooterView { | 
					
						
							|  |  |  |     // MARK: - UI | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private lazy var titleLabelConstraints: [NSLayoutConstraint] = [ | 
					
						
							|  |  |  |         titleLabel.pin(.top, to: .top, of: self, withInset: Values.mediumSpacing), | 
					
						
							|  |  |  |         titleLabel.pin(.bottom, to: .bottom, of: self, withInset: -Values.mediumSpacing) | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     private lazy var titleLabelLeadingConstraint: NSLayoutConstraint = titleLabel.pin(.leading, to: .leading, of: self) | 
					
						
							|  |  |  |     private lazy var titleLabelTrailingConstraint: NSLayoutConstraint = titleLabel.pin(.trailing, to: .trailing, of: self) | 
					
						
							|  |  |  |     private lazy var titleSeparatorLeadingConstraint: NSLayoutConstraint = titleSeparator.pin(.leading, to: .leading, of: self) | 
					
						
							|  |  |  |     private lazy var titleSeparatorTrailingConstraint: NSLayoutConstraint = titleSeparator.pin(.trailing, to: .trailing, of: self) | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private let titleLabel: UILabel = { | 
					
						
							|  |  |  |         let result: UILabel = UILabel() | 
					
						
							|  |  |  |         result.translatesAutoresizingMaskIntoConstraints = false | 
					
						
							|  |  |  |         result.font = .systemFont(ofSize: Values.mediumFontSize) | 
					
						
							|  |  |  |         result.themeTextColor = .textSecondary | 
					
						
							|  |  |  |         result.isHidden = true | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private let titleSeparator: Separator = { | 
					
						
							|  |  |  |         let result: Separator = Separator() | 
					
						
							|  |  |  |         result.isHidden = true | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private let loadingIndicator: UIActivityIndicatorView = { | 
					
						
							|  |  |  |         let result: UIActivityIndicatorView = UIActivityIndicatorView(style: .medium) | 
					
						
							|  |  |  |         result.themeTintColor = .textPrimary | 
					
						
							|  |  |  |         result.alpha = 0.5 | 
					
						
							|  |  |  |         result.startAnimating() | 
					
						
							|  |  |  |         result.hidesWhenStopped = true | 
					
						
							|  |  |  |         result.isHidden = true | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Initialization | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     override init(reuseIdentifier: String?) { | 
					
						
							|  |  |  |         super.init(reuseIdentifier: reuseIdentifier) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         self.backgroundView = UIView() | 
					
						
							|  |  |  |         self.backgroundView?.themeBackgroundColor = .backgroundPrimary | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         addSubview(titleLabel) | 
					
						
							|  |  |  |         addSubview(titleSeparator) | 
					
						
							|  |  |  |         addSubview(loadingIndicator) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         setupLayout() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     required init?(coder: NSCoder) { | 
					
						
							|  |  |  |         fatalError("use init(reuseIdentifier:) instead") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private func setupLayout() { | 
					
						
							|  |  |  |         titleLabel.pin(.top, to: .top, of: self, withInset: Values.mediumSpacing) | 
					
						
							|  |  |  |         titleLabel.pin(.bottom, to: .bottom, of: self, withInset: Values.mediumSpacing) | 
					
						
							|  |  |  |         titleLabel.center(.vertical, in: self) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         titleSeparator.center(.vertical, in: self) | 
					
						
							|  |  |  |         loadingIndicator.center(in: self) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Content | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     override func prepareForReuse() { | 
					
						
							|  |  |  |         super.prepareForReuse() | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         titleLabel.isHidden = true | 
					
						
							|  |  |  |         titleSeparator.isHidden = true | 
					
						
							|  |  |  |         loadingIndicator.isHidden = true | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         titleLabelLeadingConstraint.isActive = false | 
					
						
							|  |  |  |         titleLabelTrailingConstraint.isActive = false | 
					
						
							|  |  |  |         titleLabelConstraints.forEach { $0.isActive = false } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         titleSeparator.center(.vertical, in: self) | 
					
						
							|  |  |  |         titleSeparatorLeadingConstraint.isActive = false | 
					
						
							|  |  |  |         titleSeparatorTrailingConstraint.isActive = false | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     public func update( | 
					
						
							|  |  |  |         title: String?, | 
					
						
							|  |  |  |         style: SessionTableSectionStyle = .titleRoundedContent | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |         let titleIsEmpty: Bool = (title ?? "").isEmpty | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         switch style { | 
					
						
							|  |  |  |             case .titleRoundedContent, .titleEdgeToEdgeContent, .titleNoBackgroundContent: | 
					
						
							|  |  |  |                 titleLabel.text = title | 
					
						
							|  |  |  |                 titleLabel.isHidden = titleIsEmpty | 
					
						
							|  |  |  |                 titleLabelLeadingConstraint.constant = style.edgePadding | 
					
						
							|  |  |  |                 titleLabelTrailingConstraint.constant = -style.edgePadding | 
					
						
							|  |  |  |                 titleLabelLeadingConstraint.isActive = !titleIsEmpty | 
					
						
							|  |  |  |                 titleLabelTrailingConstraint.isActive = !titleIsEmpty | 
					
						
							|  |  |  |                 titleLabelConstraints.forEach { $0.isActive = true } | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |             case .titleSeparator: | 
					
						
							|  |  |  |                 titleSeparator.update(title: title) | 
					
						
							|  |  |  |                 titleSeparator.isHidden = false | 
					
						
							|  |  |  |                 titleSeparatorLeadingConstraint.constant = style.edgePadding | 
					
						
							|  |  |  |                 titleSeparatorTrailingConstraint.constant = -style.edgePadding | 
					
						
							|  |  |  |                 titleSeparatorLeadingConstraint.isActive = !titleIsEmpty | 
					
						
							|  |  |  |                 titleSeparatorTrailingConstraint.isActive = !titleIsEmpty | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |             case .none, .padding: break | 
					
						
							|  |  |  |             case .loadMore: loadingIndicator.isHidden = false | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         self.layoutIfNeeded() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |