'use client'; import { Upload } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { useCallback, useState } from 'react'; import { createWorkflowApiV1WorkflowCreateDefinitionPost } from '@/client/sdk.gen'; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { useAuth } from '@/lib/auth'; import logger from '@/lib/logger'; import { getRandomId } from '@/lib/utils'; import { WorkflowData } from '../flow/types'; export function UploadWorkflowButton() { const router = useRouter(); const [isOpen, setIsOpen] = useState(false); const [isDragging, setIsDragging] = useState(false); const [error, setError] = useState(null); const { user, getAccessToken } = useAuth(); const handleFileUpload = useCallback(async (file: File) => { try { const text = await file.text(); const workflowData: WorkflowData = JSON.parse(text); if (!workflowData.workflow_definition?.nodes || !workflowData.workflow_definition?.edges || !workflowData.workflow_definition?.viewport) { throw new Error('Invalid workflow data structure'); } if (!user) return; const accessToken = await getAccessToken(); const response = await createWorkflowApiV1WorkflowCreateDefinitionPost({ body: { name: workflowData.name || `WF-${getRandomId()}`, workflow_definition: workflowData.workflow_definition as unknown as { [key: string]: unknown }, }, headers: { 'Authorization': `Bearer ${accessToken}`, }, }); if (response.data?.id) { router.push(`/workflow/${response.data.id}`); setIsOpen(false); } } catch (err) { setError('Failed to upload workflow. Please check if the file is valid.'); logger.error(`Error uploading workflow: ${err}`); } }, [router, user, getAccessToken]); const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); setError(null); const file = e.dataTransfer.files[0]; if (file && file.type === 'application/json') { handleFileUpload(file); } else { setError('Please upload a valid JSON file'); } }, [handleFileUpload]); const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); setIsDragging(true); }, []); const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); }, []); const handleFileInput = useCallback((e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { handleFileUpload(file); } }, [handleFileUpload]); return ( <> Upload Workflow

Drag and drop your Workflow JSON File here, or Click to Select

{error && (

{error}

)}
); }