import streamlit as st import requests import json import time import random import os # Load environment variables API_URL = os.getenv("API_URL") # Read content from text files def read_content_from_file(file_path): try: with open(file_path, 'r') as file: return file.read() except FileNotFoundError: return f"Error: {file_path} not found." TRANSITION_MESSAGES = [ "Now we are moving onto question {number}!", "Time to switch to question {number}!", "Let's proceed with question {number}!", "Moving forward to question {number}!", "Onward to question {number}!" ] def reset_session_state(): """Reset session state to start a new registration.""" st.session_state.session_id = None st.session_state.current_question = "" st.session_state.feedback = "" st.session_state.summary = None st.session_state.answer = "" st.session_state.skip_address = False st.session_state.skip_phone = False st.session_state.prev_question = "" st.session_state.question_number = 1 def start_registration(): print("Starting registration...") try: response = requests.post(f"{API_URL}/start_registration", timeout=60) response.raise_for_status() data = response.json() print("API Response:", data) st.session_state.session_id = data["session_id"] st.session_state.current_question = data["message"] st.session_state.question_number = 1 # Reset question number for new session except requests.RequestException as e: print(f"Error starting registration: {e}") st.error(f"Error starting registration: {e}") def submit_response(): if not st.session_state.session_id: st.error("No active session. Please start registration.") return skip_steps = [] if st.session_state.get("skip_address", False): skip_steps.append("ask_address") if st.session_state.get("skip_phone", False): skip_steps.append("ask_phone") payload = { "session_id": st.session_state.session_id, "answer": st.session_state.answer, "skip_steps": skip_steps } print("Submitting response with payload:", payload) try: response = requests.post(f"{API_URL}/submit_response", json=payload, timeout=60) response.raise_for_status() data = response.json() print("API Response:", data) if data.get("message") == "Registration complete!": st.session_state.summary = data["summary"] st.session_state.current_question = "" st.session_state.feedback = "Registration complete!" st.session_state.question_number = 1 # Reset for potential next session else: st.session_state.prev_question = st.session_state.current_question st.session_state.current_question = data.get("next_question", "") st.session_state.feedback = data.get("validation_feedback", "") if st.session_state.prev_question != st.session_state.current_question: st.session_state.question_number += 1 st.session_state.answer = "" st.session_state.skip_address = False st.session_state.skip_phone = False st.rerun() except requests.RequestException as e: print(f"Error submitting response: {e}") st.error(f"Error submitting response: {e}") def edit_field(field, value): if not st.session_state.session_id: st.error("No active session.") return payload = { "session_id": st.session_state.session_id, "field_to_edit": field, "new_value": value } print("Editing field with payload:", payload) try: response = requests.post(f"{API_URL}/edit_field", json=payload, timeout=60) response.raise_for_status() data = response.json() print("API Response:", data) st.session_state.feedback = data.get("validation_feedback", "") st.session_state.summary = data.get("summary", st.session_state.summary) if data.get("message") == "Needs clarification": st.error(f"Clarification needed for {field}: {data['validation_feedback']}") elif data.get("message") == "Field updated successfully!": st.success("Database updated.") st.rerun() except requests.RequestException as e: print(f"Error editing field: {e}") st.error(f"Error editing field: {e}") def main(): st.title("AI-Powered Registration System") # Create two tabs tab1, tab2 = st.tabs(["Introduction", "Registration"]) # Tab 1: Introduction with tab1: st.subheader("About This Application") intro_content = read_content_from_file("tab1.txt") st.markdown(intro_content) # Tab 2: Registration Application with tab2: st.subheader("Registration") registration_content = read_content_from_file("tab2.txt") st.markdown(registration_content) st.markdown("**Developed by entzyeung@gmail.com**") if st.session_state.get("summary"): st.success("Registration Complete!") st.subheader("Summary") for key, value in st.session_state.summary.items(): st.write(f"**{key}**: {value}") new_value = st.text_input(f"Edit {key}", key=f"edit_{key}_{st.session_state.session_id}") # Unique key per session if st.button(f"Update {key}", key=f"update_{key}_{st.session_state.session_id}"): edit_field(key, new_value) col1, col2 = st.columns(2) with col1: if st.button("Next Registration", key="next_reg", on_click=lambda: (reset_session_state(), start_registration(), st.rerun())): pass with col2: if st.button("End Session", key="end_sess", on_click=lambda: (reset_session_state(), start_registration(), st.rerun())): pass else: if st.session_state.get("current_question"): if st.session_state.get("feedback"): st.error(st.session_state.feedback) if st.session_state.get("prev_question") and st.session_state.prev_question != st.session_state.current_question: transition_msg = random.choice(TRANSITION_MESSAGES).format(number=st.session_state.question_number) st.info(transition_msg) time.sleep(1) st.subheader(f"Question {st.session_state.question_number}: {st.session_state.current_question}") is_address_question = st.session_state.current_question == "What is your address?" is_phone_question = st.session_state.current_question == "What is your phone number?" if is_address_question or is_phone_question: st.info( f"This question is optional. Check the box to skip, or enter your information below.\n" f"- For address: Include house number (e.g., 123), street name (e.g., High Street), town/city (e.g., London), and postcode (e.g., SW1A 1AA). Example: 123 High Street, London, SW1A 1AA.\n" f"- For phone: Use 10 digits for landlines (e.g., 020 123 4567) or 11 digits for mobiles starting with 07 (e.g., 07700 900 123). Avoid +44 formats." ) if is_address_question: st.session_state.skip_address = st.checkbox("Skip this question", key=f"skip_address_{st.session_state.session_id}", value=st.session_state.skip_address) elif is_phone_question: st.session_state.skip_phone = st.checkbox("Skip this question", key=f"skip_phone_{st.session_state.session_id}", value=st.session_state.skip_phone) st.components.v1.html(""" document.addEventListener('keypress', function(e) { if (e.key === 'Enter' && document.activeElement.tagName === 'INPUT') { e.preventDefault(); const submitButton = document.querySelector('button[key="submit_button"]'); if (submitButton && !submitButton.disabled) submitButton.click(); } }); """, height=0) st.session_state.answer = st.text_input("Your Answer", value="", key=f"answer_input_{st.session_state.question_number}_{st.session_state.session_id}") # Unique key per question and session if st.button("Submit", key="submit_button"): submit_response() else: print("Waiting for session to initialize...") if __name__ == "__main__": # Initialize session state if "session_state" not in st.session_state: st.session_state.session_state = {} reset_session_state() if st.session_state.session_id is None: start_registration() main()