hydrate_middleware.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. """Middleware to hydrate the state."""
  2. from __future__ import annotations
  3. from typing import TYPE_CHECKING, Optional
  4. from pynecone import constants, utils
  5. from pynecone.event import Event
  6. from pynecone.middleware.middleware import Middleware
  7. from pynecone.state import Delta, State
  8. if TYPE_CHECKING:
  9. from pynecone.app import App
  10. class HydrateMiddleware(Middleware):
  11. """Middleware to handle initial app hydration."""
  12. def preprocess(self, app: App, state: State, event: Event) -> Optional[Delta]:
  13. """Preprocess the event.
  14. Args:
  15. app: The app to apply the middleware to.
  16. state: The client state.
  17. event: The event to preprocess.
  18. Returns:
  19. An optional state to return.
  20. """
  21. if event.name == utils.get_hydrate_event(state):
  22. route = event.router_data.get(constants.RouteVar.PATH, "")
  23. if route == "/":
  24. load_event = app.load_events.get(constants.INDEX_ROUTE)
  25. elif route:
  26. load_event = app.load_events.get(route.lstrip("/"))
  27. else:
  28. load_event = None
  29. if load_event:
  30. substate_path = utils.format_event_handler(load_event).split(".")
  31. ex_state = state.get_substate(substate_path[:-1])
  32. load_event.fn(ex_state)
  33. return utils.format_state({state.get_name(): state.dict()})