import gradio as gr import json # Load menu data def load_menu_data(): try: with open("menu.json", "r") as file: data = json.load(file) return data.get("menu", []) except Exception as e: print(f"Error loading menu: {e}") return [] menu_data = load_menu_data() # Globals current_order = [] preferences = {} # Functions def login_user(name, phone): if len(phone) != 10 or not phone.isdigit(): return gr.update(value="Invalid phone number. Please enter a 10-digit number."), gr.Tabs.update(selected=0) return gr.update(value=f"Welcome, {name}! Please proceed to set your preferences."), gr.Tabs.update(selected=1) def save_preferences(pref_type, allergies): preferences["type"] = pref_type preferences["allergies"] = allergies return gr.update(value="Preferences saved successfully! Proceed to the menu."), gr.Tabs.update(selected=2) def get_filtered_menu(): if not preferences.get("type"): return "Please set preferences first." filtered_menu = [ item for item in menu_data if item["type"] == preferences["type"] or preferences["type"] == "Complete Menu" ] return filtered_menu def add_to_order(item_name): current_order.append(item_name) return "\n".join(current_order) def place_order(): if not current_order: return "No items in the order. Please add items to your order before placing it.", gr.Tabs.update(selected=2) return f"Order placed successfully! Items: {', '.join(current_order)}.", gr.Tabs.update(selected=4) # App Interface with gr.Blocks() as app: # Login Screen with gr.Tabs() as tabs: with gr.Tab("Login"): name = gr.Textbox(label="Name", placeholder="Enter your name") phone = gr.Textbox(label="Phone", placeholder="Enter your 10-digit phone number") login_button = gr.Button("Login") login_output = gr.Label() login_button.click( login_user, inputs=[name, phone], outputs=[login_output, tabs] ) # Preferences Screen with gr.Tab("Preferences"): pref_type = gr.Radio( ["Vegetarian", "Non-Vegetarian", "Complete Menu"], label="Select Preference" ) allergies = gr.CheckboxGroup( ["Peanuts", "Cheese", "Pork", "Custom"], label="Allergies (if any)" ) save_pref_button = gr.Button("Save Preferences") pref_output = gr.Label() save_pref_button.click( save_preferences, inputs=[pref_type, allergies], outputs=[pref_output, tabs] ) # Menu Screen with gr.Tab("Menu"): menu_display = gr.Column() current_order_display = gr.Textbox(label="Current Order", interactive=False) proceed_to_summary = gr.Button("Proceed to Order Summary") proceed_to_summary.click( lambda: gr.Tabs.update(selected=3), inputs=None, outputs=[tabs] ) def load_menu(): filtered_menu = get_filtered_menu() if not filtered_menu: return [gr.Text("No items available for the selected preferences.")] menu_buttons = [] for item in filtered_menu: button = gr.Button(f"{item['name']} - ₹{item['price']}") button.click( lambda name=item["name"]: add_to_order(name), inputs=None, outputs=current_order_display ) menu_buttons.append(button) return menu_buttons menu_display.children = load_menu() # Order Summary Screen with gr.Tab("Order Summary"): order_summary = gr.Textbox(label="Your Order", interactive=False) place_order_button = gr.Button("Place Order") order_output = gr.Label() place_order_button.click( place_order, inputs=None, outputs=[order_output, tabs] ) # Thank You Screen with gr.Tab("Thank You"): thank_you_message = gr.Label("Thank you for placing your order!")