import {useEffect, useState} from "react"; import {ChevronDown, ChevronUp, Copy, Loader2, Play, Wand2} from "lucide-react"; import {useMutation} from "@tanstack/react-query"; import {invokeCloudResource} from "@/api/cloudProxyClient"; import type {ServerlessInvokeResult} from "@/api/cloudProxyClient"; import type {CloudProvider} from "@/types/cloud"; import type {CloudResource} from "@/types/resource"; import {ServiceIcon} from "@/components/serviceIcons"; import {LogsQueryPanel} from "./LogsQueryPanel"; interface ServerlessInvokePanelProps { cloud: CloudProvider; resource?: CloudResource; runtimeReachable: boolean; } export function ServerlessInvokePanel({ cloud, resource, runtimeReachable, }: ServerlessInvokePanelProps) { const [payload, setPayload] = useState("{\n \n}"); const [invokeResult, setInvokeResult] = useState(null); const [showLog, setShowLog] = useState(false); const [copied, setCopied] = useState(false); const [validationError, setValidationError] = useState(null); const [logsRefreshKey, setLogsRefreshKey] = useState(0); useEffect(() => { setPayload("{\n \n}"); setInvokeResult(null); setShowLog(false); setCopied(false); setValidationError(null); setLogsRefreshKey(0); }, [resource?.id]); const isSupportedResource = resource?.service === "serverless" && (resource.type === "lambda" || resource.type === "azure-function" || resource.type === "gcp-function"); const canInvoke = Boolean(resource && isSupportedResource && runtimeReachable); const canSubmit = canInvoke && !validationError; const providerLabel = cloud === "aws" ? "Lambda function" : cloud === "azure" ? "Azure Function" : "Google Cloud Function"; const invokeMutation = useMutation({ mutationFn: () => invokeCloudResource(cloud, "serverless", resource!.id, payload), onSuccess: (result) => { setInvokeResult(result); setShowLog(false); setCopied(false); setLogsRefreshKey((value) => value + 1); }, }); const isInvokeError = Boolean( invokeResult?.functionError || (invokeResult && invokeResult.statusCode >= 400), ); const formatPayload = () => { try { const formatted = JSON.stringify(JSON.parse(payload), null, 2); setPayload(formatted); setValidationError(null); } catch { setValidationError("Payload must be valid JSON before formatting."); } }; const clearPayload = () => { setPayload("{}"); setValidationError(null); }; const copyResponse = async () => { if (!invokeResult) return; await navigator.clipboard.writeText(invokeResult.payload || ""); setCopied(true); window.setTimeout(() => setCopied(false), 1200); }; if (!resource || resource.service !== "serverless") { return (

Select a serverless function

Select a Lambda function, Azure Function, or Google Cloud Function to invoke it from Cloud Explorer.

); } return (

Serverless Actions

Invoke {providerLabel}

Send a JSON event payload to the selected serverless function.

{canInvoke ? "Ready" : "Runtime unavailable"}