diff --git a/TalkHeal.py b/TalkHeal.py index f99cfb6..d2566d4 100644 --- a/TalkHeal.py +++ b/TalkHeal.py @@ -9,23 +9,25 @@ ) import google.generativeai as genai +from core.db import init_db, create_user, get_user_by_username, create_chat, add_message, get_messages + +# --- ENSURE TABLES EXIST BEFORE ANY DB USAGE --- +init_db() + from core.utils import save_conversations, load_conversations from core.config import configure_gemini, PAGE_CONFIG -from core.utils import get_current_time, create_new_conversation +from core.utils import get_current_time,get_ai_response from css.styles import apply_custom_css from components.header import render_header from components.sidebar import render_sidebar -from components.chat_interface import render_chat_interface, handle_chat_input +from components.chat_interface import render_chat_interface from components.emergency_page import render_emergency_page - +from core.db import init_db, get_messages, add_message, create_chat +from core.db import get_user_by_username, create_user # <-- Add this line, adjust module if needed +# --- ENSURE TABLES EXIST BEFORE ANY DB USAGE --- +init_db() # --- 1. INITIALIZE SESSION STATE --- -if "chat_history" not in st.session_state: - st.session_state.chat_history = [] -if "conversations" not in st.session_state: - st.session_state.conversations = load_conversations() -if "active_conversation" not in st.session_state: - st.session_state.active_conversation = -1 if "show_emergency_page" not in st.session_state: st.session_state.show_emergency_page = False if "sidebar_state" not in st.session_state: @@ -37,8 +39,10 @@ "Substance Use Disorders", "ADHD & Neurodevelopmental", "Personality Disorders", "Sleep Disorders" ] -if "selected_tone" not in st.session_state: - st.session_state.selected_tone = "Compassionate Listener" +if "user_id" not in st.session_state: + st.session_state.user_id = None +if "active_chat_id" not in st.session_state: + st.session_state.active_chat_id = None # --- 2. SET PAGE CONFIG --- @@ -70,22 +74,22 @@ def get_tone_prompt(): return TONE_OPTIONS.get(st.session_state.get("selected_tone", "Compassionate Listener"), TONE_OPTIONS["Compassionate Listener"]) # --- 6. RENDER SIDEBAR --- -render_sidebar() +def render_sidebar(): + from core.db import get_chats_for_user, create_chat + if "user_id" in st.session_state and st.session_state.user_id: + chats = get_chats_for_user(st.session_state.user_id) + for chat in chats: + if st.button(chat["title"], key=f"chat_{chat['id']}"): + st.session_state.active_chat_id = chat["id"] + st.rerun() + if st.button("➕ New Chat"): + chat_id = create_chat(st.session_state.user_id, "Untitled Chat") + st.session_state.active_chat_id = chat_id + st.rerun() # --- 7. PAGE ROUTING --- main_area = st.container() -if not st.session_state.conversations: - saved_conversations = load_conversations() - if saved_conversations: - st.session_state.conversations = saved_conversations - if st.session_state.active_conversation == -1: - st.session_state.active_conversation = 0 - else: - create_new_conversation() - st.session_state.active_conversation = 0 - st.rerun() - # --- 8. RENDER PAGE --- if st.session_state.get("show_emergency_page"): with main_area: @@ -93,11 +97,49 @@ def get_tone_prompt(): else: with main_area: render_header() - st.subheader(f"🗣️ Current Chatbot Tone: **{st.session_state['selected_tone']}**") - render_chat_interface() - handle_chat_input(model, system_prompt=get_tone_prompt()) + render_chat_interface(model) + + # User login/register + from core.db import create_user, get_user_by_username + + if "user_id" not in st.session_state or st.session_state.user_id is None: + st.title("Login / Register") + username = st.text_input("Username") + email = st.text_input("Email") + if st.button("Register/Login"): + user = get_user_by_username(username) + # Add this block to check for existing email + from core.db import get_user_by_email + existing_email_user = get_user_by_email(email) + if existing_email_user and (not user or existing_email_user["id"] != (user["id"] if user else None)): + st.error("This email is already registered. Please use another email or log in with the existing username.") + else: + if not user: + create_user(username, email) + user = get_user_by_username(username) + st.session_state.user_id = user["id"] + st.success(f"Logged in as {username}") + st.rerun() + st.stop() + + # Start new chat + if st.button("➕ New Chat"): + chat_id = create_chat(st.session_state.user_id, "Untitled Chat") + st.session_state.active_chat_id = chat_id + st.experimental_rerun() + + # Send message + user_input = st.text_input("Message", key="message_input") + if st.button("Send") and user_input.strip() and st.session_state.get("active_chat_id"): + add_message(st.session_state.active_chat_id, "user", user_input.strip()) + st.experimental_rerun() + + # Display chat history + if st.session_state.get("active_chat_id"): + messages = get_messages(st.session_state.active_chat_id) + for msg in messages: + st.write(f"{msg['sender']}: {msg['message']}") -# --- 9. SCROLL SCRIPT --- st.markdown(""" -""", unsafe_allow_html=True) \ No newline at end of file +""", unsafe_allow_html=True) \ No newline at end of file diff --git a/components/chat_interface.py b/components/chat_interface.py index 874a329..1dc764c 100644 --- a/components/chat_interface.py +++ b/components/chat_interface.py @@ -1,144 +1,47 @@ import streamlit as st -import streamlit.components.v1 as components -from datetime import datetime -from core.utils import get_current_time, get_ai_response, save_conversations -import requests +from core.db import get_messages, add_message +from core.utils import get_current_time, get_ai_response -# Inject JS to get user's local time zone -def set_user_time_in_session(): - if "user_time_offset" not in st.session_state: - components.html(""" - - """, height=0) +def render_chat_interface(model): + chat_id = st.session_state.get("active_chat_id") + if not chat_id: + st.info("Start a new chat to begin.") + return + messages = get_messages(chat_id) + if not messages: st.markdown(""" - +
""", unsafe_allow_html=True) -set_user_time_in_session() - -# Display chat messages -def render_chat_interface(): - if st.session_state.active_conversation >= 0: - active_convo = st.session_state.conversations[st.session_state.active_conversation] - - if not active_convo["messages"]: + for msg in messages: + if msg["sender"] == "user": st.markdown(f""" -