Skip to content

Commit c582a09

Browse files
Merge pull request #53 from eccentriccoder01/revert-51-Sql_Database
Revert "[Feature]: Pull request for Adding database capabilities to the chat-interface.py to make it more personalized #41"
2 parents 434db99 + 783ea8d commit c582a09

File tree

5 files changed

+210
-194
lines changed

5 files changed

+210
-194
lines changed

TalkHeal.py

Lines changed: 28 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,23 @@
99
)
1010

1111
import google.generativeai as genai
12-
from core.db import init_db, create_user, get_user_by_username, create_chat, add_message, get_messages
13-
14-
# --- ENSURE TABLES EXIST BEFORE ANY DB USAGE ---
15-
init_db()
16-
1712
from core.utils import save_conversations, load_conversations
1813
from core.config import configure_gemini, PAGE_CONFIG
19-
from core.utils import get_current_time,get_ai_response
14+
from core.utils import get_current_time, create_new_conversation
2015
from css.styles import apply_custom_css
2116
from components.header import render_header
2217
from components.sidebar import render_sidebar
23-
from components.chat_interface import render_chat_interface
18+
from components.chat_interface import render_chat_interface, handle_chat_input
2419
from components.emergency_page import render_emergency_page
25-
from core.db import init_db, get_messages, add_message, create_chat
26-
from core.db import get_user_by_username, create_user # <-- Add this line, adjust module if needed
27-
# --- ENSURE TABLES EXIST BEFORE ANY DB USAGE ---
28-
init_db()
20+
2921

3022
# --- 1. INITIALIZE SESSION STATE ---
23+
if "chat_history" not in st.session_state:
24+
st.session_state.chat_history = []
25+
if "conversations" not in st.session_state:
26+
st.session_state.conversations = load_conversations()
27+
if "active_conversation" not in st.session_state:
28+
st.session_state.active_conversation = -1
3129
if "show_emergency_page" not in st.session_state:
3230
st.session_state.show_emergency_page = False
3331
if "sidebar_state" not in st.session_state:
@@ -39,10 +37,8 @@
3937
"Substance Use Disorders", "ADHD & Neurodevelopmental", "Personality Disorders",
4038
"Sleep Disorders"
4139
]
42-
if "user_id" not in st.session_state:
43-
st.session_state.user_id = None
44-
if "active_chat_id" not in st.session_state:
45-
st.session_state.active_chat_id = None
40+
if "selected_tone" not in st.session_state:
41+
st.session_state.selected_tone = "Compassionate Listener"
4642

4743
# --- 2. SET PAGE CONFIG ---
4844

@@ -74,72 +70,34 @@ def get_tone_prompt():
7470
return TONE_OPTIONS.get(st.session_state.get("selected_tone", "Compassionate Listener"), TONE_OPTIONS["Compassionate Listener"])
7571

7672
# --- 6. RENDER SIDEBAR ---
77-
def render_sidebar():
78-
from core.db import get_chats_for_user, create_chat
79-
if "user_id" in st.session_state and st.session_state.user_id:
80-
chats = get_chats_for_user(st.session_state.user_id)
81-
for chat in chats:
82-
if st.button(chat["title"], key=f"chat_{chat['id']}"):
83-
st.session_state.active_chat_id = chat["id"]
84-
st.rerun()
85-
if st.button("➕ New Chat"):
86-
chat_id = create_chat(st.session_state.user_id, "Untitled Chat")
87-
st.session_state.active_chat_id = chat_id
88-
st.rerun()
73+
render_sidebar()
8974

9075
# --- 7. PAGE ROUTING ---
9176
main_area = st.container()
9277

