diff options
| author | Tyler <tyler@tylerhoang.xyz> | 2026-05-17 01:01:04 -0700 |
|---|---|---|
| committer | Tyler <tyler@tylerhoang.xyz> | 2026-05-17 01:01:04 -0700 |
| commit | 9c681a2292b4ab7ca9d8975889fe78b6bf4e0305 (patch) | |
| tree | 10e2d10ded75523b7e3de3c4ac925ff0e2979b62 /app.py | |
| parent | 2ea1abbe88b2b4acb1c58a74022fcec42d02a4c2 (diff) | |
| parent | 48f3bc1960d71785aad44292205845612a4f1cb8 (diff) | |
Merge feature/session-persistence: session persistence + watchlist exit button
- Persists watchlist and active ticker to localStorage across page reloads
- Adds "← Watchlist" button in sidebar to return to landing page
- Fixes write-before-read race that destroyed stored data on fresh load
- Fixes click swallow caused by st.rerun() aborting render before click
receivers were registered
Diffstat (limited to 'app.py')
| -rw-r--r-- | app.py | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -406,7 +406,9 @@ hr { /* Hide click receiver inputs without removing them from React's event system */ [data-testid="stSidebar"] [data-testid="stTextInput"]:has(input[aria-label="wl_click_receiver"]), -[data-testid="stTextInput"]:has(input[aria-label="qt_click_receiver"]) { +[data-testid="stTextInput"]:has(input[aria-label="qt_click_receiver"]), +[data-testid="stTextInput"]:has(input[aria-label="persist_wl"]), +[data-testid="stTextInput"]:has(input[aria-label="persist_tk"]) { visibility: hidden !important; height: 0 !important; min-height: 0 !important; @@ -590,6 +592,7 @@ _prism_template = go.layout.Template(layout=_prism_layout) pio.templates["prism"] = _prism_template pio.templates.default = "prism" +from components.persistence import render_persistence_bridge from components.market_bar import render_market_bar from components.top_movers import render_top_movers from components.watchlist import render_watchlist @@ -614,6 +617,7 @@ if "watchlist" not in st.session_state: if "active_tab" not in st.session_state: st.session_state["active_tab"] = "overview" +render_persistence_bridge() # ── Sidebar ─────────────────────────────────────────────────────────────────── @@ -719,6 +723,12 @@ with st.sidebar: ticker = st.session_state["ticker"] + # ── Exit to landing page ────────────────────────────────────────────── + if st.session_state.get("ticker"): + if st.button("← Watchlist", key="exit_ticker", use_container_width=True): + st.session_state["ticker"] = None + st.rerun() + # ── Workspace nav ───────────────────────────────────────────────────── st.markdown("<div class='psm-nav-section'>Workspace</div>", unsafe_allow_html=True) _nav = [ |
