Untitled

 avatar
unknown
plain_text
a month ago
4.9 kB
6
Indexable
// MARK: - QLPreviewWrapper

struct QLPreviewWrapper: UIViewControllerRepresentable {
  
    let url: URL
    let onSave: () -> Void
    let onClose: () -> Void
  
  func makeUIViewController(context: Context) -> some UIViewController {
      return QLPreviewAsClass(url: url, onSave: onSave, onClose: onClose)
  }
  
  func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }
}

// MARK: QLPreviewAsClass

final class QLPreviewAsClass: UIViewController, QLPreviewControllerDataSource, @preconcurrency QLPreviewControllerDelegate {
    let url: URL
    let onSave: () -> Void
    let onClose: () -> Void
    var qlController: QLPreviewController?
    
    required init?(coder: NSCoder) {
        fatalError("no supported")
    }
    
    init(url: URL, onSave: @escaping () -> Void, onClose: @escaping () -> Void) {
        self.url = url
        self.onSave = onSave
        self.onClose = onClose
        super.init(nibName: nil, bundle: nil)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if qlController == nil {
            qlController = QLPreviewController()
            guard let qlController else { return }
            qlController.dataSource = self
            qlController.delegate = self
            present(qlController, animated: false)
        }
    }
    
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }
    
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        return url as QLPreviewItem
    }
    
    func previewController(_ controller: QLPreviewController, editingModeFor previewItem: any QLPreviewItem) -> QLPreviewItemEditingMode {
        return .createCopy
    }
    
    func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) {
        _ = try? FileManager.default.replaceItemAt(url, withItemAt: modifiedContentsURL)
        NotificationCenter.default.post(name: Notification.Name("modifiedContentsURL"), object: nil)
        onSave()
    }
    
    func previewControllerWillDismiss(_ controller: QLPreviewController) {
        dismiss(animated: false)
    }
}

// MARK: - QLPreview

struct QLPreview: UIViewControllerRepresentable {
    
    let url: URL
    let onSave: () -> Void
    let onClose: () -> Void
    
    init(
        url: URL,
        onSave: @escaping () -> Void,
        onClose: @escaping () -> Void
    ) {
        self.url = url
        self.onSave = onSave
        self.onClose = onClose
    }
    
    func makeUIViewController(context: Context) -> UINavigationController {
        let editor = QLPreviewController()
        editor.dataSource = context.coordinator
        editor.delegate = context.coordinator
        editor.setEditing(true, animated: false)
        
        let doneAction = UIAction { _ in doneButtonTapped() }
        let doneButton = UIBarButtonItem(systemItem: .done, primaryAction: doneAction)
        let controller = UINavigationController(rootViewController: editor)
        editor.navigationItem.rightBarButtonItem = doneButton
        
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UINavigationController, context: Context) { }
    
    private func doneButtonTapped() {
        onClose()
    }
    
    // Coordinator
    
    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }
    
    final class Coordinator: NSObject, QLPreviewControllerDataSource, @preconcurrency QLPreviewControllerDelegate {
        
        var parent: QLPreview
        
        init(_ parent: QLPreview) {
            self.parent = parent
        }
        
        func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
            return 1
        }
        
        func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
            print("Preview item at: \(parent.url)")
            return parent.url as QLPreviewItem
        }
        
        func previewController(_ controller: QLPreviewController, editingModeFor previewItem: any QLPreviewItem) -> QLPreviewItemEditingMode {
            return .createCopy
        }
        
        func previewController(_ controller: QLPreviewController, didUpdateContentsOf previewItem: QLPreviewItem) {
            print("UPDATE")
        }
        
        func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) {
//            print("SAVED at \(modifiedContentsURL)")
            _ = try? FileManager.default.replaceItemAt(parent.url, withItemAt: modifiedContentsURL)
            NotificationCenter.default.post(name: Notification.Name("modifiedContentsURL"), object: nil)
            parent.onSave()
        }
    }
}
Editor is loading...
Leave a Comment