import { useState } from 'react'; import { Button, SegmentInput, Checkbox, Spinner } from '@ifrc-go/ui'; import styles from './ExportModal.module.css'; interface ExportModalProps { isOpen: boolean; onClose: () => void; onExport: (mode: 'standard' | 'fine-tuning', selectedTypes: string[]) => void; filteredCount: number; totalCount: number; hasFilters: boolean; crisisMapsCount: number; droneImagesCount: number; isLoading?: boolean; exportSuccess?: boolean; variant?: 'bulk' | 'single'; onNavigateToList?: () => void; onNavigateAndExport?: () => void; } export default function ExportModal({ isOpen, onClose, onExport, crisisMapsCount, droneImagesCount, isLoading = false, exportSuccess = false, variant = 'bulk', onNavigateAndExport }: ExportModalProps) { const [exportMode, setExportMode] = useState<'standard' | 'fine-tuning'>('standard'); const [trainSplit, setTrainSplit] = useState(80); const [testSplit, setTestSplit] = useState(10); const [valSplit, setValSplit] = useState(10); const [crisisMapsSelected, setCrisisMapsSelected] = useState(true); const [droneImagesSelected, setDroneImagesSelected] = useState(true); const handleExport = () => { if (variant === 'single') { // For single item export, just export immediately onExport(exportMode, ['crisis_map', 'drone_image']); // Export regardless of type return; } // For bulk export, check selections if (!crisisMapsSelected && !droneImagesSelected) { alert('Please select at least one image type to export.'); return; } const selectedTypes: string[] = []; if (crisisMapsSelected) selectedTypes.push('crisis_map'); if (droneImagesSelected) selectedTypes.push('drone_image'); onExport(exportMode, selectedTypes); }; const handleClose = () => { onClose(); }; if (!isOpen) return null; // Single item export UI if (variant === 'single') { return (
e.stopPropagation()}> {isLoading && (
Exporting...
This might take a few seconds
)} {exportSuccess && (
Export Successful!
Your dataset has been downloaded
)}

Export Single Item

This only exports the 1 item currently on display.

You may export the entire dataset from the "list view" here:

); } // Bulk export UI (original functionality) return (
e.stopPropagation()}> {isLoading && (
Exporting...
This might take a few seconds
)} {exportSuccess && (
Export Successful!
Your dataset has been downloaded
)}

Export Dataset

{/* Export Mode Switch */}
{ if (value === 'standard' || value === 'fine-tuning') { setExportMode(value); } }} options={[ { key: 'standard' as const, label: 'Standard' }, { key: 'fine-tuning' as const, label: 'Fine-tuning' } ]} keySelector={(o) => o.key} labelSelector={(o) => o.label} disabled={isLoading} />
{/* Train/Test/Val Split Configuration - Only show for Fine-tuning mode */} {exportMode === 'fine-tuning' && (
Dataset Split Configuration
{ const newTrain = parseInt(e.target.value) || 0; const remaining = 100 - newTrain; if (remaining >= 0) { setTrainSplit(newTrain); if (testSplit + valSplit > remaining) { setTestSplit(Math.floor(remaining / 2)); setValSplit(remaining - Math.floor(remaining / 2)); } } }} className={styles.splitInput} disabled={isLoading} />
{ const newTest = parseInt(e.target.value) || 0; const remaining = 100 - trainSplit - newTest; if (remaining >= 0) { setTestSplit(newTest); setValSplit(remaining); } }} className={styles.splitInput} disabled={isLoading} />
{ const newVal = parseInt(e.target.value) || 0; const remaining = 100 - trainSplit - newVal; if (remaining >= 0) { setValSplit(newVal); setTestSplit(remaining); } }} className={styles.splitInput} disabled={isLoading} />
{trainSplit + testSplit + valSplit !== 100 && (
Must equal 100%
)}
)}
setCrisisMapsSelected(value)} disabled={isLoading} />
setDroneImagesSelected(value)} disabled={isLoading} />
); }