From ad67f61cc3c432a193a78eeedd39005b2d8d9280 Mon Sep 17 00:00:00 2001 From: Anser Waseem Date: Mon, 27 May 2024 20:36:04 +0500 Subject: [PATCH 1/2] conform widget setters as they are in flutter framework --- .../src/ensemble/screens/forms.yaml | 10 +++++- packages/framework/src/evaluate/evaluate.ts | 34 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/apps/kitchen-sink/src/ensemble/screens/forms.yaml b/apps/kitchen-sink/src/ensemble/screens/forms.yaml index fe8176720..eb2bc6fda 100644 --- a/apps/kitchen-sink/src/ensemble/screens/forms.yaml +++ b/apps/kitchen-sink/src/ensemble/screens/forms.yaml @@ -25,11 +25,18 @@ View: children: - Icon: - Text: + id: formHeading styles: names: heading-3 text: Forms - Markdown: text: More to come! In the meantime, checkout the Ensemble [documentation](https://docs.ensembleui.com/). + - Button: + label: set me + onTap: + executeCode: | + formHeading.text = 'i am set' + iconText.text = 'i am set too' - Card: styles: maxWidth: unset @@ -144,7 +151,7 @@ View: - Text: styles: names: heading-3 - text: Forms with initial values + text: ${formHeading.text + ' with initial values'} - Markdown: text: More to come! In the meantime, checkout the Ensemble [documentation](https://docs.ensembleui.com/). - Card: @@ -261,4 +268,5 @@ API: Icon: body: Text: + id: iconText text: Hello123 diff --git a/packages/framework/src/evaluate/evaluate.ts b/packages/framework/src/evaluate/evaluate.ts index 024343c4d..1d207ea57 100644 --- a/packages/framework/src/evaluate/evaluate.ts +++ b/packages/framework/src/evaluate/evaluate.ts @@ -26,16 +26,48 @@ export const buildEvaluateFn = ( const globalBlock = screen.model?.global; const importedScriptBlock = screen.model?.importedScripts; + const modifiedJs = modifyJs(Object.fromEntries([...widgets]), js); + // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func const jsFunc = new Function( ...Object.keys(invokableObj), - addScriptBlock(formatJs(js), globalBlock, importedScriptBlock), + addScriptBlock(formatJs(modifiedJs), globalBlock, importedScriptBlock), ); // eslint-disable-next-line @typescript-eslint/no-unsafe-return return () => jsFunc(...Object.values(invokableObj)); }; +const modifyJs = ( + invokables: { [key: string]: InvokableMethods | undefined }, + js?: string, +): string => { + if (!js || isEmpty(js)) { + return js || ""; + } + + // check if the code is assigning a value to a property + const assignmentRegex = /(\w+)\.(\w+)\s*=\s*(.*)$/gm; // matches widgetId.setter = value + let modifiedCode = js; + + let match; + while ((match = assignmentRegex.exec(js))) { + const [fullMatch, widgetId, setter, value] = match; + const setterName = `set${setter.charAt(0).toUpperCase() + setter.slice(1)}`; + const originalSetter = invokables[widgetId]?.[setterName]; + + if (originalSetter) { + // if a setter function exists, replace the assignment with a function call + modifiedCode = modifiedCode.replace( + fullMatch, + `${widgetId}.${setterName}(${value});`, + ); + } + } + + return modifiedCode; +}; + const formatJs = (js?: string): string => { if (!js || isEmpty(js)) { if (process.env.NODE_ENV === "debug") { From b6e048e8265518ab108e3c23e9c2dcbbc72ce944 Mon Sep 17 00:00:00 2001 From: Anser Waseem Date: Mon, 27 May 2024 20:44:34 +0500 Subject: [PATCH 2/2] fix lint error --- .changeset/eleven-chicken-press.md | 6 ++++++ packages/framework/src/evaluate/evaluate.ts | 1 + 2 files changed, 7 insertions(+) create mode 100644 .changeset/eleven-chicken-press.md diff --git a/.changeset/eleven-chicken-press.md b/.changeset/eleven-chicken-press.md new file mode 100644 index 000000000..409c468ff --- /dev/null +++ b/.changeset/eleven-chicken-press.md @@ -0,0 +1,6 @@ +--- +"@ensembleui/react-framework": patch +"@ensembleui/react-kitchen-sink": patch +--- + +Support widget setters for flutter compatibility diff --git a/packages/framework/src/evaluate/evaluate.ts b/packages/framework/src/evaluate/evaluate.ts index 1d207ea57..e009535f4 100644 --- a/packages/framework/src/evaluate/evaluate.ts +++ b/packages/framework/src/evaluate/evaluate.ts @@ -47,6 +47,7 @@ const modifyJs = ( } // check if the code is assigning a value to a property + // eslint-disable-next-line prefer-named-capture-group const assignmentRegex = /(\w+)\.(\w+)\s*=\s*(.*)$/gm; // matches widgetId.setter = value let modifiedCode = js;