diff --git a/packages/chakra-ui-lib/src/components/Types/Toast.ts b/packages/chakra-ui-lib/src/components/Types/Toast.ts index f53c697f..226faa31 100644 --- a/packages/chakra-ui-lib/src/components/Types/Toast.ts +++ b/packages/chakra-ui-lib/src/components/Types/Toast.ts @@ -10,7 +10,7 @@ const ToastPosition = Type.Union([ Type.Literal('bottom-right'), Type.Literal('bottom-left'), ]); -export const ToastOpenParamterSchema = Type.Object({ +export const ToastOpenParameterSchema = Type.Object({ position: Type.Optional(ToastPosition), duration: Type.Optional(Type.Union([Type.Number(), Type.Null()])), title: Type.Optional(Type.String()), @@ -40,7 +40,7 @@ export const ToastCloseParameterSchema = Type.Object({ positions: Type.Optional(Type.Array(ToastPosition)), }); -export type ToastOpenParameter = Static; +export type ToastOpenParameter = Static; export type ToastCloseParameter = Static; const pickProperty = >( @@ -58,14 +58,15 @@ export default function ToastUtilMethodFactory() { let toast: ReturnType | undefined; const toastOpen: UtilMethod = { name: 'toast.open', - method(parameters: Static) { + method(parameters: Static) { if (!toast) { toast = createStandaloneToast(); } if (parameters) { - toast(pickProperty(ToastOpenParamterSchema, parameters)); + toast(pickProperty(ToastOpenParameterSchema, parameters)); } }, + parameters: ToastOpenParameterSchema, }; const toastClose: UtilMethod = { @@ -85,6 +86,7 @@ export default function ToastUtilMethodFactory() { } } }, + parameters: ToastCloseParameterSchema, }; return [toastOpen, toastClose]; } diff --git a/packages/editor/src/components/ComponentForm/EventTraitForm/EventHandlerForm.tsx b/packages/editor/src/components/ComponentForm/EventTraitForm/EventHandlerForm.tsx index b7830760..d1b1d45c 100644 --- a/packages/editor/src/components/ComponentForm/EventTraitForm/EventHandlerForm.tsx +++ b/packages/editor/src/components/ComponentForm/EventTraitForm/EventHandlerForm.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useState, useMemo } from 'react'; import { Box, FormControl, @@ -19,6 +19,7 @@ import { KeyValueEditor } from '../../KeyValueEditor'; import { EditorServices } from '../../../types'; import { ComponentModel } from '../../../AppModel/ComponentModel'; import { AppModel } from '../../../AppModel/AppModel'; +import { ComponentId } from '../../../AppModel/IAppModel'; type Props = { eventTypes: readonly string[]; @@ -31,7 +32,7 @@ type Props = { export const EventHandlerForm: React.FC = observer(props => { const { handler, eventTypes, onChange, onRemove, hideEventType, services } = props; - const { registry, editorStore } = services; + const { registry, editorStore, appModelManager } = services; const { utilMethods } = registry; const { components } = editorStore; const [methods, setMethods] = useState([]); @@ -43,6 +44,41 @@ export const EventHandlerForm: React.FC = observer(props => { }, }); + const hasParams = useMemo( + () => Object.keys(formik.values.method.parameters ?? {}).length, + [formik.values.method.parameters] + ); + const params = useMemo(() => { + const params: Record = {}; + const { values } = formik; + const methodName = values.method.name; + + if (values.method.name) { + let parameters = {}; + + if (handler.componentId === GLOBAL_UTILS_ID) { + const targetMethod = utilMethods.get(methodName); + + parameters = targetMethod?.parameters?.properties ?? {}; + } else { + const targetComponent = appModelManager.appModel.getComponentById( + handler.componentId as ComponentId + ); + const targetMethod = (targetComponent?.methods ?? []).find( + ({ name }) => name === formik.values.method.name + ); + + parameters = targetMethod?.parameters?.properties ?? {}; + } + + for (const key in parameters) { + params[key] = values.method.parameters?.[key] ?? ''; + } + } + + return params; + }, [formik.values.method.name]); + const updateMethods = useCallback( (componentId: string) => { if (componentId === GLOBAL_UTILS_ID) { @@ -68,6 +104,10 @@ export const EventHandlerForm: React.FC = observer(props => { formik.setValues(handler); }, [handler]); + useEffect(() => { + formik.setFieldValue('method.parameters', params); + }, [params]); + useEffect(() => { if (handler.componentId) { updateMethods(handler.componentId); @@ -76,6 +116,8 @@ export const EventHandlerForm: React.FC = observer(props => { const onTargetComponentChange = (e: React.ChangeEvent) => { updateMethods(e.target.value); + formik.handleChange(e); + formik.setFieldValue('method', { name: '', parameters: {} }); }; const typeField = ( @@ -102,10 +144,7 @@ export const EventHandlerForm: React.FC = observer(props => { = props => { onChange={onInputChange} onBlur={onBlur} /> - } - size="xs" - onClick={() => onRemoveRow(i)} - variant="ghost" - /> + {onlySetValue ? null : ( + } + size="xs" + onClick={() => onRemoveRow(i)} + variant="ghost" + /> + )} ); }); @@ -77,9 +82,11 @@ export const KeyValueEditor: React.FC = props => { return ( {rowItems} - + {onlySetValue ? null : ( + + )} ); }; diff --git a/packages/runtime/src/services/Registry.tsx b/packages/runtime/src/services/Registry.tsx index 0ebd412d..6b9cf2a7 100644 --- a/packages/runtime/src/services/Registry.tsx +++ b/packages/runtime/src/services/Registry.tsx @@ -28,6 +28,7 @@ import { ApiService } from './apiService'; export type UtilMethod = { name: string; method: (parameters?: any) => void; + parameters?: any; }; export type UtilMethodFactory = () => UtilMethod[]; @@ -50,7 +51,7 @@ export class Registry { components = new Map>(); traits = new Map>(); modules = new Map>(); - utilMethods = new Map(); + utilMethods = new Map(); private apiService: ApiService; constructor(apiService: ApiService) { @@ -166,7 +167,7 @@ export class Registry { if (this.utilMethods.get(m.name)) { throw new Error(`Already has utilMethod ${m.name} in this registry.`); } - this.utilMethods.set(m.name, m.method); + this.utilMethods.set(m.name, m); } installLib(lib: SunmaoLib) { @@ -185,9 +186,19 @@ export class Registry { private mountUtilMethods() { this.apiService.on('uiMethod', ({ componentId, name, parameters }) => { if (componentId === GLOBAL_UTILS_ID) { - const utilMethod = this.utilMethods.get(name); + const utilMethod = this.utilMethods.get(name)?.method; if (utilMethod) { - utilMethod(parameters); + const params: Record = {}; + + for (const key in parameters) { + const value = parameters[key]; + + if (value !== undefined && value !== '') { + params[key] = value; + } + } + + utilMethod(params); } } });