'use client'; import * as React from 'react'; import { ChevronDown, ChevronUp, Plus } from 'lucide-react'; import { Button } from '@/components/ui/Button'; import { EffectDevice } from './EffectDevice'; import { EffectBrowser } from './EffectBrowser'; import type { Track } from '@/types/track'; import type { EffectType } from '@/lib/audio/effects/chain'; import { cn } from '@/lib/utils/cn'; export interface EffectsPanelProps { track: Track | null; // Selected track visible: boolean; height: number; onToggleVisible: () => void; onResizeHeight: (height: number) => void; onAddEffect?: (effectType: EffectType) => void; onToggleEffect?: (effectId: string) => void; onRemoveEffect?: (effectId: string) => void; onUpdateEffect?: (effectId: string, parameters: any) => void; onToggleEffectExpanded?: (effectId: string) => void; } export function EffectsPanel({ track, visible, height, onToggleVisible, onResizeHeight, onAddEffect, onToggleEffect, onRemoveEffect, onUpdateEffect, onToggleEffectExpanded, }: EffectsPanelProps) { const [effectBrowserOpen, setEffectBrowserOpen] = React.useState(false); const [isResizing, setIsResizing] = React.useState(false); const resizeStartRef = React.useRef({ y: 0, height: 0 }); // Resize handler const handleResizeStart = React.useCallback( (e: React.MouseEvent) => { e.preventDefault(); setIsResizing(true); resizeStartRef.current = { y: e.clientY, height }; }, [height] ); React.useEffect(() => { if (!isResizing) return; const handleMouseMove = (e: MouseEvent) => { const delta = resizeStartRef.current.y - e.clientY; const newHeight = Math.max(200, Math.min(600, resizeStartRef.current.height + delta)); onResizeHeight(newHeight); }; const handleMouseUp = () => { setIsResizing(false); }; window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mouseup', handleMouseUp); return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp); }; }, [isResizing, onResizeHeight]); if (!visible) { // Collapsed state - just show header bar return (
{track && (
{track.effectChain.effects.length} device(s)
)}
); } return (
{/* Resize handle */}
{/* Header */}
{track && ( <> {track.effectChain.effects.length} device(s) )}
{/* Device Rack */}
{!track ? (
Select a track to view its devices
) : track.effectChain.effects.length === 0 ? (

No devices on this track

) : (
{track.effectChain.effects.map((effect) => ( onToggleEffect?.(effect.id)} onRemove={() => onRemoveEffect?.(effect.id)} onUpdateParameters={(params) => onUpdateEffect?.(effect.id, params)} onToggleExpanded={() => onToggleEffectExpanded?.(effect.id)} /> ))}
)}
{/* Effect Browser Dialog */} {track && ( setEffectBrowserOpen(false)} onSelectEffect={(effectType) => { if (onAddEffect) { onAddEffect(effectType); } setEffectBrowserOpen(false); }} /> )}
); }