'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' | 'master'>('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 */}

Track Management

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

Tracks ({tracks.length})

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

{selectedTrack ? 'Track controls are on the left of each track. Effects for the selected track are shown below.' : 'Click a track\'s waveform to select it and edit its effects below.'}

) : (

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

)} {/* Selected Track Effects */} {selectedTrack && (

Track Effects

{trackEffectChain && trackEffectChain.effects.length > 0 && ( )}
)} )} {activeTab === 'master' && ( <> {/* Master Channel Info */}

Master Channel

Master effects are applied to the final mix of all tracks.

{/* Master Effects */}

Master Effects

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