ios – How to upload a text to firebase


I am trying to upload a text string to firebase with but nothing is appearing in firestore I have the correct format and data assigned to the text I am receiving no errors.
What am I missing from this code that’s not allowing the text post to be uploaded The image and video is being uploaded but the text is not its only thing that’s not uploading to firestore can anyone help me solve this problem How do I rewrite this code to upload my text to firestore

Marks

import Firebase

struct Marks: Identifiable, Hashable, Codable {
    @DocumentID var id: String?
    let Uid: String
    let text: String
    let post: String
    var likes: Int
    let postURL: String
    var reply: Int
    let imageURL: String?
    let timestamp: Timestamp
    
    var user: User?
    
    var didLike: Bool? = false
}

My upload view model to firebase

import SwiftUI
import Firebase
import PhotosUI
import FirebaseFirestoreSwift

@MainActor
class UploadViewModel: ObservableObject {
    @Published var didUploadMark = false
    @Published var error: Error?
    @Published var image: Image?
    @Published var text = ""
    @Published var videos = [Video]()
    @Published var selectedVideoURL: URL?
    @Published var selectedImage: PhotosPickerItem? {
     
   
        didSet { Task { await loadImage(fromItem: selectedImage)
            
            Task { try await uploadVideo() }
        }
            
        }
        
    }
    init(){
        Task { try await fetchVideos() }
    }
    private var uiImage: UIImage?
    
    func uploadPost(marks: 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}
        guard let videoUrl = try await VideoUploader.uploadVideo(withData: videoData) else { return}
        try await Firestore.firestore().collection("videos").document().setData(["videoUrl": videoUrl])
    
        var imageUrl: String? = nil
        if let image = uiImage {
            imageUrl = try await ImageUploader.uploadImage(image: image , type: .post)
            
        }
            
            
            let marks = Marks(
                Uid: uid,
                text: text, post: marks,
                likes: 0,
                postURL: videoUrl, reply: 23,
                imageURL: imageUrl,
                timestamp: Timestamp()
            )
        
            try await MarkService.uploadPost(marks)
            self.didUploadMark = true
            
        
        
    }
        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.image = 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) })
        }
    }
    
    


My create post view

import SwiftUI
import PhotosUI
import Kingfisher
import AVKit
struct CreateView: View {
    @State private var selectedPhoto: PhotosPickerItem?
    @State private var image: Image?
    @State var captionText = ""
    @State var imagePickerPresented = false
    @StateObject var viewModel = UploadViewModel()
    @Environment(\.dismiss) var dismiss
    @State var uiImage: UIImage?
    @Binding var tabIndex: Int
    
    private var user: User? {
        return UserService.shared.currentUser
    }
    var body: some View {
        NavigationStack {
            VStack {
                HStack(alignment: .top) {
                    UserImageSize(user: user, size: .small)
                    
                    VStack(alignment: .leading, spacing: 4) {
                        Text(user?.username ?? "")
                            .fontWeight(.semibold)
                        
                        TextField("Post Something...", text: $viewModel.text, axis: .vertical)
                    }
                    .font(.footnote)
                    
                    Spacer()
                    
                    if !viewModel.text.isEmpty {
                        Button {
                            viewModel.text = ""
                        } label: {
                            Image(systemName: "globe")
                                .resizable()
                                .frame(width: 12, height: 12)
                                .foregroundColor(.gray)
                        }
                    }
                }
                
                Spacer()
            }
            .padding()
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    Button("Cancel") {
                        dismiss()
                    }
                    .font(.subheadline)
                    .foregroundStyle(Color.black)
                }
                
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Post") {
                        Task {
                            try await viewModel.uploadPost(marks: captionText)
                            dismiss()
                        }
                    }
                    .opacity(viewModel.text.isEmpty ? 0.5 : 1.0)
                    .disabled(viewModel.text.isEmpty)
                    .font(.subheadline)
                    .fontWeight(.semibold)
                    .foregroundStyle(Color.black)
                }
            }
            .onDisappear { tabIndex = 0 }
            .navigationTitle("Post Mark")
            .navigationBarTitleDisplayMode(.inline)
        }
    }
}

                
           
struct CreateView_Previews: PreviewProvider {
    static var previews: some View {
        CreateView( tabIndex: .constant(0))
    }
}

Latest articles

spot_imgspot_img

Related articles

Leave a reply

Please enter your comment!
Please enter your name here

spot_imgspot_img