|  |  |  | // | 
					
						
							|  |  |  | //  Copyright (c) 2019 Open Whisper Systems. All rights reserved. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import Foundation | 
					
						
							|  |  |  | import SessionUIKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ReminderView: UIView { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let label = UILabel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     typealias Action = () -> Void | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var tapAction: Action? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var text: String? { | 
					
						
							|  |  |  |         get { | 
					
						
							|  |  |  |             return label.text | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         set(newText) { | 
					
						
							|  |  |  |             label.text = newText | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enum ReminderViewMode { | 
					
						
							|  |  |  |         // Nags are urgent interactive prompts, bidding for the user's attention. | 
					
						
							|  |  |  |         case nag | 
					
						
							|  |  |  |         // Explanations are not interactive or urgent. | 
					
						
							|  |  |  |         case explanation | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     let mode: ReminderViewMode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @available(*, unavailable, message:"use other constructor instead.") | 
					
						
							|  |  |  |     required init?(coder aDecoder: NSCoder) { | 
					
						
							|  |  |  |         notImplemented() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @available(*, unavailable, message:"use other constructor instead.") | 
					
						
							|  |  |  |     override init(frame: CGRect) { | 
					
						
							|  |  |  |         notImplemented() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private init(mode: ReminderViewMode, | 
					
						
							|  |  |  |          text: String, tapAction: Action?) { | 
					
						
							|  |  |  |         self.mode = mode | 
					
						
							|  |  |  |         self.tapAction = tapAction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super.init(frame: .zero) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.text = text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         setupSubviews() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @objc public class func nag(text: String, tapAction: Action?) -> ReminderView { | 
					
						
							|  |  |  |         return ReminderView(mode: .nag, text: text, tapAction: tapAction) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @objc public class func explanation(text: String) -> ReminderView { | 
					
						
							|  |  |  |         return ReminderView(mode: .explanation, text: text, tapAction: nil) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func setupSubviews() { | 
					
						
							|  |  |  |         let textColor: UIColor | 
					
						
							|  |  |  |         let iconColor: UIColor | 
					
						
							|  |  |  |         switch mode { | 
					
						
							|  |  |  |         case .nag: | 
					
						
							|  |  |  |             self.backgroundColor = UIColor.ows_reminderYellow | 
					
						
							|  |  |  |             textColor = UIColor.ows_gray90 | 
					
						
							|  |  |  |             iconColor = UIColor.ows_gray60 | 
					
						
							|  |  |  |         case .explanation: | 
					
						
							|  |  |  |             // TODO: Theme, review with design. | 
					
						
							|  |  |  |             self.backgroundColor = Colors.unimportant | 
					
						
							|  |  |  |             textColor = Colors.text | 
					
						
							|  |  |  |             iconColor = Colors.separator | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         self.clipsToBounds = true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(gestureRecognizer:))) | 
					
						
							|  |  |  |         self.addGestureRecognizer(tapGesture) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let container = UIStackView() | 
					
						
							|  |  |  |         container.axis = .horizontal | 
					
						
							|  |  |  |         container.alignment = .center | 
					
						
							|  |  |  |         container.isLayoutMarginsRelativeArrangement = true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.addSubview(container) | 
					
						
							|  |  |  |         container.layoutMargins = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16) | 
					
						
							|  |  |  |         container.ows_autoPinToSuperviewEdges() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Label | 
					
						
							|  |  |  |         label.font = UIFont.ows_dynamicTypeSubheadline | 
					
						
							|  |  |  |         container.addArrangedSubview(label) | 
					
						
							|  |  |  |         label.textColor = textColor | 
					
						
							|  |  |  |         label.numberOfLines = 0 | 
					
						
							|  |  |  |         label.lineBreakMode = .byWordWrapping | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Show the disclosure indicator if this reminder has a tap action. | 
					
						
							|  |  |  |         if tapAction != nil { | 
					
						
							|  |  |  |             // Icon | 
					
						
							|  |  |  |             let iconName = (CurrentAppContext().isRTL ? "system_disclosure_indicator_rtl" : "system_disclosure_indicator") | 
					
						
							|  |  |  |             guard let iconImage = UIImage(named: iconName) else { | 
					
						
							|  |  |  |                 owsFailDebug("missing icon.") | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             let iconView = UIImageView(image: iconImage.withRenderingMode(.alwaysTemplate)) | 
					
						
							|  |  |  |             iconView.contentMode = .scaleAspectFit | 
					
						
							|  |  |  |             iconView.tintColor = iconColor | 
					
						
							|  |  |  |             iconView.autoSetDimension(.width, toSize: 13) | 
					
						
							|  |  |  |             container.addArrangedSubview(iconView) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @objc func handleTap(gestureRecognizer: UIGestureRecognizer) { | 
					
						
							|  |  |  |         guard gestureRecognizer.state == .recognized else { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         tapAction?() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |