"""
splash_page.py
──────────────
Splash screen modern, full-viewport centered.
Hanya tampil SEKALI saat pertama kali sistem diakses (browser baru/tab baru).
Jika halaman di-refresh (F5), splash TIDAK akan muncul lagi — karena status
"sudah pernah splash" disimpan di URL query parameter, bukan di session_state.
⚠️ KENAPA TIDAK PAKAI session_state SAJA?
session_state Streamlit terikat ke session koneksi, bukan ke browser/tab.
Pada beberapa kondisi (reconnect websocket, refresh di beberapa environment
hosting), session_state bisa ter-reset sehingga splash muncul lagi padahal
user hanya refresh. query_params (di URL) tidak hilang saat refresh biasa,
sehingga lebih andal untuk menandai "splash sudah pernah tampil".
🕐 PENGATURAN DURASI:
_SPLASH_DURATION = 10 ← ganti angka ini (satuan: detik)
Rekomendasi: 4–8 detik
📐 PENGATURAN TINGGI IFRAME:
components.html(..., height=700 ...) ← sesuaikan jika konten terpotong
"""
import time
import streamlit as st
import streamlit.components.v1 as components
_APP_NAME = "SentiTrack"
# ┌─────────────────────────────────────────┐
# │ ⏱ GANTI ANGKA INI UNTUK UBAH DURASI │
# │ Satuan: detik | Rekomendasi: 4–8 │
_SPLASH_DURATION = 10
# └─────────────────────────────────────────┘
# Nama parameter URL yang dipakai sebagai "penanda" splash sudah tampil.
# Tidak perlu diubah, kecuali bentrok dengan query param lain di app kamu.
_SPLASH_FLAG_KEY = "splashed"
def _build_splash_html(duration: int) -> str:
return f"""
📊
{_APP_NAME}
Dashboard Monitoring Sentimen Netizen terhadap Kebijakan Pembatasan Gratis Ongkir
📌 Topik Penelitian
Perancangan dan Implementasi Dashboard Sentimen Netizen X terhadap Kebijakan Pembatasan Gratis Ongkir dengan Naive Bayes
Komdigi · Analisis Opini Publik di Platform X (Twitter)
🤖
Model
Naive Bayes
📡
Sumber Data
X Data Historis via Tweet Harvest & Realtime
🔤
Preprocessing
Case Folding · Cleaning · Normalisasi · Stopword · Stemming
"""
def maybe_show_splash() -> bool:
"""
Tampilkan splash HANYA jika belum pernah tampil di browser ini.
Mekanisme:
- Saat splash ditampilkan untuk pertama kali, kita menambahkan
query parameter ?splashed=1 ke URL via st.query_params.
- Karena ini tersimpan di URL (bukan di session_state server),
query parameter ini TETAP ADA saat halaman di-refresh (F5).
- Jadi: refresh biasa -> splash TIDAK muncul lagi.
buka tab/browser baru tanpa parameter itu -> splash muncul.
klik tombol "reset splash" (lihat reset_splash()) -> splash
akan muncul lagi di reload berikutnya.
Return:
True -> splash baru saja ditampilkan (halaman akan rerun setelahnya)
False -> splash dilewati (sudah pernah tampil sebelumnya)
"""
# Cek apakah flag sudah ada di URL
already_splashed = st.query_params.get(_SPLASH_FLAG_KEY) == "1"
if already_splashed:
return False
# Sembunyikan semua elemen Streamlit selama splash
st.markdown("""
""", unsafe_allow_html=True)
# ┌───────────────────────────────────────────────────────┐
# │ 📐 TINGGI IFRAME (px) │
# │ Naikkan jika card terpotong di layar kecil. │
# │ Rekomendasi: 650–750 │
components.html(_build_splash_html(_SPLASH_DURATION), height=700, scrolling=False)
# └───────────────────────────────────────────────────────┘
# Tunggu sesuai durasi splash sebelum lanjut ke halaman utama
time.sleep(_SPLASH_DURATION + 0.3)
# Tandai di URL bahwa splash sudah pernah tampil.
# Penanda ini bertahan walau halaman di-refresh (F5).
st.query_params[_SPLASH_FLAG_KEY] = "1"
st.rerun()
return True
def reset_splash():
"""
Opsional: panggil fungsi ini (misalnya dari tombol di sidebar)
jika ingin memaksa splash muncul lagi di reload berikutnya.
Contoh penggunaan:
if st.sidebar.button("Tampilkan ulang splash"):
reset_splash()
st.rerun()
"""
if _SPLASH_FLAG_KEY in st.query_params:
del st.query_params[_SPLASH_FLAG_KEY]