'use client'; import React, { useState, useRef } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Upload, Library, Play, Pause, RefreshCw, Music2, Volume2 } from 'lucide-react'; import { cn } from '@/public/lib/utils'; import { GlassIconButton } from './glass-icon-button'; import { ReplaceMusicModal } from './replace-music-modal'; interface MusicTabContentProps { taskSketch: any[]; currentSketchIndex: number; onSketchSelect: (index: number) => void; } // 模拟音乐数据 const MOCK_MUSICS = [ { id: 1, name: 'Music 1 / Rocka', duration: '00m : 21s : 000ms', totalDuration: '01m : 35s : 765ms', isLooped: true, url: 'https://example.com/music1.mp3' } ]; export function MusicTabContent({ taskSketch, currentSketchIndex, onSketchSelect }: MusicTabContentProps) { const [selectedMusicIndex, setSelectedMusicIndex] = useState(0); const [isReplaceModalOpen, setIsReplaceModalOpen] = useState(false); const [activeMethod, setActiveMethod] = useState('upload'); const [isPlaying, setIsPlaying] = useState(false); const [progress, setProgress] = useState(0); const [volume, setVolume] = useState(75); const audioRef = useRef(null); // 处理音频播放进度 const handleTimeUpdate = () => { if (audioRef.current) { const progress = (audioRef.current.currentTime / audioRef.current.duration) * 100; setProgress(progress); } }; // 处理播放/暂停 const togglePlay = () => { if (audioRef.current) { if (isPlaying) { audioRef.current.pause(); } else { audioRef.current.play(); } setIsPlaying(!isPlaying); } }; // 处理进度条点击 const handleProgressClick = (e: React.MouseEvent) => { if (audioRef.current) { const rect = e.currentTarget.getBoundingClientRect(); const x = e.clientX - rect.left; const percentage = (x / rect.width) * 100; const time = (percentage / 100) * audioRef.current.duration; audioRef.current.currentTime = time; setProgress(percentage); } }; // 处理音量变化 const handleVolumeChange = (e: React.ChangeEvent) => { const newVolume = parseInt(e.target.value); setVolume(newVolume); if (audioRef.current) { audioRef.current.volume = newVolume / 100; } }; return (
{/* 上部分:音乐列表 */} {MOCK_MUSICS.map((music, index) => ( setSelectedMusicIndex(index)} whileHover={{ scale: 1.01 }} whileTap={{ scale: 0.99 }} >

{music.name}

))}
{/* 中间部分:替换区 */}

替换音乐

setIsReplaceModalOpen(true)} whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} > 上传音乐 setIsReplaceModalOpen(true)} whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} > 音乐库
{/* 下部分:音乐属性 */} {/* 左列:音乐编辑选项 */}
{/* Loop Music */}
console.log('loop toggled')} layout >
{/* Trim */}
from
to
{/* Fade in & out */}
Fade in:
Fade out:
{/* Music volume */}
{volume}%
{/* 右列:音频预览 */}
{isPlaying ? ( ) : ( )}
{audioRef.current ? ( `${Math.floor(audioRef.current.currentTime)}s / ${Math.floor(audioRef.current.duration)}s` ) : '0:00 / 0:00'}
{/* 替换音乐弹窗 */} setIsReplaceModalOpen(false)} onMusicSelect={(music) => { console.log('Selected music:', music); setIsReplaceModalOpen(false); // TODO: 处理音乐选择逻辑 }} />
); }