|  |  |  | // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import UIKit | 
					
						
							|  |  |  | import SessionUIKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | final class ScrollToBottomButton: UIView { | 
					
						
							|  |  |  |     private weak var delegate: ScrollToBottomButtonDelegate? | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Settings | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private static let size: CGFloat = 40 | 
					
						
							|  |  |  |     private static let iconSize: CGFloat = 16 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Lifecycle | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     init(delegate: ScrollToBottomButtonDelegate) { | 
					
						
							|  |  |  |         self.delegate = delegate | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         super.init(frame: CGRect.zero) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         setUpViewHierarchy() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     override init(frame: CGRect) { | 
					
						
							|  |  |  |         preconditionFailure("Use init(delegate:) instead.") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     required init?(coder: NSCoder) { | 
					
						
							|  |  |  |         preconditionFailure("Use init(delegate:) instead.") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private func setUpViewHierarchy() { | 
					
						
							|  |  |  |         // Background & blur | 
					
						
							|  |  |  |         let backgroundView = UIView() | 
					
						
							|  |  |  |         backgroundView.themeBackgroundColor = .backgroundSecondary | 
					
						
							|  |  |  |         backgroundView.alpha = Values.lowOpacity | 
					
						
							|  |  |  |         addSubview(backgroundView) | 
					
						
							|  |  |  |         backgroundView.pin(to: self) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         let blurView = UIVisualEffectView() | 
					
						
							|  |  |  |         addSubview(blurView) | 
					
						
							|  |  |  |         blurView.pin(to: self) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         ThemeManager.onThemeChange(observer: blurView) { [weak blurView] theme, _ in | 
					
						
							|  |  |  |             switch theme.interfaceStyle { | 
					
						
							|  |  |  |                 case .light: blurView?.effect = UIBlurEffect(style: .light) | 
					
						
							|  |  |  |                 default: blurView?.effect = UIBlurEffect(style: .dark) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // Size & shape | 
					
						
							|  |  |  |         set(.width, to: ScrollToBottomButton.size) | 
					
						
							|  |  |  |         set(.height, to: ScrollToBottomButton.size) | 
					
						
							|  |  |  |         layer.cornerRadius = (ScrollToBottomButton.size / 2) | 
					
						
							|  |  |  |         layer.masksToBounds = true | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // Border | 
					
						
							|  |  |  |         self.themeBorderColor = .borderSeparator | 
					
						
							|  |  |  |         layer.borderWidth = Values.separatorThickness | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // Icon | 
					
						
							|  |  |  |         let iconImageView = UIImageView( | 
					
						
							|  |  |  |             image: UIImage(named: "ic_chevron_down")? | 
					
						
							|  |  |  |                 .withRenderingMode(.alwaysTemplate) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         iconImageView.themeTintColor = .textPrimary | 
					
						
							|  |  |  |         iconImageView.contentMode = .scaleAspectFit | 
					
						
							|  |  |  |         addSubview(iconImageView) | 
					
						
							|  |  |  |         iconImageView.center(in: self) | 
					
						
							|  |  |  |         iconImageView.set(.width, to: ScrollToBottomButton.iconSize) | 
					
						
							|  |  |  |         iconImageView.set(.height, to: ScrollToBottomButton.iconSize) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // Gesture recognizer | 
					
						
							|  |  |  |         let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap)) | 
					
						
							|  |  |  |         addGestureRecognizer(tapGestureRecognizer) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Interaction | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     @objc private func handleTap() { | 
					
						
							|  |  |  |         delegate?.handleScrollToBottomButtonTapped() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MARK: - ScrollToBottomButtonDelegate | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protocol ScrollToBottomButtonDelegate: AnyObject { | 
					
						
							|  |  |  |     func handleScrollToBottomButtonTapped() | 
					
						
							|  |  |  | } |