'use client'; import * as React from 'react'; import { Save, FolderOpen, Trash2, Download, Upload } from 'lucide-react'; import { Button } from '@/components/ui/Button'; import { Modal } from '@/components/ui/Modal'; import type { EffectChain, EffectPreset } from '@/lib/audio/effects/chain'; import { createPreset, loadPreset } from '@/lib/audio/effects/chain'; export interface PresetManagerProps { open: boolean; onClose: () => void; currentChain: EffectChain; presets: EffectPreset[]; onSavePreset: (preset: EffectPreset) => void; onLoadPreset: (preset: EffectPreset) => void; onDeletePreset: (presetId: string) => void; onExportPreset?: (preset: EffectPreset) => void; onImportPreset?: (preset: EffectPreset) => void; } export function PresetManager({ open, onClose, currentChain, presets, onSavePreset, onLoadPreset, onDeletePreset, onExportPreset, onImportPreset, }: PresetManagerProps) { const [presetName, setPresetName] = React.useState(''); const [presetDescription, setPresetDescription] = React.useState(''); const [mode, setMode] = React.useState<'list' | 'create'>('list'); const fileInputRef = React.useRef(null); const handleSave = () => { if (!presetName.trim()) return; const preset = createPreset(currentChain, presetName.trim(), presetDescription.trim()); onSavePreset(preset); setPresetName(''); setPresetDescription(''); setMode('list'); }; const handleLoad = (preset: EffectPreset) => { onLoadPreset(preset); onClose(); }; const handleExport = (preset: EffectPreset) => { if (!onExportPreset) return; const data = JSON.stringify(preset, null, 2); const blob = new Blob([data], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${preset.name.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.json`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); onExportPreset(preset); }; const handleImportClick = () => { fileInputRef.current?.click(); }; const handleFileChange = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file || !onImportPreset) return; try { const text = await file.text(); const preset: EffectPreset = JSON.parse(text); // Validate preset structure if (!preset.id || !preset.name || !preset.chain) { throw new Error('Invalid preset format'); } onImportPreset(preset); } catch (error) { console.error('Failed to import preset:', error); alert('Failed to import preset. Please check the file format.'); } // Reset input e.target.value = ''; }; return (
{/* Mode Toggle */}
{onImportPreset && ( <> )}
{/* Create Mode */} {mode === 'create' && (
setPresetName(e.target.value)} placeholder="My Awesome Preset" className="w-full px-3 py-2 bg-background border border-border rounded-md text-sm" />