import { useState, useCallback, useEffect } from "react"; import type { ToolUiProps } from "../../core/plugins/plugin-types"; import type { ImageOptimizerOptions } from "./index"; import { Button } from "../../components/ui/Button"; import { Card } from "../../components/ui/Card"; import { Dropzone } from "../../components/ui/Dropzone"; import { Slider } from "../../components/ui/Slider"; import { Select } from "../../components/ui/Select"; import { useToolExecution } from "../../components/tool/useToolExecution"; const IMAGE_FORMATS = ["image/jpeg", "image/webp", "image/png"] as const; type ImageFormat = (typeof IMAGE_FORMATS)[number]; function isImageFormat(value: string): value is ImageFormat { return IMAGE_FORMATS.includes(value as ImageFormat); } export default function ImageOptimizerUi({ plugin, }: ToolUiProps) { const [files, setFiles] = useState([]); const [previewUrls, setPreviewUrls] = useState([]); const [quality, setQuality] = useState(80); const [format, setFormat] = useState< "image/jpeg" | "image/webp" | "image/png" >("image/webp"); const { run, result, isExecuting, error, reset } = useToolExecution(plugin); useEffect(() => { return () => { previewUrls.forEach((url) => URL.revokeObjectURL(url)); }; }, [previewUrls]); const handleFilesDrop = useCallback((nextFiles: File[]) => { setFiles(nextFiles); setPreviewUrls(nextFiles.map((file) => URL.createObjectURL(file))); reset(); }, [reset]); const handleRun = useCallback(async () => { if (files.length === 0) return; await run({ files }, { quality, format }); }, [files, format, quality, run]); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === "Enter") { e.preventDefault(); if (!isExecuting && files.length > 0) { handleRun(); } } }; window.addEventListener("keydown", handleKeyDown); return () => { window.removeEventListener("keydown", handleKeyDown); }; }, [handleRun, isExecuting, files]); const downloadBlob = useCallback((blob: Blob, filename: string) => { const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }, []); return (
{previewUrls.length > 0 && (

Previews:

{previewUrls.map((url, i) => (
Preview
))}
)}
{error && (
{error}
)} {result && result.type === "files" && ( {result.files.length > 1 && (
Successfully optimized {result.files.length} images
)}
    {result.files.map((file, i) => { const savedBytes = (file.sizeBefore || 0) - (file.sizeAfter || 0); const savedPercentage = file.sizeBefore ? (savedBytes / file.sizeBefore) * 100 : 0; return (
  • {file.name}
    {((file.sizeBefore || 0) / 1024).toFixed(1)} KB {((file.sizeAfter || 0) / 1024).toFixed(1)} KB -{savedPercentage.toFixed(0)}%
  • ); })}
)}