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.
		
		
		
		
		
			
		
			
				
	
	
		
			155 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			155 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Swift
		
	
| 
 | |
| final class ExpandingAttachmentsButton : UIView, InputViewButtonDelegate {
 | |
|     private weak var delegate: ExpandingAttachmentsButtonDelegate?
 | |
|     private var isExpanded = false { didSet { expandOrCollapse() } }
 | |
|     
 | |
|     override var isUserInteractionEnabled: Bool {
 | |
|         didSet {
 | |
|             gifButton.isUserInteractionEnabled = isUserInteractionEnabled
 | |
|             documentButton.isUserInteractionEnabled = isUserInteractionEnabled
 | |
|             libraryButton.isUserInteractionEnabled = isUserInteractionEnabled
 | |
|             cameraButton.isUserInteractionEnabled = isUserInteractionEnabled
 | |
|             mainButton.isUserInteractionEnabled = isUserInteractionEnabled
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     // MARK: Constraints
 | |
|     private lazy var gifButtonContainerBottomConstraint = gifButtonContainer.pin(.bottom, to: .bottom, of: self)
 | |
|     private lazy var documentButtonContainerBottomConstraint = documentButtonContainer.pin(.bottom, to: .bottom, of: self)
 | |
|     private lazy var libraryButtonContainerBottomConstraint = libraryButtonContainer.pin(.bottom, to: .bottom, of: self)
 | |
|     private lazy var cameraButtonContainerBottomConstraint = cameraButtonContainer.pin(.bottom, to: .bottom, of: self)
 | |
|     
 | |
|     // MARK: UI Components
 | |
|     lazy var gifButton: InputViewButton = {
 | |
|         let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_gif_black"), delegate: self, hasOpaqueBackground: true)
 | |
|         result.accessibilityLabel = NSLocalizedString("accessibility_gif_button", comment: "")
 | |
|         return result
 | |
|     }()
 | |
|     lazy var gifButtonContainer = container(for: gifButton)
 | |
|     lazy var documentButton: InputViewButton = {
 | |
|         let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_document_black"), delegate: self, hasOpaqueBackground: true)
 | |
|         result.accessibilityLabel = NSLocalizedString("accessibility_document_button", comment: "")
 | |
|         return result
 | |
|     }()
 | |
|     lazy var documentButtonContainer = container(for: documentButton)
 | |
|     lazy var libraryButton: InputViewButton = {
 | |
|         let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_camera_roll_black"), delegate: self, hasOpaqueBackground: true)
 | |
|         result.accessibilityLabel = NSLocalizedString("accessibility_library_button", comment: "")
 | |
|         return result
 | |
|     }()
 | |
|     lazy var libraryButtonContainer = container(for: libraryButton)
 | |
|     lazy var cameraButton: InputViewButton = {
 | |
|         let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_camera_black"), delegate: self, hasOpaqueBackground: true)
 | |
|         result.accessibilityLabel = NSLocalizedString("accessibility_camera_button", comment: "")
 | |
|         return result
 | |
|     }()
 | |
|     lazy var cameraButtonContainer = container(for: cameraButton)
 | |
|     lazy var mainButton: InputViewButton = {
 | |
|         let result = InputViewButton(icon: #imageLiteral(resourceName: "ic_plus_24"), delegate: self)
 | |
|         result.accessibilityLabel = NSLocalizedString("accessibility_expanding_attachments_button", comment: "")
 | |
|         return result
 | |
|     }()
 | |
|     lazy var mainButtonContainer = container(for: mainButton)
 | |
|     
 | |
|     // MARK: Lifecycle
 | |
|     init(delegate: ExpandingAttachmentsButtonDelegate?) {
 | |
|         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() {
 | |
|         backgroundColor = .clear
 | |
|         // GIF button
 | |
|         addSubview(gifButtonContainer)
 | |
|         gifButtonContainer.alpha = 0
 | |
|         // Document button
 | |
|         addSubview(documentButtonContainer)
 | |
|         documentButtonContainer.alpha = 0
 | |
|         // Library button
 | |
|         addSubview(libraryButtonContainer)
 | |
|         libraryButtonContainer.alpha = 0
 | |
|         // Camera button
 | |
|         addSubview(cameraButtonContainer)
 | |
|         cameraButtonContainer.alpha = 0
 | |
|         // Main button
 | |
|         addSubview(mainButtonContainer)
 | |
|         // Constraints
 | |
|         mainButtonContainer.pin(to: self)
 | |
|         gifButtonContainer.center(.horizontal, in: self)
 | |
|         documentButtonContainer.center(.horizontal, in: self)
 | |
|         libraryButtonContainer.center(.horizontal, in: self)
 | |
|         cameraButtonContainer.center(.horizontal, in: self)
 | |
|         [ gifButtonContainerBottomConstraint, documentButtonContainerBottomConstraint, libraryButtonContainerBottomConstraint, cameraButtonContainerBottomConstraint ].forEach {
 | |
|             $0.isActive = true
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     // MARK: Animation
 | |
|     private func expandOrCollapse() {
 | |
|         if isExpanded {
 | |
|             mainButton.accessibilityLabel = NSLocalizedString("accessibility_main_button_collapse", comment: "")
 | |
|             let expandedButtonSize = InputViewButton.expandedSize
 | |
|             let spacing: CGFloat = 4
 | |
|             cameraButtonContainerBottomConstraint.constant = -1 * (expandedButtonSize + spacing)
 | |
|             libraryButtonContainerBottomConstraint.constant = -2 * (expandedButtonSize + spacing)
 | |
|             documentButtonContainerBottomConstraint.constant = -3 * (expandedButtonSize + spacing)
 | |
|             gifButtonContainerBottomConstraint.constant = -4 * (expandedButtonSize + spacing)
 | |
|             UIView.animate(withDuration: 0.25) {
 | |
|                 [ self.gifButtonContainer, self.documentButtonContainer, self.libraryButtonContainer, self.cameraButtonContainer ].forEach {
 | |
|                     $0.alpha = 1
 | |
|                 }
 | |
|                 self.layoutIfNeeded()
 | |
|             }
 | |
|         } else {
 | |
|             mainButton.accessibilityLabel = NSLocalizedString("accessibility_expanding_attachments_button", comment: "")
 | |
|             [ gifButtonContainerBottomConstraint, documentButtonContainerBottomConstraint, libraryButtonContainerBottomConstraint, cameraButtonContainerBottomConstraint ].forEach {
 | |
|                 $0.constant = 0
 | |
|             }
 | |
|             UIView.animate(withDuration: 0.25) {
 | |
|                 [ self.gifButtonContainer, self.documentButtonContainer, self.libraryButtonContainer, self.cameraButtonContainer ].forEach {
 | |
|                     $0.alpha = 0
 | |
|                 }
 | |
|                 self.layoutIfNeeded()
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     // MARK: Interaction
 | |
|     func handleInputViewButtonTapped(_ inputViewButton: InputViewButton) {
 | |
|         if inputViewButton == gifButton { delegate?.handleGIFButtonTapped(); isExpanded = false }
 | |
|         if inputViewButton == documentButton { delegate?.handleDocumentButtonTapped(); isExpanded = false }
 | |
|         if inputViewButton == libraryButton { delegate?.handleLibraryButtonTapped(); isExpanded = false }
 | |
|         if inputViewButton == cameraButton { delegate?.handleCameraButtonTapped(); isExpanded = false }
 | |
|         if inputViewButton == mainButton { isExpanded = !isExpanded }
 | |
|     }
 | |
|     
 | |
|     // MARK: Convenience
 | |
|     private func container(for button: InputViewButton) -> UIView {
 | |
|         let result = UIView()
 | |
|         result.addSubview(button)
 | |
|         result.set(.width, to: InputViewButton.expandedSize)
 | |
|         result.set(.height, to: InputViewButton.expandedSize)
 | |
|         button.center(in: result)
 | |
|         return result
 | |
|     }
 | |
| }
 | |
| 
 | |
| // MARK: - Delegate
 | |
| 
 | |
| protocol ExpandingAttachmentsButtonDelegate: AnyObject {
 | |
| 
 | |
|     func handleGIFButtonTapped()
 | |
|     func handleDocumentButtonTapped()
 | |
|     func handleLibraryButtonTapped()
 | |
|     func handleCameraButtonTapped()
 | |
| }
 |