Spaces:
Runtime error
Runtime error
Apurva Tiwari commited on
Commit ·
c7f9fd7
1
Parent(s): 7d1144c
Remove all browser lifecycle detection - embrace state persistence
Browse files- Remove unused reset_ui and on_page_load controllers
- Remove client-side session detection scripts
- Let browser remember last UI state (sessions persist)
- Users can return to landing via Main Page button
- Much simpler and cleaner code
app.py
CHANGED
|
@@ -23,31 +23,6 @@ from simple_session_manager import SESSION_MANAGER, get_session_by_alias
|
|
| 23 |
server = get_server()
|
| 24 |
state, ctrl = server.state, server.controller
|
| 25 |
|
| 26 |
-
# Track client connections to detect new browser sessions
|
| 27 |
-
_active_clients = set()
|
| 28 |
-
|
| 29 |
-
@server.state.change("trame__busy")
|
| 30 |
-
def _on_client_activity(*args, **kwargs):
|
| 31 |
-
"""
|
| 32 |
-
Detect new client connections.
|
| 33 |
-
When trame__busy changes from None, it means a client just connected.
|
| 34 |
-
"""
|
| 35 |
-
client_id = kwargs.get("__client_id")
|
| 36 |
-
if client_id and client_id not in _active_clients:
|
| 37 |
-
print(f"[APP] New client connected: {client_id}")
|
| 38 |
-
_active_clients.add(client_id)
|
| 39 |
-
|
| 40 |
-
# ALWAYS reset to landing page for new connections
|
| 41 |
-
# This ensures browser reopens always start at landing
|
| 42 |
-
print(f"[APP] Resetting to landing page for new client")
|
| 43 |
-
state.current_page = None
|
| 44 |
-
state.session_active = False
|
| 45 |
-
state.session_card_visible = True
|
| 46 |
-
state.session_alias = ""
|
| 47 |
-
state.current_session_id = None
|
| 48 |
-
state.session_alias_input = ""
|
| 49 |
-
state.session_error = ""
|
| 50 |
-
|
| 51 |
# --- App state
|
| 52 |
state.current_page = None # None = landing, "EM" or "QLBM"
|
| 53 |
state.session_active = False
|
|
@@ -112,40 +87,6 @@ def on_session_selected(session_id: str):
|
|
| 112 |
print(f"[APP] Error selecting session: {e}")
|
| 113 |
state.session_error = str(e)
|
| 114 |
state.session_active = False
|
| 115 |
-
|
| 116 |
-
# --- Controller to reset UI on page load ---
|
| 117 |
-
@ctrl.add("reset_ui")
|
| 118 |
-
def _reset_ui():
|
| 119 |
-
"""Reset UI to landing page (called when browser closes/reopens)."""
|
| 120 |
-
print(f"[RESET_UI] Resetting to landing page")
|
| 121 |
-
print(f"[RESET_UI] Current state: page={state.current_page}, session_active={state.session_active}, session_id={state.current_session_id}")
|
| 122 |
-
|
| 123 |
-
state.current_page = None
|
| 124 |
-
state.session_card_visible = True
|
| 125 |
-
state.session_active = False
|
| 126 |
-
state.session_alias = ""
|
| 127 |
-
state.current_session_id = None
|
| 128 |
-
state.session_alias_input = ""
|
| 129 |
-
state.session_error = ""
|
| 130 |
-
state.session_action_trigger = None
|
| 131 |
-
|
| 132 |
-
print(f"[RESET_UI] State after reset: page={state.current_page}, session_active={state.session_active}")
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
@ctrl.add("on_page_load")
|
| 136 |
-
def _on_page_load(is_new_session: bool):
|
| 137 |
-
"""Handle page load event from browser."""
|
| 138 |
-
print(f"[PAGE_LOAD] is_new_session={is_new_session}")
|
| 139 |
-
print(f"[PAGE_LOAD] Current state: page={state.current_page}, session_active={state.session_active}, session_id={state.current_session_id}")
|
| 140 |
-
|
| 141 |
-
if is_new_session:
|
| 142 |
-
print(f"[PAGE_LOAD] *** NEW BROWSER SESSION DETECTED ***")
|
| 143 |
-
print(f"[PAGE_LOAD] Resetting to landing page")
|
| 144 |
-
_reset_ui()
|
| 145 |
-
else:
|
| 146 |
-
print(f"[PAGE_LOAD] Page refresh in same browser session - keeping current state")
|
| 147 |
-
|
| 148 |
-
|
| 149 |
# Watcher to reset navigation when no session is active
|
| 150 |
@state.change("session_active")
|
| 151 |
def _on_session_status_change(session_active, **kwargs):
|
|
@@ -254,37 +195,6 @@ with SinglePageLayout(server) as layout:
|
|
| 254 |
.success-bounce { animation: successBounce 0.6s ease; color: #1e9e3e; }
|
| 255 |
""")
|
| 256 |
|
| 257 |
-
# Simple client-side script to detect new browser sessions
|
| 258 |
-
# This is MUCH simpler than the complex lifecycle detection
|
| 259 |
-
with trame_html.Div():
|
| 260 |
-
trame_html.Script("""
|
| 261 |
-
console.log('[SESSION-CHECK] Checking browser session state...');
|
| 262 |
-
|
| 263 |
-
// Check if this is a new browser session (sessionStorage is empty when browser reopens)
|
| 264 |
-
const SESSION_KEY = '__quantum_active__';
|
| 265 |
-
const wasActive = sessionStorage.getItem(SESSION_KEY);
|
| 266 |
-
|
| 267 |
-
if (!wasActive) {
|
| 268 |
-
console.log('[SESSION-CHECK] New browser session - sessionStorage was empty');
|
| 269 |
-
sessionStorage.setItem(SESSION_KEY, 'true');
|
| 270 |
-
|
| 271 |
-
// Wait for Trame to be ready, then reset to landing page
|
| 272 |
-
setTimeout(function() {
|
| 273 |
-
if (window.trame && window.trame.state) {
|
| 274 |
-
console.log('[SESSION-CHECK] Resetting to landing page');
|
| 275 |
-
window.trame.state.current_page = null;
|
| 276 |
-
window.trame.state.session_active = false;
|
| 277 |
-
window.trame.state.session_card_visible = true;
|
| 278 |
-
window.trame.state.current_session_id = null;
|
| 279 |
-
}
|
| 280 |
-
}, 200);
|
| 281 |
-
} else {
|
| 282 |
-
console.log('[SESSION-CHECK] Same browser session - keeping state');
|
| 283 |
-
}
|
| 284 |
-
""")
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
with layout.toolbar:
|
| 289 |
vuetify3.VSpacer()
|
| 290 |
|
|
|
|
| 23 |
server = get_server()
|
| 24 |
state, ctrl = server.state, server.controller
|
| 25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
# --- App state
|
| 27 |
state.current_page = None # None = landing, "EM" or "QLBM"
|
| 28 |
state.session_active = False
|
|
|
|
| 87 |
print(f"[APP] Error selecting session: {e}")
|
| 88 |
state.session_error = str(e)
|
| 89 |
state.session_active = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
# Watcher to reset navigation when no session is active
|
| 91 |
@state.change("session_active")
|
| 92 |
def _on_session_status_change(session_active, **kwargs):
|
|
|
|
| 195 |
.success-bounce { animation: successBounce 0.6s ease; color: #1e9e3e; }
|
| 196 |
""")
|
| 197 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 198 |
with layout.toolbar:
|
| 199 |
vuetify3.VSpacer()
|
| 200 |
|