I Can't Get the Same Value in Two Different Views

72 Views Asked by At
import SwiftUI
import Supabase

class UserData: ObservableObject {
    @Published var supabaseUserID: UUID = (UUID(uuidString: "") ?? UUID())
}

struct SignInView: View {
    @State private var email: String = ""
    @State private var password: String = ""
    @State private var alertActive: Bool = false
    @State private var isError: Bool = false
    @State private var isSuccesfull: Bool = false
    @State private var goToListView: Bool = false
    @State private var consoleOutput: String = ""
    @State static var userid: UUID = UUID()
    @StateObject private var userData = UserData()

    private let supabaseURL = URL(string: "deleted for security")!
    private let supabaseKey = "deleted for security"
    
    var body: some View {
        VStack {
            Text("Hoş Geldiniz!")
                .font(.title)
                .padding()
            
            TextField("E-posta", text: $email)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()
                .textInputAutocapitalization(.never)
            
            SecureField("Şifre", text: $password)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .textInputAutocapitalization(.never)
                .padding()
            
            NavigationLink(destination: todosView(), isActive: self.$goToListView) {EmptyView()}
            
            Button(action:  {
                // Giriş butonuna tıklandığında
                signIn()
                self.isError = false
                self.isSuccesfull = false
                self.consoleOutput = ""
            }) {
                Text("Giriş Yap")
                    .padding()
                    .frame(minWidth: 0, maxWidth: .infinity)
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(10)
            }
            .padding()
            .alert(isPresented: $alertActive) {
                
                if isError == true {
                    Alert(title: Text("Error!"),
                          message: Text("Error: " + consoleOutput + "\n\nBilgilerinizi kontrol edip tekrar giriniz."),
                          dismissButton: .default(Text("OK")))
                } else {
                    Alert(title: Text("Tebrikler!"),
                          message: Text("Başarıyla giriş yaptınız " + consoleOutput),
                          dismissButton: .default(Text("OK"), action: {
                            print("Ok Click")
                            self.goToListView = true
                    }))
                }
            }
        }
        .padding()
    }

    private func signIn() {
        let client = SupabaseClient(supabaseURL: supabaseURL, supabaseKey: supabaseKey)

        Task {
          do {
              try await client.auth.signIn(email: email, password: password)
              let session = try await client.auth.session
              print("### Session Info: \(session)")
              self.consoleOutput = session.user.email!
              SignInView.userid = session.user.id
              userData.supabaseUserID = session.user.id
              print("### Useridnormal: \(userData.supabaseUserID)")
              print("### Userid: \(SignInView.userid)")
              
              self.alertActive = true
              self.isSuccesfull = true
          } catch {
              print("### Sign In Error: \(error)")
              self.consoleOutput = error.localizedDescription
              print(consoleOutput)
              self.alertActive = true
              self.isError = true
          }
        }
    }
}

#Preview {
    SignInView().environmentObject(UserData())
}
import SwiftUI

struct ToDo: Decodable, Identifiable {
    let id: Int
    let createdAt: String
    let title: String
    let body: String
    var done: Bool
    let user: String
}

struct ToDoPayload: Codable {
    let text: String
    let userbodytext: String
    let userUid: String
    
    private enum CodingKeys: String, CodingKey {
        case text = "title"
        case userbodytext = "body"
        case userUid = "user"
    }
}

class ToDoViewModel: ObservableObject {
    @Published var todos = [ToDo]()
    
    var mockData = [
        ToDoPayload(text: "Homework", userbodytext: "ewrwr", userUid: "123"),
        ToDoPayload(text: "Code", userbodytext: "rewr", userUid: "12"),
        ToDoPayload(text: "Gym", userbodytext: "trhr", userUid: "33"),
        ToDoPayload(text: "Sleep", userbodytext: "fghf", userUid: "22")
        ]
     
    func controlUserID(userid: String) async throws {
        todos = try await DatabaseManager.shared.controlUserID(uid: userid)
        let users = todos.map { $0.user }
        if users.contains(userid) {
            print("Belirtilen kullanıcı değeri bulundu.")
        } else {
            print("Belirtilen kullanıcı değeri bulunamadı.")
        }
        print("\n\nUserid todos control: \(todos)")
        print("\n\nUserid todos control: \(users)")
    }
    
    func createItem(text: String, userbodytext: String, uid: String) async throws {
        guard !todos.contains(where: {$0.title.lowercased() == text.lowercased()}) else {
            print("Already in todo list")
            throw NSError()
        }
        let toDo = ToDoPayload(text: text, userbodytext: userbodytext, userUid: uid)
        try await DatabaseManager.shared.createToDoItem(item: toDo)
    }
    
    @MainActor
    func fetchItems(for uid: String) async throws {
        todos = try await DatabaseManager.shared.fetchToDoItems(for: uid)
        print("\nfunc: \n", todos)
    }
    @MainActor
    func deleteItem(todo: ToDo) async throws {
        try await DatabaseManager.shared.deleteToDoItem(id: todo.id)
        todos.removeAll(where: {$0.id == todo.id})
    }
}


struct todosView: View {
    @EnvironmentObject var userData: UserData
    @StateObject var viewModel = ToDoViewModel()
    var body: some View {
        NavigationStack {
            ZStack {
                ScrollView(showsIndicators: false) {
                    LazyVStack{
                        ForEach(viewModel.todos, id: \.title) {todo in
                            ToDoItemView(todo: todo).environmentObject(viewModel)
                        }
                    }
                }
            }
            .navigationTitle("Notes")
            .toolbar {
                NavigationLink {
                    CreateToDoView().environmentObject(viewModel)
                } label: {
                    Image(systemName: "plus.circle.fill")
                        .resizable()
                        .frame(width: 32, height: 32)
                        .padding(.all, 2)
                        .foregroundColor(.teal)
                }
            }
            .onAppear{
                Task{
                    do {
                        print("SignIn Supabase id: \(UserData().supabaseUserID)")
                        print("Print: ", viewModel.todos, "\n")
                        print("Print: ", viewModel.mockData ,"\n")
                        try await viewModel.controlUserID(userid: "\(UserData().supabaseUserID)")
                        try await viewModel.fetchItems(for: "\(UserData().supabaseUserID)")
                    } catch {
                        print(error)
                    }
                }
            }
        }
    }
}

#Preview {
    todosView()
}

I cannot get the same output as print("### Useridnormal: (userData.supabaseUserID)") in SignInView as in print("SignIn Supabase id: (UserData().supabaseUserID)") in todosView.

I want the same value of print("### Useridnormal: (userData.supabaseUserID)") to be written in the other one as well. I tried to transfer the supabaseUserID variable in SignInView to todosView in the same way, but I couldn't get the result I wanted.

0

There are 0 best solutions below