diff --git a/skyvern-frontend/src/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup.tsx b/skyvern-frontend/src/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup.tsx index 2d5d1757..a7460c9e 100644 --- a/skyvern-frontend/src/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup.tsx +++ b/skyvern-frontend/src/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup.tsx @@ -42,8 +42,6 @@ function WorkflowDataSchemaInputGroup({ return TSON.parse(value); }, [value]); - console.log({ tsonResult }); - const getDataSchemaSuggestionMutation = useMutation({ mutationFn: async () => { const client = await getClient(credentialGetter); diff --git a/skyvern-frontend/src/routes/workflows/editor/nodes/CodeBlockNode/CodeBlockNode.tsx b/skyvern-frontend/src/routes/workflows/editor/nodes/CodeBlockNode/CodeBlockNode.tsx index 38427bca..44c7553b 100644 --- a/skyvern-frontend/src/routes/workflows/editor/nodes/CodeBlockNode/CodeBlockNode.tsx +++ b/skyvern-frontend/src/routes/workflows/editor/nodes/CodeBlockNode/CodeBlockNode.tsx @@ -9,6 +9,7 @@ import { NodeHeader } from "../components/NodeHeader"; import { useParams } from "react-router-dom"; import { statusIsRunningOrQueued } from "@/routes/tasks/types"; import { useWorkflowRunQuery } from "@/routes/workflows/hooks/useWorkflowRunQuery"; +import { deepEqualStringArrays } from "@/util/equality"; function CodeBlockNode({ id, data }: NodeProps) { const { updateNodeData } = useReactFlow(); @@ -64,10 +65,20 @@ function CodeBlockNode({ id, data }: NodeProps) { { + const differs = !deepEqualStringArrays( + inputs.parameterKeys, + Array.from(parameterKeys), + ); + + if (!differs) { + return; + } + setInputs({ ...inputs, parameterKeys: Array.from(parameterKeys), }); + updateNodeData(id, { parameterKeys: Array.from(parameterKeys) }); }} values={new Set(inputs.parameterKeys ?? [])} diff --git a/skyvern-frontend/src/util/equality.test.ts b/skyvern-frontend/src/util/equality.test.ts new file mode 100644 index 00000000..c331db7b --- /dev/null +++ b/skyvern-frontend/src/util/equality.test.ts @@ -0,0 +1,39 @@ +import { deepEqualStringArrays } from "./equality"; +import { describe, test, expect } from "vitest"; + +describe("deepEqualStringArrays", () => { + test("both undefined", () => { + expect(deepEqualStringArrays(undefined, undefined)).toBe(true); + }); + + test("one undefined, one defined", () => { + expect(deepEqualStringArrays(undefined, ["a"])).toBe(false); + expect(deepEqualStringArrays(["a"], undefined)).toBe(false); + }); + + test("both null", () => { + expect(deepEqualStringArrays(null, null)).toBe(true); + }); + + test("one null, one defined", () => { + expect(deepEqualStringArrays(null, ["a"])).toBe(false); + expect(deepEqualStringArrays(["a"], null)).toBe(false); + }); + + test("different lengths", () => { + expect(deepEqualStringArrays(["a"], ["a", "b"])).toBe(false); + expect(deepEqualStringArrays(["a", "b"], ["a"])).toBe(false); + }); + + test("same elements, same order", () => { + expect(deepEqualStringArrays(["a", "b", "c"], ["a", "b", "c"])).toBe(true); + }); + + test("same elements, different order", () => { + expect(deepEqualStringArrays(["a", "b", "c"], ["c", "b", "a"])).toBe(false); + }); + + test("different elements", () => { + expect(deepEqualStringArrays(["a", "b", "c"], ["a", "b", "d"])).toBe(false); + }); +}); diff --git a/skyvern-frontend/src/util/equality.ts b/skyvern-frontend/src/util/equality.ts new file mode 100644 index 00000000..9963d12c --- /dev/null +++ b/skyvern-frontend/src/util/equality.ts @@ -0,0 +1,13 @@ +function deepEqualStringArrays( + a: string[] | null | undefined, + b: string[] | null | undefined, +): boolean { + if (a === undefined && b === undefined) return true; + if (a === undefined || b === undefined) return false; + if (a === null && b === null) return true; + if (a === null || b === null) return false; + if (a.length !== b.length) return false; + return a.every((val, i) => val === b[i]); +} + +export { deepEqualStringArrays };