From 42a7fb2f39629b0d132dc5e768d5363139941825 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 1 Oct 2024 16:29:08 -0700 Subject: [PATCH] change the way we're handling event actions --- reflex/.templates/web/utils/state.js | 22 +++++++++++++++----- reflex/components/component.py | 10 ++-------- reflex/event.py | 30 ++++++++++++++++------------ 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/reflex/.templates/web/utils/state.js b/reflex/.templates/web/utils/state.js index 78e671809..cb9f9f238 100644 --- a/reflex/.templates/web/utils/state.js +++ b/reflex/.templates/web/utils/state.js @@ -544,13 +544,19 @@ export const uploadFiles = async ( /** * Create an event object. - * @param name The name of the event. - * @param payload The payload of the event. - * @param handler The client handler to process event. + * @param {string} name The name of the event. + * @param {Object.} payload The payload of the event. + * @param {Object.} event_actions The actions to take on the event. + * @param {string} handler The client handler to process event. * @returns The event object. */ -export const Event = (name, payload = {}, handler = null) => { - return { name, payload, handler }; +export const Event = ( + name, + payload = {}, + event_actions = {}, + handler = null +) => { + return { name, payload, handler, event_actions }; }; /** @@ -676,6 +682,12 @@ export const useEventLoop = ( if (!(args instanceof Array)) { args = [args]; } + + const event_actions = events.reduce( + (acc, e) => ({ ...acc, ...e.event_actions }), + event_actions + ); + const _e = args.filter((o) => o?.preventDefault !== undefined)[0]; if (event_actions?.preventDefault && _e?.preventDefault) { diff --git a/reflex/components/component.py b/reflex/components/component.py index 87a3a10ad..35f10a01d 100644 --- a/reflex/components/component.py +++ b/reflex/components/component.py @@ -589,24 +589,18 @@ class Component(BaseComponent, ABC): for e in events ] - # Collect event_actions from each spec - event_actions = {} - for e in events: - if isinstance(e, EventSpec): - event_actions.update(e.event_actions) - # Return the event chain. if isinstance(args_spec, Var): return EventChain( events=events, args_spec=None, - event_actions=event_actions, + event_actions={}, ) else: return EventChain( events=events, args_spec=args_spec, - event_actions=event_actions, + event_actions={}, ) def get_event_triggers(self) -> Dict[str, Any]: diff --git a/reflex/event.py b/reflex/event.py index 7d40b164d..bfd285c9d 100644 --- a/reflex/event.py +++ b/reflex/event.py @@ -1167,20 +1167,25 @@ class LiteralEventVar(CachedVarOperation, LiteralVar, EventVar): Returns: The name of the var. """ - event_name = LiteralVar.create( - ".".join( - filter(None, format.get_event_handler_parts(self._var_value.handler)) - ) - ) - event_args = LiteralVar.create( - {str(name): value for name, value in self._var_value.args} - ) - event_client_name = LiteralVar.create(self._var_value.client_handler_name) return str( FunctionStringVar("Event").call( - event_name, - event_args, - *([event_client_name] if self._var_value.client_handler_name else []), + # event handler name + ".".join( + filter( + None, + format.get_event_handler_parts(self._var_value.handler), + ) + ), + # event handler args + {str(name): value for name, value in self._var_value.args}, + # event actions + self._var_value.event_actions, + # client handler name + *( + [self._var_value.client_handler_name] + if self._var_value.client_handler_name + else [] + ), ) ) @@ -1254,7 +1259,6 @@ class LiteralEventChainVar(CachedVarOperation, LiteralVar, EventChainVar): [LiteralVar.create(event) for event in self._var_value.events] ), arg_def_expr, - LiteralVar.create(self._var_value.event_actions), ), ) )