1// CameraPickerView.swift
2// SophaxChat
3//
4// UIImagePickerController wrapper for taking photos with the device camera.
5
6import SwiftUI
7import UIKit
8
9struct CameraPickerView: UIViewControllerRepresentable {
10 let onImage: (UIImage?) -> Void
11
12 func makeCoordinator() -> Coordinator { Coordinator(onImage: onImage) }
13
14 func makeUIViewController(context: Context) -> UIImagePickerController {
15 let picker = UIImagePickerController()
16 picker.sourceType = UIImagePickerController.isSourceTypeAvailable(.camera) ? .camera : .photoLibrary
17 picker.allowsEditing = false
18 picker.delegate = context.coordinator
19 return picker
20 }
21
22 func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
23
24 // MARK: - Coordinator
25
26 final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
27 let onImage: (UIImage?) -> Void
28
29 init(onImage: @escaping (UIImage?) -> Void) {
30 self.onImage = onImage
31 }
32
33 func imagePickerController(
34 _ picker: UIImagePickerController,
35 didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
36 ) {
37 let image = info[.originalImage] as? UIImage
38 picker.dismiss(animated: true) { [self] in
39 onImage(image)
40 }
41 }
42
43 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
44 picker.dismiss(animated: true) { [self] in
45 onImage(nil)
46 }
47 }
48 }
49}