import * as React from "react"; // ; import Editor, { OnMount } from "@monaco-editor/react"; import { BaseNode } from "@flyde/core"; import { useLocalStorage } from "../../lib/user-preferences"; import { InfoTooltip } from "../../lib/InfoTooltip"; import { usePorts } from "../../flow-editor/ports"; import { Button } from "../../ui"; import { Dialog, DialogContent, DialogFooter, DialogHeader } from "../../ui"; import { Slider } from "../../ui"; import { cn } from "../../lib/utils"; export interface RunFlowModalProps { node: BaseNode; onClose: () => void; } export const RunFlowModal: React.FC = React.memo( function RunFlowModal(props) { const { onClose, node } = props; const { onRunFlow } = usePorts(); const [executionDelay, setExecutionDelay] = React.useState(0); const [lastValues, setLastValues] = useLocalStorage( `run-inputs-${node.id}`, Object.keys(node.inputs).reduce((acc, key) => { acc[key] = `Enter a value for input ${key}`; return acc; }, {} as Record) ); const [inputsValue, setInputsValue] = React.useState( JSON.stringify(lastValues, null, 2) ); const onMonacoMount: OnMount = (editor) => { if (editor) { editor.updateOptions({ lineNumbers: "off", minimap: { enabled: false }, }); } }; const _onRun = React.useCallback(() => { const inputs = JSON.parse(inputsValue); setLastValues(inputs); onRunFlow(inputs, executionDelay); onClose(); }, [inputsValue, setLastValues, onRunFlow, executionDelay, onClose]); const onKeyDown: React.KeyboardEventHandler = (e) => { if (e.key === "Enter" && e.metaKey) { _onRun(); } }; const flowInputs = Object.keys(node.inputs); const optionals = flowInputs.filter( (key) => node.inputs[key]?.mode !== "required" ); const maybeInputs = React.useMemo(() => { if (flowInputs.length) { return ( <> This node receives external inputs. Enter values for each input below: setInputsValue(val ?? "")} onMount={onMonacoMount} /> {optionals.length > 0 ? (
Note: input(s) {optionals.join(", ")} are optional
) : null} ); } else { return This node does not receive any external inputs.; } }, [flowInputs.length, optionals, inputsValue]); return ( onClose()}>
{maybeInputs}
setExecutionDelay(value ?? 0)} min={0} max={1000} step={100} className="w-full" />
{executionDelay}ms
); } );