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