reflex 0.5.10a3__py3-none-any.whl → 0.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +2 -2
- reflex/.templates/jinja/web/pages/_app.js.jinja2 +1 -1
- reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -4
- reflex/.templates/jinja/web/utils/context.js.jinja2 +1 -1
- reflex/.templates/jinja/web/utils/theme.js.jinja2 +1 -1
- reflex/.templates/web/utils/state.js +3 -1
- reflex/__init__.py +10 -3
- reflex/__init__.pyi +3 -2
- reflex/app.py +47 -11
- reflex/app_module_for_backend.py +1 -1
- reflex/base.py +3 -2
- reflex/compiler/compiler.py +5 -5
- reflex/compiler/utils.py +5 -3
- reflex/components/base/app_wrap.py +2 -4
- reflex/components/base/app_wrap.pyi +16 -26
- reflex/components/base/bare.py +6 -4
- reflex/components/base/body.pyi +16 -26
- reflex/components/base/document.pyi +76 -126
- reflex/components/base/error_boundary.py +9 -8
- reflex/components/base/error_boundary.pyi +18 -30
- reflex/components/base/fragment.pyi +16 -26
- reflex/components/base/head.pyi +31 -51
- reflex/components/base/link.py +1 -1
- reflex/components/base/link.pyi +31 -51
- reflex/components/base/meta.pyi +61 -101
- reflex/components/base/script.py +2 -2
- reflex/components/base/script.pyi +20 -36
- reflex/components/component.py +107 -130
- reflex/components/core/banner.py +61 -66
- reflex/components/core/banner.pyi +129 -230
- reflex/components/core/client_side_routing.py +2 -2
- reflex/components/core/client_side_routing.pyi +31 -51
- reflex/components/core/clipboard.py +4 -3
- reflex/components/core/clipboard.pyi +19 -31
- reflex/components/core/cond.py +21 -44
- reflex/components/core/debounce.py +7 -9
- reflex/components/core/debounce.pyi +19 -31
- reflex/components/core/foreach.py +4 -14
- reflex/components/core/html.py +1 -1
- reflex/components/core/html.pyi +34 -44
- reflex/components/core/match.py +36 -43
- reflex/components/core/upload.py +27 -26
- reflex/components/core/upload.pyi +81 -116
- reflex/components/datadisplay/code.py +55 -29
- reflex/components/datadisplay/code.pyi +303 -410
- reflex/components/datadisplay/dataeditor.py +13 -9
- reflex/components/datadisplay/dataeditor.pyi +39 -51
- reflex/components/el/__init__.py +0 -1
- reflex/components/el/__init__.pyi +0 -11
- reflex/components/el/element.pyi +16 -26
- reflex/components/el/elements/__init__.py +1 -7
- reflex/components/el/elements/__init__.pyi +1 -15
- reflex/components/el/elements/base.py +1 -1
- reflex/components/el/elements/base.pyi +33 -43
- reflex/components/el/elements/forms.py +26 -33
- reflex/components/el/elements/forms.pyi +542 -694
- reflex/components/el/elements/inline.py +1 -1
- reflex/components/el/elements/inline.pyi +909 -1189
- reflex/components/el/elements/media.py +1 -22
- reflex/components/el/elements/media.pyi +765 -975
- reflex/components/el/elements/metadata.py +3 -5
- reflex/components/el/elements/metadata.pyi +175 -235
- reflex/components/el/elements/other.py +1 -1
- reflex/components/el/elements/other.pyi +228 -298
- reflex/components/el/elements/scripts.py +1 -1
- reflex/components/el/elements/scripts.pyi +106 -136
- reflex/components/el/elements/sectioning.py +0 -2
- reflex/components/el/elements/sectioning.pyi +481 -631
- reflex/components/el/elements/tables.py +1 -1
- reflex/components/el/elements/tables.pyi +341 -441
- reflex/components/el/elements/typography.py +1 -1
- reflex/components/el/elements/typography.pyi +491 -641
- reflex/components/gridjs/datatable.py +9 -13
- reflex/components/gridjs/datatable.pyi +33 -53
- reflex/components/lucide/icon.py +3 -127
- reflex/components/lucide/icon.pyi +31 -160
- reflex/components/markdown/markdown.py +32 -42
- reflex/components/markdown/markdown.pyi +28 -41
- reflex/components/moment/moment.py +13 -12
- reflex/components/moment/moment.pyi +22 -33
- reflex/components/next/base.pyi +16 -26
- reflex/components/next/image.py +1 -5
- reflex/components/next/image.pyi +21 -35
- reflex/components/next/link.py +1 -1
- reflex/components/next/link.pyi +16 -26
- reflex/components/next/video.py +1 -1
- reflex/components/next/video.pyi +16 -26
- reflex/components/plotly/plotly.py +17 -30
- reflex/components/plotly/plotly.pyi +38 -52
- reflex/components/props.py +21 -10
- reflex/components/radix/__init__.pyi +2 -1
- reflex/components/radix/primitives/accordion.py +6 -7
- reflex/components/radix/primitives/accordion.pyi +415 -485
- reflex/components/radix/primitives/base.py +1 -1
- reflex/components/radix/primitives/base.pyi +31 -51
- reflex/components/radix/primitives/drawer.py +1 -1
- reflex/components/radix/primitives/drawer.pyi +162 -262
- reflex/components/radix/primitives/form.py +1 -1
- reflex/components/radix/primitives/form.pyi +247 -353
- reflex/components/radix/primitives/progress.py +1 -1
- reflex/components/radix/primitives/progress.pyi +226 -276
- reflex/components/radix/primitives/slider.py +1 -1
- reflex/components/radix/primitives/slider.pyi +82 -132
- reflex/components/radix/themes/base.py +8 -25
- reflex/components/radix/themes/base.pyi +171 -242
- reflex/components/radix/themes/color_mode.py +11 -20
- reflex/components/radix/themes/color_mode.pyi +198 -231
- reflex/components/radix/themes/components/__init__.pyi +1 -0
- reflex/components/radix/themes/components/alert_dialog.py +1 -1
- reflex/components/radix/themes/components/alert_dialog.pyi +129 -199
- reflex/components/radix/themes/components/aspect_ratio.py +1 -1
- reflex/components/radix/themes/components/aspect_ratio.pyi +16 -26
- reflex/components/radix/themes/components/avatar.py +1 -1
- reflex/components/radix/themes/components/avatar.pyi +69 -79
- reflex/components/radix/themes/components/badge.py +1 -1
- reflex/components/radix/themes/components/badge.pyi +87 -97
- reflex/components/radix/themes/components/button.py +1 -1
- reflex/components/radix/themes/components/button.pyi +97 -107
- reflex/components/radix/themes/components/callout.py +1 -1
- reflex/components/radix/themes/components/callout.pyi +317 -367
- reflex/components/radix/themes/components/card.py +1 -1
- reflex/components/radix/themes/components/card.pyi +37 -47
- reflex/components/radix/themes/components/checkbox.py +2 -4
- reflex/components/radix/themes/components/checkbox.pyi +205 -241
- reflex/components/radix/themes/components/checkbox_cards.py +1 -1
- reflex/components/radix/themes/components/checkbox_cards.pyi +92 -112
- reflex/components/radix/themes/components/checkbox_group.py +1 -1
- reflex/components/radix/themes/components/checkbox_group.pyi +84 -104
- reflex/components/radix/themes/components/context_menu.py +1 -1
- reflex/components/radix/themes/components/context_menu.pyi +230 -310
- reflex/components/radix/themes/components/data_list.py +6 -1
- reflex/components/radix/themes/components/data_list.pyi +131 -166
- reflex/components/radix/themes/components/dialog.py +1 -1
- reflex/components/radix/themes/components/dialog.pyi +132 -202
- reflex/components/radix/themes/components/dropdown_menu.py +1 -1
- reflex/components/radix/themes/components/dropdown_menu.pyi +241 -323
- reflex/components/radix/themes/components/hover_card.py +1 -1
- reflex/components/radix/themes/components/hover_card.pyi +86 -126
- reflex/components/radix/themes/components/icon_button.py +1 -1
- reflex/components/radix/themes/components/icon_button.pyi +97 -107
- reflex/components/radix/themes/components/inset.py +1 -1
- reflex/components/radix/themes/components/inset.pyi +46 -56
- reflex/components/radix/themes/components/popover.py +1 -1
- reflex/components/radix/themes/components/popover.pyi +91 -131
- reflex/components/radix/themes/components/progress.py +1 -1
- reflex/components/radix/themes/components/progress.pyi +70 -80
- reflex/components/radix/themes/components/radio.py +1 -1
- reflex/components/radix/themes/components/radio.pyi +68 -78
- reflex/components/radix/themes/components/radio_cards.py +1 -1
- reflex/components/radix/themes/components/radio_cards.pyi +96 -116
- reflex/components/radix/themes/components/radio_group.py +32 -31
- reflex/components/radix/themes/components/radio_group.pyi +230 -266
- reflex/components/radix/themes/components/scroll_area.py +1 -1
- reflex/components/radix/themes/components/scroll_area.pyi +20 -30
- reflex/components/radix/themes/components/segmented_control.py +1 -1
- reflex/components/radix/themes/components/segmented_control.pyi +88 -110
- reflex/components/radix/themes/components/select.py +1 -1
- reflex/components/radix/themes/components/select.pyi +365 -461
- reflex/components/radix/themes/components/separator.py +2 -4
- reflex/components/radix/themes/components/separator.pyi +68 -78
- reflex/components/radix/themes/components/skeleton.py +1 -1
- reflex/components/radix/themes/components/skeleton.pyi +22 -32
- reflex/components/radix/themes/components/slider.py +1 -1
- reflex/components/radix/themes/components/slider.pyi +74 -86
- reflex/components/radix/themes/components/spinner.py +1 -1
- reflex/components/radix/themes/components/spinner.pyi +18 -28
- reflex/components/radix/themes/components/switch.py +1 -1
- reflex/components/radix/themes/components/switch.pyi +70 -82
- reflex/components/radix/themes/components/table.py +1 -1
- reflex/components/radix/themes/components/table.pyi +254 -324
- reflex/components/radix/themes/components/tabs.py +1 -1
- reflex/components/radix/themes/components/tabs.pyi +134 -188
- reflex/components/radix/themes/components/text_area.py +1 -1
- reflex/components/radix/themes/components/text_area.pyi +95 -109
- reflex/components/radix/themes/components/text_field.py +1 -80
- reflex/components/radix/themes/components/text_field.pyi +245 -290
- reflex/components/radix/themes/components/tooltip.py +1 -1
- reflex/components/radix/themes/components/tooltip.pyi +25 -35
- reflex/components/radix/themes/layout/__init__.pyi +1 -0
- reflex/components/radix/themes/layout/base.py +1 -1
- reflex/components/radix/themes/layout/base.pyi +55 -65
- reflex/components/radix/themes/layout/box.pyi +33 -43
- reflex/components/radix/themes/layout/center.pyi +55 -65
- reflex/components/radix/themes/layout/container.py +2 -4
- reflex/components/radix/themes/layout/container.pyi +35 -45
- reflex/components/radix/themes/layout/flex.py +1 -1
- reflex/components/radix/themes/layout/flex.pyi +55 -65
- reflex/components/radix/themes/layout/grid.py +1 -1
- reflex/components/radix/themes/layout/grid.pyi +63 -73
- reflex/components/radix/themes/layout/list.py +1 -1
- reflex/components/radix/themes/layout/list.pyi +188 -238
- reflex/components/radix/themes/layout/section.py +2 -4
- reflex/components/radix/themes/layout/section.pyi +35 -45
- reflex/components/radix/themes/layout/spacer.pyi +55 -65
- reflex/components/radix/themes/layout/stack.py +1 -1
- reflex/components/radix/themes/layout/stack.pyi +125 -155
- reflex/components/radix/themes/typography/blockquote.py +1 -1
- reflex/components/radix/themes/typography/blockquote.pyi +88 -98
- reflex/components/radix/themes/typography/code.py +1 -1
- reflex/components/radix/themes/typography/code.pyi +89 -99
- reflex/components/radix/themes/typography/heading.py +1 -1
- reflex/components/radix/themes/typography/heading.pyi +95 -105
- reflex/components/radix/themes/typography/link.py +1 -1
- reflex/components/radix/themes/typography/link.pyi +101 -111
- reflex/components/radix/themes/typography/text.py +1 -1
- reflex/components/radix/themes/typography/text.pyi +494 -564
- reflex/components/react_player/audio.pyi +32 -58
- reflex/components/react_player/react_player.py +1 -1
- reflex/components/react_player/react_player.pyi +32 -58
- reflex/components/react_player/video.pyi +32 -58
- reflex/components/recharts/cartesian.py +22 -19
- reflex/components/recharts/cartesian.pyi +658 -840
- reflex/components/recharts/charts.py +3 -3
- reflex/components/recharts/charts.pyi +238 -342
- reflex/components/recharts/general.py +8 -8
- reflex/components/recharts/general.pyi +175 -225
- reflex/components/recharts/polar.py +11 -11
- reflex/components/recharts/polar.pyi +135 -171
- reflex/components/recharts/recharts.pyi +31 -51
- reflex/components/sonner/toast.py +27 -31
- reflex/components/sonner/toast.pyi +36 -45
- reflex/components/suneditor/editor.py +1 -1
- reflex/components/suneditor/editor.pyi +54 -76
- reflex/components/tags/cond_tag.py +6 -4
- reflex/components/tags/iter_tag.py +37 -25
- reflex/components/tags/match_tag.py +6 -4
- reflex/components/tags/tag.py +43 -28
- reflex/constants/base.py +3 -1
- reflex/constants/event.py +1 -0
- reflex/custom_components/custom_components.py +3 -1
- reflex/event.py +166 -108
- reflex/experimental/__init__.py +25 -6
- reflex/experimental/client_state.py +34 -57
- reflex/experimental/hooks.py +12 -17
- reflex/experimental/layout.py +4 -4
- reflex/experimental/layout.pyi +130 -180
- reflex/middleware/hydrate_middleware.py +2 -0
- reflex/middleware/middleware.py +3 -3
- reflex/model.py +22 -0
- reflex/reflex.py +4 -0
- reflex/state.py +491 -110
- reflex/style.py +56 -39
- reflex/testing.py +8 -3
- reflex/utils/exceptions.py +32 -0
- reflex/utils/exec.py +0 -14
- reflex/utils/format.py +80 -209
- reflex/utils/imports.py +16 -73
- reflex/utils/net.py +43 -0
- reflex/utils/path_ops.py +13 -1
- reflex/utils/prerequisites.py +81 -41
- reflex/utils/pyi_generator.py +12 -6
- reflex/utils/serializers.py +13 -41
- reflex/utils/telemetry.py +3 -2
- reflex/utils/types.py +47 -7
- reflex/{experimental/vars → vars}/__init__.py +6 -3
- reflex/vars/base.py +2563 -0
- reflex/vars/function.py +196 -0
- reflex/vars/number.py +1158 -0
- reflex/vars/object.py +562 -0
- reflex/vars/sequence.py +1604 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/METADATA +6 -9
- reflex-0.6.0.dist-info/RECORD +382 -0
- reflex/.templates/apps/demo/.gitignore +0 -4
- reflex/.templates/apps/demo/assets/favicon.ico +0 -0
- reflex/.templates/apps/demo/assets/github.svg +0 -10
- reflex/.templates/apps/demo/assets/icon.svg +0 -37
- reflex/.templates/apps/demo/assets/logo.svg +0 -68
- reflex/.templates/apps/demo/assets/paneleft.svg +0 -13
- reflex/.templates/apps/demo/code/__init__.py +0 -1
- reflex/.templates/apps/demo/code/demo.py +0 -127
- reflex/.templates/apps/demo/code/pages/__init__.py +0 -7
- reflex/.templates/apps/demo/code/pages/chatapp.py +0 -31
- reflex/.templates/apps/demo/code/pages/datatable.py +0 -360
- reflex/.templates/apps/demo/code/pages/forms.py +0 -257
- reflex/.templates/apps/demo/code/pages/graphing.py +0 -253
- reflex/.templates/apps/demo/code/pages/home.py +0 -56
- reflex/.templates/apps/demo/code/sidebar.py +0 -178
- reflex/.templates/apps/demo/code/state.py +0 -22
- reflex/.templates/apps/demo/code/states/form_state.py +0 -40
- reflex/.templates/apps/demo/code/states/pie_state.py +0 -47
- reflex/.templates/apps/demo/code/styles.py +0 -68
- reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
- reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -4
- reflex/.templates/apps/demo/code/webui/components/chat.py +0 -118
- reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -19
- reflex/.templates/apps/demo/code/webui/components/modal.py +0 -56
- reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -70
- reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -66
- reflex/.templates/apps/demo/code/webui/state.py +0 -146
- reflex/.templates/apps/demo/code/webui/styles.py +0 -88
- reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +0 -36
- reflex/experimental/vars/base.py +0 -583
- reflex/experimental/vars/function.py +0 -290
- reflex/experimental/vars/number.py +0 -1458
- reflex/experimental/vars/object.py +0 -804
- reflex/experimental/vars/sequence.py +0 -1764
- reflex/utils/watch.py +0 -96
- reflex/vars.py +0 -2604
- reflex/vars.pyi +0 -218
- reflex-0.5.10a3.dist-info/RECORD +0 -413
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/LICENSE +0 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/WHEEL +0 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/entry_points.txt +0 -0
|
@@ -8,7 +8,7 @@ from typing import Any, Callable, Dict, Literal, Optional, Union, overload
|
|
|
8
8
|
from reflex.components.component import Component
|
|
9
9
|
from reflex.event import EventHandler, EventSpec
|
|
10
10
|
from reflex.style import Style
|
|
11
|
-
from reflex.vars import
|
|
11
|
+
from reflex.vars.base import Var
|
|
12
12
|
|
|
13
13
|
class Script(Component):
|
|
14
14
|
@overload
|
|
@@ -19,8 +19,8 @@ class Script(Component):
|
|
|
19
19
|
src: Optional[Union[Var[str], str]] = None,
|
|
20
20
|
strategy: Optional[
|
|
21
21
|
Union[
|
|
22
|
-
Var[Literal["afterInteractive", "beforeInteractive", "lazyOnload"]],
|
|
23
22
|
Literal["afterInteractive", "beforeInteractive", "lazyOnload"],
|
|
23
|
+
Var[Literal["afterInteractive", "beforeInteractive", "lazyOnload"]],
|
|
24
24
|
]
|
|
25
25
|
] = None,
|
|
26
26
|
style: Optional[Style] = None,
|
|
@@ -29,59 +29,43 @@ class Script(Component):
|
|
|
29
29
|
class_name: Optional[Any] = None,
|
|
30
30
|
autofocus: Optional[bool] = None,
|
|
31
31
|
custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
|
|
32
|
-
on_blur: Optional[
|
|
33
|
-
|
|
34
|
-
] = None,
|
|
35
|
-
on_click: Optional[
|
|
36
|
-
Union[EventHandler, EventSpec, list, Callable, BaseVar]
|
|
37
|
-
] = None,
|
|
32
|
+
on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
33
|
+
on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
38
34
|
on_context_menu: Optional[
|
|
39
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
35
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
40
36
|
] = None,
|
|
41
37
|
on_double_click: Optional[
|
|
42
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
43
|
-
] = None,
|
|
44
|
-
on_error: Optional[
|
|
45
|
-
Union[EventHandler, EventSpec, list, Callable, BaseVar]
|
|
46
|
-
] = None,
|
|
47
|
-
on_focus: Optional[
|
|
48
|
-
Union[EventHandler, EventSpec, list, Callable, BaseVar]
|
|
49
|
-
] = None,
|
|
50
|
-
on_load: Optional[
|
|
51
|
-
Union[EventHandler, EventSpec, list, Callable, BaseVar]
|
|
52
|
-
] = None,
|
|
53
|
-
on_mount: Optional[
|
|
54
|
-
Union[EventHandler, EventSpec, list, Callable, BaseVar]
|
|
38
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
55
39
|
] = None,
|
|
40
|
+
on_error: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
41
|
+
on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
42
|
+
on_load: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
43
|
+
on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
56
44
|
on_mouse_down: Optional[
|
|
57
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
45
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
58
46
|
] = None,
|
|
59
47
|
on_mouse_enter: Optional[
|
|
60
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
48
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
61
49
|
] = None,
|
|
62
50
|
on_mouse_leave: Optional[
|
|
63
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
51
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
64
52
|
] = None,
|
|
65
53
|
on_mouse_move: Optional[
|
|
66
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
54
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
67
55
|
] = None,
|
|
68
56
|
on_mouse_out: Optional[
|
|
69
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
57
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
70
58
|
] = None,
|
|
71
59
|
on_mouse_over: Optional[
|
|
72
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
60
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
73
61
|
] = None,
|
|
74
62
|
on_mouse_up: Optional[
|
|
75
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
76
|
-
] = None,
|
|
77
|
-
on_ready: Optional[
|
|
78
|
-
Union[EventHandler, EventSpec, list, Callable, BaseVar]
|
|
79
|
-
] = None,
|
|
80
|
-
on_scroll: Optional[
|
|
81
|
-
Union[EventHandler, EventSpec, list, Callable, BaseVar]
|
|
63
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
82
64
|
] = None,
|
|
65
|
+
on_ready: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
66
|
+
on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
83
67
|
on_unmount: Optional[
|
|
84
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
68
|
+
Union[EventHandler, EventSpec, list, Callable, Var]
|
|
85
69
|
] = None,
|
|
86
70
|
**props,
|
|
87
71
|
) -> "Script":
|
reflex/components/component.py
CHANGED
|
@@ -44,10 +44,17 @@ from reflex.event import (
|
|
|
44
44
|
get_handler_args,
|
|
45
45
|
)
|
|
46
46
|
from reflex.style import Style, format_as_emotion
|
|
47
|
-
from reflex.utils import
|
|
48
|
-
from reflex.utils.imports import
|
|
47
|
+
from reflex.utils import format, imports, types
|
|
48
|
+
from reflex.utils.imports import (
|
|
49
|
+
ImmutableParsedImportDict,
|
|
50
|
+
ImportDict,
|
|
51
|
+
ImportVar,
|
|
52
|
+
ParsedImportDict,
|
|
53
|
+
parse_imports,
|
|
54
|
+
)
|
|
49
55
|
from reflex.utils.serializers import serializer
|
|
50
|
-
from reflex.vars import
|
|
56
|
+
from reflex.vars import VarData
|
|
57
|
+
from reflex.vars.base import LiteralVar, Var
|
|
51
58
|
|
|
52
59
|
|
|
53
60
|
class BaseComponent(Base, ABC):
|
|
@@ -188,7 +195,7 @@ class Component(BaseComponent, ABC):
|
|
|
188
195
|
class_name: Any = None
|
|
189
196
|
|
|
190
197
|
# Special component props.
|
|
191
|
-
special_props:
|
|
198
|
+
special_props: List[Var] = []
|
|
192
199
|
|
|
193
200
|
# Whether the component should take the focus once the page is loaded
|
|
194
201
|
autofocus: bool = False
|
|
@@ -320,9 +327,8 @@ class Component(BaseComponent, ABC):
|
|
|
320
327
|
# Set default values for any props.
|
|
321
328
|
if types._issubclass(field.type_, Var):
|
|
322
329
|
field.required = False
|
|
323
|
-
field.default
|
|
324
|
-
field.default
|
|
325
|
-
)
|
|
330
|
+
if field.default is not None:
|
|
331
|
+
field.default = LiteralVar.create(field.default)
|
|
326
332
|
elif types._issubclass(field.type_, EventHandler):
|
|
327
333
|
field.required = False
|
|
328
334
|
|
|
@@ -351,10 +357,7 @@ class Component(BaseComponent, ABC):
|
|
|
351
357
|
"id": kwargs.get("id"),
|
|
352
358
|
"children": children,
|
|
353
359
|
**{
|
|
354
|
-
prop:
|
|
355
|
-
kwargs[prop],
|
|
356
|
-
_var_is_string=False if isinstance(kwargs[prop], str) else None,
|
|
357
|
-
)
|
|
360
|
+
prop: LiteralVar.create(kwargs[prop])
|
|
358
361
|
for prop in self.get_initial_props()
|
|
359
362
|
if prop in kwargs
|
|
360
363
|
},
|
|
@@ -401,10 +404,10 @@ class Component(BaseComponent, ABC):
|
|
|
401
404
|
passed_types = None
|
|
402
405
|
try:
|
|
403
406
|
# Try to create a var from the value.
|
|
404
|
-
|
|
405
|
-
value
|
|
406
|
-
|
|
407
|
-
|
|
407
|
+
if isinstance(value, Var):
|
|
408
|
+
kwargs[key] = value
|
|
409
|
+
else:
|
|
410
|
+
kwargs[key] = LiteralVar.create(value)
|
|
408
411
|
|
|
409
412
|
# Check that the var type is not None.
|
|
410
413
|
if kwargs[key] is None:
|
|
@@ -444,11 +447,18 @@ class Component(BaseComponent, ABC):
|
|
|
444
447
|
not passed_types
|
|
445
448
|
and not types._issubclass(passed_type, expected_type, value)
|
|
446
449
|
):
|
|
447
|
-
value_name = value.
|
|
448
|
-
|
|
449
|
-
|
|
450
|
+
value_name = value._js_expr if isinstance(value, Var) else value
|
|
451
|
+
|
|
452
|
+
additional_info = (
|
|
453
|
+
" You can call `.bool()` on the value to convert it to a boolean."
|
|
454
|
+
if expected_type is bool and isinstance(value, Var)
|
|
455
|
+
else ""
|
|
450
456
|
)
|
|
451
457
|
|
|
458
|
+
raise TypeError(
|
|
459
|
+
f"Invalid var passed for prop {type(self).__name__}.{key}, expected type {expected_type}, got value {value_name} of type {passed_type}."
|
|
460
|
+
+ additional_info
|
|
461
|
+
)
|
|
452
462
|
# Check if the key is an event trigger.
|
|
453
463
|
if key in component_specific_triggers:
|
|
454
464
|
# Temporarily disable full control for event triggers.
|
|
@@ -495,7 +505,11 @@ class Component(BaseComponent, ABC):
|
|
|
495
505
|
self,
|
|
496
506
|
args_spec: Any,
|
|
497
507
|
value: Union[
|
|
498
|
-
Var,
|
|
508
|
+
Var,
|
|
509
|
+
EventHandler,
|
|
510
|
+
EventSpec,
|
|
511
|
+
List[Union[EventHandler, EventSpec]],
|
|
512
|
+
Callable,
|
|
499
513
|
],
|
|
500
514
|
) -> Union[EventChain, Var]:
|
|
501
515
|
"""Create an event chain from a variety of input types.
|
|
@@ -513,7 +527,9 @@ class Component(BaseComponent, ABC):
|
|
|
513
527
|
# If it's an event chain var, return it.
|
|
514
528
|
if isinstance(value, Var):
|
|
515
529
|
if value._var_type is not EventChain:
|
|
516
|
-
raise ValueError(
|
|
530
|
+
raise ValueError(
|
|
531
|
+
f"Invalid event chain: {repr(value)} of type {type(value)}"
|
|
532
|
+
)
|
|
517
533
|
return value
|
|
518
534
|
elif isinstance(value, EventChain):
|
|
519
535
|
# Trust that the caller knows what they're doing passing an EventChain directly
|
|
@@ -529,15 +545,7 @@ class Component(BaseComponent, ABC):
|
|
|
529
545
|
for v in value:
|
|
530
546
|
if isinstance(v, (EventHandler, EventSpec)):
|
|
531
547
|
# Call the event handler to get the event.
|
|
532
|
-
|
|
533
|
-
event = call_event_handler(v, args_spec)
|
|
534
|
-
except ValueError as err:
|
|
535
|
-
raise ValueError(
|
|
536
|
-
f" {err} defined in the `{type(self).__name__}` component"
|
|
537
|
-
) from err
|
|
538
|
-
|
|
539
|
-
# Add the event to the chain.
|
|
540
|
-
events.append(event)
|
|
548
|
+
events.append(call_event_handler(v, args_spec))
|
|
541
549
|
elif isinstance(v, Callable):
|
|
542
550
|
# Call the lambda to get the event chain.
|
|
543
551
|
result = call_event_fn(v, args_spec)
|
|
@@ -638,27 +646,6 @@ class Component(BaseComponent, ABC):
|
|
|
638
646
|
|
|
639
647
|
return _compile_component(self)
|
|
640
648
|
|
|
641
|
-
def _apply_theme(self, theme: Optional[Component]):
|
|
642
|
-
"""Apply the theme to this component.
|
|
643
|
-
|
|
644
|
-
Deprecated. Use add_style instead.
|
|
645
|
-
|
|
646
|
-
Args:
|
|
647
|
-
theme: The theme to apply.
|
|
648
|
-
"""
|
|
649
|
-
pass
|
|
650
|
-
|
|
651
|
-
def apply_theme(self, theme: Optional[Component]):
|
|
652
|
-
"""Apply a theme to the component and its children.
|
|
653
|
-
|
|
654
|
-
Args:
|
|
655
|
-
theme: The theme to apply.
|
|
656
|
-
"""
|
|
657
|
-
self._apply_theme(theme)
|
|
658
|
-
for child in self.children:
|
|
659
|
-
if isinstance(child, Component):
|
|
660
|
-
child.apply_theme(theme)
|
|
661
|
-
|
|
662
649
|
def _exclude_props(self) -> list[str]:
|
|
663
650
|
"""Props to exclude when adding the component props to the Tag.
|
|
664
651
|
|
|
@@ -678,7 +665,7 @@ class Component(BaseComponent, ABC):
|
|
|
678
665
|
"""
|
|
679
666
|
# Create the base tag.
|
|
680
667
|
tag = Tag(
|
|
681
|
-
name=self.tag if not self.alias else self.alias,
|
|
668
|
+
name=(self.tag if not self.alias else self.alias) or "",
|
|
682
669
|
special_props=self.special_props,
|
|
683
670
|
)
|
|
684
671
|
|
|
@@ -692,9 +679,7 @@ class Component(BaseComponent, ABC):
|
|
|
692
679
|
# Add ref to element if `id` is not None.
|
|
693
680
|
ref = self.get_ref()
|
|
694
681
|
if ref is not None:
|
|
695
|
-
props["ref"] = Var
|
|
696
|
-
ref, _var_is_local=False, _var_is_string=False
|
|
697
|
-
)
|
|
682
|
+
props["ref"] = Var(_js_expr=ref)
|
|
698
683
|
else:
|
|
699
684
|
props = props.copy()
|
|
700
685
|
|
|
@@ -768,22 +753,6 @@ class Component(BaseComponent, ABC):
|
|
|
768
753
|
from reflex.components.base.fragment import Fragment
|
|
769
754
|
from reflex.utils.exceptions import ComponentTypeError
|
|
770
755
|
|
|
771
|
-
# Translate deprecated props to new names.
|
|
772
|
-
new_prop_names = [
|
|
773
|
-
prop for prop in cls.get_props() if prop in ["type", "min", "max"]
|
|
774
|
-
]
|
|
775
|
-
for prop in new_prop_names:
|
|
776
|
-
under_prop = f"{prop}_"
|
|
777
|
-
if under_prop in props:
|
|
778
|
-
console.deprecate(
|
|
779
|
-
f"Underscore suffix for prop `{under_prop}`",
|
|
780
|
-
reason=f"for consistency. Use `{prop}` instead.",
|
|
781
|
-
deprecation_version="0.4.0",
|
|
782
|
-
removal_version="0.6.0",
|
|
783
|
-
dedupe=False,
|
|
784
|
-
)
|
|
785
|
-
props[prop] = props.pop(under_prop)
|
|
786
|
-
|
|
787
756
|
# Filter out None props
|
|
788
757
|
props = {key: value for key, value in props.items() if value is not None}
|
|
789
758
|
|
|
@@ -809,7 +778,7 @@ class Component(BaseComponent, ABC):
|
|
|
809
778
|
else (
|
|
810
779
|
Fragment.create(*child)
|
|
811
780
|
if isinstance(child, tuple)
|
|
812
|
-
else Bare.create(contents=
|
|
781
|
+
else Bare.create(contents=LiteralVar.create(child))
|
|
813
782
|
)
|
|
814
783
|
)
|
|
815
784
|
for child in children
|
|
@@ -900,17 +869,6 @@ class Component(BaseComponent, ABC):
|
|
|
900
869
|
new_style.update(component_style)
|
|
901
870
|
style_vars.append(component_style._var_data)
|
|
902
871
|
|
|
903
|
-
# 3. User-defined style from `Component.style`.
|
|
904
|
-
# Apply theme for retro-compatibility with deprecated _apply_theme API
|
|
905
|
-
if type(self)._apply_theme != Component._apply_theme:
|
|
906
|
-
console.deprecate(
|
|
907
|
-
f"{self.__class__.__name__}._apply_theme",
|
|
908
|
-
reason="use add_style instead",
|
|
909
|
-
deprecation_version="0.5.0",
|
|
910
|
-
removal_version="0.6.0",
|
|
911
|
-
)
|
|
912
|
-
self._apply_theme(theme)
|
|
913
|
-
|
|
914
872
|
# 4. style dict and css props passed to the component instance.
|
|
915
873
|
new_style.update(self.style)
|
|
916
874
|
style_vars.append(self.style._var_data)
|
|
@@ -936,7 +894,12 @@ class Component(BaseComponent, ABC):
|
|
|
936
894
|
"""
|
|
937
895
|
if isinstance(self.style, Var):
|
|
938
896
|
return {"css": self.style}
|
|
939
|
-
|
|
897
|
+
emotion_style = format_as_emotion(self.style)
|
|
898
|
+
return (
|
|
899
|
+
{"css": LiteralVar.create(emotion_style)}
|
|
900
|
+
if emotion_style is not None
|
|
901
|
+
else {}
|
|
902
|
+
)
|
|
940
903
|
|
|
941
904
|
def render(self) -> Dict:
|
|
942
905
|
"""Render the component.
|
|
@@ -1091,10 +1054,10 @@ class Component(BaseComponent, ABC):
|
|
|
1091
1054
|
# Style keeps track of its own VarData instance, so embed in a temp Var that is yielded.
|
|
1092
1055
|
if isinstance(self.style, dict) and self.style or isinstance(self.style, Var):
|
|
1093
1056
|
vars.append(
|
|
1094
|
-
|
|
1095
|
-
|
|
1057
|
+
Var(
|
|
1058
|
+
_js_expr="style",
|
|
1096
1059
|
_var_type=str,
|
|
1097
|
-
_var_data=self.style._var_data,
|
|
1060
|
+
_var_data=VarData.merge(self.style._var_data),
|
|
1098
1061
|
)
|
|
1099
1062
|
)
|
|
1100
1063
|
|
|
@@ -1113,10 +1076,8 @@ class Component(BaseComponent, ABC):
|
|
|
1113
1076
|
vars.append(comp_prop)
|
|
1114
1077
|
elif isinstance(comp_prop, str):
|
|
1115
1078
|
# Collapse VarData encoded in f-strings.
|
|
1116
|
-
var =
|
|
1117
|
-
|
|
1118
|
-
)
|
|
1119
|
-
if var._var_data is not None:
|
|
1079
|
+
var = LiteralVar.create(comp_prop)
|
|
1080
|
+
if var._get_all_var_data() is not None:
|
|
1120
1081
|
vars.append(var)
|
|
1121
1082
|
|
|
1122
1083
|
# Get Vars associated with children.
|
|
@@ -1124,7 +1085,8 @@ class Component(BaseComponent, ABC):
|
|
|
1124
1085
|
for child in self.children:
|
|
1125
1086
|
if not isinstance(child, Component):
|
|
1126
1087
|
continue
|
|
1127
|
-
|
|
1088
|
+
child_vars = child._get_vars(include_children=include_children)
|
|
1089
|
+
vars.extend(child_vars)
|
|
1128
1090
|
|
|
1129
1091
|
return vars
|
|
1130
1092
|
|
|
@@ -1329,13 +1291,13 @@ class Component(BaseComponent, ABC):
|
|
|
1329
1291
|
|
|
1330
1292
|
other_imports = []
|
|
1331
1293
|
user_hooks = self._get_hooks()
|
|
1332
|
-
|
|
1333
|
-
user_hooks
|
|
1334
|
-
and isinstance(user_hooks, Var)
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
other_imports.append(
|
|
1294
|
+
user_hooks_data = (
|
|
1295
|
+
VarData.merge(user_hooks._get_all_var_data())
|
|
1296
|
+
if user_hooks is not None and isinstance(user_hooks, Var)
|
|
1297
|
+
else None
|
|
1298
|
+
)
|
|
1299
|
+
if user_hooks_data is not None:
|
|
1300
|
+
other_imports.append(user_hooks_data.imports)
|
|
1339
1301
|
other_imports.extend(
|
|
1340
1302
|
hook_imports for hook_imports in self._get_added_hooks().values()
|
|
1341
1303
|
)
|
|
@@ -1358,9 +1320,16 @@ class Component(BaseComponent, ABC):
|
|
|
1358
1320
|
event_imports = Imports.EVENTS if self.event_triggers else {}
|
|
1359
1321
|
|
|
1360
1322
|
# Collect imports from Vars used directly by this component.
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1323
|
+
var_datas = [var._get_all_var_data() for var in self._get_vars()]
|
|
1324
|
+
var_imports: List[ImmutableParsedImportDict] = list(
|
|
1325
|
+
map(
|
|
1326
|
+
lambda var_data: var_data.imports,
|
|
1327
|
+
filter(
|
|
1328
|
+
None,
|
|
1329
|
+
var_datas,
|
|
1330
|
+
),
|
|
1331
|
+
)
|
|
1332
|
+
)
|
|
1364
1333
|
|
|
1365
1334
|
added_import_dicts: list[ParsedImportDict] = []
|
|
1366
1335
|
for clz in self._iter_parent_classes_with_method("add_imports"):
|
|
@@ -1407,9 +1376,9 @@ class Component(BaseComponent, ABC):
|
|
|
1407
1376
|
on_mount = self.event_triggers.get(EventTriggers.ON_MOUNT, None)
|
|
1408
1377
|
on_unmount = self.event_triggers.get(EventTriggers.ON_UNMOUNT, None)
|
|
1409
1378
|
if on_mount is not None:
|
|
1410
|
-
on_mount =
|
|
1379
|
+
on_mount = str(LiteralVar.create(on_mount)) + "()"
|
|
1411
1380
|
if on_unmount is not None:
|
|
1412
|
-
on_unmount =
|
|
1381
|
+
on_unmount = str(LiteralVar.create(on_unmount)) + "()"
|
|
1413
1382
|
if on_mount is not None or on_unmount is not None:
|
|
1414
1383
|
return f"""
|
|
1415
1384
|
useEffect(() => {{
|
|
@@ -1427,7 +1396,7 @@ class Component(BaseComponent, ABC):
|
|
|
1427
1396
|
"""
|
|
1428
1397
|
ref = self.get_ref()
|
|
1429
1398
|
if ref is not None:
|
|
1430
|
-
return f"const {ref} = useRef(null); {str(Var
|
|
1399
|
+
return f"const {ref} = useRef(null); {str(Var(_js_expr=ref).as_ref())} = {ref};"
|
|
1431
1400
|
|
|
1432
1401
|
def _get_vars_hooks(self) -> dict[str, None]:
|
|
1433
1402
|
"""Get the hooks required by vars referenced in this component.
|
|
@@ -1437,8 +1406,13 @@ class Component(BaseComponent, ABC):
|
|
|
1437
1406
|
"""
|
|
1438
1407
|
vars_hooks = {}
|
|
1439
1408
|
for var in self._get_vars():
|
|
1440
|
-
|
|
1441
|
-
|
|
1409
|
+
var_data = var._get_all_var_data()
|
|
1410
|
+
if var_data is not None:
|
|
1411
|
+
vars_hooks.update(
|
|
1412
|
+
var_data.hooks
|
|
1413
|
+
if isinstance(var_data.hooks, dict)
|
|
1414
|
+
else {k: None for k in var_data.hooks}
|
|
1415
|
+
)
|
|
1442
1416
|
return vars_hooks
|
|
1443
1417
|
|
|
1444
1418
|
def _get_events_hooks(self) -> dict[str, None]:
|
|
@@ -1487,11 +1461,12 @@ class Component(BaseComponent, ABC):
|
|
|
1487
1461
|
|
|
1488
1462
|
def extract_var_hooks(hook: Var):
|
|
1489
1463
|
_imports = {}
|
|
1490
|
-
|
|
1491
|
-
|
|
1464
|
+
var_data = VarData.merge(hook._get_all_var_data())
|
|
1465
|
+
if var_data is not None:
|
|
1466
|
+
for sub_hook in var_data.hooks:
|
|
1492
1467
|
code[sub_hook] = {}
|
|
1493
|
-
if
|
|
1494
|
-
_imports =
|
|
1468
|
+
if var_data.imports:
|
|
1469
|
+
_imports = var_data.imports
|
|
1495
1470
|
if str(hook) in code:
|
|
1496
1471
|
code[str(hook)] = imports.merge_imports(code[str(hook)], _imports)
|
|
1497
1472
|
else:
|
|
@@ -1505,6 +1480,7 @@ class Component(BaseComponent, ABC):
|
|
|
1505
1480
|
extract_var_hooks(hook)
|
|
1506
1481
|
else:
|
|
1507
1482
|
code[hook] = {}
|
|
1483
|
+
|
|
1508
1484
|
return code
|
|
1509
1485
|
|
|
1510
1486
|
def _get_hooks(self) -> str | None:
|
|
@@ -1561,7 +1537,7 @@ class Component(BaseComponent, ABC):
|
|
|
1561
1537
|
The ref name.
|
|
1562
1538
|
"""
|
|
1563
1539
|
# do not create a ref if the id is dynamic or unspecified
|
|
1564
|
-
if self.id is None or isinstance(self.id,
|
|
1540
|
+
if self.id is None or isinstance(self.id, Var):
|
|
1565
1541
|
return None
|
|
1566
1542
|
return format.format_ref(self.id)
|
|
1567
1543
|
|
|
@@ -1707,7 +1683,7 @@ class CustomComponent(Component):
|
|
|
1707
1683
|
|
|
1708
1684
|
# Handle subclasses of Base.
|
|
1709
1685
|
if isinstance(value, Base):
|
|
1710
|
-
base_value =
|
|
1686
|
+
base_value = LiteralVar.create(value)
|
|
1711
1687
|
|
|
1712
1688
|
# Track hooks and imports associated with Component instances.
|
|
1713
1689
|
if base_value is not None and isinstance(value, Component):
|
|
@@ -1721,7 +1697,7 @@ class CustomComponent(Component):
|
|
|
1721
1697
|
else:
|
|
1722
1698
|
value = base_value
|
|
1723
1699
|
else:
|
|
1724
|
-
value =
|
|
1700
|
+
value = LiteralVar.create(value)
|
|
1725
1701
|
|
|
1726
1702
|
# Set the prop.
|
|
1727
1703
|
self.props[format.to_camel_case(key)] = value
|
|
@@ -1800,19 +1776,19 @@ class CustomComponent(Component):
|
|
|
1800
1776
|
"""
|
|
1801
1777
|
return super()._render(props=self.props)
|
|
1802
1778
|
|
|
1803
|
-
def get_prop_vars(self) -> List[
|
|
1779
|
+
def get_prop_vars(self) -> List[Var]:
|
|
1804
1780
|
"""Get the prop vars.
|
|
1805
1781
|
|
|
1806
1782
|
Returns:
|
|
1807
1783
|
The prop vars.
|
|
1808
1784
|
"""
|
|
1809
1785
|
return [
|
|
1810
|
-
|
|
1811
|
-
|
|
1786
|
+
Var(
|
|
1787
|
+
_js_expr=name,
|
|
1812
1788
|
_var_type=(
|
|
1813
1789
|
prop._var_type if types._isinstance(prop, Var) else type(prop)
|
|
1814
1790
|
),
|
|
1815
|
-
)
|
|
1791
|
+
).guess_type()
|
|
1816
1792
|
for name, prop in self.props.items()
|
|
1817
1793
|
]
|
|
1818
1794
|
|
|
@@ -1825,9 +1801,11 @@ class CustomComponent(Component):
|
|
|
1825
1801
|
Returns:
|
|
1826
1802
|
Each var referenced by the component (props, styles, event handlers).
|
|
1827
1803
|
"""
|
|
1828
|
-
return
|
|
1829
|
-
|
|
1830
|
-
|
|
1804
|
+
return (
|
|
1805
|
+
super()._get_vars(include_children=include_children)
|
|
1806
|
+
+ [prop for prop in self.props.values() if isinstance(prop, Var)]
|
|
1807
|
+
+ self.get_component(self)._get_vars(include_children=include_children)
|
|
1808
|
+
)
|
|
1831
1809
|
|
|
1832
1810
|
@lru_cache(maxsize=None) # noqa
|
|
1833
1811
|
def get_component(self) -> Component:
|
|
@@ -1981,7 +1959,7 @@ class StatefulComponent(BaseComponent):
|
|
|
1981
1959
|
if not should_memoize:
|
|
1982
1960
|
# Determine if any Vars have associated data.
|
|
1983
1961
|
for prop_var in component._get_vars():
|
|
1984
|
-
if prop_var.
|
|
1962
|
+
if prop_var._get_all_var_data():
|
|
1985
1963
|
should_memoize = True
|
|
1986
1964
|
break
|
|
1987
1965
|
|
|
@@ -1996,7 +1974,7 @@ class StatefulComponent(BaseComponent):
|
|
|
1996
1974
|
should_memoize = True
|
|
1997
1975
|
break
|
|
1998
1976
|
child = cls._child_var(child)
|
|
1999
|
-
if isinstance(child, Var) and child.
|
|
1977
|
+
if isinstance(child, Var) and child._get_all_var_data():
|
|
2000
1978
|
should_memoize = True
|
|
2001
1979
|
break
|
|
2002
1980
|
|
|
@@ -2176,9 +2154,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2176
2154
|
|
|
2177
2155
|
# Get the actual EventSpec and render it.
|
|
2178
2156
|
event = component.event_triggers[event_trigger]
|
|
2179
|
-
rendered_chain =
|
|
2180
|
-
if isinstance(rendered_chain, str):
|
|
2181
|
-
rendered_chain = rendered_chain.strip("{}")
|
|
2157
|
+
rendered_chain = str(LiteralVar.create(event))
|
|
2182
2158
|
|
|
2183
2159
|
# Hash the rendered EventChain to get a deterministic function name.
|
|
2184
2160
|
chain_hash = md5(str(rendered_chain).encode("utf-8")).hexdigest()
|
|
@@ -2187,12 +2163,13 @@ class StatefulComponent(BaseComponent):
|
|
|
2187
2163
|
# Calculate Var dependencies accessed by the handler for useCallback dep array.
|
|
2188
2164
|
var_deps = ["addEvents", "Event"]
|
|
2189
2165
|
for arg in event_args:
|
|
2190
|
-
|
|
2166
|
+
var_data = arg._get_all_var_data()
|
|
2167
|
+
if var_data is None:
|
|
2191
2168
|
continue
|
|
2192
|
-
for hook in
|
|
2169
|
+
for hook in var_data.hooks:
|
|
2193
2170
|
var_deps.extend(cls._get_hook_deps(hook))
|
|
2194
2171
|
memo_var_data = VarData.merge(
|
|
2195
|
-
*[var.
|
|
2172
|
+
*[var._get_all_var_data() for var in event_args],
|
|
2196
2173
|
VarData(
|
|
2197
2174
|
imports={"react": [ImportVar(tag="useCallback")]},
|
|
2198
2175
|
),
|
|
@@ -2200,7 +2177,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2200
2177
|
|
|
2201
2178
|
# Store the memoized function name and hook code for this event trigger.
|
|
2202
2179
|
trigger_memo[event_trigger] = (
|
|
2203
|
-
Var
|
|
2180
|
+
Var(_js_expr=memo_name)._replace(
|
|
2204
2181
|
_var_type=EventChain, merge_var_data=memo_var_data
|
|
2205
2182
|
),
|
|
2206
2183
|
f"const {memo_name} = useCallback({rendered_chain}, [{', '.join(var_deps)}])",
|
|
@@ -2273,7 +2250,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2273
2250
|
Returns:
|
|
2274
2251
|
The tag to render.
|
|
2275
2252
|
"""
|
|
2276
|
-
return dict(Tag(name=self.tag))
|
|
2253
|
+
return dict(Tag(name=self.tag or ""))
|
|
2277
2254
|
|
|
2278
2255
|
def __str__(self) -> str:
|
|
2279
2256
|
"""Represent the component in React.
|