import { useCallback, useEffect, useState } from "react"; import Form from "@rjsf/mantine"; import validator from "@rjsf/validator-ajv8"; import type { RJSFSchema, UiSchema } from "@rjsf/utils"; import { Alert, Button, Card, Code, Select, Table, Text, Textarea, Title, } from "@mantine/core"; import { IconAlertCircle, IconPlayerPlay } from "@tabler/icons-react"; import { ApiError, api, type FlowDefinition, type InputSchema, type Run } from "../api"; import StatusBadge from "../components/StatusBadge"; export default function WorkflowsPage() { const [flows, setFlows] = useState([]); const [flowId, setFlowId] = useState(""); const [schema, setSchema] = useState(null); const [formData, setFormData] = useState>({}); const [freeText, setFreeText] = useState(""); const [runs, setRuns] = useState([]); const [result, setResult] = useState(""); const [error, setError] = useState(""); const [busy, setBusy] = useState(false); const fail = useCallback((e: unknown) => { setError(e instanceof ApiError ? `${e.status}: ${e.message}` : String(e)); }, []); useEffect(() => { api .listFlows() .then((list) => { setFlows(list); const first = list[0]; if (first) setFlowId((prev) => prev || first.id); }) .catch(fail); }, [fail]); useEffect(() => { if (!flowId) return; setError(""); setResult(""); Promise.all([api.getInputSchema(flowId), api.listRuns(flowId)]) .then(([s, r]) => { setSchema(s); setFormData({}); setRuns(r); }) .catch((e: unknown) => { // Flows without a deployed version have no schema yet. if (e instanceof ApiError && e.status === 404) { setSchema(null); setRuns([]); setError("Für diesen Flow ist noch keine Version deployed."); } else fail(e); }); }, [flowId, fail]); async function onRun(input: unknown) { if (!flowId) return; setBusy(true); setError(""); setResult(""); try { const run = await api.runFlow(flowId, input); setRuns((prev) => [run, ...prev]); setResult(run.output?.result ?? run.output?.error ?? run.status); } catch (e) { fail(e); } finally { setBusy(false); } } return (
Workflows {error && ( } mb="md"> {error} )}