Team Ai
Apppublic

dvwn/nl2sql-api

sourceHugging Faceupdated 4mo agoView on Hugging Face
0likes
sidebar.py123 linesDownload Raw Back to components
1# Path: frontend/components/sidebar.py2# Sidebar component for navigation and additional options.3import streamlit as st4from utils.api import get_available_models5from backend.src.database.db_manager import get_db_connection6from components.auth import render_auth_dialog, save_chat_history, save_userDB, load_userDB7 8@st.cache_data(ttl=60)9def check_db_connection():10    """ 11    Ping the database to check connectivity status 12    Cached for 60 seconds to avoid DB overloading on Streamlit rerun13    """14    try:15        conn = get_db_connection()16        # Close connection immediately after successful ping to free resources17        if hasattr(conn, 'close'):18            conn.close()19        return True, None20    except Exception as e:21        return False, str(e)22 23@st.dialog("Delete Confirmation")24def confirm_delete(idx, session_title):25    st.warning(f"Are you sure you want to delete '{session_title}'?")26    st.write(":material/warning: This action cannot be undone!")27 28    col1, col2 = st.columns(2)29    with col1:30        if st.button("Cancel", use_container_width=True):31            st.rerun()32    33    with col2:34        if st.button("Delete", type="primary", use_container_width=True):35            deleted_session = st.session_state.chat_sessions.pop(idx)36            st.toast("Item permanently deleted!", icon=":material/delete:")37 38            if st.session_state.messages == deleted_session.get("messages", []):39                st.session_state.messages = []40 41            db = load_userDB()42            if st.session_state.username in db:43                db[st.session_state.username]["sessions"] = st.session_state.chat_sessions44                save_userDB(db)45            st.rerun()46 47def render_sidebar():48    with st.sidebar:49        if st.session_state.auth_stat == 'guest':50            st.markdown("## :material/emoji_people: Welcome, Guest!")51        else:52            display_name = st.session_state.username.capitalize()53            st.markdown(f"## :material/emoji_people: Hi, {display_name}!")54        st.write("")55        56        if st.session_state.auth_stat == 'guest':57            if st.button(":material/login: Login / Sign Up", type="secondary", use_container_width=True):58                render_auth_dialog()59        else:60            if st.button(":material/logout: Logout", use_container_width=True):61                st.session_state.auth_stat = 'guest'62                st.session_state.username = 'guest'63                st.session_state.messages = []64                if "chat_sessions" in st.session_state:65                    del st.session_state.chat_sessions66                st.rerun()67 68        if st.button(":material/add: New Chat", use_container_width=True):69            if st.session_state.auth_stat != 'guest':70                save_chat_history(st.session_state.username, st.session_state.messages)71            st.session_state.messages = []72            st.rerun()73        st.divider()74 75        st.subheader("Database Connection")76        is_connected, error_msg = check_db_connection()77 78        if is_connected:79            st.success(icon=":material/database:", body="Connected")80        else:81            st.error(icon=":material/database_off:", body="Disconnected")82            st.caption("Connection failed. Please check your configuration.")83        84        st.subheader("Model Selector")85        available_models = get_available_models()86        st.session_state.current_model = st.selectbox(87            "Select model:",88            available_models,89            label_visibility="collapsed"90        )91        st.divider()92 93        st.subheader(":material/history: History")94        if st.session_state.auth_stat == 'guest':95            st.info("You are in Guest Mode. Your conversation history will not be saved.")96        else:97            st.caption(f"Authenticated as: {st.session_state.username}")98            if "chat_sessions" not in st.session_state:99                db = load_userDB()100                st.session_state.chat_sessions = db.get(st.session_state.username, {}).get("sessions", [])101 102            if st.session_state.messages:103                st.button(f":material/chat_bubble: Active Session Logs", disabled=True, use_container_width=True)104 105            if not st.session_state.chat_sessions:106                st.caption('Query your database now')107            else:108                for idx, session in enumerate(st.session_state.chat_sessions):109                    col1, col2 = st.columns([0.80, 0.20])110 111                    with col1:112                        session_title = session.get("title", f"Chat {idx + 1}")113                        if st.button(114                            f"{session_title[:25]}...",115                            key=f"load_session_{idx}",116                            use_container_width=True117                        ):118                            st.session_state.messages = session.get("messages", [])119                            st.rerun()120 121                    with col2:122                        if st.button(":material/delete:", key=f"delete_session_{idx}"):123                            confirm_delete(idx, session_title)