better-chatbot / src /components /workflow /http-value-input.tsx
Bot
Initial commit for HF Spaces
05c5ed5
Raw
History Blame Contribute Delete
3.72 kB
"use client";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { TrashIcon, VariableIcon } from "lucide-react";
import {
HttpValue,
OutputSchemaSourceKey,
} from "lib/ai/workflow/workflow.interface";
import { VariableSelect } from "./variable-select";
import { useReactFlow } from "@xyflow/react";
import { UINode } from "lib/ai/workflow/workflow.interface";
import { Tooltip, TooltipContent, TooltipTrigger } from "ui/tooltip";
import { VariableMentionItem } from "./variable-mention-item";
import { findAvailableSchemaBySource } from "lib/ai/workflow/shared.workflow";
import { useTranslations } from "next-intl";
import { cn, exclude } from "lib/utils";
interface HttpValueInputProps {
value: HttpValue | undefined;
onChange: (value: HttpValue | undefined) => void;
onDelete?: () => void;
placeholder?: string;
currentNodeId: string;
allowedTypes?: string[];
className?: string;
}
export function HttpValueInput({
value,
onChange,
placeholder,
currentNodeId,
allowedTypes = [],
onDelete,
className,
}: HttpValueInputProps) {
const { getNodes, getEdges } = useReactFlow<UINode>();
const t = useTranslations("Workflow");
// Check if current value is a variable reference
const isVariable = value && typeof value === "object" && "nodeId" in value;
// Get the node name for display if it's a variable
const getVariable = (sourceKey: OutputSchemaSourceKey) => {
const data = findAvailableSchemaBySource({
nodeId: currentNodeId,
source: sourceKey,
nodes: getNodes().map((node) => node.data),
edges: getEdges(),
});
return exclude(data, ["type"]);
};
const handleLiteralChange = (inputValue: string) => {
if (inputValue === "") {
onChange(undefined);
return;
}
onChange(inputValue);
};
const handleVariableSelect = (item: {
nodeId: string;
path: string[];
nodeName: string;
type: string;
}) => {
onChange({
nodeId: item.nodeId,
path: item.path,
});
};
return (
<div className={cn("flex items-center gap-1 min-w-0", className)}>
{isVariable ? (
<div className="flex-1 min-w-0">
<VariableMentionItem
className="py-[7px] text-sm truncate"
{...getVariable(value as OutputSchemaSourceKey)}
onRemove={() => onChange(undefined)}
/>
</div>
) : (
<Input
className="flex-1 placeholder:text-xs"
value={value?.toString() || ""}
onChange={(e) => handleLiteralChange(e.target.value)}
placeholder={placeholder}
/>
)}
<Tooltip>
<TooltipTrigger asChild>
<div>
<VariableSelect
currentNodeId={currentNodeId}
onChange={handleVariableSelect}
allowedTypes={allowedTypes}
>
<Button
variant={isVariable ? "secondary" : "ghost"}
onPointerDown={(e) => {
if (isVariable) {
e.preventDefault();
onChange(undefined);
}
}}
size="icon"
className="data-[state=open]:bg-secondary"
>
<VariableIcon className={isVariable ? "text-blue-500" : ""} />
</Button>
</VariableSelect>
</div>
</TooltipTrigger>
<TooltipContent>
<p>{t("selectVariable")}</p>
</TooltipContent>
</Tooltip>
{onDelete && (
<Button variant="ghost" size="icon" onClick={onDelete}>
<TrashIcon />
</Button>
)}
</div>
);
}