'use client'; import * as React from 'react'; import { ChevronLeft, ChevronRight, Upload, Plus, Trash2, Link2, FolderOpen, Music2, } from 'lucide-react'; import { Button } from '@/components/ui/Button'; import { cn } from '@/lib/utils/cn'; import type { Track } from '@/types/track'; import type { EffectChain, EffectPreset } from '@/lib/audio/effects/chain'; import { EffectRack } from '@/components/effects/EffectRack'; import { PresetManager } from '@/components/effects/PresetManager'; export interface SidePanelProps { tracks: Track[]; selectedTrackId: string | null; onSelectTrack: (trackId: string | null) => void; onAddTrack: () => void; onImportTracks: () => void; onUpdateTrack: (trackId: string, updates: Partial) => void; onRemoveTrack: (trackId: string) => void; onClearTracks: () => void; // Track effect chain (for selected track) trackEffectChain: EffectChain | null; onToggleTrackEffect: (effectId: string) => void; onRemoveTrackEffect: (effectId: string) => void; onReorderTrackEffects: (fromIndex: number, toIndex: number) => void; onClearTrackChain: () => void; // Master effect chain masterEffectChain: EffectChain; masterEffectPresets: EffectPreset[]; onToggleMasterEffect: (effectId: string) => void; onRemoveMasterEffect: (effectId: string) => void; onReorderMasterEffects: (fromIndex: number, toIndex: number) => void; onSaveMasterPreset: (preset: EffectPreset) => void; onLoadMasterPreset: (preset: EffectPreset) => void; onDeleteMasterPreset: (presetId: string) => void; onClearMasterChain: () => void; className?: string; } export function SidePanel({ tracks, selectedTrackId, onSelectTrack, onAddTrack, onImportTracks, onUpdateTrack, onRemoveTrack, onClearTracks, trackEffectChain, onToggleTrackEffect, onRemoveTrackEffect, onReorderTrackEffects, onClearTrackChain, masterEffectChain, masterEffectPresets, onToggleMasterEffect, onRemoveMasterEffect, onReorderMasterEffects, onSaveMasterPreset, onLoadMasterPreset, onDeleteMasterPreset, onClearMasterChain, className, }: SidePanelProps) { const [isCollapsed, setIsCollapsed] = React.useState(false); const [activeTab, setActiveTab] = React.useState<'tracks' | 'trackFx' | 'masterFx'>('tracks'); const [presetDialogOpen, setPresetDialogOpen] = React.useState(false); const selectedTrack = tracks.find((t) => t.id === selectedTrackId); if (isCollapsed) { return (
); } return (
{/* Header */}
{/* Content */}
{activeTab === 'tracks' && ( <> {/* Track Actions */}

Multi-Track Editor

{tracks.length > 0 && ( )}
{/* Track List - Simplified */} {tracks.length > 0 ? (

Tracks ({tracks.length})

Track controls are located on the left side of each track in the timeline.

Click a track to select it and apply effects from the Effect Chain tab.

) : (

No tracks yet. Add or import audio files to get started.

)} )} {activeTab === 'trackFx' && (

Track Effects {selectedTrack && ( ({String(selectedTrack.name || 'Untitled Track')}) )}

{trackEffectChain && trackEffectChain.effects.length > 0 && ( )}
{!selectedTrack ? (

Select a track to apply effects

) : ( )}
)} {activeTab === 'masterFx' && (

Master Effects

{masterEffectChain.effects.length > 0 && ( )}
setPresetDialogOpen(false)} currentChain={masterEffectChain} presets={masterEffectPresets} onSavePreset={onSaveMasterPreset} onLoadPreset={onLoadMasterPreset} onDeletePreset={onDeleteMasterPreset} onExportPreset={() => {}} onImportPreset={(preset) => onSaveMasterPreset(preset)} />
)}
); }