Spaces:
Sleeping
Sleeping
import streamlit as st | |
from app.chat import ( | |
create_chat_session, | |
list_chat_sessions, | |
ensure_chat_session, | |
delete_chat_session, | |
delete_all_chat_sessions, | |
) | |
from app.db import supabase | |
def render_sidebar_sessions(): | |
"""Render the sidebar: sessions list/search/pagination, actions, and logout. | |
Assumes st.session_state['user'] exists. | |
""" | |
st.sidebar.header("Percakapan") | |
if st.sidebar.button("β New Chat", use_container_width=True): | |
uid = st.session_state["user"]["id"] | |
new_sid = create_chat_session(uid, title="Percakapan Baru") | |
st.session_state["session_id"] = new_sid | |
for k in ["history", "generated", "past", "input_text", "tts_output", "tts_played"]: | |
if k in st.session_state: | |
del st.session_state[k] | |
st.rerun() | |
# Search and pagination controls | |
search_query = st.sidebar.text_input("Cari sesi", value=st.session_state.get("session_search", "")) | |
st.session_state["session_search"] = search_query | |
page_size = st.sidebar.selectbox("Jumlah per halaman", [5, 10, 20, 50], index=1, key="session_page_size") | |
current_page = st.session_state.get("session_page", 0) | |
# Fetch sessions | |
try: | |
sessions = list_chat_sessions(st.session_state["user"]["id"], limit=1000) | |
except Exception as e: | |
st.sidebar.error(f"Tidak dapat memuat sesi: {e}") | |
sessions = [] | |
# Filter by search | |
if search_query: | |
sq = search_query.lower() | |
sessions = [s for s in sessions if sq in (s.get("title") or "").lower() or sq in s.get("id", "").lower()] | |
# Pagination | |
total = len(sessions) | |
start = current_page * page_size | |
end = start + page_size | |
page_sessions = sessions[start:end] | |
cols = st.sidebar.columns([1, 3, 1]) | |
disable_prev = current_page <= 0 | |
disable_next = end >= total | |
if cols[0].button("β", disabled=disable_prev): | |
st.session_state["session_page"] = max(0, current_page - 1) | |
st.rerun() | |
cols[1].markdown(f"Halaman {current_page + 1} / {max(1, (total + page_size - 1) // page_size)}") | |
if cols[2].button("β", disabled=disable_next): | |
st.session_state["session_page"] = current_page + 1 | |
st.rerun() | |
# List sessions with select and delete | |
for s in page_sessions: | |
sid = s["id"] | |
title = s.get("title") or sid | |
row = st.sidebar.container() | |
subcols = row.columns([6, 1]) | |
if subcols[0].button(title, key=f"select_{sid}"): | |
st.session_state["session_id"] = sid | |
ensure_chat_session(st.session_state["user"]["id"], sid) # ensure selected session exists | |
# Clear local caches if switching | |
for k in ["history", "generated", "past"]: | |
if k in st.session_state: | |
del st.session_state[k] | |
st.rerun() | |
if subcols[1].button("β", key=f"del_{sid}"): | |
try: | |
ok = delete_chat_session(st.session_state["user"]["id"], sid) | |
if ok: | |
# If deleting active, choose next one or create new | |
if st.session_state.get("session_id") == sid: | |
remaining = [x for x in sessions if x["id"] != sid] | |
if remaining: | |
st.session_state["session_id"] = remaining[0]["id"] | |
else: | |
st.session_state["session_id"] = create_chat_session(st.session_state["user"]["id"], title="Percakapan Baru") | |
for k in ["history", "generated", "past"]: | |
if k in st.session_state: | |
del st.session_state[k] | |
st.success("Sesi dihapus") | |
st.rerun() | |
else: | |
st.error("Gagal menghapus sesi") | |
except Exception as e: | |
st.error(f"Gagal menghapus: {e}") | |
st.sidebar.divider() | |
with st.sidebar.expander("Hapus Semua Percakapan", expanded=False): | |
confirm = st.checkbox("Saya yakin ingin menghapus semua percakapan", key="confirm_delete_all") | |
if st.button("Hapus Semua", type="primary", disabled=not confirm): | |
try: | |
ok = delete_all_chat_sessions(st.session_state["user"]["id"]) | |
if ok: | |
st.session_state["session_id"] = create_chat_session(st.session_state["user"]["id"], title="Percakapan Baru") | |
for k in ["history", "generated", "past"]: | |
if k in st.session_state: | |
del st.session_state[k] | |
st.success("Semua percakapan dihapus") | |
st.rerun() | |
else: | |
st.error("Gagal menghapus semua percakapan") | |
except Exception as e: | |
st.error(f"Gagal menghapus semua: {e}") | |
st.sidebar.divider() | |
if st.sidebar.button("Logout"): | |
try: | |
supabase.auth.sign_out() | |
except Exception: | |
pass | |
for k in [ | |
"user", "history", "generated", "past", "input_text", | |
"tts_output", "tts_played", "vector_store", "session_id", "sb_session" | |
]: | |
if k in st.session_state: | |
del st.session_state[k] | |
st.success("Anda telah logout") | |
st.rerun() | |