hydrate_middleware.py 1.9 KB

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