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.
		
		
		
		
		
			
		
			
				
	
	
		
			54 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			54 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | |
| 
 | |
| import Foundation
 | |
| 
 | |
| enum Media {
 | |
|     case gallery(MediaGalleryViewModel.Item)
 | |
|     case image(UIImage)
 | |
| 
 | |
|     var image: UIImage? {
 | |
|         switch self {
 | |
|             case let .gallery(item):
 | |
|                 // For videos attempt to load a large thumbnail, for other items just try to load
 | |
|                 // the source file directly
 | |
|                 guard !item.isVideo else { return item.attachment.existingThumbnail(size: .large) }
 | |
|                 guard let originalFilePath: String = item.attachment.originalFilePath else { return nil }
 | |
|                 
 | |
|                 return UIImage(contentsOfFile: originalFilePath)
 | |
|                 
 | |
|             case let .image(image): return image
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct MediaPresentationContext {
 | |
|     let mediaView: UIView
 | |
|     let presentationFrame: CGRect
 | |
|     let cornerRadius: CGFloat
 | |
|     let cornerMask: CACornerMask
 | |
| }
 | |
| 
 | |
| // There are two kinds of AnimationControllers that interact with the media detail view. Both
 | |
| // appear to transition the media view from one VC to it's corresponding location in the
 | |
| // destination VC.
 | |
| //
 | |
| // MediaPresentationContextProvider is either a target or destination VC which can provide the
 | |
| // details necessary to facilite this animation.
 | |
| //
 | |
| // First, the MediaZoomAnimationController is non-interactive. We use it whenever we're going to
 | |
| // show the Media detail pager.
 | |
| //
 | |
| //  We can get there several ways:
 | |
| //    From conversation settings, this can be a push or a pop from the tileView.
 | |
| //    From conversationView/MessageDetails this can be a modal present or a pop from the tile view.
 | |
| //
 | |
| // The other animation controller, the MediaDismissAnimationController is used when we're going to
 | |
| // stop showing the media pager. This can be a pop to the tile view, or a modal dismiss.
 | |
| protocol MediaPresentationContextProvider {
 | |
|     func mediaPresentationContext(mediaItem: Media, in coordinateSpace: UICoordinateSpace) -> MediaPresentationContext?
 | |
| 
 | |
|     // The transitionView will be presented below this view.
 | |
|     // If nil, the transitionView will be presented above all
 | |
|     func snapshotOverlayView(in coordinateSpace: UICoordinateSpace) -> (UIView, CGRect)?
 | |
| }
 |