import { getClient } from "@/api/AxiosClient"; import { GarbageIcon } from "@/components/icons/GarbageIcon"; import { Button } from "@/components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { toast } from "@/components/ui/use-toast"; import { useCredentialGetter } from "@/hooks/useCredentialGetter"; import { CopyIcon, DotsHorizontalIcon, DownloadIcon, ReloadIcon, } from "@radix-ui/react-icons"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { AxiosError } from "axios"; import { stringify as convertToYAML } from "yaml"; import { convert } from "./editor/workflowEditorUtils"; import { useCreateWorkflowMutation } from "./hooks/useCreateWorkflowMutation"; import { WorkflowApiResponse } from "./types/workflowTypes"; type Props = { workflow: WorkflowApiResponse; onSuccessfullyDeleted?: () => void; }; function downloadFile(fileName: string, contents: string) { const element = document.createElement("a"); element.setAttribute( "href", "data:text/plain;charset=utf-8," + encodeURIComponent(contents), ); element.setAttribute("download", fileName); element.style.display = "none"; document.body.appendChild(element); element.click(); document.body.removeChild(element); } function WorkflowActions({ workflow, onSuccessfullyDeleted }: Props) { const credentialGetter = useCredentialGetter(); const queryClient = useQueryClient(); function handleExport(type: "json" | "yaml") { if (!workflow) { return; } const fileName = `${workflow.title}.${type}`; const contents = type === "json" ? JSON.stringify(convert(workflow), null, 2) : convertToYAML(convert(workflow)); downloadFile(fileName, contents); } const createWorkflowMutation = useCreateWorkflowMutation(); const deleteWorkflowMutation = useMutation({ mutationFn: async (id: string) => { const client = await getClient(credentialGetter); return client.delete(`/workflows/${id}`); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["workflows"], }); onSuccessfullyDeleted?.(); }, onError: (error: AxiosError) => { toast({ variant: "destructive", title: "Failed to delete workflow", description: error.message, }); }, }); return ( { if (!workflow) { return; } const clonedWorkflow = convert({ ...workflow, title: `Copy of ${workflow.title}`, }); createWorkflowMutation.mutate(clonedWorkflow); }} className="p-2" > Clone Workflow Export as... { handleExport("yaml"); }} > YAML { handleExport("json"); }} > JSON Delete Workflow e.preventDefault()}> Are you sure? The workflow{" "} {workflow.title}{" "} will be deleted. ); } export { WorkflowActions };