File size: 7,803 Bytes
522c037
 
 
 
 
 
 
d0b32da
 
6ac56b7
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
 
 
 
 
 
 
 
 
 
 
 
d0b32da
 
020375c
6ac56b7
 
 
 
 
 
 
 
d0b32da
6ac56b7
d0b32da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
020375c
d0b32da
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
184
185
186
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

if st.session_state.session_id is None:
    start_registration()

# 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."

st.title("AI-Powered Registration System")
st.markdown("**Developed by [email protected]**")

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:
        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.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}")

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