import { PlusIcon } from "@radix-ui/react-icons"; import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; import { WorkflowBlockParameterSelect } from "@/routes/workflows/editor/nodes/WorkflowBlockParameterSelect"; import { useWorkflowParametersStore } from "@/store/WorkflowParametersStore"; import { useState, useEffect } from "react"; import { Cross2Icon } from "@radix-ui/react-icons"; import "./workflow-block-input-set.css"; type Props = { onChange: (parameterKeys: Set) => void; nodeId: string; values: Set; }; function areSetsEqual(a: Set, b: Set): boolean { if (a.size !== b.size) return false; for (const item of a) { if (!b.has(item)) return false; } return true; } function WorkflowBlockInputSet(props: Props) { const { nodeId, onChange, values } = props; const [parameterKeys, setParameterKeys] = useState>(values); const hasKeys = parameterKeys.size > 0; const { parameters: workflowParameters } = useWorkflowParametersStore(); const availableParameterKeys = new Set( workflowParameters.map((parameter) => parameter.key), ); // Sync local state when values prop changes (e.g., parameter renamed externally) useEffect(() => { if (!areSetsEqual(parameterKeys, values)) { setParameterKeys(values); } }, [values, parameterKeys]); useEffect(() => { onChange(new Set(parameterKeys)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [parameterKeys]); return (
{hasKeys ? ( Array.from(parameterKeys).map((parameterKey) => { const missing = !availableParameterKeys.has(parameterKey); return (
{parameterKey} { setParameterKeys((prev) => { const newSet = new Set(prev); newSet.delete(parameterKey); return newSet; }); }} />
); }) ) : (   )}
{ setParameterKeys((prev) => { const newSet = new Set(prev); newSet.add(parameterKey); return newSet; }); }} />
); } export { WorkflowBlockInputSet };