78+
if not st.session_state.conversations:
79+
saved_conversations = load_conversations()
80+
if saved_conversations:
81+
st.session_state.conversations = saved_conversations
82+
if st.session_state.active_conversation == -1:
83+
st.session_state.active_conversation = 0
84+
else:
85+
create_new_conversation()
86+
st.session_state.active_conversation = 0
87+
st.rerun()
88+
9389
# --- 8. RENDER PAGE ---
9490
if st.session_state.get("show_emergency_page"):
9591
with main_area:
9692
render_emergency_page()
9793
else:
9894
with main_area:
9995
render_header()
100-
render_chat_interface(model)
101-
102-
# User login/register
103-
from core.db import create_user, get_user_by_username
104-
105-
if "user_id" not in st.session_state or st.session_state.user_id is None:
106-
st.title("Login / Register")
107-
username = st.text_input("Username")
108-
email = st.text_input("Email")
109-
if st.button("Register/Login"):
110-
user = get_user_by_username(username)
111-
# Add this block to check for existing email
112-
from core.db import get_user_by_email
113-
existing_email_user = get_user_by_email(email)
114-
if existing_email_user and (not user or existing_email_user["id"] != (user["id"] if user else None)):
115-
st.error("This email is already registered. Please use another email or log in with the existing username.")
116-
else:
117-
if not user:
118-
create_user(username, email)
119-
user = get_user_by_username(username)
120-
st.session_state.user_id = user["id"]
121-
st.success(f"Logged in as {username}")
122-
st.rerun()
123-
st.stop()
124-
125-
# Start new chat
126-
if st.button("➕ New Chat"):
127-
chat_id = create_chat(st.session_state.user_id, "Untitled Chat")
128-
st.session_state.active_chat_id = chat_id
129-
st.experimental_rerun()
130-
131-
# Send message
132-
user_input = st.text_input("Message", key="message_input")
133-
if st.button("Send") and user_input.strip() and st.session_state.get("active_chat_id"):
134-
add_message(st.session_state.active_chat_id, "user", user_input.strip())
135-
st.experimental_rerun()
136-
137-
# Display chat history
138-
if st.session_state.get("active_chat_id"):
139-
messages = get_messages(st.session_state.active_chat_id)
140-
for msg in messages:
141-
st.write(f"{msg['sender']}: {msg['message']}")
96+
st.subheader(f"🗣️ Current Chatbot Tone: **{st.session_state['selected_tone']}**")
97+
render_chat_interface()
98+
handle_chat_input(model, system_prompt=get_tone_prompt())
14299

