|  |  |  | 
 | 
					
						
							|  |  |  | class BaseVC : UIViewController { | 
					
						
							|  |  |  |     private var hasGradient = false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     lazy var navBarTitleLabel: UILabel = { | 
					
						
							|  |  |  |         let result = UILabel() | 
					
						
							|  |  |  |         result.textColor = Colors.text | 
					
						
							|  |  |  |         result.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) | 
					
						
							|  |  |  |         result.alpha = 1 | 
					
						
							|  |  |  |         result.textAlignment = .center | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     lazy var crossfadeLabel: UILabel = { | 
					
						
							|  |  |  |         let result = UILabel() | 
					
						
							|  |  |  |         result.textColor = Colors.text | 
					
						
							|  |  |  |         result.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) | 
					
						
							|  |  |  |         result.alpha = 0 | 
					
						
							|  |  |  |         result.textAlignment = .center | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     override func viewDidLoad() { | 
					
						
							|  |  |  |         setNeedsStatusBarAppearanceUpdate() | 
					
						
							|  |  |  |         NotificationCenter.default.addObserver(self, selector: #selector(handleAppModeChangedNotification(_:)), name: .appModeChanged, object: nil) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     internal func ensureWindowBackground() { | 
					
						
							|  |  |  |         let appMode = AppModeManager.shared.currentAppMode | 
					
						
							|  |  |  |         switch appMode { | 
					
						
							|  |  |  |         case .light: | 
					
						
							|  |  |  |             UIApplication.shared.delegate?.window??.backgroundColor = .white | 
					
						
							|  |  |  |         case .dark: | 
					
						
							|  |  |  |             UIApplication.shared.delegate?.window??.backgroundColor = .black | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     internal func setUpGradientBackground() { | 
					
						
							|  |  |  |         hasGradient = true | 
					
						
							|  |  |  |         view.backgroundColor = .clear | 
					
						
							|  |  |  |         let gradient = Gradients.defaultBackground | 
					
						
							|  |  |  |         view.setGradient(gradient) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     internal func setUpNavBarStyle() { | 
					
						
							|  |  |  |         guard let navigationBar = navigationController?.navigationBar else { return } | 
					
						
							|  |  |  |         if #available(iOS 15.0, *) { | 
					
						
							|  |  |  |             let appearance = UINavigationBarAppearance() | 
					
						
							|  |  |  |             appearance.configureWithOpaqueBackground() | 
					
						
							|  |  |  |             appearance.backgroundColor = Colors.navigationBarBackground | 
					
						
							|  |  |  |             appearance.shadowColor = .clear | 
					
						
							|  |  |  |             navigationBar.standardAppearance = appearance; | 
					
						
							|  |  |  |             navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) | 
					
						
							|  |  |  |             navigationBar.shadowImage = UIImage() | 
					
						
							|  |  |  |             navigationBar.isTranslucent = false | 
					
						
							|  |  |  |             navigationBar.barTintColor = Colors.navigationBarBackground | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     internal func setNavBarTitle(_ title: String, customFontSize: CGFloat? = nil) { | 
					
						
							|  |  |  |         let container = UIView() | 
					
						
							|  |  |  |         navBarTitleLabel.text = title | 
					
						
							|  |  |  |         crossfadeLabel.text = title | 
					
						
							|  |  |  |         if let customFontSize = customFontSize { | 
					
						
							|  |  |  |             navBarTitleLabel.font = .boldSystemFont(ofSize: customFontSize) | 
					
						
							|  |  |  |             crossfadeLabel.font = .boldSystemFont(ofSize: customFontSize) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         container.addSubview(navBarTitleLabel) | 
					
						
							|  |  |  |         navBarTitleLabel.pin(to: container) | 
					
						
							|  |  |  |         container.addSubview(crossfadeLabel) | 
					
						
							|  |  |  |         crossfadeLabel.pin(to: container) | 
					
						
							|  |  |  |         navigationItem.titleView = container | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     internal func setUpNavBarSessionIcon() { | 
					
						
							|  |  |  |         let logoImageView = UIImageView() | 
					
						
							|  |  |  |         logoImageView.image = #imageLiteral(resourceName: "SessionGreen32") | 
					
						
							|  |  |  |         logoImageView.contentMode = .scaleAspectFit | 
					
						
							|  |  |  |         logoImageView.set(.width, to: 32) | 
					
						
							|  |  |  |         logoImageView.set(.height, to: 32) | 
					
						
							|  |  |  |         navigationItem.titleView = logoImageView | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deinit { | 
					
						
							|  |  |  |         NotificationCenter.default.removeObserver(self) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { | 
					
						
							|  |  |  |         NotificationCenter.default.post(name: .appModeChanged, object: nil) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @objc internal func handleAppModeChangedNotification(_ notification: Notification) { | 
					
						
							|  |  |  |         if hasGradient { | 
					
						
							|  |  |  |             setUpGradientBackground() // Re-do the gradient | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         ensureWindowBackground() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |