dvwn/nl2sql-api
0
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)