diff --git a/app/frontend/components/login.py b/app/frontend/components/login.py index 34a11227a9631acd8ce677fbca67c6d95f47e615..02f559e0b3036b8e1a11763e16482d88688c43a6 100644 --- a/app/frontend/components/login.py +++ b/app/frontend/components/login.py @@ -1,39 +1,67 @@ import ttkbootstrap as tb from ttkbootstrap.constants import * from tkinter import messagebox +import requests # Import requests for API communication -# Function to handle login -def login(): - username = entry_username.get() - password = entry_password.get() - - if username == "admin" and password == "password": # Dummy credentials - messagebox.showinfo("Login Successful", "Welcome, Admin!") - else: - messagebox.showerror("Login Failed", "Invalid username or password.") - -# Create main window -root = tb.Window(themename="superhero") # Try different themes like "darkly", "minty", etc. -root.title("Login Form") -root.geometry("900x800") - -# Title Label -label_title = tb.Label(root, text="Login", font=("Helvetica", 18, "bold")) -label_title.pack(pady=10) - -# Username Entry -tb.Label(root, text="Username:").pack(pady=5) -entry_username = tb.Entry(root, bootstyle="info") -entry_username.pack(pady=5) - -# Password Entry -tb.Label(root, text="Password:").pack(pady=5) -entry_password = tb.Entry(root, bootstyle="info", show="*") # Masked input -entry_password.pack(pady=5) - -# Login Button -btn_login = tb.Button(root, text="Login", bootstyle="primary", command=login) -btn_login.pack(pady=15) - -# Run the GUI -root.mainloop() + +def login_frame(parent, switch_func, api_url): # Added api_url parameter + frame = tb.Frame(parent) + + def login(): + email = entry_email.get() + password = entry_password.get() + + def login(): + email = entry_email.get() + password = entry_password.get() + + if not email or not password: + messagebox.showwarning("Input Error", "Both fields are required!") + return + + # Sending login request to backend + response = requests.post( + f"{api_url}/auth/login", json={"email": email, "password": password} + ) + + try: + response_data = response.json() + if response.status_code == 200: + messagebox.showinfo("Login Successful", f"Welcome back, {email}!") + # TODO: Implement navigation after login (e.g., open dashboard) + else: + messagebox.showerror( + "Login Failed", response_data.get("detail", "Invalid credentials") + ) + except requests.exceptions.JSONDecodeError: + messagebox.showerror("Login Failed", "Server returned an invalid response.") + + tb.Label(frame, text="Login", font=("Helvetica", 18, "bold")).pack(pady=10) + + tb.Label(frame, text="Email:").pack(pady=5) + entry_email = tb.Entry(frame, bootstyle="info") + entry_email.pack(pady=5) + tb.Label(frame, text="Email:").pack(pady=5) + entry_email = tb.Entry(frame, bootstyle="info") + entry_email.pack(pady=5) + + tb.Label(frame, text="Password:").pack(pady=5) + entry_password = tb.Entry(frame, bootstyle="info", show="*") + entry_password.pack(pady=5) + tb.Label(frame, text="Password:").pack(pady=5) + entry_password = tb.Entry(frame, bootstyle="info", show="*") + entry_password.pack(pady=5) + + btn_login = tb.Button(frame, text="Login", bootstyle="primary", command=login) + btn_login.pack(pady=15) + btn_login = tb.Button(frame, text="Login", bootstyle="primary", command=login) + btn_login.pack(pady=15) + + tb.Button( + frame, + text="Don't have an account? Register", + bootstyle="link", + command=lambda: switch_func("register"), + ).pack() + + return frame diff --git a/app/frontend/components/register.py b/app/frontend/components/register.py index f6829458f1e41ef409b253f8fd9239a674db43fd..eda5e9db03519b539c97d59e9615ab5e131d42a8 100644 --- a/app/frontend/components/register.py +++ b/app/frontend/components/register.py @@ -1,63 +1,156 @@ import ttkbootstrap as tb from ttkbootstrap.constants import * from tkinter import messagebox +import requests # Import requests for API communication -# Function to handle registration -def register(): - username = entry_username.get() - email = entry_email.get() - phone_number = entry_phone.get() - password = entry_password.get() - confirm_password = entry_confirm_password.get() - - if not username or not email or not phone_number or not password or not confirm_password: - messagebox.showwarning("Input Error", "All fields are required!") - return - - if password != confirm_password: - messagebox.showerror("Password Error", "Passwords do not match!") - return - - # Dummy registration success message (Replace with DB logic) - messagebox.showinfo("Registration Successful", f"Welcome, {username}!") - -# Create main window -root = tb.Window(themename="superhero") # Change to "darkly", "superhero", etc. -root.title("Register") -root.geometry("900x800") - -# Title Label -label_title = tb.Label(root, text="Register", font=("Helvetica", 18, "bold")) -label_title.pack(pady=10) - -# Username Entry -tb.Label(root, text="Username:").pack(pady=5) -entry_username = tb.Entry(root, bootstyle="info") -entry_username.pack(pady=5) - -# Email Entry -tb.Label(root, text="Email:").pack(pady=5) -entry_email = tb.Entry(root, bootstyle="info") -entry_email.pack(pady=5) - -# Phone Entry -tb.Label(root, text="Phone Number:").pack(pady=5) -entry_phone = tb.Entry(root, bootstyle="info") -entry_phone.pack(pady=5) - -# Password Entry -tb.Label(root, text="Password:").pack(pady=5) -entry_password = tb.Entry(root, bootstyle="info", show="*") -entry_password.pack(pady=5) - -# Confirm Password Entry -tb.Label(root, text="Confirm Password:").pack(pady=5) -entry_confirm_password = tb.Entry(root, bootstyle="info", show="*") -entry_confirm_password.pack(pady=5) - -# Register Button -btn_register = tb.Button(root, text="Register", bootstyle="success", command=register) -btn_register.pack(pady=15) - -# Run the GUI -root.mainloop() +<<<<<<< HEAD +def register_frame(parent, switch_func, api_url): # Added api_url parameter + frame = tb.Frame(parent) + + def register(): + username = entry_username.get() + email = entry_email.get() + phone_number = entry_phone.get() + password = entry_password.get() + confirm_password = entry_confirm_password.get() + + if not username or not email or not phone_number or not password or not confirm_password: + messagebox.showwarning("Input Error", "All fields are required!") + return + + if password != confirm_password: + messagebox.showerror("Password Error", "Passwords do not match!") + return + + # Sending registration data to backend + response = requests.post(f"{api_url}/auth/signup", json={ + "username": username, + "email": email, + "phone_number": phone_number, + "password": password + }) + + try: + response_data = response.json() + if response.status_code == 200: + messagebox.showinfo("Registration Successful", f"Welcome, {username}!") + switch_func("login") # Switch to login after successful registration + else: + messagebox.showerror("Registration Failed", response_data.get("detail", "Unknown error")) + except requests.exceptions.JSONDecodeError: + messagebox.showerror("Registration Failed", f"Server returned an invalid response.") + + tb.Label(frame, text="Register", font=("Helvetica", 18, "bold")).pack(pady=10) + + tb.Label(frame, text="Username:").pack(pady=5) + entry_username = tb.Entry(frame, bootstyle="info") + entry_username.pack(pady=5) + + tb.Label(frame, text="Email:").pack(pady=5) + entry_email = tb.Entry(frame, bootstyle="info") + entry_email.pack(pady=5) + + tb.Label(frame, text="Phone Number:").pack(pady=5) + entry_phone = tb.Entry(frame, bootstyle="info") + entry_phone.pack(pady=5) + + tb.Label(frame, text="Password:").pack(pady=5) + entry_password = tb.Entry(frame, bootstyle="info", show="*") + entry_password.pack(pady=5) + + tb.Label(frame, text="Confirm Password:").pack(pady=5) + entry_confirm_password = tb.Entry(frame, bootstyle="info", show="*") + entry_confirm_password.pack(pady=5) + + btn_register = tb.Button(frame, text="Register", bootstyle="success", command=register) + btn_register.pack(pady=15) + + tb.Button(frame, text="Already have an account? Login", bootstyle="link", + command=lambda: switch_func("login")).pack() +======= + +def register_frame(parent, switch_func, api_url): # Added api_url parameter + frame = tb.Frame(parent) + + def register(): + username = entry_username.get() + email = entry_email.get() + phone_number = entry_phone.get() + password = entry_password.get() + confirm_password = entry_confirm_password.get() + + if ( + not username + or not email + or not phone_number + or not password + or not confirm_password + ): + messagebox.showwarning("Input Error", "All fields are required!") + return + + if password != confirm_password: + messagebox.showerror("Password Error", "Passwords do not match!") + return + + # Sending registration data to backend + response = requests.post( + f"{api_url}/auth/signup", + json={ + "username": username, + "email": email, + "phone_number": phone_number, + "password": password, + }, + ) + + try: + response_data = response.json() + if response.status_code == 200: + messagebox.showinfo("Registration Successful", f"Welcome, {username}!") + switch_func("login") # Switch to login after successful registration + else: + messagebox.showerror( + "Registration Failed", response_data.get("detail", "Unknown error") + ) + except requests.exceptions.JSONDecodeError: + messagebox.showerror( + "Registration Failed", f"Server returned an invalid response." + ) + + tb.Label(frame, text="Register", font=("Helvetica", 18, "bold")).pack(pady=10) + + tb.Label(frame, text="Username:").pack(pady=5) + entry_username = tb.Entry(frame, bootstyle="info") + entry_username.pack(pady=5) + + tb.Label(frame, text="Email:").pack(pady=5) + entry_email = tb.Entry(frame, bootstyle="info") + entry_email.pack(pady=5) + + tb.Label(frame, text="Phone Number:").pack(pady=5) + entry_phone = tb.Entry(frame, bootstyle="info") + entry_phone.pack(pady=5) + + tb.Label(frame, text="Password:").pack(pady=5) + entry_password = tb.Entry(frame, bootstyle="info", show="*") + entry_password.pack(pady=5) + + tb.Label(frame, text="Confirm Password:").pack(pady=5) + entry_confirm_password = tb.Entry(frame, bootstyle="info", show="*") + entry_confirm_password.pack(pady=5) + + btn_register = tb.Button( + frame, text="Register", bootstyle="success", command=register + ) + btn_register.pack(pady=15) + + tb.Button( + frame, + text="Already have an account? Login", + bootstyle="link", + command=lambda: switch_func("login"), + ).pack() +>>>>>>> 510d2b0 (resolve merge) + + return frame diff --git a/app/frontend/main.py b/app/frontend/main.py index ca21b73bb584a4874aa25ed97899f08625766675..eb1b435db1c7121097478cba72550a1bfc204745 100644 --- a/app/frontend/main.py +++ b/app/frontend/main.py @@ -1,101 +1,44 @@ import ttkbootstrap as tb -from ttkbootstrap.constants import * -from tkinter import messagebox -import requests +from components.login import login_frame +from components.register import register_frame +from components.login import login_frame +from components.register import register_frame # Backend API URL API_URL = "http://127.0.0.1:8000" -# Function to handle registration -def register(): - username = entry_username.get() - email = entry_email.get() - phone_number = entry_phone.get() - password = entry_password.get() - confirm_password = entry_confirm_password.get() - if not username or not email or not password or not confirm_password: - messagebox.showwarning("Input Error", "All fields are required!") - return +# Function to switch between login and register +def switch_frame(frame_name): + if frame_name == "login": + login.tkraise() + elif frame_name == "register": + register.tkraise() - if password != confirm_password: - messagebox.showerror("Password Error", "Passwords do not match!") - return - - # Send registration data to backend - response = requests.post(f"{API_URL}/auth/signup", json={ - "username": username, - "email": email, - "phone_number": phone_number, - "password": password - }) - - try: - response_data = response.json() - if response.status_code == 200: - messagebox.showinfo("Registration Successful", f"Welcome, {username}!") - else: - messagebox.showerror("Registration Failed", response_data.get("detail", "Unknown error")) - except requests.exceptions.JSONDecodeError: - messagebox.showerror("Registration Failed", f"Server returned non-JSON response: {response.text}") - -# Function to handle login -def login(): - email = entry_email.get() - password = entry_password.get() - - # Send login data to backend - response = requests.post(f"{API_URL}/auth/login", json={ - "email": email, - "password": password - }) - - if response.status_code == 200: - messagebox.showinfo("Login Successful", "Welcome!") - else: - messagebox.showerror("Login Failed", response.json().get("detail", "Invalid credentials")) # Create main window -root = tb.Window(themename="superhero") # Change to "darkly", "superhero", etc. +root = tb.Window(themename="superhero") +root = tb.Window(themename="superhero") root.title("Shopping App") root.geometry("900x800") -# Title Label -label_title = tb.Label(root, text="Shopping App", font=("Helvetica", 18, "bold")) -label_title.pack(pady=10) - -# Username Entry -tb.Label(root, text="Username:").pack(pady=5) -entry_username = tb.Entry(root, bootstyle="info") -entry_username.pack(pady=5) - -# Email Entry -tb.Label(root, text="Email:").pack(pady=5) -entry_email = tb.Entry(root, bootstyle="info") -entry_email.pack(pady=5) - -# Phone Entry -tb.Label(root, text="Phone Number:").pack(pady=5) -entry_phone = tb.Entry(root, bootstyle="info") -entry_phone.pack(pady=5) - -# Password Entry -tb.Label(root, text="Password:").pack(pady=5) -entry_password = tb.Entry(root, bootstyle="info", show="*") -entry_password.pack(pady=5) +# Create Frames +login = login_frame(root, switch_frame, API_URL) +register = register_frame(root, switch_frame, API_URL) -# Confirm Password Entry -tb.Label(root, text="Confirm Password:").pack(pady=5) -entry_confirm_password = tb.Entry(root, bootstyle="info", show="*") -entry_confirm_password.pack(pady=5) +for frame in (login, register): + frame.place(relx=0, rely=0.2, relwidth=1, relheight=1) +# Create Frames +login = login_frame(root, switch_frame, API_URL) +register = register_frame(root, switch_frame, API_URL) -# Register Button -btn_register = tb.Button(root, text="Register", bootstyle="success", command=register) -btn_register.pack(pady=15) +for frame in (login, register): + frame.place(relx=0, rely=0.2, relwidth=1, relheight=1) -# Login Button -btn_login = tb.Button(root, text="Login", bootstyle="primary", command=login) -btn_login.pack(pady=15) +# Show Login Frame First +switch_frame("login") +# Show Login Frame First +switch_frame("login") # Run the GUI -root.mainloop() \ No newline at end of file +root.mainloop()