diff --git a/app/frontend/components/auth/login.py b/app/frontend/components/auth/login.py index 79f360b50f3b8e40a327bcd04dacd8934c2ac2f1..dc2d30d1dbcd871981f32b94b033c0a3fb92a4d3 100644 --- a/app/frontend/components/auth/login.py +++ b/app/frontend/components/auth/login.py @@ -1,32 +1,31 @@ import customtkinter as ctk from tkinter import messagebox from PIL import Image -from utils.api_requests import login_api # Import the login function from login_api.py +from utils.api_requests import login_api def login_frame(parent, switch_func, API_URL): - # Create a container frame to hold both left (empty) and right (login) frames - container = ctk.CTkFrame(parent) - container.grid_columnconfigure(0, weight=1) # Left empty frame - container.grid_columnconfigure(1, weight=1) # Right login frame + # Overall container + container = ctk.CTkFrame(parent, fg_color="#F3F4F6") # Light gray background + container.grid_columnconfigure(0, weight=1) + container.grid_columnconfigure(1, weight=1) container.grid_rowconfigure(0, weight=1) - # Left empty frame (Just an empty frame to balance the layout) - left_frame = ctk.CTkFrame(container) + # Left image frame + left_frame = ctk.CTkFrame(container, fg_color="transparent") left_frame.grid(row=0, column=0, sticky="nsew") - # Load and display the image - image_path = "app/static/front_end_img/login.jpg" # Change this to your image path - img = ctk.CTkImage( - light_image=Image.open(image_path), size=(1000, 1000) - ) # Resize as needed - image_label = ctk.CTkLabel(left_frame, image=img, text="") # No text, only image + image_path = "app/static/front_end_img/login.jpg" + img = ctk.CTkImage(light_image=Image.open(image_path), size=(800, 800)) + image_label = ctk.CTkLabel(left_frame, image=img, text="") image_label.place(relwidth=1, relheight=1) # Right login frame - right_frame = ctk.CTkFrame(container) - right_frame.grid(row=0, column=1, sticky="nsew") + right_frame = ctk.CTkFrame(container, fg_color="white", corner_radius=20) + right_frame.grid(row=0, column=1, sticky="nsew", padx=50, pady=100) + right_frame.grid_columnconfigure(0, weight=1) + # Login Function def login(): email = entry_email.get() password = entry_password.get() @@ -35,37 +34,61 @@ def login_frame(parent, switch_func, API_URL): messagebox.showwarning("Input Error", "Both fields are required!") return - # Call the API function from login_api.py status_code, response_data = login_api(email, password, API_URL) if status_code == 200: access_token = response_data.get("access_token") messagebox.showinfo("Login Successful", f"Welcome back, {email}!") switch_func("dashboard", access_token) - print(f"Access Token in login: {access_token}") # Debugging line else: - messagebox.showerror( - "Login Failed", response_data.get("detail", "Invalid credentials") - ) + messagebox.showerror("Login Failed", response_data.get("detail", "Invalid credentials")) - ctk.CTkLabel(right_frame, text="Login", font=("Helvetica", 18, "bold")).pack( - pady=10 - ) + # Title + ctk.CTkLabel( + right_frame, + text="Login", + font=ctk.CTkFont("Helvetica", size=26, weight="bold"), + text_color="#111827" + ).pack(pady=(20, 10)) - ctk.CTkLabel(right_frame, text="Email:").pack(pady=5) - entry_email = ctk.CTkEntry(right_frame) - entry_email.pack(pady=5) + # Email + ctk.CTkLabel( + right_frame, text="Email", font=("Helvetica", 14), text_color="#374151" + ).pack(pady=(10, 5)) + entry_email = ctk.CTkEntry( + right_frame, height=40, corner_radius=10, placeholder_text="Enter your email" + ) + entry_email.pack(pady=5, padx=20, fill="x") - ctk.CTkLabel(right_frame, text="Password:").pack(pady=5) - entry_password = ctk.CTkEntry(right_frame, show="*") - entry_password.pack(pady=5) + # Password + ctk.CTkLabel( + right_frame, text="Password", font=("Helvetica", 14), text_color="#374151" + ).pack(pady=(10, 5)) + entry_password = ctk.CTkEntry( + right_frame, height=40, show="*", corner_radius=10, placeholder_text="Enter your password" + ) + entry_password.pack(pady=5, padx=20, fill="x") - ctk.CTkButton(right_frame, text="Login", command=login).pack(pady=15) + # Login Button + ctk.CTkButton( + right_frame, + text="Login", + command=login, + corner_radius=10, + height=45, + font=("Helvetica", 14), + fg_color="#2563EB", + hover_color="#1E40AF" + ).pack(pady=20, padx=20, fill="x") + # Register Redirect ctk.CTkButton( right_frame, text="Don't have an account? Register", command=lambda: switch_func("register"), - ).pack() + fg_color="transparent", + hover_color="#E5E7EB", + text_color="#2563EB" + ).pack(pady=(5, 20)) return container diff --git a/app/frontend/components/auth/register.py b/app/frontend/components/auth/register.py index 1be5aab735a0eb953c37c711a631aefbfcc93a50..d2a635345377808e657efeeb110b660141a209e0 100644 --- a/app/frontend/components/auth/register.py +++ b/app/frontend/components/auth/register.py @@ -4,7 +4,14 @@ from utils.api_requests import register_api # Import the API function def register_frame(parent, switch_func, API_URL): - frame = ctk.CTkFrame(parent) + # Create a full-window container with a light gray background + container = ctk.CTkFrame(parent, fg_color="#F3F4F6") + container.pack(expand=True, fill="both") + + # Center the register panel (the white card) in the middle of the container. + # Width and height are set to ensure a consistent size. + register_panel = ctk.CTkFrame(container, fg_color="white", corner_radius=20, width=400, height=500) + register_panel.place(relx=0.5, rely=0.5, anchor="center") def register(): username = entry_username.get() @@ -13,13 +20,7 @@ def register_frame(parent, switch_func, API_URL): 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 - ): + 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 @@ -36,38 +37,66 @@ def register_frame(parent, switch_func, API_URL): messagebox.showinfo("Registration Successful", f"Welcome, {username}!") switch_func("login") else: - messagebox.showerror( - "Registration Failed", response_data.get("detail", "Unknown error") - ) - - ctk.CTkLabel(frame, text="Register", font=("Helvetica", 18, "bold")).pack(pady=10) - - ctk.CTkLabel(frame, text="Username:").pack(pady=5) - entry_username = ctk.CTkEntry(frame) - entry_username.pack(pady=5) - - ctk.CTkLabel(frame, text="Email:").pack(pady=5) - entry_email = ctk.CTkEntry(frame) - entry_email.pack(pady=5) - - ctk.CTkLabel(frame, text="Phone Number:").pack(pady=5) - entry_phone = ctk.CTkEntry(frame) - entry_phone.pack(pady=5) - - ctk.CTkLabel(frame, text="Password:").pack(pady=5) - entry_password = ctk.CTkEntry(frame, show="*") - entry_password.pack(pady=5) - - ctk.CTkLabel(frame, text="Confirm Password:").pack(pady=5) - entry_confirm_password = ctk.CTkEntry(frame, show="*") - entry_confirm_password.pack(pady=5) - - ctk.CTkButton(frame, text="Register", command=register).pack(pady=15) - + messagebox.showerror("Registration Failed", response_data.get("detail", "Unknown error")) + + # Title for the registration form + ctk.CTkLabel( + register_panel, + text="Create Account", + font=ctk.CTkFont("Helvetica", size=26, weight="bold"), + text_color="#111827" + ).pack(pady=(20, 10)) + + # Username Entry + entry_username = ctk.CTkEntry( + register_panel, placeholder_text="Username", height=40, corner_radius=10, width=250 + ) + entry_username.pack(pady=10, padx=20, fill="x") + + # Email Entry + entry_email = ctk.CTkEntry( + register_panel, placeholder_text="Email", height=40, corner_radius=10, width=250 + ) + entry_email.pack(pady=10, padx=20, fill="x") + + # Phone Number Entry + entry_phone = ctk.CTkEntry( + register_panel, placeholder_text="Phone Number", height=40, corner_radius=10, width=250 + ) + entry_phone.pack(pady=10, padx=20, fill="x") + + # Password Entry + entry_password = ctk.CTkEntry( + register_panel, placeholder_text="Password", show="*", height=40, corner_radius=10, width=250 + ) + entry_password.pack(pady=10, padx=20, fill="x") + + # Confirm Password Entry + entry_confirm_password = ctk.CTkEntry( + register_panel, placeholder_text="Confirm Password", show="*", height=40, corner_radius=10, width=250 + ) + entry_confirm_password.pack(pady=10, padx=20, fill="x") + + # Register Button + ctk.CTkButton( + register_panel, + text="Register", + command=register, + corner_radius=10, + height=45, + font=("Helvetica", 14), + fg_color="#2563EB", + hover_color="#1E40AF" + ).pack(pady=20, padx=20, fill="x") + + # Link to Login Page ctk.CTkButton( - frame, + register_panel, text="Already have an account? Login", command=lambda: switch_func("login"), - ).pack() + fg_color="transparent", + hover_color="#E5E7EB", + text_color="#2563EB" + ).pack(pady=(5, 20)) - return frame + return container diff --git a/app/frontend/components/dashboard.py b/app/frontend/components/dashboard.py index 75622c90c5895d8d39a7685a2debacae8704d269..f6c1af427f1737be2f1b63cffcfaf6bd66ccc972 100644 --- a/app/frontend/components/dashboard.py +++ b/app/frontend/components/dashboard.py @@ -65,7 +65,7 @@ def dashboard_frame(parent, switch_func, API_URL, token): def open_cart_details(): # Switch to cart_shopping.py screen or run it - switch_func("cart_shopping") + switch_func("user_orders") # Alternatively, use os.system("python cart_shopping.py") # Try loading icon images; update paths as needed. @@ -112,6 +112,7 @@ def dashboard_frame(parent, switch_func, API_URL, token): fg_color="transparent", command=open_cart_details, ) + switch_func("user_orders") cart_button.image = cart_icon cart_button.place(relx=0.91, rely=0.25, relwidth=0.08, relheight=0.5) else: diff --git a/app/frontend/components/user_details.py b/app/frontend/components/user_details.py index 7a4903265babe73a82b142e70bd2a2047efe7335..a6b1a8fa0cee85e51d4b7b44e45a71d71e3a4cf5 100644 --- a/app/frontend/components/user_details.py +++ b/app/frontend/components/user_details.py @@ -90,16 +90,6 @@ def user_details_frame(parent, switch_func, API_URL, token): ) nav_orders.pack(fill="x", padx=10, pady=5) - nav_address = ctk.CTkButton( - sidebar_frame, - text="Address Book", - fg_color="#2b2b2b", - text_color="white", - hover_color="#3b3b3b", - command=lambda: messagebox.showinfo("Info", "Address Book clicked!") - ) - nav_address.pack(fill="x", padx=10, pady=5) - # ----------------- RIGHT CONTENT (User Details) ----------------- content_frame = ctk.CTkFrame(main_section, fg_color="transparent") content_frame.pack(side="left", fill="both", expand=True, padx=20, pady=20)