parass13 commited on
Commit
0da2ad8
Β·
verified Β·
1 Parent(s): 1947ad0

Update components/auth.py

Browse files
Files changed (1) hide show
  1. components/auth.py +23 -24
components/auth.py CHANGED
@@ -3,34 +3,31 @@
3
  from utils.db import sign_up_user, login_user, supabase
4
  import gradio as gr
5
 
6
- # The function now accepts 'gender' as a third argument
7
- def register(email, password, gender):
8
- """Handler for the signup process, now including gender."""
9
- # Check if all three inputs are provided
10
- if not all([email, password, gender]):
11
- # Return a no-op for all 4 output components on failure
12
- return "❌ Email, password, and gender are required.", gr.update(), gr.update(), gr.update()
13
 
14
- # The 'gender' is passed to the sign_up_user utility function
15
- result = sign_up_user(email, password, gender)
16
 
17
  if result and result.user:
18
  message = "βœ… Signup successful! You can now log in."
19
  if result.user and not result.session:
20
  message = "βœ… Signup successful! Please check your email to confirm your account."
21
- # On success, clear all three signup fields
22
- return message, "", "", None # Clear email, password, and gender radio
23
 
24
  if hasattr(result, 'error') and result.error:
25
- # On failure, don't clear the fields
26
- return f"❌ Signup Failed: {result.error.message}", gr.update(), gr.update(), gr.update()
 
 
27
 
28
- # On unknown failure, don't clear the fields
29
- return "❌ Signup failed. An unknown error occurred.", gr.update(), gr.update(), gr.update()
30
 
31
 
32
  def login(email, password, current_user_state):
33
- """Handler for login. Now fetches the user's gender from the public.users table."""
34
  if not email or not password:
35
  return "❌ Email and password cannot be empty.", current_user_state, gr.update()
36
 
@@ -38,14 +35,18 @@ def login(email, password, current_user_state):
38
 
39
  if result and result.session:
40
  try:
41
- profile = supabase.table("users").select("gender").eq("id", result.user.id).single().execute()
 
42
  user_gender = profile.data.get("gender") if profile.data else None
 
43
  except Exception as e:
44
  print(f"Could not fetch user profile: {e}")
45
  user_gender = None
 
46
 
47
- new_user_state = {"email": email, "id": result.user.id, "logged_in": True, "gender": user_gender}
48
- return f"βœ… Login successful! Redirecting...", new_user_state, gr.Tabs(selected="prediction_tab")
 
49
 
50
  if hasattr(result, 'error') and result.error:
51
  return f"❌ Login Failed: {result.error.message}", current_user_state, gr.update()
@@ -54,12 +55,10 @@ def login(email, password, current_user_state):
54
 
55
 
56
  def logout(current_user_state):
57
- """Handler for logout. Now clears all state and form fields, including the pregnancies row visibility."""
58
- new_user_state = {"email": None, "id": None, "logged_in": False, "gender": None}
59
 
60
- # The return order must match the outputs list in app.py exactly
61
  return (
62
  "πŸ‘‹ Logged out successfully.", new_user_state, gr.Tabs(selected="home_tab"),
63
- "", "", None, None, None, None, None, None, "", # Clear forms
64
- gr.update(visible=False) # Hide pregnancies row
65
  )
 
3
  from utils.db import sign_up_user, login_user, supabase
4
  import gradio as gr
5
 
6
+ def register(email, password, gender, username):
7
+ """Handler for the signup process, now including username."""
8
+ if not all([email, password, gender, username]):
9
+ return "❌ All fields are required.", gr.update(), gr.update(), gr.update(), gr.update()
 
 
 
10
 
11
+ result = sign_up_user(email, password, gender, username)
 
12
 
13
  if result and result.user:
14
  message = "βœ… Signup successful! You can now log in."
15
  if result.user and not result.session:
16
  message = "βœ… Signup successful! Please check your email to confirm your account."
17
+ # On success, clear all four signup fields
18
+ return message, "", "", None, ""
19
 
20
  if hasattr(result, 'error') and result.error:
21
+ # Check for unique constraint violation on username
22
+ if 'duplicate key value violates unique constraint "users_username_key"' in result.error.message:
23
+ return "❌ Signup Failed: This username is already taken.", gr.update(), gr.update(), gr.update(), gr.update()
24
+ return f"❌ Signup Failed: {result.error.message}", gr.update(), gr.update(), gr.update(), gr.update()
25
 
26
+ return "❌ Signup failed. An unknown error occurred.", gr.update(), gr.update(), gr.update(), gr.update()
 
27
 
28
 
29
  def login(email, password, current_user_state):
30
+ """Handler for login. Now fetches username and gender from the database."""
31
  if not email or not password:
32
  return "❌ Email and password cannot be empty.", current_user_state, gr.update()
33
 
 
35
 
36
  if result and result.session:
37
  try:
38
+ # Fetch username and gender in a single query for efficiency
39
+ profile = supabase.table("users").select("gender, username").eq("id", result.user.id).single().execute()
40
  user_gender = profile.data.get("gender") if profile.data else None
41
+ user_name = profile.data.get("username") if profile.data else "User"
42
  except Exception as e:
43
  print(f"Could not fetch user profile: {e}")
44
  user_gender = None
45
+ user_name = "User"
46
 
47
+ # Add username to the user's session state
48
+ new_user_state = {"email": email, "id": result.user.id, "logged_in": True, "gender": user_gender, "username": user_name}
49
+ return f"βœ… Welcome, {user_name}! Redirecting...", new_user_state, gr.Tabs(selected="prediction_tab")
50
 
51
  if hasattr(result, 'error') and result.error:
52
  return f"❌ Login Failed: {result.error.message}", current_user_state, gr.update()
 
55
 
56
 
57
  def logout(current_user_state):
58
+ """Handler for logout. Clears all state and form fields."""
59
+ new_user_state = {"email": None, "id": None, "logged_in": False, "gender": None, "username": None}
60
 
 
61
  return (
62
  "πŸ‘‹ Logged out successfully.", new_user_state, gr.Tabs(selected="home_tab"),
63
+ "", "", None, None, None, None, None, None, "", gr.update(visible=False)
 
64
  )