import { useCallback, useState } from "react" import { cn } from "@/lib/utils" import { useAudioClipEditor } from "../../hooks/use-audio-clip-editor" import { AudioClip } from "../../services/audio-clip-editor" import { AudioClipEditorComponent } from "../editor/audio-clip-editor" import { AudioClipComponent } from "./audio-clip" interface AudioTrack { id: string name: string clips: AudioClip[] isMuted: boolean isSolo: boolean } interface AudioTimelineProps { tracks: AudioTrack[] pixelsPerSecond?: number trackHeight?: number onTracksUpdate: (tracks: AudioTrack[]) => void } export function AudioTimeline({ tracks, pixelsPerSecond = 50, trackHeight = 80, onTracksUpdate }: AudioTimelineProps) { const [selectedClip, setSelectedClip] = useState<{ trackId: string clipId: string } | null>(null) const { splitClip } = useAudioClipEditor() const handleClipUpdate = useCallback( (trackId: string, updatedClip: AudioClip) => { const updatedTracks = tracks.map((track) => { if (track.id !== trackId) return track return { ...track, clips: track.clips.map((clip) => (clip.id === updatedClip.id ? updatedClip : clip)), } }) onTracksUpdate(updatedTracks) }, [tracks, onTracksUpdate], ) const handleClipSplit = useCallback( async (trackId: string, clipId: string, splitTime: number) => { const track = tracks.find((t) => t.id === trackId) const clip = track?.clips.find((c) => c.id === clipId) if (!track || !clip) return try { const [firstPart, secondPart] = await splitClip(clip, splitTime) const updatedTracks = tracks.map((t) => { if (t.id !== trackId) return t return { ...t, clips: t.clips.flatMap((c) => (c.id === clipId ? [firstPart, secondPart] : c)), } }) onTracksUpdate(updatedTracks) } catch (error) { console.error("Failed to split clip:", error) } }, [tracks, onTracksUpdate, splitClip], ) const handleClipPositionChange = useCallback( (trackId: string, clipId: string, newStartTime: number) => { const updatedTracks = tracks.map((track) => { if (track.id !== trackId) return track return { ...track, clips: track.clips.map((clip) => (clip.id === clipId ? { ...clip, startTime: newStartTime } : clip)), } }) onTracksUpdate(updatedTracks) }, [tracks, onTracksUpdate], ) const handleClipDurationChange = useCallback( (trackId: string, clipId: string, newDuration: number) => { const updatedTracks = tracks.map((track) => { if (track.id !== trackId) return track return { ...track, clips: track.clips.map((clip) => (clip.id === clipId ? { ...clip, duration: newDuration } : clip)), } }) onTracksUpdate(updatedTracks) }, [tracks, onTracksUpdate], ) const selectedClipData = selectedClip ? tracks.find((t) => t.id === selectedClip.trackId)?.clips.find((c) => c.id === selectedClip.clipId) : null return (