QRCodeMenu / app.py
DSatishchandra's picture
Update app.py
77685e0 verified
raw
history blame
5.53 kB
import gradio as gr
import uuid
import json
import os
# File to store registered user data
USER_DATA_FILE = "users.json"
# Load user data from the file
def load_user_data():
if os.path.exists(USER_DATA_FILE):
with open(USER_DATA_FILE, "r") as file:
return json.load(file)
return {}
# Save user data to the file
def save_user_data(data):
with open(USER_DATA_FILE, "w") as file:
json.dump(data, file, indent=4)
# Initialize user database
customers = load_user_data()
session_data = {}
# Function for user signup
def signup(name, phone):
if phone in customers:
return f"Phone number {phone} is already registered. Please log in."
# Generate unique customer ID
customer_id = f"CUST{str(uuid.uuid4().int)[:6]}"
customers[phone] = {"name": name, "phone": phone, "customer_id": customer_id}
# Save the updated user data
save_user_data(customers)
return f"Signup successful! Welcome {name}. Your customer ID is {customer_id}."
# Function for user login
def login(phone):
if phone in customers:
customer = customers[phone]
session_data['customer_id'] = customer['customer_id']
session_data['customer_name'] = customer['name']
return f"Welcome {customer['name']}! You are now logged in."
else:
return "Phone number not found. Please register first."
# Function to add items to the cart
def add_to_cart(item_name):
if 'customer_id' not in session_data:
return "Please log in first to add items to the cart."
# Find the selected item in the menu
selected_item = next((item for item in menu_items if item["name"] == item_name), None)
if not selected_item:
return f"Item '{item_name}' not found in the menu."
# Add item to cart
cart = session_data.get('cart', [])
cart.append({"item_id": selected_item['id'], "name": selected_item['name'], "quantity": 1, "price": selected_item['price']})
session_data['cart'] = cart
return f"Added 1 x {selected_item['name']} to the cart."
# Function to display the cart
def view_cart():
if 'customer_id' not in session_data:
return "Please log in first to view your cart."
cart = session_data.get('cart', [])
if not cart:
return "Your cart is empty."
cart_summary = []
total_price = 0
for item in cart:
cart_summary.append(f"{item['name']} x {item['quantity']} - ${item['price']:.2f}")
total_price += item['price']
return "\n".join(cart_summary) + f"\n\nTotal Price: ${total_price:.2f}"
# Function to proceed to order
def proceed_to_order(table_number):
if 'customer_id' not in session_data:
return "Please log in first to proceed with your order."
cart = session_data.get('cart', [])
if not cart:
return "Your cart is empty. Add items to your cart before proceeding."
order_id = str(uuid.uuid4()) # Generate unique order ID
order_details = {
"order_id": order_id,
"customer_id": session_data['customer_id'],
"customer_name": session_data['customer_name'],
"table_number": table_number,
"items": cart
}
session_data['cart'] = [] # Clear cart after order
return f"Order placed successfully!\n\nOrder ID: {order_id}\nTable Number: {table_number}\n\nOrder Details:\n" + "\n".join([f"{item['name']} x {item['quantity']} - ${item['price']:.2f}" for item in cart])
# Sample menu items
menu_items = [
{"id": 1, "name": "Burger", "price": 5.99, "description": "Juicy grilled burger with fresh veggies."},
{"id": 2, "name": "Pizza", "price": 8.99, "description": "Cheesy pizza with a choice of toppings."},
{"id": 3, "name": "Pasta", "price": 7.99, "description": "Creamy Italian pasta with garlic bread."},
{"id": 4, "name": "Salad", "price": 4.99, "description": "Fresh garden salad with vinaigrette dressing."},
{"id": 5, "name": "Soda", "price": 1.99, "description": "Refreshing chilled soda of your choice."}
]
# Function to generate the styled menu
def generate_menu():
with gr.Blocks() as menu_interface:
gr.Markdown("# Menu")
output = gr.Textbox(label="Status") # Declare output component only once
for item in menu_items:
with gr.Row():
with gr.Column(scale=4):
gr.Markdown(f"### {item['name']}\n{item['description']}\n**Price:** ${item['price']:.2f}")
with gr.Column(scale=1):
button = gr.Button("Add")
button.click(fn=add_to_cart, inputs=gr.Textbox(value=item["name"], visible=False), outputs=output)
return menu_interface
# Gradio Interface for Signup
signup_interface = gr.Interface(fn=signup, inputs=["text", "text"], outputs="text", title="Signup")
# Gradio Interface for Login
login_interface = gr.Interface(fn=login, inputs="text", outputs="text", title="Login")
# Gradio Interface for Cart
cart_interface = gr.Interface(fn=view_cart, inputs=None, outputs="text", title="Cart")
# Gradio Interface for Proceed to Order
order_interface = gr.Interface(
fn=proceed_to_order,
inputs=gr.Textbox(label="Table Number"),
outputs="text",
title="Proceed to Order"
)
# Generate the menu interface
menu_interface = generate_menu()
# Launch Gradio app with multiple tabs
demo = gr.TabbedInterface(
[signup_interface, login_interface, menu_interface, cart_interface, order_interface],
["Signup", "Login", "Menu", "Cart", "Order"]
)
demo.launch()