1111import functools
1212import inspect
1313import pickle
14+ import re
1415import sys
1516import time
1617import typing
@@ -2471,15 +2472,23 @@ def wrapper() -> Component:
24712472 return wrapper
24722473
24732474
2475+ # sessionStorage key holding the ms timestamp of the last reload on error
2476+ LAST_RELOADED_KEY = "reflex_last_reloaded_on_error"
2477+
2478+
24742479class FrontendEventExceptionState (State ):
24752480 """Substate for handling frontend exceptions."""
24762481
24772482 # If the frontend error message contains any of these strings, automatically reload the page.
2478- auto_reload_on_errors : ClassVar [list [str ]] = [
2479- "TypeError: Cannot read properties of null" ,
2483+ auto_reload_on_errors : ClassVar [list [re .Pattern ]] = [
2484+ re .compile ( # Chrome/Edge
2485+ re .escape ("TypeError: Cannot read properties of null" )
2486+ ),
2487+ re .compile (re .escape ("TypeError: null is not an object" )), # Safari
2488+ re .compile (r"TypeError: can't access property \".*\" of null" ), # Firefox
24802489 ]
24812490 # Reload the page only once per cooldown period to avoid reload loops.
2482- auto_reload_cooldown_time_ms : ClassVar [int ] = 10000
2491+ auto_reload_cooldown_time_ms : ClassVar [int ] = 10000 # 10 seconds
24832492
24842493 @event
24852494 def handle_frontend_exception (
@@ -2499,12 +2508,15 @@ def handle_frontend_exception(
24992508 """
25002509 # Handle automatic reload for certain errors.
25012510 if type (self ).auto_reload_on_errors and any (
2502- error in info for error in type (self ).auto_reload_on_errors
2511+ error . search ( info ) for error in type (self ).auto_reload_on_errors
25032512 ):
25042513 yield call_script (
2505- "const last_reload = parseInt(window.sessionStorage.getItem('reflex_last_reloaded_on_error ')) || 0;"
2514+ f "const last_reload = parseInt(window.sessionStorage.getItem('{ LAST_RELOADED_KEY } ')) || 0;"
25062515 f"if (Date.now() - last_reload > { type (self ).auto_reload_cooldown_time_ms } )"
2507- "{window.sessionStorage.setItem('reflex_last_reloaded_on_error', Date.now().toString()); window.location.reload(true);}"
2516+ "{"
2517+ f"window.sessionStorage.setItem('{ LAST_RELOADED_KEY } ', Date.now().toString());"
2518+ "window.location.reload(true);"
2519+ "}"
25082520 )
25092521 prerequisites .get_and_validate_app ().app .frontend_exception_handler (
25102522 Exception (info )
0 commit comments