import { FileCard } from './FileCard.tsx'; import { FileCardAdd } from './FileCardAdd.tsx'; import React from 'react'; import { DroppedFile, useFileDrop } from './useFileDrop.ts'; import { THEME } from './theme.ts'; import { ThemeToggleButton } from './ThemeToggleButton.tsx'; import { useThemeMode } from './ThemeModeContext.tsx'; export interface PlanDropProps { setPlan: React.Dispatch>; descriptors: DroppedFile[] | undefined; setDescriptors: React.Dispatch< React.SetStateAction >; } export function PlanDrop({ setPlan, descriptors, setDescriptors, }: PlanDropProps) { const { isDarkMode } = useThemeMode(); const theme = THEME[isDarkMode ? 'dark' : 'light']; const { dragState, error, fileName, fileInputRef, handleFileSelect, triggerFileInput, handleDragOver, handleDragLeave, handleDrop, } = useFileDrop(setPlan, true); const getDragMessage = () => { switch (dragState) { case 'dragging': return fileName ? `Drop "${fileName}" to visualize` : 'Drop to visualize plan'; case 'processing': return fileName ? `Processing "${fileName}"...` : 'Processing file...'; case 'success': return fileName ? `"${fileName}" loaded successfully!` : 'File loaded successfully!'; case 'error': return error?.message || 'Error loading file'; default: return 'Drop your Substrait plan here'; } }; const getMessageColor = () => { switch (dragState) { case 'dragging': return isDarkMode ? 'text-blue-300' : 'text-blue-600'; case 'processing': return isDarkMode ? 'text-yellow-300' : 'text-yellow-600'; case 'success': return isDarkMode ? 'text-green-300' : 'text-green-600'; case 'error': return isDarkMode ? 'text-red-300' : 'text-red-600'; default: return isDarkMode ? 'text-gray-300' : 'text-gray-700'; } }; return (
{descriptors?.map((_, i) => ( setDescriptors(prev => prev?.map((desc, index) => index === i ? { ...desc, help: newHelp } : desc, ), ) } onDelete={() => setDescriptors(prev => prev?.filter((_, ind) => ind !== i)) } /> ))} setDescriptors(prev => (prev ?? []).concat(file))} />
{getDragMessage()}
{dragState === 'processing' && (
Please wait...
)} {dragState === 'idle' && (
paste (Cmd+V) or click to browse
)}
); }