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




