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.