// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation import SessionUtilitiesKit class ImagePickerHandler: NSObject, UIImagePickerControllerDelegate & UINavigationControllerDelegate { private let onTransition: (UIViewController, TransitionType) -> Void private let onImageDataPicked: (Data) -> Void // MARK: - Initialization init( onTransition: @escaping (UIViewController, TransitionType) -> Void, onImageDataPicked: @escaping (Data) -> Void ) { self.onTransition = onTransition self.onImageDataPicked = onImageDataPicked } // MARK: - UIImagePickerControllerDelegate func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { guard let imageUrl: URL = info[.imageURL] as? URL, let rawAvatar: UIImage = info[.originalImage] as? UIImage else { picker.presentingViewController?.dismiss(animated: true) return } picker.presentingViewController?.dismiss(animated: true) { [weak self] in // Check if the user selected an animated image (if so then don't crop, just // set the avatar directly guard let resourceValues: URLResourceValues = (try? imageUrl.resourceValues(forKeys: [.typeIdentifierKey])), let type: Any = resourceValues.allValues.first?.value, let typeString: String = type as? String, MIMETypeUtil.supportedAnimatedImageUTITypes().contains(typeString) else { let viewController: CropScaleImageViewController = CropScaleImageViewController( srcImage: rawAvatar, successCompletion: { resultImageData in self?.onImageDataPicked(resultImageData) } ) self?.onTransition(viewController, .present) return } guard let imageData: Data = try? Data(contentsOf: URL(fileURLWithPath: imageUrl.path)) else { return } self?.onImageDataPicked(imageData) } } }