I am trying to upload a text string but the current data is not uploading to firestore. When I upload the text string with just the imageUrl the data is successfully uploaded but when I added the videoUrl the text string is getting canceled out and no longer uploading. How do I successfully upload all three data from the text / imageUrl / VideoUrl all together without one getting canceled out
import SwiftUI
import Firebase
import PhotosUI
import FirebaseFirestoreSwift
@MainActor
class UploadViewModel: ObservableObject {
@Published var didUploadPost = false
@Published var error: Error?
@Published var videos = [Video]()
@Published var profileImage: Image?
@Published var text = ""
@Published var selectedImage: PhotosPickerItem? {
didSet { Task { await loadImage(fromItem: selectedImage)
Task { try await uploadVideo() }
} }
}
private var uiImage: UIImage?
func uploadPost(caption: String) async throws {
guard let uid = Auth.auth().currentUser?.uid else { return }
guard let item = selectedImage else {return}
guard let videoData = try await item.loadTransferable(type: Data.self) else {return}
do{
guard let videoUrl = try await VideoUploader.uploadVideo(withData: videoData) else { return}
try await Firestore.firestore().collection("videos").document().setData(["videoUrl": videoUrl])t
var imageUrl: String? = nil
if let image = uiImage {
imageUrl = try await ImageUploader.uploadImage(image: image , type: .post)
}
let post = Post(
ownerUid: uid,
text: text, caption: caption,
videoUrl: videoUrl, likes: 0,
replyCount: 23, imageUrl: imageUrl,
timestamp: Timestamp()
)
try await PostService.uploadPost(post)
self.didUploadPost = true
}catch{
print(error)
}
}
func loadImage(fromItem item: PhotosPickerItem?) async {
guard let item = item else { return }
guard let data = try? await item.loadTransferable(type: Data.self) else { return }
guard let uiImage = UIImage(data: data) else { return }
self.uiImage = uiImage
self.profileImage = Image(uiImage: uiImage)
}
func uploadVideo() async throws {
guard let item = selectedImage else {return}
guard let videoData = try await item.loadTransferable(type: Data.self) else {return}
guard let videoUrl = try await VideoUploader.uploadVideo(withData: videoData) else { return}
try await Firestore.firestore().collection("videos").document().setData(["videoUrl": videoUrl])
}
func fetchVideos() async throws {
let snapshot = try await Firestore.firestore().collection("videos").getDocuments()
self.videos = snapshot.documents.compactMap({ try? $0.data(as: Video.self) })
}
}




