mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | |
| 
 | |
| import UIKit
 | |
| import SessionUIKit
 | |
| 
 | |
| final class PathStatusView: UIView {
 | |
|     enum Status {
 | |
|         case unknown
 | |
|         case connecting
 | |
|         case connected
 | |
|         case error
 | |
|         
 | |
|         var themeColor: ThemeValue {
 | |
|             switch self {
 | |
|                 case .unknown: return .path_unknown
 | |
|                 case .connecting: return .path_connecting
 | |
|                 case .connected: return .path_connected
 | |
|                 case .error: return .path_error
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     static let size: CGFloat = 8
 | |
|     
 | |
|     override init(frame: CGRect) {
 | |
|         super.init(frame: frame)
 | |
|         
 | |
|         setUpViewHierarchy()
 | |
|         registerObservers()
 | |
|     }
 | |
| 
 | |
|     required init?(coder: NSCoder) {
 | |
|         super.init(coder: coder)
 | |
|         
 | |
|         setUpViewHierarchy()
 | |
|         registerObservers()
 | |
|     }
 | |
|     
 | |
|     private func setUpViewHierarchy() {
 | |
|         layer.cornerRadius = (PathStatusView.size / 2)
 | |
|         layer.masksToBounds = false
 | |
|         
 | |
|         setStatus(to: (!OnionRequestAPI.paths.isEmpty ? .connected : .connecting))
 | |
|     }
 | |
| 
 | |
|     private func registerObservers() {
 | |
|         let notificationCenter = NotificationCenter.default
 | |
|         notificationCenter.addObserver(self, selector: #selector(handleBuildingPathsNotification), name: .buildingPaths, object: nil)
 | |
|         notificationCenter.addObserver(self, selector: #selector(handlePathsBuiltNotification), name: .pathsBuilt, object: nil)
 | |
|     }
 | |
| 
 | |
|     deinit {
 | |
|         NotificationCenter.default.removeObserver(self)
 | |
|     }
 | |
| 
 | |
|     private func setStatus(to status: Status) {
 | |
|         themeBackgroundColor = status.themeColor
 | |
|         layer.themeShadowColor = status.themeColor
 | |
|         layer.shadowOffset = CGSize(width: 0, height: 0.8)
 | |
|         layer.shadowPath = UIBezierPath(
 | |
|             ovalIn: CGRect(
 | |
|                 origin: CGPoint.zero,
 | |
|                 size: CGSize(width: PathStatusView.size, height: PathStatusView.size)
 | |
|             )
 | |
|         ).cgPath
 | |
|         
 | |
|         ThemeManager.onThemeChange(observer: self) { [weak self] theme, _ in
 | |
|             self?.layer.shadowOpacity = (theme.interfaceStyle == .light ? 0.4 : 1)
 | |
|             self?.layer.shadowRadius = (theme.interfaceStyle == .light ? 6 : 8)
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @objc private func handleBuildingPathsNotification() {
 | |
|         setStatus(to: .connecting)
 | |
|     }
 | |
| 
 | |
|     @objc private func handlePathsBuiltNotification() {
 | |
|         setStatus(to: .connected)
 | |
|     }
 | |
| }
 |