File size: 7,984 Bytes
522c037
 
 
 
 
 
 
0e81284
522c037
 
 
 
 
 
 
 
 
 
 
0ed6eb6
020375c
0ed6eb6
 
 
 
 
dec5435
 
3464e09
dec5435
 
 
 
0ed6eb6
 
 
522c037
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78b30d7
522c037
 
 
0fa3cbb
522c037
 
 
dec5435
522c037
 
 
 
 
 
3464e09
020375c
 
522c037
 
0ed6eb6
 
522c037
 
 
 
 
 
 
 
 
 
 
 
78b30d7
522c037
 
 
 
 
0fa3cbb
522c037
0fa3cbb
522c037
5d54d5e
522c037
0ed6eb6
 
522c037
020375c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273c990
020375c
 
 
 
 
 
 
 
 
 
 
 
 
e188a38
 
 
 
 
 
 
 
 
 
 
 
 
 
020375c
 
b6a9e3d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
020375c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
import streamlit as st
import requests
import json
import time
import random
import os

API_URL = os.getenv("API_URL")

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 start_registration():
    print("Starting registration...")
    try:
        response = requests.post(f"{API_URL}/start_registration")
        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.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
    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)
        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
        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)
        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}")

if "session_state" not in st.session_state:
    st.session_state.session_state = {}
    st.session_state.session_id = None
    st.session_state.current_question = ""
    st.session_state.answer = ""
    st.session_state.feedback = ""
    st.session_state.summary = None
    st.session_state.skip_address = False
    st.session_state.skip_phone = False
    st.session_state.prev_question = ""
    st.session_state.question_number = 1

# Create two tabs
tab1, tab2 = st.tabs(["Introduction", "Registration"])

# Tab 1: Introduction
with tab1:
    st.header("Welcome to the AI-Powered Registration System")
    try:
        with open("tab1.txt", "r") as file:
            intro_content = file.read()
        st.markdown(intro_content)
    except FileNotFoundError:
        st.error("Introduction file (tab1.txt) not found. Please create the file with the introduction content.")
    except Exception as e:
        st.error(f"Error reading introduction file: {e}")

# Tab 2: Registration App
with tab2:
    if st.session_state.session_id is None:
        start_registration()

    st.title("AI-Powered Registration System")

    if st.session_state.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}")
            if st.button(f"Update {key}", key=f"update_{key}"):
                edit_field(key, new_value)
        col1, col2 = st.columns(2)
        with col1:
            if st.button("Next Registration", key="next_reg", on_click=start_registration):
                pass
        with col2:
            if st.button("End Session", key="end_sess", on_click=start_registration):
                pass
    else:
        if st.session_state.current_question:
            with st.form(key=f"question_form_{st.session_state.question_number}"):
                if st.session_state.feedback:
                    st.error(st.session_state.feedback)
                if st.session_state.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)
                print(f"Displaying question: {st.session_state.current_question}")
                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). Do not use +44 or other region numbers."
                    )
                    if is_address_question:
                        st.session_state.skip_address = st.checkbox("Skip this question", value=st.session_state.skip_address)
                    elif is_phone_question:
                        st.session_state.skip_phone = st.checkbox("Skip this question", value=st.session_state.skip_phone)

                st.session_state.answer = st.text_input("Your Answer", value="", key=f"answer_input_{st.session_state.question_number}")

                if st.form_submit_button("Submit", key="submit_button"):
                    submit_response()
        else:
            print("Waiting for session to initialize...")