Skip to content

Commit 9650b0f

Browse files
committed
replace "reload" functionality with internal rehydration
instead of telling the frontend to reload, just hydrate and run on_load internally before processing the user's requested event.
1 parent c50d2b2 commit 9650b0f

3 files changed

Lines changed: 49 additions & 6 deletions

File tree

packages/reflex-core/src/reflex_core/.templates/web/utils/state.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -672,10 +672,6 @@ export const connect = async (
672672
queueEvents(update.events, socket, false, navigate, params);
673673
}
674674
});
675-
socket.current.on("reload", async (event) => {
676-
on_hydrated_queue.push(event);
677-
queueEvents(initialEvents(), socket, true, navigate, params);
678-
});
679675
socket.current.on("new_token", async (new_token) => {
680676
token = new_token;
681677
window.sessionStorage.setItem(TOKEN_KEY, new_token);

packages/reflex-core/src/reflex_core/_internal/event/processor/base_state_processor.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,20 @@
1919
EventQueueEntry,
2020
RegisteredEventHandler,
2121
)
22+
from reflex_core.utils.format import format_event_handler
2223

2324
if TYPE_CHECKING:
2425
from reflex.event import EventHandler, EventSpec
2526
from reflex.state import BaseState
2627

2728

29+
@functools.lru_cache(maxsize=1)
30+
def _hydrate_event_name():
31+
from reflex.state import State
32+
33+
return format_event_handler(State.event_handlers["hydrate"])
34+
35+
2836
def _check_valid_yield(events: Any, handler_name: str = "unknown") -> Any:
2937
"""Check if the events yielded are valid. They must be EventHandlers or EventSpecs.
3038
@@ -271,6 +279,33 @@ class BaseStateEventProcessor(EventProcessor):
271279
frontend.
272280
"""
273281

282+
async def _rehydrate(self, root_state: BaseState):
283+
"""Rehydrate the state by calling the hydrate event handler.
284+
285+
Args:
286+
root_state: The root state to rehydrate.
287+
"""
288+
from reflex.state import OnLoadInternalState, State
289+
290+
if (
291+
type(root_state) is not State
292+
or OnLoadInternalState.get_name() not in root_state.substates
293+
):
294+
return
295+
296+
await process_event(
297+
handler=State.event_handlers["hydrate"],
298+
payload={},
299+
state=root_state,
300+
root_state=root_state,
301+
)
302+
await process_event(
303+
handler=OnLoadInternalState.event_handlers["on_load_internal"],
304+
payload={},
305+
state=await root_state.get_state(OnLoadInternalState),
306+
root_state=root_state,
307+
)
308+
274309
async def _process_event_queue_entry(
275310
self, *, entry: EventQueueEntry, registered_handler: RegisteredEventHandler
276311
) -> None:
@@ -295,7 +330,10 @@ async def _process_event_queue_entry(
295330
),
296331
event=entry.event,
297332
) as state:
298-
# TODO: handle "reload" trigger of brand new state instances
333+
# Compatibility hack rehydrate the state before processing this event.
334+
needs_to_rehydrate = bool(
335+
not state.router_data and event.name != _hydrate_event_name()
336+
)
299337

300338
# re-assign only when the value is set and different
301339
if router_data and state.router_data != router_data:
@@ -322,6 +360,9 @@ async def _process_event_queue_entry(
322360
substate = await state.get_state(event.state_cls)
323361
root_state = state._get_root_state()
324362

363+
if needs_to_rehydrate:
364+
await self._rehydrate(root_state)
365+
325366
# Process non-background events while holding the lock.
326367
if not registered_handler.handler.is_background:
327368
await process_event(

tests/units/conftest.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,18 @@ def handle_backend_exception(ex: Exception) -> None:
281281

282282

283283
@pytest.fixture
284-
def mock_base_state_event_processor_obj() -> BaseStateEventProcessor:
284+
def mock_base_state_event_processor_obj(
285+
monkeypatch: pytest.MonkeyPatch,
286+
) -> BaseStateEventProcessor:
285287
"""Create a BaseState event processor.
286288
289+
Args:
290+
monkeypatch: pytest monkeypatch fixture.
291+
287292
Returns:
288293
A fresh BaseState event processor.
289294
"""
295+
monkeypatch.setattr(BaseStateEventProcessor, "_rehydrate", mock.AsyncMock())
290296

291297
def handle_backend_exception(ex: Exception) -> None:
292298
formatted_exc = "\n".join(traceback.format_exception(ex))

0 commit comments

Comments
 (0)