update too many parameters created when using login block (#2023)
This commit is contained in:
@@ -8,7 +8,7 @@ import {
|
|||||||
import { Skeleton } from "@/components/ui/skeleton";
|
import { Skeleton } from "@/components/ui/skeleton";
|
||||||
import { useCredentialsQuery } from "@/routes/workflows/hooks/useCredentialsQuery";
|
import { useCredentialsQuery } from "@/routes/workflows/hooks/useCredentialsQuery";
|
||||||
import CloudContext from "@/store/CloudContext";
|
import CloudContext from "@/store/CloudContext";
|
||||||
import { useContext, useId } from "react";
|
import { useContext } from "react";
|
||||||
import { useWorkflowParametersState } from "../../useWorkflowParametersState";
|
import { useWorkflowParametersState } from "../../useWorkflowParametersState";
|
||||||
import { CredentialsModal } from "@/routes/credentials/CredentialsModal";
|
import { CredentialsModal } from "@/routes/credentials/CredentialsModal";
|
||||||
import { PlusIcon } from "@radix-ui/react-icons";
|
import { PlusIcon } from "@radix-ui/react-icons";
|
||||||
@@ -16,14 +16,20 @@ import {
|
|||||||
CredentialModalTypes,
|
CredentialModalTypes,
|
||||||
useCredentialModalState,
|
useCredentialModalState,
|
||||||
} from "@/routes/credentials/useCredentialModalState";
|
} from "@/routes/credentials/useCredentialModalState";
|
||||||
|
import { useNodes } from "@xyflow/react";
|
||||||
|
import { AppNode } from "..";
|
||||||
|
import { isLoginNode } from "./types";
|
||||||
|
import { parameterIsSkyvernCredential } from "../../types";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
nodeId: string;
|
||||||
value?: string;
|
value?: string;
|
||||||
onChange?: (value: string) => void;
|
onChange?: (value: string) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
function LoginBlockCredentialSelector({ value, onChange }: Props) {
|
function LoginBlockCredentialSelector({ nodeId, value, onChange }: Props) {
|
||||||
const { setIsOpen, setType } = useCredentialModalState();
|
const { setIsOpen, setType } = useCredentialModalState();
|
||||||
|
const nodes = useNodes<AppNode>();
|
||||||
const [workflowParameters, setWorkflowParameters] =
|
const [workflowParameters, setWorkflowParameters] =
|
||||||
useWorkflowParametersState();
|
useWorkflowParametersState();
|
||||||
const credentialParameters = workflowParameters.filter(
|
const credentialParameters = workflowParameters.filter(
|
||||||
@@ -38,7 +44,6 @@ function LoginBlockCredentialSelector({ value, onChange }: Props) {
|
|||||||
const { data: credentials = [], isFetching } = useCredentialsQuery({
|
const { data: credentials = [], isFetching } = useCredentialsQuery({
|
||||||
enabled: isCloud,
|
enabled: isCloud,
|
||||||
});
|
});
|
||||||
const noneItemValue = useId();
|
|
||||||
|
|
||||||
if (isCloud && isFetching) {
|
if (isCloud && isFetching) {
|
||||||
return <Skeleton className="h-8 w-full" />;
|
return <Skeleton className="h-8 w-full" />;
|
||||||
@@ -81,38 +86,66 @@ function LoginBlockCredentialSelector({ value, onChange }: Props) {
|
|||||||
<>
|
<>
|
||||||
<Select
|
<Select
|
||||||
value={value}
|
value={value}
|
||||||
onValueChange={(value) => {
|
onValueChange={(newValue) => {
|
||||||
if (value === "new") {
|
if (newValue === "new") {
|
||||||
setIsOpen(true);
|
setIsOpen(true);
|
||||||
setType(CredentialModalTypes.PASSWORD);
|
setType(CredentialModalTypes.PASSWORD);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const option = options.find((option) => option.value === value);
|
|
||||||
|
let newParameters = [...workflowParameters];
|
||||||
|
|
||||||
|
const loginNodes = nodes
|
||||||
|
.filter((node) => node.id !== nodeId)
|
||||||
|
.filter(isLoginNode);
|
||||||
|
|
||||||
|
const thereIsAParameterWithThisValue = workflowParameters.some(
|
||||||
|
(parameter) =>
|
||||||
|
parameter.parameterType === "credential" &&
|
||||||
|
parameterIsSkyvernCredential(parameter) &&
|
||||||
|
parameter.credentialId === value,
|
||||||
|
);
|
||||||
|
|
||||||
|
const isUsedInOtherLoginNodes =
|
||||||
|
value &&
|
||||||
|
loginNodes.some((node) => node.data.parameterKeys.includes(value));
|
||||||
|
|
||||||
|
const deleteOldParameter =
|
||||||
|
thereIsAParameterWithThisValue && !isUsedInOtherLoginNodes;
|
||||||
|
|
||||||
|
if (deleteOldParameter) {
|
||||||
|
newParameters = newParameters.filter(
|
||||||
|
(parameter) => parameter.key !== value,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const option = options.find((option) => option.value === newValue);
|
||||||
if (option?.type === "credential") {
|
if (option?.type === "credential") {
|
||||||
const existingCredential = workflowParameters.find((parameter) => {
|
const existingCredential = workflowParameters.find((parameter) => {
|
||||||
return (
|
return (
|
||||||
parameter.parameterType === "credential" &&
|
parameter.parameterType === "credential" &&
|
||||||
"credentialId" in parameter &&
|
"credentialId" in parameter &&
|
||||||
parameter.credentialId === value &&
|
parameter.credentialId === newValue &&
|
||||||
parameter.key === value
|
parameter.key === newValue
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
if (!existingCredential) {
|
if (!existingCredential) {
|
||||||
setWorkflowParameters((prev) => [
|
newParameters = [
|
||||||
...prev,
|
...newParameters,
|
||||||
{
|
{
|
||||||
parameterType: "credential",
|
parameterType: "credential",
|
||||||
credentialId: value,
|
credentialId: newValue,
|
||||||
key: value,
|
key: newValue,
|
||||||
},
|
},
|
||||||
]);
|
];
|
||||||
}
|
}
|
||||||
|
} else if (deleteOldParameter) {
|
||||||
|
newParameters = newParameters.filter(
|
||||||
|
(parameter) => parameter.key !== value,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (value === noneItemValue) {
|
onChange?.(newValue);
|
||||||
onChange?.("");
|
setWorkflowParameters(newParameters);
|
||||||
} else {
|
|
||||||
onChange?.(value);
|
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<SelectTrigger className="w-full">
|
<SelectTrigger className="w-full">
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ function LoginNode({ id, data }: NodeProps<LoginNode>) {
|
|||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label className="text-xs text-slate-300">Credential</Label>
|
<Label className="text-xs text-slate-300">Credential</Label>
|
||||||
<LoginBlockCredentialSelector
|
<LoginBlockCredentialSelector
|
||||||
|
nodeId={id}
|
||||||
value={
|
value={
|
||||||
data.parameterKeys.length > 0
|
data.parameterKeys.length > 0
|
||||||
? data.parameterKeys[0]
|
? data.parameterKeys[0]
|
||||||
|
|||||||
Reference in New Issue
Block a user