"use client"; import { useState, useCallback } from "react"; import { motion } from "framer-motion"; import { Music, Volume2 } from "lucide-react"; import { FileUploader } from "@/components/tools/FileUploader"; import { ProgressBar } from "@/components/tools/ProgressBar"; import { ResultPreview } from "@/components/tools/ResultPreview"; import { ConfigPanel, type ConfigOption } from "@/components/tools/ConfigPanel"; import { Button } from "@/components/ui/button"; import { useUploadStore } from "@/store/uploadStore"; import { generateId } from "@/lib/utils"; import type { UploadedFile, ProcessedFile, AudioCompressConfig } from "@/types"; const audioAccept = { "audio/*": [".mp3", ".wav", ".ogg", ".aac", ".flac", ".m4a"], }; const defaultConfig: AudioCompressConfig = { bitrate: 128, format: "mp3", sampleRate: 44100, channels: 2, }; const configOptions: ConfigOption[] = [ { id: "bitrate", type: "select", label: "Bitrate", description: "Higher bitrate = better quality, larger file", value: defaultConfig.bitrate, options: [ { label: "64 kbps", value: 64 }, { label: "128 kbps", value: 128 }, { label: "192 kbps", value: 192 }, { label: "256 kbps", value: 256 }, { label: "320 kbps", value: 320 }, ], }, { id: "format", type: "select", label: "Output Format", description: "Target audio format", value: defaultConfig.format, options: [ { label: "MP3", value: "mp3" }, { label: "AAC", value: "aac" }, { label: "OGG", value: "ogg" }, { label: "FLAC", value: "flac" }, ], }, { id: "sampleRate", type: "select", label: "Sample Rate", description: "Audio sample rate in Hz", value: defaultConfig.sampleRate, options: [ { label: "44.1 kHz", value: 44100 }, { label: "48 kHz", value: 48000 }, ], }, { id: "channels", type: "radio", label: "Channels", description: "Audio channels", value: defaultConfig.channels, options: [ { label: "Stereo (2 channels)", value: 2 }, { label: "Mono (1 channel)", value: 1 }, ], }, ]; export default function AudioCompressPage() { const { files, addFile, removeFile, clearFiles, processingStatus, setProcessingStatus } = useUploadStore(); const [config, setConfig] = useState(defaultConfig); const [processedFiles, setProcessedFiles] = useState([]); const handleFilesDrop = useCallback( (acceptedFiles: File[]) => { const newFiles: UploadedFile[] = acceptedFiles.map((file) => ({ id: generateId(), file, name: file.name, size: file.size, type: file.type, uploadedAt: new Date(), })); newFiles.forEach((file) => addFile(file)); }, [addFile] ); const handleConfigChange = (id: string, value: any) => { setConfig((prev) => ({ ...prev, [id]: value })); }; const handleResetConfig = () => { setConfig(defaultConfig); }; const handleProcess = async () => { if (files.length === 0) return; setProcessingStatus({ status: "uploading", progress: 0, message: "Uploading audio...", }); try { // Simulate upload for (let i = 0; i <= 100; i += 10) { await new Promise((resolve) => setTimeout(resolve, 50)); setProcessingStatus({ status: "uploading", progress: i, message: `Uploading... ${i}%`, }); } setProcessingStatus({ status: "processing", progress: 0, message: "Compressing audio...", }); // Simulate processing for (let i = 0; i <= 100; i += 5) { await new Promise((resolve) => setTimeout(resolve, 150)); setProcessingStatus({ status: "processing", progress: i, message: `Compressing... ${i}%`, }); } // Simulate completion const results: ProcessedFile[] = files.map((file) => ({ id: generateId(), originalFile: file, processedUrl: "#", metadata: { format: config.format, bitrate: config.bitrate, sampleRate: config.sampleRate, compressionRatio: Math.floor(Math.random() * 50) + 50, // Simulated 50-100% }, createdAt: new Date(), })); setProcessedFiles(results); clearFiles(); setProcessingStatus({ status: "completed", progress: 100, message: "Compression complete!", }); } catch (error) { setProcessingStatus({ status: "failed", progress: 0, message: "Compression failed", error: error instanceof Error ? error.message : "Unknown error", }); } }; const handleDownload = (fileId: string) => { console.log("Downloading file:", fileId); }; const canProcess = files.length > 0 && processingStatus.status !== "processing"; return (

Audio Compression

Compress and convert audio files with quality control

({ ...opt, value: config[opt.id as keyof AudioCompressConfig], }))} onChange={handleConfigChange} onReset={handleResetConfig} /> {canProcess && ( )}
{processingStatus.status !== "idle" && ( )} {processedFiles.length > 0 && ( )}

Supported Formats

Input

MP3, WAV, OGG, AAC, FLAC, M4A

Output

MP3, AAC, OGG, FLAC

); }