parass13's picture
Update components/auth.py
5ed1618 verified
# components/auth.py
from utils.db import sign_up_user, login_user, supabase
import gradio as gr
def register(email, password, gender, username):
"""Handler for the signup process, now including username."""
if not all([email, password, gender, username]):
return "❌ All fields are required.", gr.update(), gr.update(), gr.update(), gr.update()
result = sign_up_user(email, password, gender, username)
if result and result.user:
message = "βœ… Signup successful! You can now log in."
if result.user and not result.session:
message = "βœ… Signup successful! Please check your email to confirm your account."
# On success, clear all four signup fields
return message, "", "", None, ""
if hasattr(result, 'error') and result.error:
# Check for unique constraint violation on username
if 'duplicate key value violates unique constraint "users_username_key"' in result.error.message:
return "❌ Signup Failed: This username is already taken.", gr.update(), gr.update(), gr.update(), gr.update()
return f"❌ Signup Failed: {result.error.message}", gr.update(), gr.update(), gr.update(), gr.update()
return "❌ Signup failed. An unknown error occurred.", gr.update(), gr.update(), gr.update(), gr.update()
def login(email, password, current_user_state):
"""Handler for login. Now fetches username and gender from the database."""
if not email or not password:
return "❌ Email and password cannot be empty.", current_user_state, gr.update()
result = login_user(email, password)
if result and result.session:
try:
# Fetch username and gender in a single query for efficiency
profile = supabase.table("users").select("gender, username").eq("id", result.user.id).single().execute()
user_gender = profile.data.get("gender") if profile.data else None
user_name = profile.data.get("username") if profile.data else "User"
except Exception as e:
print(f"Could not fetch user profile: {e}")
user_gender = None
user_name = "User"
# Add username to the user's session state
new_user_state = {"email": email, "id": result.user.id, "logged_in": True, "gender": user_gender, "username": user_name}
return f"βœ… Welcome, {user_name}! Redirecting...", new_user_state, gr.Tabs(selected="prediction_tab")
if hasattr(result, 'error') and result.error:
return f"❌ Login Failed: {result.error.message}", current_user_state, gr.update()
return "❌ Login failed. Check credentials or confirm your email.", current_user_state, gr.update()
def logout(current_user_state):
"""Handler for logout. Clears all state and form fields."""
new_user_state = {"email": None, "id": None, "logged_in": False, "gender": None, "username": None}
return (
"πŸ‘‹ Logged out successfully.", # 1. auth_message
new_user_state, # 2. user_state
gr.Tabs(selected="home_tab"), # 3. main_tabs
"", # 4. email_login
"", # 5. pwd_login
None, # 6. preg
None, # 7. glucose
None, # 8. bp
None, # 9. insulin
None, # 10. bmi
None, # 11. age
"", # 12. result_output
gr.update(visible=False), # 13. pregnancies_row
None, # 14. weight (NEW)
None, # 15. height (NEW)
None # 16. bmi_choice (NEW)
)