CameraController.swift (2422B)
1 // 2 // CameraController.swift 3 // damus 4 // 5 // Created by KernelKind on 2/15/24. 6 // 7 8 import UIKit 9 import SwiftUI 10 11 struct CameraController: UIViewControllerRepresentable { 12 13 @Environment(\.presentationMode) 14 @Binding private var presentationMode 15 16 let uploader: MediaUploader 17 let done: () -> Void 18 var imagesOnly: Bool = false 19 20 final class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate { 21 let parent: CameraController 22 23 init(_ parent: CameraController) { 24 self.parent = parent 25 } 26 27 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 28 if !parent.imagesOnly, let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL { 29 // Handle the selected video 30 UISaveVideoAtPathToSavedPhotosAlbum(videoURL.relativePath, nil, nil, nil) 31 } else if let cameraImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { 32 let orientedImage = cameraImage.fixOrientation() 33 UIImageWriteToSavedPhotosAlbum(orientedImage, nil, nil, nil) 34 } else if let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage { 35 let orientedImage = editedImage.fixOrientation() 36 UIImageWriteToSavedPhotosAlbum(orientedImage, nil, nil, nil) 37 } 38 39 parent.done() 40 } 41 42 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 43 parent.presentationMode.dismiss() 44 } 45 } 46 47 func makeCoordinator() -> Coordinator { 48 return Coordinator(self) 49 } 50 51 func makeUIViewController(context: UIViewControllerRepresentableContext<CameraController>) -> UIImagePickerController { 52 let picker = UIImagePickerController() 53 picker.sourceType = .camera 54 picker.mediaTypes = ["public.image", "com.compuserve.gif"] 55 if uploader.supportsVideo && !imagesOnly { 56 picker.mediaTypes.append("public.movie") 57 } 58 picker.delegate = context.coordinator 59 return picker 60 } 61 62 func updateUIViewController(_ uiViewController: UIImagePickerController, 63 context: UIViewControllerRepresentableContext<CameraController>) { 64 65 } 66 }