diff --git a/packages/connect-react/CHANGELOG.md b/packages/connect-react/CHANGELOG.md index af8ac173e64a3..2d7a9befc78af 100644 --- a/packages/connect-react/CHANGELOG.md +++ b/packages/connect-react/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog +# [1.0.0-preview.25] - 2025-01-28 + +- Show prop labels instead of values after selecting dynamic props +- Fix the bug where a remote option would not be reloaded when the form component is re-rendered + # [1.0.0-preview.24] - 2025-01-24 - Fix the bug where inputting multiple strings into an array prop would merge the strings into one diff --git a/packages/connect-react/examples/nextjs/package-lock.json b/packages/connect-react/examples/nextjs/package-lock.json index 9d9ef59557722..a68badecb0ec5 100644 --- a/packages/connect-react/examples/nextjs/package-lock.json +++ b/packages/connect-react/examples/nextjs/package-lock.json @@ -23,7 +23,7 @@ }, "../..": { "name": "@pipedream/connect-react", - "version": "1.0.0-preview.24", + "version": "1.0.0-preview.25", "license": "MIT", "dependencies": { "@pipedream/sdk": "workspace:^", diff --git a/packages/connect-react/package.json b/packages/connect-react/package.json index b4c52d6571bd7..1f50b66dc317f 100644 --- a/packages/connect-react/package.json +++ b/packages/connect-react/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/connect-react", - "version": "1.0.0-preview.24", + "version": "1.0.0-preview.25", "description": "Pipedream Connect library for React", "files": [ "dist" diff --git a/packages/connect-react/src/components/ControlSelect.tsx b/packages/connect-react/src/components/ControlSelect.tsx index b7f1be6ae704d..fcc312f665098 100644 --- a/packages/connect-react/src/components/ControlSelect.tsx +++ b/packages/connect-react/src/components/ControlSelect.tsx @@ -171,26 +171,16 @@ export function ControlSelect({ if (o) { if (Array.isArray(o)) { if (typeof o[0] === "object" && "value" in o[0]) { - const vs = []; - for (const _o of o) { - if (prop.withLabel) { - vs.push(_o); - } else { - vs.push(_o.value); - } - } - onChange(vs); - } else { - onChange(o); - } - } else if (typeof o === "object" && "value" in o) { - if (prop.withLabel) { onChange({ __lv: o, }); } else { - onChange(o.value); + onChange(o); } + } else if (typeof o === "object" && "value" in o) { + onChange({ + __lv: o, + }); } else { throw new Error("unhandled option type"); // TODO } diff --git a/packages/connect-react/src/hooks/form-context.tsx b/packages/connect-react/src/hooks/form-context.tsx index 6c0634a15918a..2f26376e4b3dc 100644 --- a/packages/connect-react/src/hooks/form-context.tsx +++ b/packages/connect-react/src/hooks/form-context.tsx @@ -13,6 +13,7 @@ import { appPropErrors, arrayPropErrors, booleanPropErrors, integerPropErrors, stringPropErrors, } from "../utils/component"; +import _ from "lodash"; export type DynamicProps = { id: string; configurableProps: T; }; // TODO @@ -254,6 +255,15 @@ export const FormContextProvider = ({ setErrors(_errors); }; + useEffect(() => { + // Initialize queryDisabledIdx on load so that we don't force users + // to reconfigure a prop they've already configured whenever the page + // or component is reloaded + updateConfiguredPropsQueryDisabledIdx(_configuredProps) + }, [ + _configuredProps, + ]); + useEffect(() => { const newConfiguredProps: ConfiguredProps = {}; for (const prop of configurableProps) { @@ -365,6 +375,15 @@ export const FormContextProvider = ({ } } // propsNeedConfiguring.splice(0, propsNeedConfiguring.length, ..._propsNeedConfiguring) + + // Prevent useEffect/useState infinite loop by updating + // propsNeedConfiguring only if there is an actual change to the list of + // props that need to be configured. + // NB: The infinite loop is triggered because of calling + // checkPropsNeedConfiguring() from registerField, which is called + // from inside useEffect. + if (_propsNeedConfiguring && propsNeedConfiguring && _.isEqual(_propsNeedConfiguring, propsNeedConfiguring)) return; + setPropsNeedConfiguring(_propsNeedConfiguring) } @@ -373,6 +392,7 @@ export const FormContextProvider = ({ fields[field.prop.name] = field return fields }); + checkPropsNeedConfiguring() }; // console.log("***", configurableProps, configuredProps) diff --git a/packages/connect-react/src/utils/component.ts b/packages/connect-react/src/utils/component.ts index c3fe9e212832b..e217e1a985a7d 100644 --- a/packages/connect-react/src/utils/component.ts +++ b/packages/connect-react/src/utils/component.ts @@ -40,6 +40,9 @@ export function valuesFromOptions(value: unknown | T[] | PropOptions): T[] } return results } + if (value && typeof value === "object" && Array.isArray(value.__lv)) { + return value.__lv as T[] + } if (!Array.isArray(value)) return [] return value as T[]