'use client'; import * as React from 'react'; import { Upload, Plus } from 'lucide-react'; import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/Button'; import { decodeAudioFile } from '@/lib/audio/decoder'; export interface ImportTrackDialogProps { open: boolean; onClose: () => void; onImportTrack: (buffer: AudioBuffer, name: string) => void; } export function ImportTrackDialog({ open, onClose, onImportTrack, }: ImportTrackDialogProps) { const [isDragging, setIsDragging] = React.useState(false); const [isLoading, setIsLoading] = React.useState(false); const fileInputRef = React.useRef(null); const handleFiles = async (files: FileList) => { setIsLoading(true); // Convert FileList to Array to prevent any weird behavior const fileArray = Array.from(files); console.log(`[ImportTrackDialog] Processing ${fileArray.length} files`, fileArray); try { // Process files sequentially for (let i = 0; i < fileArray.length; i++) { console.log(`[ImportTrackDialog] Loop iteration ${i}, fileArray.length: ${fileArray.length}`); const file = fileArray[i]; console.log(`[ImportTrackDialog] Processing file ${i + 1}/${fileArray.length}: ${file.name}, type: ${file.type}`); if (!file.type.startsWith('audio/')) { console.warn(`Skipping non-audio file: ${file.name} (type: ${file.type})`); continue; } try { console.log(`[ImportTrackDialog] Decoding file ${i + 1}/${files.length}: ${file.name}`); const buffer = await decodeAudioFile(file); const trackName = file.name.replace(/\.[^/.]+$/, ''); // Remove extension console.log(`[ImportTrackDialog] Importing track: ${trackName}`); onImportTrack(buffer, trackName); console.log(`[ImportTrackDialog] Track imported: ${trackName}`); } catch (error) { console.error(`Failed to import ${file.name}:`, error); } console.log(`[ImportTrackDialog] Finished processing file ${i + 1}`); } console.log('[ImportTrackDialog] Loop completed, all files processed'); } catch (error) { console.error('[ImportTrackDialog] Error in handleFiles:', error); } finally { setIsLoading(false); console.log('[ImportTrackDialog] Closing dialog'); onClose(); } }; const handleFileSelect = (e: React.ChangeEvent) => { const files = e.target.files; if (files && files.length > 0) { handleFiles(files); } // Reset input e.target.value = ''; }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(true); }; const handleDragLeave = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); const files = e.dataTransfer.files; if (files && files.length > 0) { handleFiles(files); } }; return (
{/* Drag and Drop Area */}

{isLoading ? 'Importing files...' : 'Drag and drop audio files here'}

or

{/* Supported Formats */}

Supported formats:

MP3, WAV, OGG, FLAC, M4A, AAC, and more

💡 Tip: Select multiple files at once or drag multiple files to import them all as separate tracks

{/* Actions */}
); }