1
1
# mypy: disable-error-code=attr-defined
2
2
import asyncio
3
- from typing import Callable
4
-
5
- import js
6
- from jsonpointer import set_pointer
7
- from pyodide .ffi .wrappers import add_event_listener
8
- from reactpy .core .layout import Layout
9
- from reactpy .types import ComponentType
10
3
11
4
12
5
class ReactPyLayoutHandler :
@@ -23,13 +16,17 @@ def __init__(self, uuid):
23
16
@staticmethod
24
17
def apply_update (update , root_model ):
25
18
"""Apply an update ReactPy's internal DOM model."""
19
+ from jsonpointer import set_pointer
20
+
26
21
if update ["path" ]:
27
22
set_pointer (root_model , update ["path" ], update ["model" ])
28
23
else :
29
24
root_model .update (update ["model" ])
30
25
31
26
def render (self , layout , model ):
32
27
"""Submit ReactPy's internal DOM model into the HTML DOM."""
28
+ import js
29
+
33
30
container = js .document .getElementById (f"pyscript-{ self .uuid } " )
34
31
35
32
# FIXME: The current implementation completely recreates the DOM on every render.
@@ -39,6 +36,8 @@ def render(self, layout, model):
39
36
40
37
def build_element_tree (self , layout , parent , model ):
41
38
"""Recursively build an element tree, starting from the root component."""
39
+ import js
40
+
42
41
if isinstance (model , str ):
43
42
parent .appendChild (js .document .createTextNode (model ))
44
43
elif isinstance (model , dict ):
@@ -74,6 +73,8 @@ def build_element_tree(self, layout, parent, model):
74
73
def create_event_handler (layout , element , event_name , event_handler_model ):
75
74
"""Create an event handler for an element. This function is used as an
76
75
adapter between ReactPy and browser events."""
76
+ from pyodide .ffi .wrappers import add_event_listener
77
+
77
78
target = event_handler_model ["target" ]
78
79
79
80
def event_handler (* args ):
@@ -89,6 +90,8 @@ def delete_old_workspaces():
89
90
"""To prevent memory leaks, we must delete all user generated Python code
90
91
whe it is no longer on the page. To do this, we compare what UUIDs exist on
91
92
the DOM, versus what UUIDs exist within the PyScript global interpreter."""
93
+ import js
94
+
92
95
dom_workspaces = js .document .querySelectorAll (".pyscript" )
93
96
dom_uuids = {element .dataset .uuid for element in dom_workspaces }
94
97
python_uuids = {
@@ -115,8 +118,10 @@ def delete_old_workspaces():
115
118
f"Warning: Could not auto delete PyScript workspace { workspace_name } "
116
119
)
117
120
118
- async def run (self , workspace_function : Callable [[], ComponentType ] ):
121
+ async def run (self , workspace_function ):
119
122
"""Run the layout handler. This function is main executor for all user generated code."""
123
+ from reactpy .core .layout import Layout
124
+
120
125
self .delete_old_workspaces ()
121
126
root_model : dict = {}
122
127
0 commit comments