"use client"; import { useEffect, useState } from "react"; import { FFmpeg } from "@ffmpeg/ffmpeg"; import { toBlobURL } from "@ffmpeg/util"; import * as React from "react"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; function InputFile({ onFileSelect }: any) { const handleFileChange = (event: React.ChangeEvent) => { if (event.target.files && event.target.files[0]) { onFileSelect(event.target.files[0]); } }; return (
); } export default function Home() { const [ffmpeg, setFFmpeg] = useState(null); const [isLoading, setIsLoading] = useState(true); const [converting, setConverting] = useState(false); const [error, setError] = useState(null); const [downloadUrl, setDownloadUrl] = useState(""); const [downloadFileName, setDownloadFileName] = useState(""); const [originalFileName, setOriginalFileName] = useState(""); const [originalFileSize, setOriginalFileSize] = useState(""); const [convertedFileSize, setConvertedFileSize] = useState(""); const [selectedFormat, setSelectedFormat] = useState(""); const [availableFormats, setAvailableFormats] = useState([ { value: "png", label: "PNG" }, { value: "jpg", label: "JPEG" }, { value: "webp", label: "WebP" }, { value: "gif", label: "GIF" }, { value: "bmp", label: "BMP" }, { value: "tiff", label: "TIFF" }, { value: "ico", label: "ICO" }, { value: "avif", label: "AVIF" }, { value: "heic", label: "HEIC" }, ]); useEffect(() => { const loadFFmpeg = async () => { try { const ffmpegInstance = new FFmpeg(); const baseURL = "https://unpkg.com/@ffmpeg/core@0.12.4/dist/umd"; await ffmpegInstance.load({ coreURL: await toBlobURL( `${baseURL}/ffmpeg-core.js`, "text/javascript", ), wasmURL: await toBlobURL( `${baseURL}/ffmpeg-core.wasm`, "application/wasm", ), }); setFFmpeg(ffmpegInstance); setIsLoading(false); } catch (error) { console.error("Error loading FFmpeg:", error); setError("Failed to load FFmpeg"); } }; loadFFmpeg(); return () => { if (downloadUrl) { URL.revokeObjectURL(downloadUrl); } }; }, [downloadUrl]); const humanFileSize = (size: number) => { const i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024)); return ( (size / Math.pow(1024, i)).toFixed(2) + " " + ["B", "kB", "MB", "GB", "TB"][i] ); }; const convertImage = async (file: File, format: string) => { if (!ffmpeg || !file) return; try { setConverting(true); setError(null); const inputFileName = "input_" + file.name; const outputFileName = `${file.name.split(".")[0]}-new.${format}`; const fileData = await file.arrayBuffer(); await ffmpeg.writeFile(inputFileName, new Uint8Array(fileData)); await ffmpeg.exec(["-i", inputFileName, outputFileName]); const data = await ffmpeg.readFile(outputFileName); const url = URL.createObjectURL( new Blob([data], { type: `image/${format}` }), ); await ffmpeg.deleteFile(inputFileName); await ffmpeg.deleteFile(outputFileName); if (downloadUrl) { URL.revokeObjectURL(downloadUrl); } setDownloadUrl(url); setDownloadFileName(outputFileName); setConvertedFileSize(humanFileSize(data.length)); setConverting(false); } catch (error) { console.error("Error during conversion:", error); setError( `Error during conversion: ${error instanceof Error ? error.message : "Unknown error"}`, ); setConverting(false); } }; const handleConvert = async (event: React.FormEvent) => { event.preventDefault(); const form = event.currentTarget; const fileInput = form.querySelector('input[type="file"]'); if (!fileInput?.files?.length || !selectedFormat) { setError("Please select a file and format"); return; } const file = fileInput.files[0]; await convertImage(file, selectedFormat); }; const handleFileSelect = (file: File) => { setOriginalFileName(file.name); setOriginalFileSize(humanFileSize(file.size)); // Get the current format and filter it out from available formats const currentFormat = file.name.split(".").pop()?.toLowerCase(); setAvailableFormats((prev) => prev.filter((format) => format.value !== currentFormat), ); }; const handleReset = () => { window.location.reload(); }; return (
Convert Format | Image Utilities

Convert Format

{originalFileName && (

Original File: {originalFileName}

Size: {originalFileSize}

)}
{isLoading ? (

loading ffmpeg...

) : ( )} {originalFileName && ( )}
{converting && (

Converting...

)} {error && (

{error}

)} {downloadUrl && (

Converted File: {downloadFileName}

Size: {convertedFileSize}

)} {downloadUrl && ( Download {downloadFileName.split(".").pop()?.toUpperCase()} Image )}
); }