ios – How to upload a post to firestore


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) })
    }
}

Latest articles

spot_imgspot_img

Related articles

Leave a reply

Please enter your comment!
Please enter your name here

spot_imgspot_img