100+
# --- 9. SCROLL SCRIPT ---
143101
st.markdown("""
144102
<script>
145103
function scrollToBottom() {
@@ -150,4 +108,4 @@ def render_sidebar():
150108
}
151109
setTimeout(scrollToBottom, 100);
152110
</script>
153-
""", unsafe_allow_html=True)
111+
""", unsafe_allow_html=True)

components/chat_interface.py

Lines changed: 128 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,144 @@
11
import streamlit as st
2-
from core.db import get_messages, add_message
3-
from core.utils import get_current_time, get_ai_response
2+
import streamlit.components.v1 as components
3+
from datetime import datetime
4+
from core.utils import get_current_time, get_ai_response, save_conversations
5+
import requests
46

5-
def render_chat_interface(model):
6-
chat_id = st.session_state.get("active_chat_id")
7-
if not chat_id:
8-
st.info("Start a new chat to begin.")
9-
return
7+
# Inject JS to get user's local time zone
8+
def set_user_time_in_session():
9+
if "user_time_offset" not in st.session_state:
10+
components.html("""
11+
<script>
12+
const offset = new Date().getTimezoneOffset();
13+
const time = new Date().toLocaleString();
14+
const data = {offset: offset, time: time};
15+
window.parent.postMessage({type: 'USER_TIME', data: data}, '*');
16+
</script>
17+
""", height=0)
1018

11-
messages = get_messages(chat_id)
12-
if not messages:
1319
st.markdown("""
14-
<div class="welcome-message">
15-
<strong>Hello! I'm TalkHeal, your mental health companion</strong><br>
16-
How are you feeling today? You can write it down below or for a fresh start click on "➕ New Chat" 😊
17-
</div>
20+
<script>
21+
window.addEventListener("message", (event) => {
22+
if (event.data.type === "USER_TIME") {
23+
const payload = JSON.stringify(event.data.data);
24+
fetch("/", {
25+
method: "POST",
26+
headers: {"Content-Type": "application/json"},
27+
body: payload
28+
}).then(() => location.reload());
29+
}
30+
});
31+
</script>
1832
""", unsafe_allow_html=True)
1933

20-
for msg in messages:
21-
if msg["sender"] == "user":
34+
set_user_time_in_session()
35+
36+
# Display chat messages
37+
def render_chat_interface():
38+
if st.session_state.active_conversation >= 0:
39+
active_convo = st.session_state.conversations[st.session_state.active_conversation]
40+
41+
if not active_convo["messages"]:
2242
st.markdown(f"""
23-
<div class="user-message">
24-
{msg["message"]}
25-
<div class="message-time">{msg["timestamp"]}</div>
43+
<div class="welcome-message">
44+
<strong>Hello! I'm TalkHeal, your mental health companion 🤗</strong><br>
45+
How are you feeling today? You can write below or start a new topic.
46+
<div class="message-time">{get_current_time()}</div>
2647
</div>
2748
""", unsafe_allow_html=True)
28-
else:
49+
50+
for msg in active_convo["messages"]:
51+
css_class = "user-message" if msg["sender"] == "user" else "bot-message"
2952
st.markdown(f"""
30-
<div class="bot-message">
53+
<div class="{css_class}">
3154
{msg["message"]}
32-
<div class="message-time">{msg["timestamp"]}</div>
55+
<div class="message-time">{msg["time"]}</div>
3356
</div>
3457
""", unsafe_allow_html=True)
3558

59+
# Handle chat input and generate AI response
60+
def handle_chat_input(model, system_prompt):
61+
if "pre_filled_chat_input" not in st.session_state:
62+
st.session_state.pre_filled_chat_input = ""
63+
initial_value = st.session_state.pre_filled_chat_input
64+
st.session_state.pre_filled_chat_input = ""
65+
3666
with st.form(key="chat_form", clear_on_submit=True):
37-
user_input = st.text_input("Share your thoughts...", key="message_input", label_visibility="collapsed")
38-
send_pressed = st.form_submit_button("Send")
39-
if send_pressed and user_input.strip():
40-
add_message(chat_id, "user", user_input.strip())
41-
with st.spinner("TalkHeal is thinking..."):
42-
context = "\n".join([f"{m['sender'].capitalize()}: {m['message']}" for m in get_messages(chat_id)])
43-
prompt = context + f"\nUser: {user_input.strip()}\nBot:"
44-
ai_response = get_ai_response(prompt, model)
45-
add_message(chat_id, "bot", ai_response)
46-
st.rerun()
67+
col1, col2 = st.columns([5, 1])
68+
with col1:
69+
user_input = st.text_input(
70+
"Share your thoughts...",
71+
key="message_input",
72+
label_visibility="collapsed",
73+
placeholder="Type your message here...",
74+
value=initial_value
75+
)
76+
with col2:
77+
send_pressed = st.form_submit_button("Send", use_container_width=True)
78+
79+
if (send_pressed or st.session_state.get("send_chat_message", False)) and user_input.strip():
80+
if 'send_chat_message' in st.session_state:
81+
st.session_state.send_chat_message = False
82+
83+
if st.session_state.active_conversation >= 0:
84+
current_time = get_current_time()
85+
active_convo = st.session_state.conversations[st.session_state.active_conversation]
86+
87+
# Save user message
88+
active_convo["messages"].append({
89+
"sender": "user",
90+
"message": user_input.strip(),
91+
"time": current_time
92+
})
93+
94+
# Set title if it's the first message
95+
if len(active_convo["messages"]) == 1:
96+
title = user_input[:30] + "..." if len(user_input) > 30 else user_input
97+
active_convo["title"] = title
98+
99+
save_conversations(st.session_state.conversations)
100+
101+
# Format memory
102+
def format_memory(convo_history, max_turns=10):
103+
context = ""
104+
for msg in convo_history[-max_turns*2:]: # user + bot per turn
105+
sender = "User" if msg["sender"] == "user" else "Bot"
106+
context += f"{sender}: {msg['message']}\n"
107+
return context
108+
109+
try:
110+
with st.spinner("TalkHeal is thinking..."):
111+
memory = format_memory(active_convo["messages"])
112+
prompt = f"{system_prompt}\n\n{memory}\nUser: {user_input.strip()}\nBot:"
113+
ai_response = get_ai_response(prompt, model)
114+
115+
active_convo["messages"].append({
116+
"sender": "bot",
117+
"message": ai_response,
118+
"time": get_current_time()
119+
})
120+
121+
except ValueError as e:
122+
st.error("I'm having trouble understanding your message. Could you please rephrase it?")
123+
active_convo["messages"].append({
124+
"sender": "bot",
125+
"message": "I'm having trouble understanding your message. Could you please rephrase it?",
126+
"time": get_current_time()
127+
})
128+
except requests.RequestException as e:
129+
st.error("Network connection issue. Please check your internet connection.")
130+
active_convo["messages"].append({
131+
"sender": "bot",
132+
"message": "I'm having trouble connecting to my services. Please check your internet connection and try again.",
133+
"time": get_current_time()
134+
})
135+
except Exception as e:
136+
st.error(f"An unexpected error occurred. Please try again.")
137+
active_convo["messages"].append({
138+
"sender": "bot",
139+
"message": "I'm having trouble responding right now. Please try again in a moment.",
140+
"time": get_current_time()
141+
})
47142

143+
save_conversations(st.session_state.conversations)
144+
st.rerun()

0 commit comments

Comments
 (0)