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() | |