diff --git a/app/frontend/components/__init__.py b/app/frontend/components/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/frontend/components/forgot_pass.py b/app/frontend/components/forgot_pass.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/frontend/components/login.py b/app/frontend/components/login.py new file mode 100644 index 0000000000000000000000000000000000000000..34a11227a9631acd8ce677fbca67c6d95f47e615 --- /dev/null +++ b/app/frontend/components/login.py @@ -0,0 +1,39 @@ +import ttkbootstrap as tb +from ttkbootstrap.constants import * +from tkinter import messagebox + +# 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() diff --git a/app/frontend/components/register.py b/app/frontend/components/register.py new file mode 100644 index 0000000000000000000000000000000000000000..f6829458f1e41ef409b253f8fd9239a674db43fd --- /dev/null +++ b/app/frontend/components/register.py @@ -0,0 +1,63 @@ +import ttkbootstrap as tb +from ttkbootstrap.constants import * +from tkinter import messagebox + +# 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() diff --git a/app/frontend/main.py b/app/frontend/main.py new file mode 100644 index 0000000000000000000000000000000000000000..ca21b73bb584a4874aa25ed97899f08625766675 --- /dev/null +++ b/app/frontend/main.py @@ -0,0 +1,101 @@ +import ttkbootstrap as tb +from ttkbootstrap.constants import * +from tkinter import messagebox +import requests + +# 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 + + 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.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) + +# 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) + +# Login Button +btn_login = tb.Button(root, text="Login", bootstyle="primary", command=login) +btn_login.pack(pady=15) + +# Run the GUI +root.mainloop() \ No newline at end of file diff --git a/app/frontend/utils/__init__.py b/app/frontend/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/frontend/utils/api_requests.py b/app/frontend/utils/api_requests.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/frontend/utils/validators.py b/app/frontend/utils/validators.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/requirements.txt b/requirements.txt index db289112de76ec4ba1d16c00a7ff3a9e31eca8b2..a9f5493b0494ce61126f5380e9f8c496c94b7327 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ anyio==4.8.0 bcrypt==3.2.2 certifi==2025.1.31 cffi==1.17.1 +charset-normalizer==3.4.1 click==8.1.8 colorama==0.4.6 dnspython==2.7.0 @@ -23,6 +24,7 @@ mdurl==0.1.2 mysql-connector-python==9.2.0 orjson==3.10.15 passlib==1.7.4 +pillow==11.1.0 pycparser==2.22 pydantic==2.10.6 pydantic-extra-types==2.10.2 @@ -33,6 +35,7 @@ PyMySQL==1.1.1 python-dotenv==1.0.1 python-multipart==0.0.20 PyYAML==6.0.2 +requests==2.32.3 rich==13.9.4 rich-toolkit==0.13.2 shellingham==1.5.4 @@ -40,9 +43,12 @@ sniffio==1.3.1 SQLAlchemy==2.0.38 sqlmodel==0.0.23 starlette==0.46.0 +ttkbootstrap==1.10.1 typer==0.15.2 typing_extensions==4.12.2 ujson==5.10.0 +urllib3==2.3.0 uvicorn==0.34.0 +uvloop==0.21.0 watchfiles==1.0.4 websockets==15.0