import React, { useRef, useEffect } from 'react' function Waveform({ analyserData, isPlaying }) { const canvasRef = useRef(null) const animationRef = useRef(null) useEffect(() => { const canvas = canvasRef.current if (!canvas) return const ctx = canvas.getContext('2d') const dpr = window.devicePixelRatio || 1 // Set canvas size const rect = canvas.getBoundingClientRect() canvas.width = rect.width * dpr canvas.height = rect.height * dpr ctx.scale(dpr, dpr) const draw = () => { const width = rect.width const height = rect.height const data = analyserData || new Uint8Array(64).fill(0) // Clear canvas ctx.clearRect(0, 0, width, height) // Number of bars const barCount = 64 const barWidth = width / barCount - 2 const barGap = 2 // Create gradient const gradient = ctx.createLinearGradient(0, height, 0, 0) gradient.addColorStop(0, '#3b82f6') gradient.addColorStop(0.5, '#8b5cf6') gradient.addColorStop(1, '#a855f7') for (let i = 0; i < barCount; i++) { const value = data[i] || 0 const normalizedValue = value / 255 // Smooth decay when not playing const targetHeight = isPlaying ? normalizedValue * height * 0.9 : 0 const barHeight = Math.max(2, targetHeight) const x = i * (barWidth + barGap) const y = height - barHeight // Draw bar with rounded corners ctx.fillStyle = gradient ctx.beginPath() ctx.roundRect(x, y, barWidth, barHeight, 2) ctx.fill() // Add glow effect when playing if (isPlaying && normalizedValue > 0.5) { ctx.shadowColor = '#8b5cf6' ctx.shadowBlur = 10 ctx.fillStyle = gradient ctx.beginPath() ctx.roundRect(x, y, barWidth, barHeight, 2) ctx.fill() ctx.shadowBlur = 0 } } animationRef.current = requestAnimationFrame(draw) } draw() return () => { if (animationRef.current) { cancelAnimationFrame(animationRef.current) } } }, [analyserData, isPlaying]) return (
) } export default Waveform