// Buttons helpful import SwiftUI import PhotosUI struct Movie: Transferable { let url: URL static var transferRepresentation: some TransferRepresentation { FileRepresentation(contentType: .movie) { movie in SentTransferredFile(movie.url) } importing: { received in let copy = URL.documentsDirectory.appending(path: "tmpmovie.mp4") if FileManager.default.fileExists(atPath: copy.path()) { try FileManager.default.removeItem(at: copy) } try FileManager.default.copyItem(at: received.file, to: copy) return Self.init(url: copy) } } } struct editingProject: View { @State private var text = "" @ObservedObject private var writeVideo = WriteVideo() @State private var selectedImage: PhotosPickerItem? @State private var image: UIImage? @State private var selectedVideo: PhotosPickerItem? @State private var selectedVideoURL: URL? enum LoadState { case unknown, loading, loaded(Movie), failed } @State private var loadState = LoadState.unknown var body: some View { VStack { TextEditor(text: $text) Button("Generate Video") { Task(priority: .background) { if selectedVideoURL != nil { writeVideo.videoURL = selectedVideoURL } else { writeVideo.videoURL = nil } await writeVideo.beginWriteVideo(text) } } .disabled(text == "") if writeVideo.canExport { Button("Save Vídeo") { if let url = writeVideo.url { saveVideo(url: url) { error in if let error = error { print(error.localizedDescription) } else { print("Video exported successful!") } } } } } Button("Request Permission to Create Video") { let solicitou = PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in switch status { case .authorized: Text("OK, autorized.") default: Text("You is not authorized.") } } } if writeVideo.canExport, let url = writeVideo.url { PhotosPicker("Library", selection: $selectedVideo, matching: .videos) switch loadState { case .unknown: EmptyView() case .loading: ProgressView() case .loaded(let movie): Text("Vídeo carregado: \(movie.url)") case .failed: Text("Importação flahou.") } if let videoURL = selectedVideoURL { Text("Vídeo disponível.") } //---------- } } // Fim VSTack { .onChange(of: selectedVideo) { newValue in Task { do { loadState = .loading if let movie = try await selectedVideo?.loadTransferable(type: Movie.self) { selectedVideoURL = movie.url loadState = .loaded(movie) } else { loadState = .failed } } catch { loadState = .failed } } } } }