@@ -20,7 +20,7 @@ import {
2020QueryConfigItemWrapper ,
2121ValueFromOption ,
2222} from "lowcoder-design" ;
23- import { Fragment , ReactNode , useContext , useEffect , useState } from "react" ;
23+ import { Fragment , ReactNode , useContext , useEffect , useState , useRef , useCallback } from "react" ;
2424import { memo } from "util/cacheUtils" ;
2525import { EditorContext } from "../editorState" ;
2626import { ActionSelectorControl } from "./actionSelector/actionSelectorControl" ;
@@ -59,7 +59,12 @@ class SingleEventHandlerControl<
5959return ;
6060}
6161if ( handler ) {
62- return handler ( ) ;
62+ try {
63+ return handler ( ) ;
64+ } catch ( error ) {
65+ console . error ( 'Error in event handler:' , error ) ;
66+ return Promise . reject ( error ) ;
67+ }
6368}
6469} ;
6570}
@@ -142,10 +147,9 @@ const EventHandlerControlPropertyView = (props: {
142147type ?:"query" ;
143148eventConfigs :EventConfigsType ;
144149} ) => {
145-
146-
147150const editorState = useContext ( EditorContext ) ;
148151const [ showNewCreate , setShowNewCreate ] = useState ( false ) ;
152+ const mountedRef = useRef ( true ) ;
149153
150154const {
151155 dispatch,
@@ -157,14 +161,27 @@ const EventHandlerControlPropertyView = (props: {
157161 type
158162} = props ;
159163
160- useEffect ( ( ) => setShowNewCreate ( false ) , [ dispatch ] ) ;
164+ // Reset state on unmount
165+ useEffect ( ( ) => {
166+ return ( ) => {
167+ mountedRef . current = false ;
168+ setShowNewCreate ( false ) ;
169+ } ;
170+ } , [ ] ) ;
171+
172+ // Reset showNewCreate when dispatch changes
173+ useEffect ( ( ) => {
174+ if ( mountedRef . current ) {
175+ setShowNewCreate ( false ) ;
176+ }
177+ } , [ dispatch ] ) ;
161178
162179const queryHandler = {
163180name :eventConfigs [ 0 ] . value ,
164181} ;
165182
166- const handleAdd = ( ) => {
167- if ( eventConfigs . length === 0 ) {
183+ const handleAdd = useCallback ( ( ) => {
184+ if ( eventConfigs . length === 0 || ! mountedRef . current ) {
168185return ;
169186}
170187
@@ -190,8 +207,10 @@ const EventHandlerControlPropertyView = (props: {
190207handler :isInDevIde ?messageHandler :queryExecHandler ,
191208} as const ;
192209dispatch ( pushAction ( type !== "query" ?newHandler :queryHandler ) ) ;
193- setShowNewCreate ( true ) ;
194- } ;
210+ if ( mountedRef . current ) {
211+ setShowNewCreate ( true ) ;
212+ }
213+ } , [ dispatch , eventConfigs , editorState , pushAction , type ] ) ;
195214
196215const renderItems = ( ) =>
197216items . length > 0 ?(
@@ -251,7 +270,12 @@ class EventHandlerControl<T extends EventConfigsType> extends list(SingleEventHa
251270super . getView ( ) . forEach ( ( child ) => {
252271const ret = child . getView ( ) ( eventName ) ;
253272if ( ret ) {
254- list . push ( ret ) ;
273+ list . push (
274+ Promise . resolve ( ret ) . catch ( error => {
275+ console . error ( 'Error in event handler:' , error ) ;
276+ return Promise . reject ( error ) ;
277+ } )
278+ ) ;
255279}
256280} ) ;
257281return Promise . all ( list ) ;