From b200acec9ef3ce10506ef2aa80e65466fd139fd1 Mon Sep 17 00:00:00 2001 From: Kerem Yilmaz Date: Tue, 17 Sep 2024 06:48:43 -0700 Subject: [PATCH] Add copy as curl button to run workflow form (#839) --- .../src/routes/workflows/RunWorkflowForm.tsx | 99 ++++++++++++++----- 1 file changed, 72 insertions(+), 27 deletions(-) diff --git a/skyvern-frontend/src/routes/workflows/RunWorkflowForm.tsx b/skyvern-frontend/src/routes/workflows/RunWorkflowForm.tsx index 62c3f419..4316dd81 100644 --- a/skyvern-frontend/src/routes/workflows/RunWorkflowForm.tsx +++ b/skyvern-frontend/src/routes/workflows/RunWorkflowForm.tsx @@ -8,7 +8,7 @@ import { Link, useParams } from "react-router-dom"; import { WorkflowParameterInput } from "./WorkflowParameterInput"; import { Button } from "@/components/ui/button"; import { toast } from "@/components/ui/use-toast"; -import { PlayIcon, ReloadIcon } from "@radix-ui/react-icons"; +import { CopyIcon, PlayIcon, ReloadIcon } from "@radix-ui/react-icons"; import { Table, TableBody, @@ -18,12 +18,47 @@ import { TableRow, } from "@/components/ui/table"; import { ToastAction } from "@radix-ui/react-toast"; +import fetchToCurl from "fetch-to-curl"; +import { apiBaseUrl } from "@/util/env"; +import { useApiCredential } from "@/hooks/useApiCredential"; +import { copyText } from "@/util/copyText"; type Props = { workflowParameters: Array; initialValues: Record; }; +function parseValuesForWorkflowRun( + values: Record, + workflowParameters: Array, +): Record { + return Object.fromEntries( + Object.entries(values).map(([key, value]) => { + const parameter = workflowParameters?.find( + (parameter) => parameter.key === key, + ); + if (parameter?.workflow_parameter_type === "json") { + try { + return [key, JSON.parse(value as string)]; + } catch { + console.error("Invalid JSON"); // this should never happen, it should fall to form error + return [key, value]; + } + } + // can improve this via the type system maybe + if ( + parameter?.workflow_parameter_type === "file_url" && + value !== null && + typeof value === "object" && + "s3uri" in value + ) { + return [key, value.s3uri]; + } + return [key, value]; + }), + ); +} + function RunWorkflowForm({ workflowParameters, initialValues }: Props) { const { workflowPermanentId } = useParams(); const credentialGetter = useCredentialGetter(); @@ -31,6 +66,7 @@ function RunWorkflowForm({ workflowParameters, initialValues }: Props) { const form = useForm({ defaultValues: initialValues, }); + const apiCredential = useApiCredential(); const runWorkflowMutation = useMutation({ mutationFn: async (values: Record) => { @@ -74,31 +110,7 @@ function RunWorkflowForm({ workflowParameters, initialValues }: Props) { }); function onSubmit(values: Record) { - const parsedValues = Object.fromEntries( - Object.entries(values).map(([key, value]) => { - const parameter = workflowParameters?.find( - (parameter) => parameter.key === key, - ); - if (parameter?.workflow_parameter_type === "json") { - try { - return [key, JSON.parse(value as string)]; - } catch { - console.error("Invalid JSON"); // this should never happen, it should fall to form error - return [key, value]; - } - } - // can improve this via the type system maybe - if ( - parameter?.workflow_parameter_type === "file_url" && - value !== null && - typeof value === "object" && - "s3uri" in value - ) { - return [key, value.s3uri]; - } - return [key, value]; - }), - ); + const parsedValues = parseValuesForWorkflowRun(values, workflowParameters); runWorkflowMutation.mutate(parsedValues); } @@ -180,7 +192,40 @@ function RunWorkflowForm({ workflowParameters, initialValues }: Props) { })} -
+
+